高並發6-redis集群搭建


集群搭建

- 1安裝redis

  * 處理步驟

  cd /usr/local/
  wget http://download.redis.io/releases/redis-4.0.6.tar.gz
  tar -zxvf redis-4.0.6.tar.gz
  cd redis-4.0.6
  make && make install

- 2新建集群文件夾

   - 處理步驟

  cd /usr/local/
  mkdir redis_cluster
  cd redis_cluster
  mkdir 7000 7001 7002 7003 7004 7005
  cp /usr/local/redis-4.0.6/redis.conf /usr/local/redis_cluster/7000

 

- 3修改redis_cluster/7000到redis_cluster/7005文件夾下面的Redis.conf

  * 處理步驟

  daemonize yes //redis后台運行
  port 7000 //端口7000,7002,7003
  cluster-enabled yes //開啟集群 把注釋#去掉
  cluster-config-file nodes.conf //集群的配置 配置文件首次啟動自動生成 7000,7001,7002
  cluster-node-timeout 5000 //請求超時 設置5秒夠了
  appendonly yes //aof日志開啟 有需要就開啟,它會每次寫操作都記錄一條日志
  bind 127.0.0.1 172.16.244.144(此處為自己內網的ip地址,centos7下面采用ip addr來查看,其他系統試一下ifconfig查看,ip為)

  dir /root/application/program/redis-cluster/7000/  //修改數據文件存放地址,以端口號為目錄名來區分(這點一定要注意)


  - 在其他節點也修改完Redis.conf

  * 處理步驟

  cp /usr/local/redis_cluster/7000/redis.conf /usr/local/redis_cluster/7001
  cp /usr/local/redis_cluster/7000/redis.conf /usr/local/redis_cluster/7002
  cp /usr/local/redis_cluster/7000/redis.conf /usr/local/redis_cluster/7003
  cp /usr/local/redis_cluster/7000/redis.conf /usr/local/redis_cluster/7004
  cp /usr/local/redis_cluster/7000/redis.conf /usr/local/redis_cluster/7005

- 4啟動所有redis節點cd redis-server所在的路徑

  * 處理步驟

  cp /usr/local/redis-4.0.6/src/redis-server /usr/local/ redis-cluster
  cd /usr/local/redis_cluster/7000 ../redis-server ./redis.conf
  cd /usr/local/redis-cluster/7001 ../redis-server ./redis.conf
  cd /usr/local/redis-cluster/7002 ../redis-server ./redis.conf
  cd /usr/local/redis-cluster/7003 ../redis-server ./redis.conf
  cd /usr/local/redis-cluster/7004 ../redis-server ./redis.conf
  cd /usr/local/redis-cluster/7005 ../redis-server ./redis.conf

- 5創建集群

  * 前面已經准備好了搭建集群的redis節點,接下來我們要把這些節點都串連起來搭建集群。官方提供了一個工具:redis-trib.rb(/usr/local/redis-4.0.6/src/redis-trib.rb) 看后綴就知道這鳥東西不能直接執 行,它是用ruby寫的一個程序,所以我們還得安裝ruby.

  yum -y install ruby ruby-devel rubygems rpm-build
  gem install redis

  

  - 如果gem install redis發現報錯

    curl -L get.rvm.io | bash -s stable
    source /usr/local/rvm/scripts/rvm
    rvm list known
    rvm install 2.3.3
    rvm use 2.3.3
    ruby --version
    gem install redis

- 6開啟集群工作

  cd /usr/local/redis-4.0.6/src

  redis5.0以下用如下命令啟動
  ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

  redis5.0及以上用如下命令啟動

  redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

 

  - 測試集群是否正常

    ./redis-cli -c -p 7000

  - 如果搭建失敗,請用此命令將所有啟動的redis server一個個關閉掉

    ./redis-cli -p 7000 shutdown

---------------------------------------------------------------------------------割-----------------------------------------------------------------------------------------------

 

Redis 集群的數據分片

概念:Redis 集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽.集群的每個節點負責一部分hash槽,

* 舉個例子,比如當前集群有3個節點,那么:
  * 節點 A 約包含 0 到 5500號哈希槽.
  * 節點 B 約包含5501 到 11000 號哈希槽.
  * 節點 C 約包含11001 到 16384號哈希槽.
