一、Redis群集架構細節:
1、所有的Redis節點彼此互聯(PING-PONG機制)內部使用二進制協議優先傳輸速度和帶寬。
2、節點的失效(fail)在群集中超過半數的主(master)節點檢測失效時才會生效。
3、客戶端與redis節點直連,不需要中間代理(proxy)層,客戶端不需要連接群集所有節點,連接群集中任何一個可用節點即可。
4、redis-cluster把所有的物理節點映射到 [ 0-1638 ] slot 上,cluster負責維護node< - >slot< - > key。
二、redis-cluster選舉:
選舉過程是群集中所有master參與,如果半數以上master節點與當前master節點通信超時(cluster-node-timeout),認為當前master節點掛掉。以下兩種情況為整個群集不可用(cluster_state:fail),當群集不可用時,所有對群集的操作都不可用,收到((error)CLUSTERDOWN Thecluster is down)錯誤:
如果群集中任意master掛掉,且當前master沒有slave,則群集進入fail狀態,也可以理解成群集的slot映射 [ 0-16383 ]不完整時進入fail狀態。
默認情況下,每個群集的節點都是用兩個TCP端口,一個是6379,一個是16379;6379服務于客戶端的連接,16379用于群集總線,就是使用二進制協議的節點到節點通信通道。節點使用群集總線進行故障檢測、配置更新、故障轉移授權等。
Redis群集原理:
1、Redis集群架構:
Redis Cluster采用虛擬槽分區,將所有的數據根據算法映射到0~16384整數槽內
Redis Cluster是一個無中心的結構
每個節點都保存數據和整個集群的狀態
2、集群角色:
Master:Master之間分配slots
Slave:Slave向它指定的Master同步數據
3、集群節點使用的TCP端口
6379端口用于客戶端的連接
16379端口用于群集總線
Redis3.0版本以上開始支持群集,采用的是hash slot(哈希槽),可以將多個Redis實例整合在一起,形成一個群集,也就是將數據分散到群集的多臺服務器上。
.
Redis cluster(Redis 群集)是一個無中心的結構,如下圖所示,每個節點都會保存數據和整個群集的狀態。每個節點都會保存其他節點的信息,知道其他節點所負責的槽,并且會與其他節點定時發送心跳信息,能夠及時感知群集中異常的節點。
當客戶端向群集中任一節點發送與數據庫鍵有關的命令時,接受命令的節點會計算出命令要處理的數據屬于哪個槽,并檢查這個槽是否指派給了自己,如果鍵所在的槽正好指派給了當前節點,那么節點直接執這個命令;如果鍵值所在的槽并沒有指派給當前節點,那么節點會向客戶端返回一個MOVED錯誤,指引客戶端轉向(redirect)正確的節點,并再次發送之前想要執行的命令。
.
群集角色有master和slave。master之間分配slots,一共16384個slot。slave向它指定的master同步數據,實現備份。當其中一個master無法提供服務時,該master的slave將提升為master,以保證群集間slot的完整性。當其中的某一個master和它的slave都失效,導致了slot不完整,群集失效,這時就需要運維人員去處理了。
.
群集搭建好后,群集中的每個節點都會定期地向其他節點發送PING消息,如果接收PING消息的節點沒有在規定的時間內返回PONG消息,那么發送PING消息的節點就會將其標記為疑似下線(PFAIL)。各個節點會通過互相發送消息的方式來交換群集中各個節點的狀態信息。如果已經在一個群集里面,半數以上的主節點都將某個主節點x報告為疑似下線,那么這個主節點x將被標記為已下線(FAIL),同時會向群集廣播一條關于主節點x的FAIL消息,所有收到這條FAIL消息的節點都會立即將主節點x標記為已下線。
.
當需要減少或者增加群集中的服務器時,我們需要將已經指派給某個節點(源節點)的槽改為指派給另一個節點(目標節點),并且將相關槽所包含的鍵值對從源節點移動到目標節點。
.
Redis群集的重新分片操作時由Redis的群集管理軟件redis-trib負責執行的,不支持自動分片,而且需要自己計算從哪些節點遷移多少Slot。在重新分片的過程中,群集無需下線,并且源節點和目標節點都可以繼續處理命令請求。
準備工作:
1、六臺服務器,三臺為master、三臺為slave,這里均為centos 7,IP地址依次為192.168.1.10--60(參與群集的服務器數量最好為偶數,每個master會自動對應一個slave,若為奇數,群集無法實現冗余,因為必定有一個master沒有對應的slave,一旦這個master宕機,整個群集就會丟失一部分數據);
2、所需源碼包: https://pan.baidu.com/s/12L6jNOBrXeLH4I445_uUtQ 提取碼: smn6
3、所有redis服務器必須保證無任何數據,最好是全新安裝的,因為如果有數據存在,在后面進行群集時會報錯。
4、配置防火墻放行流量,本人較懶,這里直接關閉了
開始部署:
192.168.1.10 上的配置:
[root@localhost media]# ls
redis-3.2.0.gem redis-3.2.9.tar.gz
[root@localhost media]# cp * /usr/src/ # 將軟件包復制
[root@localhost media]# cd /usr/src/
[root@localhost src]# ls # 確認都在呢
debug kernels redis-3.2.0.gem redis-3.2.9.tar.gz
[root@localhost src]# tar zxf redis-3.2.9.tar.gz
[root@localhost src]# cd redis-3.2.9/
[root@localhost redis-3.2.9]# make && make install # 編譯并安裝
[root@localhost redis-3.2.9]# cd utils/ # 再進一個子目錄
[root@localhost utils]# ./install_server.sh # 一路回車即可
# 因為make install 只是安裝了二進制文件到系統中,并沒有啟動腳本和配置文件,所以需要通過install_server.sh來設置 redis 服務所需要的相關配置文件。
[root@localhost utils]# cd /etc/init.d/ #優化redis控制啟停方式
[root@localhost init.d]# mv redis_6379 redis
[root@localhost init.d]# chkconfig --add redis #將redis添加為系統服務
[root@localhost init.d]# systemctl restart redis #重啟服務,以測試是否生效
[root@localhost /]# vim /etc/redis/6379.conf # 修改配置文件,修改以下幾條
.......................
bind 192.168.1.10 // 設置監聽 IP 地址
daemonize yes
logfile /var/log/redis_6379.log // 指定日志文件
cluster-enabled yes // 啟動群集
cluster-config-file nodes-6379.conf // 群集配置文件
cluster-node-timeout 15000 // 節點超時時間,默認為毫秒
cluster-require-full-coverage no // 將yes改為no
port 6379 // 監聽端口
# 保存退出
主配置文件修改完畢后先別著急啟服務,因為我們需要在每一臺服務器上都要安裝 redis ,按照之前的方法安裝即可,然后修改配置文件。其中每臺服務器都要修改,只是監聽IP地址不同而已,其他的配置都一樣。所以,嘿嘿嘿~
192.168.1.20 的配置:
# 安裝完畢redis后
[root@localhost utils]# scp [email protected]:/etc/redis/6379.conf /etc/redis/
# 我們直接將第一臺的主配文件復制過來使用,修改一下監聽IP就可以了
[root@localhost utils]# vim /etc/redis/6379.conf
........................
bind 192.168.1.20
然后將剩下的幾臺服務器依次配置完畢。
回到 192.168.1.1配置:
使用腳本創建群集:
[root@localhost /]# yum -y install ruby rubygems
# 創建群集會用到ruby的一個腳本,在創建群集前,需要先安裝ruby的運行環境和客戶端,在任何一臺服務器安裝都可以
[root@localhost src]# gem install redis --version 3.2.0 # 執行這條命令需要此文件redis-3.2.0.gem,所以執行前切換到擁有此文件的目錄
Successfully installed redis-3.2.0
Parsing documentation for redis-3.2.0
Installing ri documentation for redis-3.2.0
1 gem installed
[root@localhost src]# ./redis-trib.rb create --replicas 1 \
> 192.168.1.10:6379 \
> 192.168.1.20:6379 \
> 192.168.1.30:6379 \
> 192.168.1.40:6379 \
> 192.168.1.50:6379 \
> 192.168.1.60:6379
.20:6379 192.168.1.30:6379 192.168.1.40:6379 192.168.1.50:6379 192.168.1.60:6379 >>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.10:6379
192.168.1.20:6379
192.168.1.30:6379
Adding replica 192.168.1.40:6379 to 192.168.1.10:6379
Adding replica 192.168.1.50:6379 to 192.168.1.20:6379
Adding replica 192.168.1.60:6379 to 192.168.1.30:6379
M: 4234dad1a041a91401d6e635c800581172e850dc 192.168.1.10:6379
slots:0-5460 (5461 slots) master
M: b386e4089c6f45a59d371549cda306669dd6938f 192.168.1.20:6379
slots:5461-10922 (5462 slots) master
M: c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8 192.168.1.30:6379
slots:10923-16383 (5461 slots) master
S: e772a17543efb1e11cd05d792c11319b0fbfee5f 192.168.1.40:6379
replicates 4234dad1a041a91401d6e635c800581172e850dc
S: f0a387bf5f366de0e25c575588349bd424a0ff90 192.168.1.50:6379
replicates b386e4089c6f45a59d371549cda306669dd6938f
S: abc2fef19988e6626243feff831bced36b83b642 192.168.1.60:6379
replicates c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8
Can I set the above configuration? (type 'yes' to accept): yes # 此處記得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.1.10:6379)
M: 4234dad1a041a91401d6e635c800581172e850dc 192.168.1.10:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8 192.168.1.30:6379
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: b386e4089c6f45a59d371549cda306669dd6938f 192.168.1.20:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: f0a387bf5f366de0e25c575588349bd424a0ff90 192.168.1.50:6379
slots: (0 slots) slave
replicates b386e4089c6f45a59d371549cda306669dd6938f
S: e772a17543efb1e11cd05d792c11319b0fbfee5f 192.168.1.40:6379
slots: (0 slots) slave
replicates 4234dad1a041a91401d6e635c800581172e850dc
S: abc2fef19988e6626243feff831bced36b83b642 192.168.1.60:6379
slots: (0 slots) slave
replicates c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
測試一下群集:
[root@localhost /]# redis-cli -h 192.168.1.20 -p 6379 -c
192.168.1.20:6379> set zhangsan 123123 # 創建一個值
-> Redirected to slot [12767] located at 192.168.1.30:6379 # 發現他跑另一個服務器上了
OK
192.168.1.30:6379> get zhangsan # 也是可以查到
"123123"
[root@localhost src]# ./redis-trib.rb check 192.168.1.10:6379 # 查看群集狀態
>>> Performing Cluster Check (using node 192.168.1.10:6379)
M: 4234dad1a041a91401d6e635c800581172e850dc 192.168.1.10:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8 192.168.1.30:6379
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: b386e4089c6f45a59d371549cda306669dd6938f 192.168.1.20:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: f0a387bf5f366de0e25c575588349bd424a0ff90 192.168.1.50:6379
slots: (0 slots) slave
replicates b386e4089c6f45a59d371549cda306669dd6938f
S: e772a17543efb1e11cd05d792c11319b0fbfee5f 192.168.1.40:6379
slots: (0 slots) slave
replicates 4234dad1a041a91401d6e635c800581172e850dc
S: abc2fef19988e6626243feff831bced36b83b642 192.168.1.60:6379
slots: (0 slots) slave
replicates c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
redis-3.x.x和redis-5.x.x創建群集的區別:
使用命令不一樣,redis-3.x.x使用redis-trib.rb命令,語法如下:
[root@localhost ~]#redis-trib.rb create --replicas 1 192.168.1.1:6379 ..192.168.1.6:6379
#redis-3.x.x創建群集。
[root@localhost src]# redis-trib.rb check 192.168.1.1:6379
#查看群集狀態
# redis-trib.rb不可以直接使用,需要執行以下操作才可直接使用
[root@localhost src]# cd /usr/src/redis-5.0.5/src/
[root@localhost src]# cp redis-trib.rb /usr/local/bin/
#將該腳本復制到本地../bin下,以便直接使用。若不然,需要在目錄下使用“./”執行該文件
另外有需要云服務器可以了解下創新互聯cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
文章標題:Redis群集部署及原理-創新互聯
URL鏈接:http://www.2m8n56k.cn/article26/dodjcg.html
成都網站建設公司_創新互聯,為您提供小程序開發、商城網站、靜態網站、Google、網站策劃、軟件開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