成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

RedisCluster集群部署方案-創(chuàng)新互聯(lián)

什么是 Redis 集群

    

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、長(zhǎng)安網(wǎng)站維護(hù)、網(wǎng)站推廣。

    Redis 集群是一個(gè)分布式(distributed)、容錯(cuò)(fault-tolerant)的 Redis 實(shí)現(xiàn),集群可以使用的功能是普通單機(jī) Redis 所能使用的功能的一個(gè)子集(subset)。

Redis 集群中不存在中心(central)節(jié)點(diǎn)或者代理(proxy)節(jié)點(diǎn),集群的其中一個(gè)主要設(shè)計(jì)目標(biāo)是達(dá)到線性可擴(kuò)展性(linear scalability)。

Redis 集群為了保證一致性(consistency)而犧牲了一部分容錯(cuò)性:系統(tǒng)會(huì)在保證對(duì)網(wǎng)絡(luò)斷線(net split)和節(jié)點(diǎn)失效(node failure)具有有限(limited)抵抗力的前提下,盡可能地保持?jǐn)?shù)據(jù)的一致性。

請(qǐng)注意,本教程使用于Redis3.0(包括3.0)以上版本

如果你計(jì)劃部署集群,那么我們建議你從閱讀這個(gè)文檔開始。

Redis集群介紹

    Redis 集群是一個(gè)提供在多個(gè)Redis間節(jié)點(diǎn)間共享數(shù)據(jù)的程序集。

    Redis集群并不支持處理多個(gè)keys的命令,因?yàn)檫@需要在不同的節(jié)點(diǎn)間移動(dòng)數(shù)據(jù),從而達(dá)不到像Redis那樣的性能,在高負(fù)載的情況下可能會(huì)導(dǎo)致不可預(yù)料的錯(cuò)誤.

    Redis 集群通過分區(qū)來提供一定程度的可用性,在實(shí)際環(huán)境中當(dāng)某個(gè)節(jié)點(diǎn)宕機(jī)或者不可達(dá)的情況下繼續(xù)處理命令. Redis 集群的優(yōu)勢(shì):

   自動(dòng)分割數(shù)據(jù)到不同的節(jié)點(diǎn)上。
   整個(gè)集群的部分節(jié)點(diǎn)失敗或者不可達(dá)的情況下能夠繼續(xù)處理命令。

Redis 集群的數(shù)據(jù)分片
Redis 集群沒有使用一致性hash, 而是引入了 哈希槽的概念.

Redis 集群有16384個(gè)哈希槽,每個(gè)key通過CRC16校驗(yàn)后對(duì)16384取模來決定放置哪個(gè)槽.集群的每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分hash槽,舉個(gè)例子,比如當(dāng)前集群有3個(gè)節(jié)點(diǎn),那么:

   節(jié)點(diǎn) A 包含 0 到 5500號(hào)哈希槽.
   節(jié)點(diǎn) B 包含5501 到 11000 號(hào)哈希槽.
   節(jié)點(diǎn) C 包含11001 到 16384號(hào)哈希槽.

    這種結(jié)構(gòu)很容易添加或者刪除節(jié)點(diǎn). 比如如果我想新添加個(gè)節(jié)點(diǎn)D, 我需要從節(jié)點(diǎn) A, B, C中得部分槽到D上. 如果我像移除節(jié)點(diǎn)A,需要將A中得槽移到B和C節(jié)點(diǎn)上,然后將沒有任何槽的A節(jié)點(diǎn)從集群中移除即可. 由于從一個(gè)節(jié)點(diǎn)將哈希槽移動(dòng)到另一個(gè)節(jié)點(diǎn)并不會(huì)停止服務(wù),所以無論添加刪除或者改變某個(gè)節(jié)點(diǎn)的哈希槽的數(shù)量都不會(huì)造成集群不可用的狀態(tài).
Redis 集群的主從復(fù)制模型

    為了使在部分節(jié)點(diǎn)失敗或者大部分節(jié)點(diǎn)無法通信的情況下集群仍然可用,所以集群使用了主從復(fù)制模型,每個(gè)節(jié)點(diǎn)都會(huì)有N-1個(gè)復(fù)制品.

    在我們例子中具有A,B,C三個(gè)節(jié)點(diǎn)的集群,在沒有復(fù)制模型的情況下,如果節(jié)點(diǎn)B失敗了,那么整個(gè)集群就會(huì)以為缺少5501-11000這個(gè)范圍的槽而不可用.

    然而如果在集群創(chuàng)建的時(shí)候(或者過一段時(shí)間)我們?yōu)槊總€(gè)節(jié)點(diǎn)添加一個(gè)從節(jié)點(diǎn)A1,B1,C1,那么整個(gè)集群便有三個(gè)master節(jié)點(diǎn)和三個(gè)slave節(jié)點(diǎn)組成,這樣在節(jié)點(diǎn)B失敗后,集群便會(huì)選舉B1為新的主節(jié)點(diǎn)繼續(xù)服務(wù),整個(gè)集群便不會(huì)因?yàn)椴壅也坏蕉豢捎昧?br />
不過當(dāng)B和B1 都失敗后,集群是不可用的.

    Redis 一致性保證
    Redis 并不能保證數(shù)據(jù)的強(qiáng)一致性. 這意味這在實(shí)際中集群在特定的條件下可能會(huì)丟失寫操作.

第一個(gè)原因是因?yàn)榧菏怯昧水惒綇?fù)制. 寫操作過程:

   客戶端向主節(jié)點(diǎn)B寫入一條命令.
   主節(jié)點(diǎn)B向客戶端回復(fù)命令狀態(tài).
   主節(jié)點(diǎn)將寫操作復(fù)制給他得從節(jié)點(diǎn) B1, B2 和 B3.

    主節(jié)點(diǎn)對(duì)命令的復(fù)制工作發(fā)生在返回命令回復(fù)之后, 因?yàn)槿绻看翁幚砻钫?qǐng)求都需要等待復(fù)制操作完成的話, 那么主節(jié)點(diǎn)處理命令請(qǐng)求的速度將極大地降低 —— 我們必須在性能和一致性之間做出權(quán)衡。 注意:Redis 集群可能會(huì)在將來提供同步寫的方法。 Redis 集群另外一種可能會(huì)丟失命令的情況是集群出現(xiàn)了網(wǎng)絡(luò)分區(qū), 并且一個(gè)客戶端與至少包括一個(gè)主節(jié)點(diǎn)在內(nèi)的少數(shù)實(shí)例被孤立。

    舉個(gè)例子 假設(shè)集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六個(gè)節(jié)點(diǎn), 其中 A 、B 、C 為主節(jié)點(diǎn), A1 、B1 、C1 為A,B,C的從節(jié)點(diǎn), 還有一個(gè)客戶端 Z1 假設(shè)集群中發(fā)生網(wǎng)絡(luò)分區(qū),那么集群可能會(huì)分為兩方,大部分的一方包含節(jié)點(diǎn) A 、C 、A1 、B1 和 C1 ,小部分的一方則包含節(jié)點(diǎn) B 和客戶端 Z1 .

    Z1仍然能夠向主節(jié)點(diǎn)B中寫入, 如果網(wǎng)絡(luò)分區(qū)發(fā)生時(shí)間較短,那么集群將會(huì)繼續(xù)正常運(yùn)作,如果分區(qū)的時(shí)間足夠讓大部分的一方將B1選舉為新的master,那么Z1寫入B中得數(shù)據(jù)便丟失了.

    注意, 在網(wǎng)絡(luò)分裂出現(xiàn)期間, 客戶端 Z1 可以向主節(jié)點(diǎn) B 發(fā)送寫命令的大時(shí)間是有限制的, 這一時(shí)間限制稱為節(jié)點(diǎn)超時(shí)時(shí)間(node timeout), 是 Redis 集群的一個(gè)重要的配置選項(xiàng):
搭建并使用Redis集群

    搭建集群的第一件事情我們需要一些運(yùn)行在 集群模式的Redis實(shí)例. 這意味這集群并不是由一些普通的Redis實(shí)例組成的,集群模式需要通過配置啟用,開啟集群模式后的Redis實(shí)例便可以使用集群特有的命令和特性了.

目前redis支持的cluster特性

1):節(jié)點(diǎn)自動(dòng)發(fā)現(xiàn)
2):slave->master 選舉,集群容錯(cuò)
3):Hot resharding:在線分片
4):進(jìn)群管理:cluster xxx
5):基于配置(nodes-port.conf)的集群管理
6):ASK 轉(zhuǎn)向/MOVED 轉(zhuǎn)向機(jī)制.

1)redis-cluster架構(gòu)圖

Redis Cluster集群部署方案

架構(gòu)細(xì)節(jié):

(1)所有的redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬.
(2)節(jié)點(diǎn)的fail是通過集群中超過半數(shù)的節(jié)點(diǎn)檢測(cè)失效時(shí)才生效.
(3)客戶端與redis節(jié)點(diǎn)直連,不需要中間proxy層.客戶端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可
(4)redis-cluster把所有的物理節(jié)點(diǎn)映射到[0-16383]slot上,cluster 負(fù)責(zé)維護(hù)node<->slot<->value2) redis-cluster選舉:容錯(cuò)

Redis Cluster集群部署方案

(1)領(lǐng)著選舉過程是集群中所有master參與,如果半數(shù)以上master節(jié)點(diǎn)與master節(jié)點(diǎn)通信超過(cluster- node-timeout),認(rèn)為當(dāng)前master節(jié)點(diǎn)掛掉.
(2):什么時(shí)候整個(gè)集群不可用(cluster_state:fail),當(dāng)集群不可用時(shí),所有對(duì)集群的操作做都不可用,收到     ((error) CLUSTERDOWN The cluster is down)錯(cuò)誤
   a:如果集群任意master掛掉,且當(dāng)前master沒有slave.集群進(jìn)入fail狀態(tài),也可以理解成進(jìn)群的slot映射        [0-16383]不完成時(shí)進(jìn)入fail狀態(tài).
   b:如果進(jìn)群超過半數(shù)以上master掛掉,無論是否有slave集群進(jìn)入fail狀態(tài).

一、環(huán)境

os:centos7     ip:192.168.19.132     redis:3.2.9     gem-redis:3.2.2

二、搭建集群

1、本機(jī)下載redis-3.2.9.tar.gz

[root@zookeeper ~]# cd /usr/local/src/ [root@zookeeper src]# wget http://download.redis.io/releases/redis-3.2.9.tar.gz

2、安裝

root@zookeeper ~]# yum -y install tcl-8.5*  [root@zookeeper src]# tar zxf redis-3.2.9.tar.gz -C /usr/local/ [root@zookeeper src]# ln -s /usr/local/redis-3.2.9 /usr/local/redis [root@zookeeper src]# cd /usr/local/redis 第一種: [root@zookeeper redis]# make MALLOC=libc && make install [root@zookeeper redis]# make test(可選,等待時(shí)間長(zhǎng)) ...... \o/ All tests passed without errors! Cleanup: may take some time... OK make[1]: Leaving directory `/usr/local/redis-3.2.9/src' 第二種make: make完成之后,進(jìn)行install,默認(rèn)安裝路徑為/usr/local/bin下,這里我們把他安裝目錄放到/usr/local/redis下,使用PREFIX指定目錄: [root@zookeeper redis]# make && make PREFIX=/usr/local/redis install

將redis可執(zhí)行目錄添加到環(huán)境變量中,編輯~/.bash_profile添加redis環(huán)境變量:

[root@zookeeper ~]# vim ~/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then         . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin:/usr/local/redis/bin export PATH [root@zookeeper ~]# source ~/.bash_profile

3、創(chuàng)建文件夾

[root@zookeeper redis]#    mkdir -p /data/cluster [root@zookeeper redis]# cd /data/cluster/ [root@zookeeper cluster]# mkdir 7000 7001 7002 7003 7004 7005

4、拷貝修改配置文件

[root@zookeeper cluster]# mkdir /var/log/redis/ [root@zookeeper cluster]# cp /usr/local/redis/redis.conf 7000/redis-7000.conf vim 7000/redis-7000.conf ......     bind 192.168.19.132     port 7000     daemonize yes     cluster-enabled yes     cluster-config-file nodes-7000.conf     cluster-node-timeout 15000     pidfile /var/run/redis_7000.pid     logfile "/var/log/redis/redis-7000.log" 改完之后將此配置文件cp到所有節(jié)點(diǎn)上,并且修改端口號(hào)和cluster-config-file項(xiàng)。 [root@zookeeper cluster]# cp 7000/redis-7000.conf 7001/redis-7001.conf  [root@zookeeper cluster]# cp 7000/redis-7000.conf 7002/redis-7002.conf  [root@zookeeper cluster]# cp 7000/redis-7000.conf 7003/redis-7003.conf  [root@zookeeper cluster]# cp 7000/redis-7000.conf 7004/redis-7004.conf  [root@zookeeper cluster]# cp 7000/redis-7000.conf 7005/redis-7005.conf  ......(修改配置文件請(qǐng)參考redis-7000.conf)     [root@zookeeper cluster]# vim 7001/redis-7001.conf      [root@zookeeper cluster]# vim 7002/redis-7002.conf      [root@zookeeper cluster]# vim 7003/redis-7003.conf      [root@zookeeper cluster]# vim 7004/redis-7004.conf      [root@zookeeper cluster]# vim 7005/redis-7005.conf

5、啟動(dòng)6個(gè)實(shí)例

[root@zookeeper cluster]# redis-server 7000/redis-7000.conf [root@zookeeper cluster]# redis-server 7001/redis-7001.conf  [root@zookeeper cluster]# redis-server 7002/redis-7002.conf  [root@zookeeper cluster]# redis-server 7003/redis-7003.conf  [root@zookeeper cluster]# redis-server 7004/redis-7004.conf  [root@zookeeper cluster]# redis-server 7005/redis-7005.conf  [root@zookeeper cluster]#  關(guān)閉命令:[root@zookeeper cluster]# redis-cli -p 端口號(hào) shutdown

用redis-cli -c -h -p命令登錄
-c是以集群方式登錄;
-h后跟主機(jī)號(hào) ;
-p后跟端口號(hào)。
綁定了127.0.0.1則可以省略-h參數(shù)。不加-c則客戶端不自動(dòng)切換。

例如:客戶端登錄7000端口的,設(shè)置的數(shù)據(jù)應(yīng)該存放在7001上則會(huì)報(bào)錯(cuò)請(qǐng)轉(zhuǎn)到7001。而加上-c啟動(dòng)則會(huì)自動(dòng)切換到7001客戶端保存。

6、查看redis進(jìn)程啟動(dòng)狀態(tài)

[root@zookeeper cluster]# ps -ef| grep redis root      18839      1  0 22:58 ?        00:00:00 redis-server 192.168.19.132:7000 [cluster] root      18843      1  0 22:58 ?        00:00:00 redis-server 192.168.19.132:7001 [cluster] root      18847      1  0 22:58 ?        00:00:00 redis-server 192.168.19.132:7002 [cluster] root      18851      1  0 22:59 ?        00:00:00 redis-server 192.168.19.132:7003 [cluster] root      18855      1  0 22:59 ?        00:00:00 redis-server 192.168.19.132:7004 [cluster] root      18859      1  0 22:59 ?        00:00:00 redis-server 192.168.19.132:7005 [cluster] root      18865   2891  0 22:59 pts/1    00:00:00 grep --color=auto redis [root@zookeeper cluster]#

7、部署集群

    7.1、安裝ruby依賴,返回安裝軟件目錄

root@zookeeper src]# yum install ruby rubygems -y [root@zookeeper src]# wget https://rubygems.org/downloads/redis-3.2.2.gem 安裝集群管理工具 Redis作者應(yīng)該是個(gè)Ruby愛好者,Ruby客戶端就是他開發(fā)的。這次集群的管理功能沒有嵌入到Redis代碼中,于是作者又順手寫了個(gè)叫做redis-trib的管理腳本。redis-trib依賴Ruby和RubyGems,以及redis擴(kuò)展??梢韵扔脀hich命令查看是否已安裝ruby和rubygems,用gem list –local查看本地是否已安裝redis擴(kuò)展。 [root@zookeeper src]# gem install -l redis-3.2.2.gem  Successfully installed redis-3.2.2 Parsing documentation for redis-3.2.2 Installing ri documentation for redis-3.2.2 1 gem installed

    7.2、將集群管理程序復(fù)制到/usr/local/bin/

 [root@zookeeper src]# cp /usr/local/redis/src/redis-trib.rb /usr/local/bin/redis-trib

      可以看到redis-trib.rb具有以下功能:
      1、create:創(chuàng)建集群
      2、check:檢查集群
      3、info:查看集群信息
      4、fix:修復(fù)集群
      5、reshard:在線遷移slot
      6、rebalance:平衡集群節(jié)點(diǎn)slot數(shù)量
      7、add-node:將新節(jié)點(diǎn)加入集群
      8、del-node:從集群中刪除節(jié)點(diǎn)
      9、set-timeout:設(shè)置集群節(jié)點(diǎn)間心跳連接的超時(shí)時(shí)間
      10、call:在集群全部節(jié)點(diǎn)上執(zhí)行命令
      11、import:將外部redis數(shù)據(jù)導(dǎo)入集群

8、創(chuàng)建集群

[root@zookeeper cluster]# redis-trib create --replicas 1 192.168.19.132:7000 192.168.19.132:7001 192.168.19.132:7002 192.168.19.132:7003 192.168.19.132:7004 192.168.19.132:7005 >>> Creating cluster >>> Performing hash slots allocation on 7 nodes... Using 3 masters: 192.168.19.132:7000 192.168.19.132:7001 192.168.19.132:7002 Adding replica 192.168.19.132:7003 to 192.168.19.132:7000 Adding replica 192.168.19.132:7004 to 192.168.19.132:7001 Adding replica 192.168.19.132:7005 to 192.168.19.132:7002 M: 3546a9930ce08543731c4d49ae8609d75b0b8193 192.168.19.132:7000    slots:0-16383 (16384 slots) master M: 1dd532b0f41b98574b6cd355fa58a2773c9da8fe 192.168.19.132:7001    slots:5461-10922 (5462 slots) master M: 2900e315a4a01df8609eafe0f9fd2a1d779ecc69 192.168.19.132:7002    slots:10923-16383 (5461 slots) master S: 71c8cea8e3e9c913eb7c09bd3f95c03985938eca 192.168.19.132:7003    replicates 3546a9930ce08543731c4d49ae8609d75b0b8193 S: 046a02ea253d8912b87c13e98b28f81e6c54c0b1 192.168.19.132:7004    replicates 1dd532b0f41b98574b6cd355fa58a2773c9da8fe S: 8a666ed58930673b7dfc6d005c2a937751350f77 192.168.19.132:7005    replicates 2900e315a4a01df8609eafe0f9fd2a1d779ecc69 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join. >>> Performing Cluster Check (using node 192.168.19.132:7000) M: 3da69162cde5884f21cec07f6f812ffbdda0cfc4 192.168.19.132:7000    slots:0-10922 (10923 slots) master    3 additional replica(s) M: d30be1d1232e55f3cc69d8d11e9eb9a870160ac1 192.168.19.132:7001    slots:10923-16383 (5461 slots) master    1 additional replica(s) S: 6bd6589a69ce37da5335ffd10b042ce0b02e3247 192.168.19.132:7004    slots: (0 slots) slave    replicates d30be1d1232e55f3cc69d8d11e9eb9a870160ac1 S: 12d7db519133b96bac51b79204f69eabdfe75627 192.168.19.132:7002    slots: (0 slots) slave    replicates 3da69162cde5884f21cec07f6f812ffbdda0cfc4 S: 8a9d6189b42bef127ab388e221d8225938c3f038 192.168.19.132:7003    slots: (0 slots) slave    replicates 3da69162cde5884f21cec07f6f812ffbdda0cfc4 S: 2cfb927fc17988be6fee6b5eb1249e2789a76f82 192.168.19.132:7005    slots: (0 slots) slave    replicates 3da69162cde5884f21cec07f6f812ffbdda0cfc4 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.

   當(dāng)我們同意這份計(jì)劃之后輸入yes,,Can I set the above configuration? (type 'yes' to accept): yes,開始執(zhí)行節(jié)點(diǎn)握手和槽分配操作。