* 查看集群信息redis-cli -p 7000 cluster nodes | grep master
  * 這種結構很容易添加或者刪除節點. 比如如果我想新添加個節點D, 我需要從節點 A, B, C中得部分槽到D上. 如果我想移除節點A,需要將A中的槽移到B和C節點上,然后將沒有任何槽的A節點從集群中移除即可. 由於從一個節點將哈希槽移動到另一個節點並不會停止服務,所以無論添加刪除或者改變某個節點的哈希槽的數量都不會造成集群不可用的狀態.

- 從Redis宕機講解分布式鎖執行的異常場景流程

- 從Server服務宕機講解分布式鎖執行的異常場景流程

 - Redis 集群的主從復制模型

  - 為了使在部分節點失敗或者大部分節點無法通信的情況下集群仍然可用,所以集群使用了主從復制模型,每個節點都會有N-1個復制品. 在我們例子中具有A,B,C三個節點的集群,在沒有復制模型的情況下,如果節點B失敗了,那么整個集群就會以為缺少5501-11000這個范圍的槽而不可用.Redis集群做主從備份解決了這個問題 

- Redis 一致性保證(redis是先返回數據再進行主從復制)

  - 主節點對命令的復制工作發生在返回命令回復之后, 因為如果每次處理命令請求都需要等待復制操作完成的話, 那么主節點處理命令請求的速度將極大地降低 —— 我們必須在性能和一致性之間做出權衡。 注意:Redis 集群可能會在將來提供同步寫的方法。 Redis 集群另外一種可能會丟失命令的情況是集群出現了網絡分區, 並且一個客戶端與至少包括一個主節點在內的少數實例被孤立。

 - 手把手測試故障轉移

  redis-cli -p 7000 debug segfault //關閉
  redis-cli -p 7001 cluster nodes | grep master

------------------------------------------------------------------------------------------------------------割--------------------------------------------------------------------------------------

Redis集群分片重哈希

- 采用SSH連接遠程服務器

  - ssh命令安裝過程:https://blog.csdn.net/DanielAntony/article/details/87997574

- 集群重新分片

  手動處理solt節點槽重新分片

  - ./redis-trib.rb reshard 127.0.0.1:6383或./redis-cli --cluster reshard 127.0.0.1:6383


  - 你想移動多少個槽( 從1 到 16384)? all

 

 

 

 - 添加一個新的主節點

  ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

  或./redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

 - 添加一個新的從節點

  ./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000

  或./redis-cli --cluster add-node   --slave 127.0.0.1:7006 127.0.0.1:7000

- 移除一個節點

  ./redis-trib.rb del-node 127.0.0.1:7000 `<node-id>`

  或./redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`
  第一個參數是任意一個節點的地址,第二個節點是你想要移除的節點地址。

  * 移除主節點【先確保節點里面沒有slot】
    * 使用同樣的方法移除主節點,不過在移除主節點前,需要確保這個主節點是空的. 如果不是空的,需要將這個節點的數據重新分片到其他主節點上.
    * 替代移除主節點的方法是手動執行故障恢復,被移除的主節點會作為一個從節點存在,不過這種情況下不會減少集群節點的數量,也需要重新分片數據.

  * 移除從節點 直接移除成功

 

---------------------------------------------------------------------------割---------------------------------------------------------------------------------------

Redis集群整合Springboot

  - 大多數用戶可能會使用RedisTemplate它及其相應的包org.springframework.data.redis.core- 由於其豐富的功能集,該模板實際上是Redis模塊的中心類。該模板為Redis交互提供了高級抽象。雖然RedisConnection提供了接受和返回二進制值(byte數組)的低級方法,但模板負責序列化和連接管理,使用戶無需處理這些細節。

 - 引入spring-data-redis pom依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

- 引入redistemplate

  * 引入bean redisTemplate的使用,類型於:monogoTemplate、jdbcTemplate數據庫連接工具
  * 編寫redisTemplate類,設置redisConnectFactory

- 配置yml配置文件

spring:
  redis:
    timeout: 6000
    password:
    #host: 47.105.163.46
    #port: 6379

    cluster:
      nodes: 47.105.163.46:6379,47.105.163.46:6380,47.105.163.46:6381,47.105.163.46:6382,47.105.163.46:6383,47.105.163.46:6384
      # 獲取失敗 最大重定向次數
      max-redirects: 3
    lettuce:
      pool:
       #max-active: 1000  #連接池最大連接數(使用負值表示沒有限制)
       max-idle: 10 # 連接池中的最大空閑連接
       min-idle: 5 # 連接池中的最小空閑連接
       max-wait: -1
       max-active: 1000

 源碼地址:https://gitee.com/jiawenzhang/RedisCluster.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM