相信大家通過閱讀博文:非關(guān)系型數(shù)據(jù)庫(NoSQL)——Redis安裝及部署詳解
可以初步的認(rèn)識(shí)Redis數(shù)據(jù)庫的優(yōu)勢及其安裝方法,今天我們來認(rèn)識(shí)一下Redis數(shù)據(jù)庫怎么橫向擴(kuò)展,以滿足更大的訪問需求。
Redis 3.0版本以上開始支持cluster,采用的是hash slot(hash 槽),可以將多個(gè)Redis實(shí)例整個(gè)在一起,形成一個(gè)群集,也就是將數(shù)據(jù)分散到群集的多個(gè)機(jī)器上。
Redis Cluster是一個(gè)無中心的結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都保存數(shù)據(jù)和整個(gè)群集的狀態(tài)。每個(gè)節(jié)點(diǎn)都會(huì)保存其他節(jié)點(diǎn)的信息,知道其他節(jié)點(diǎn)鎖負(fù)責(zé)的槽,并且會(huì)與其他節(jié)點(diǎn)定時(shí)發(fā)送心跳信息,能夠及時(shí)感知群集中異常的節(jié)點(diǎn)。如圖:
當(dāng)客戶端向群集中任一節(jié)點(diǎn)發(fā)送與數(shù)據(jù)庫鍵有關(guān)的命令是,接受命令的節(jié)點(diǎn)會(huì)計(jì)算出命令要處理的數(shù)據(jù)庫鍵屬于哪個(gè)槽,并檢查這個(gè)槽是否指派給了自己。如果鍵所在的槽正好指派給了當(dāng)前節(jié)點(diǎn),那么節(jié)點(diǎn)直接執(zhí)行這個(gè)命令;如果鍵所在的槽并沒有指派給當(dāng)前節(jié)點(diǎn),那么節(jié)點(diǎn)會(huì)向客戶端返回一個(gè)MOVED錯(cuò)誤,指引客戶端轉(zhuǎn)向正確的節(jié)點(diǎn),并再次發(fā)送之前想要執(zhí)行的命令。
群集角色有Master和Slave。Master之間分配slots,一共有16384個(gè)slot。Slave向它指定的Master同步數(shù)據(jù),實(shí)現(xiàn)備份。當(dāng)其中一個(gè)Master無法提供服務(wù)時(shí),該Master的Slave將提升為Master。以保證群集鍵slot的完整性。當(dāng)其中的某一個(gè)Master和它的Slave都失效,就會(huì)導(dǎo)致slot不完整,群集失效,這是就需要人工參與修復(fù)。
群集搭建好后,群集中的每個(gè)節(jié)點(diǎn)都會(huì)定期地想其他節(jié)點(diǎn)發(fā)送PING消息,如果接收PING消息的節(jié)點(diǎn)沒有在規(guī)定的時(shí)間內(nèi)返回PONG消息,那么發(fā)送PING消息的節(jié)點(diǎn)就會(huì)將其標(biāo)記為疑似下線(PFAIL)。各個(gè)節(jié)點(diǎn)會(huì)通過互相發(fā)送消息的方式來交換群集中各個(gè)節(jié)點(diǎn)的狀態(tài)信息。如果在一個(gè)群集里,半數(shù)以上的主節(jié)點(diǎn)都將某個(gè)節(jié)點(diǎn) X 報(bào)告為疑似下線,那么這個(gè)主節(jié)點(diǎn) X 將被標(biāo)記為已下線(FAIL),同時(shí)會(huì)向群集廣播一條關(guān)于主節(jié)點(diǎn) X 的FAIL消息,所有收到這條FAIL消息的節(jié)點(diǎn)都會(huì)立即將主節(jié)點(diǎn) X 標(biāo)記為已下線。
當(dāng)需要減少或增加群集中的機(jī)器時(shí),我們需要將已經(jīng)指派給某個(gè)節(jié)點(diǎn)(源節(jié)點(diǎn))的槽改為指派給另一個(gè)節(jié)點(diǎn)(目標(biāo)節(jié)點(diǎn)),并且將相關(guān)槽所屬的鍵值對從源節(jié)點(diǎn)移動(dòng)到目標(biāo)節(jié)點(diǎn)。
Redis群集的重新分片操作是由Redis的群集管理軟件redis-trib負(fù)責(zé)執(zhí)行的,不支持自動(dòng)的分片,而且需要自己計(jì)算從哪些節(jié)點(diǎn)上遷移多少Slot。在重新分片的過程中,群集不需要下線,并且源節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)都可以繼續(xù)處理命令請求。
架構(gòu)細(xì)節(jié)
1.所有的redis節(jié)點(diǎn)彼此互聯(lián),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬;
2.節(jié)點(diǎn)的失效在群集中超過半數(shù)的主節(jié)點(diǎn)檢測失效才失效;
3.客戶端與redis節(jié)點(diǎn)直連,不需要中間代理層,客戶端不需要連接群集所有節(jié)點(diǎn),連接群集中任何一個(gè)可用節(jié)點(diǎn)即可;
4.redis-cluster把所有的物理節(jié)點(diǎn)映射到【0-16383】slot上,cluster 負(fù)責(zé)維護(hù)node<->slot<->key;
選舉過程是群集中所有master參與,如果半數(shù)以上master節(jié)點(diǎn)與當(dāng)前master節(jié)點(diǎn)通信超時(shí),認(rèn)為當(dāng)前master節(jié)點(diǎn)掛掉。如圖:
以下兩種情況出現(xiàn)則為群集不可用:
- 如果群集任意master掛掉,且當(dāng)前master沒有slave,則群集進(jìn)入fail狀態(tài),也可以理解為群集的slot映射【0-16383】不完整時(shí)進(jìn)入的fail狀態(tài);
- 如果群集中出現(xiàn)半數(shù)的master掛掉,無論是否有slave,群集都進(jìn)入fail狀態(tài);
當(dāng)群集不可用時(shí),所有對群集的操作都不可用,收到((error)CLUSTERDOWN The cluster is down)錯(cuò)誤。
默認(rèn)情況下,每個(gè)群集的節(jié)點(diǎn)都使用兩個(gè)TCP端口,一個(gè)是6379,一個(gè)是16379:
理解了Redis群集原理之后,搭建redis群集就變得非常簡單了。本次實(shí)驗(yàn)采用6臺(tái)服務(wù)器搭建Redis群集,其中3臺(tái)為master,3臺(tái)為salve。6臺(tái)服務(wù)器的IP地址為192.168.1.1/24——192.168.1.6/24,服務(wù)器均為centos 7系統(tǒng)。這里就不上傳實(shí)驗(yàn)拓補(bǔ)圖了。
Redis群集部署的具體操作步驟主要分為:
關(guān)于如何搭建Redis服務(wù)器及其軟件包獲取方式均可參考博文:非關(guān)系型數(shù)據(jù)庫(NoSQL)——Redis安裝及部署詳解
按照博文安裝即可,6臺(tái)服務(wù)器都需安裝Redis,安裝完成之后每臺(tái)服務(wù)器都需要修改為本機(jī)真實(shí)的IP地址,取消回環(huán)地址(127.0.0.1),具體修改內(nèi)容如下:
[root@localhost ~]# vim /etc/redis/6379.conf
bind 192.168.1.1 //改為本機(jī)的真是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
//關(guān)于群集這幾條默認(rèn)是存在,只不過注釋了,取消注釋即可!
[root@localhost ~]# /etc/init.d/redis_6379 restart
//重啟redis服務(wù)
Stopping ...
Redis stopped
Starting Redis server...
[root@localhost ~]# netstat -anpt | grep 6379
tcp 0 0 192.168.1.1:6379 0.0.0.0:* LISTEN 6497/redis-server 1
tcp 0 0 192.168.1.1:16379 0.0.0.0:* LISTEN 6497/redis-server 1
tcp 0 0 127.0.0.1:6379 127.0.0.1:43304 TIME_WAIT -
//6379端口和16379端口都在監(jiān)聽
第一個(gè)redis服務(wù)器已經(jīng)搭建完畢,剩下5個(gè)一樣的做法,只是配置文件中都是自身的IP地址,別弄混了!
創(chuàng)建群集要用到ruby的一個(gè)腳本,在創(chuàng)建群集之前,需要先安裝ruby的運(yùn)行環(huán)境和ruby的Redis客戶端,該操作在其中一臺(tái)服務(wù)器進(jìn)行即可。gem命令是提前下載的redis-3.2.0 gem軟件包提供的,直接上傳服務(wù)器即可使用!
gem軟件包網(wǎng)盤鏈接:https://pan.baidu.com/s/1Fx7YI-ZwZoHOPm13HYeFKw
提取碼:cj0x
[root@localhost ~]# yum -y install ruby rubygems
//安裝ruby的運(yùn)行環(huán)境
[root@localhost ~]# gem install redis --version 3.2.0
Successfully installed redis-3.2.0
Parsing documentation for redis-3.2.0
Installing ri documentation for redis-3.2.0
1 gem installed
//安裝ruby的Redis客戶端工具——gem命令
使用腳本創(chuàng)建群集:
[root@localhost ~]# cd /usr/src/redis-3.2.9/src
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 192.168.1.4:6379 192.168.1.5:6379 192.168.1.6:6379
………… //省略部分內(nèi)容
Can I set the above configuration? (type 'yes' to accept): yes
………… //省略部分內(nèi)容
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
//創(chuàng)建群集完成
[root@localhost src]# ./redis-trib.rb check 192.168.1.1:6379
//查看群集狀態(tài)(可以清楚的看到哪臺(tái)主機(jī)是master、哪臺(tái)主機(jī)時(shí)salve)
>>> Performing Cluster Check (using node 192.168.1.1:6379)
M: afb2a0876b9c4c1c19e2bc492e398765bed0a311 192.168.1.1:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 00ed4b0da4f0444c7e2a54a44c2060dd2c51a19a 192.168.1.4:6379
slots: (0 slots) slave
replicates afb2a0876b9c4c1c19e2bc492e398765bed0a311
S: 081d87a0d26895605e4c237c5429d3ae6e01f7b2 192.168.1.5:6379
slots: (0 slots) slave
replicates 050d71e6ad9bbf0a2a90b743d5a9bb9fb77052bb
S: 00bf8cb3a48a696d9bfc4b124234335633dc14d0 192.168.1.6:6379
slots: (0 slots) slave
replicates bec4c3401ced5a43439568f5530d79dd2a911512
M: 050d71e6ad9bbf0a2a90b743d5a9bb9fb77052bb 192.168.1.2:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: bec4c3401ced5a43439568f5530d79dd2a911512 192.168.1.3:6379
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
登錄群集,設(shè)置鍵值測試,需要用到“-c”參數(shù)來激活群集,具體操作如下:
[root@localhost ~]# redis-cli -h 192.168.1.1 -p 6379 -c
192.168.1.1:6379> set k1 1
-> Redirected to slot [12706] located at 192.168.1.3:6379
OK
192.168.1.3:6379> get k1
"1"
數(shù)據(jù)自動(dòng)同步其redis服務(wù)器上,查看效果:
[root@localhost ~]# redis-cli -h 192.168.1.5 -p 6379 -c
192.168.1.5:6379> get k1
-> Redirected to slot [12706] located at 192.168.1.3:6379
"1"
//提示是從192.168.1.3服務(wù)器上同步過來的
實(shí)驗(yàn)完成!!!
———————— 本文至此結(jié)束,感謝閱讀 ————————
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。