最后輸出報(bào)告說明,16384個(gè)槽全部被分配,集群創(chuàng)建成功。這里需要注意給redis-trib.rb的節(jié)點(diǎn)地址必須是不包含任何槽/數(shù)據(jù)的節(jié)點(diǎn),否則會(huì)拒絕創(chuàng)建集群。

    --replicascas參數(shù)制定集群中每個(gè)主節(jié)點(diǎn)配置幾個(gè)從節(jié)點(diǎn),這里設(shè)置為1.節(jié)點(diǎn)列表順序用于確定主從角色,先主節(jié)點(diǎn)之后是從節(jié)點(diǎn)。

創(chuàng)建流程如下:

1、首先為每個(gè)節(jié)點(diǎn)創(chuàng)建ClusterNode對(duì)象,包括連接每個(gè)節(jié)點(diǎn)。檢查每個(gè)節(jié)點(diǎn)是否為獨(dú)立且db為空的節(jié)點(diǎn)。執(zhí)行l(wèi)oad_info方法導(dǎo)入節(jié)點(diǎn)信息。

2、檢查傳入的master節(jié)點(diǎn)數(shù)量是否大于等于3個(gè)。只有大于3個(gè)節(jié)點(diǎn)才能組成集群。

3、計(jì)算每個(gè)master需要分配的slot數(shù)量,以及給master分配slave。分配的算法大致如下:
先把節(jié)點(diǎn)按照host分類,這樣保證master節(jié)點(diǎn)能分配到更多的主機(jī)中。
不停遍歷遍歷host列表,從每個(gè)host列表中彈出一個(gè)節(jié)點(diǎn),放入interleaved數(shù)組。直到所有的節(jié)點(diǎn)都彈出為止。
master節(jié)點(diǎn)列表就是interleaved前面的master數(shù)量的節(jié)點(diǎn)列表。保存在masters數(shù)組。
計(jì)算每個(gè)master節(jié)點(diǎn)負(fù)責(zé)的slot數(shù)量,保存在slots_per_node對(duì)象,用slot總數(shù)除以master數(shù)量取整即可。
遍歷masters數(shù)組,每個(gè)master分配slots_per_node個(gè)slot,最后一個(gè)master,分配到16384個(gè)slot為止。
接下來為master分配slave,分配算法會(huì)盡量保證master和slave節(jié)點(diǎn)不在同一臺(tái)主機(jī)上。對(duì)于分配完指定slave數(shù)量的節(jié)點(diǎn),還有多余的節(jié)點(diǎn),也會(huì)為這些節(jié)點(diǎn)尋找master。分配算法會(huì)遍歷兩次masters數(shù)組。
第一次遍歷masters數(shù)組,在余下的節(jié)點(diǎn)列表找到replicas數(shù)量個(gè)slave。每個(gè)slave為第一個(gè)和master節(jié)點(diǎn)host不一樣的節(jié)點(diǎn),如果沒有不一樣的節(jié)點(diǎn),則直接取出余下列表的第一個(gè)節(jié)點(diǎn)。
第二次遍歷是在對(duì)于節(jié)點(diǎn)數(shù)除以replicas不為整數(shù),則會(huì)多余一部分節(jié)點(diǎn)。遍歷的方式跟第一次一樣,只是第一次會(huì)一次性給master分配replicas數(shù)量個(gè)slave,而第二次遍歷只分配一個(gè),直到余下的節(jié)點(diǎn)被全部分配出去。

4、打印出分配信息,并提示用戶輸入“yes”確認(rèn)是否按照打印出來的分配方式創(chuàng)建集群。

5、輸入“yes”后,會(huì)執(zhí)行flush_nodes_config操作,該操作執(zhí)行前面的分配結(jié)果,給master分配slot,讓slave復(fù)制master,對(duì)于還沒有握手(cluster meet)的節(jié)點(diǎn),slave復(fù)制操作無法完成,不過沒關(guān)系,flush_nodes_config操作出現(xiàn)異常會(huì)很快返回,后續(xù)握手后會(huì)再次執(zhí)行flush_nodes_config。

6、給每個(gè)節(jié)點(diǎn)分配epoch,遍歷節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)分配的epoch比之前節(jié)點(diǎn)大1。

7、節(jié)點(diǎn)間開始相互握手,握手的方式為節(jié)點(diǎn)列表的其他節(jié)點(diǎn)跟第一個(gè)節(jié)點(diǎn)握手。

8、然后每隔1秒檢查一次各個(gè)節(jié)點(diǎn)是否已經(jīng)消息同步完成,使用ClusterNode的get_config_signature方法,檢查的算法為獲取每個(gè)節(jié)點(diǎn)cluster nodes信息,排序每個(gè)節(jié)點(diǎn),組裝成node_id1:slots|node_id2:slot2|...的字符串。如果每個(gè)節(jié)點(diǎn)獲得字符串都相同,即認(rèn)為握手成功。

9、此后會(huì)再執(zhí)行一次flush_nodes_config,這次主要是為了完成slave復(fù)制操作。

10、最后再執(zhí)行check_cluster,全面檢查一次集群狀態(tài)。包括和前面握手時(shí)檢查一樣的方式再檢查一遍。確認(rèn)沒有遷移的節(jié)點(diǎn)。確認(rèn)所有的slot都被分配出去了。

11、至此完成了整個(gè)創(chuàng)建流程,返回[OK] All 16384 slots covered.。

9、集群完整性檢查

[root@zookeeper ~]# redis-trib check 192.168.19.132:7000 >>> Performing Cluster Check (using node 192.168.19.132:7000) M: 8a628ee2e98c70a404be020cba3dfc1172a38335 192.168.19.132:7000    slots:0-5460 (5461 slots) master    1 additional replica(s) S: 154e2f4f3fad75a564f9fe2efcde7820284116c6 192.168.19.132:7003    slots: (0 slots) slave    replicates 8a628ee2e98c70a404be020cba3dfc1172a38335 S: f2707a3052d3dc91358b73b4786e4c8e20662a79 192.168.19.132:7004    slots: (0 slots) slave    replicates 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef M: 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef 192.168.19.132:7001    slots:5461-10922 (5462 slots) master    1 additional replica(s) M: 08d3663dc9e0f5f02e2bff07640d67e406211e49 192.168.19.132:7002    slots:10923-16383 (5461 slots) master    1 additional replica(s) S: a44237119e6b2129e457d2f48a584b94b1b815f5 192.168.19.132:7005    slots: (0 slots) slave    replicates 08d3663dc9e0f5f02e2bff07640d67e406211e49 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. [root@zookeeper ~]# redis-trib check 192.168.19.132:7004 >>> Performing Cluster Check (using node 192.168.19.132:7004) S: f2707a3052d3dc91358b73b4786e4c8e20662a79 192.168.19.132:7004    slots: (0 slots) slave    replicates 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef M: 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef 192.168.19.132:7001    slots:5461-10922 (5462 slots) master    1 additional replica(s) S: 154e2f4f3fad75a564f9fe2efcde7820284116c6 192.168.19.132:7003    slots: (0 slots) slave    replicates 8a628ee2e98c70a404be020cba3dfc1172a38335 M: 08d3663dc9e0f5f02e2bff07640d67e406211e49 192.168.19.132:7002    slots:10923-16383 (5461 slots) master    1 additional replica(s) M: 8a628ee2e98c70a404be020cba3dfc1172a38335 192.168.19.132:7000    slots:0-5460 (5461 slots) master    1 additional replica(s) S: a44237119e6b2129e457d2f48a584b94b1b815f5 192.168.19.132:7005    slots: (0 slots) slave    replicates 08d3663dc9e0f5f02e2bff07640d67e406211e49 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.

10 測(cè)試

[root@zookeeper ~]# redis-cli -h 192.168.19.132 -p 7000 192.168.19.132:7000> CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_sent:414 cluster_stats_messages_received:414 3192.168.19.132:7000> CLUSTER NODES 154e2f4f3fad75a564f9fe2efcde7820284116c6 192.168.19.132:7003 slave 8a628ee2e98c70a404be020cba3dfc1172a38335 0 1496720263710 4 connected f2707a3052d3dc91358b73b4786e4c8e20662a79 192.168.19.132:7004 slave 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef 0 1496720264715 5 connected 0e4d1ee05b090c45ce979bc9e8ad4c027d5332ef 192.168.19.132:7001 master - 0 1496720262702 2 connected 5461-10922 08d3663dc9e0f5f02e2bff07640d67e406211e49 192.168.19.132:7002 master - 0 1496720265722 3 connected 10923-16383 a44237119e6b2129e457d2f48a584b94b1b815f5 192.168.19.132:7005 slave 08d3663dc9e0f5f02e2bff07640d67e406211e49 0 1496720266730 6 connected 8a628ee2e98c70a404be020cba3dfc1172a38335 192.168.19.132:7000 myself,master - 0 0 1 connected 0-5460

當(dāng)前集群狀態(tài)是OK,集群進(jìn)入在線狀態(tài)。cluster nodes可以看到節(jié)點(diǎn)和槽的分配關(guān)系,目前還有三個(gè)及誒按沒有使用,作為一個(gè)完整的集群,每個(gè)負(fù)責(zé)處理槽的節(jié)點(diǎn)都應(yīng)該具有從節(jié)點(diǎn),保證當(dāng)它出現(xiàn)故障時(shí)可以自動(dòng)進(jìn)行故障轉(zhuǎn)移。集群模式下,Redis節(jié)點(diǎn)角色分為主節(jié)點(diǎn)和從節(jié)點(diǎn)。首次啟動(dòng)的節(jié)點(diǎn)和被分配槽的節(jié)點(diǎn)都是主節(jié)點(diǎn),從節(jié)點(diǎn)負(fù)責(zé)復(fù)制主節(jié)點(diǎn)槽信息和相關(guān)數(shù)據(jù)。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

文章標(biāo)題:RedisCluster集群部署方案-創(chuàng)新互聯(lián)
路徑分享:http://jinyejixie.com/article10/ddeogo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、品牌網(wǎng)站制作、企業(yè)網(wǎng)站制作搜索引擎優(yōu)化、動(dòng)態(tài)網(wǎng)站關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
论坛| 扎兰屯市| 土默特右旗| 江津市| 武汉市| 长阳| 西藏| 大同市| 永胜县| 苍溪县| 庐江县| 襄汾县| 新疆| 商洛市| 定安县| 吉水县| 潞城市| 许昌市| 壶关县| 竹山县| 信宜市| 瓦房店市| 大田县| 汶上县| 高密市| 黎川县| 泰兴市| 兰西县| 东辽县| 板桥市| 桐乡市| 乌拉特前旗| 金寨县| 青阳县| 章丘市| 衡水市| 靖边县| 玉林市| 平江县| 乌拉特中旗| 区。|