相信你們經過閱讀博文:非關係型數據庫(NoSQL)——Redis安裝及部署詳解
能夠初步的認識Redis數據庫的優點及其安裝方法,今天咱們來認識一下Redis數據庫怎麼橫向擴展,以知足更大的訪問需求。node
Redis 3.0版本以上開始支持cluster,採用的是hash slot(hash 槽),能夠將多個Redis實例整個在一塊兒,造成一個羣集,也就是將數據分散到羣集的多個機器上。redis
Redis Cluster是一個無中心的結構,每一個節點都保存數據和整個羣集的狀態。每一個節點都會保存其餘節點的信息,知道其餘節點鎖負責的槽,而且會與其餘節點定時發送心跳信息,可以及時感知羣集中異常的節點。如圖:
數據庫
當客戶端向羣集中任一節點發送與數據庫鍵有關的命令是,接受命令的節點會計算出命令要處理的數據庫鍵屬於哪一個槽,並檢查這個槽是否指派給了本身。若是鍵所在的槽正好指派給了當前節點,那麼節點直接執行這個命令;若是鍵所在的槽並無指派給當前節點,那麼節點會向客戶端返回一個MOVED錯誤,指引客戶端轉向正確的節點,並再次發送以前想要執行的命令。vim
羣集角色有Master和Slave。Master之間分配slots,一共有16384個slot。Slave向它指定的Master同步數據,實現備份。當其中一個Master沒法提供服務時,該Master的Slave將提高爲Master。以保證羣集鍵slot的完整性。當其中的某一個Master和它的Slave都失效,就會致使slot不完整,羣集失效,這是就須要人工參與修復。centos
羣集搭建好後,羣集中的每一個節點都會按期地想其餘節點發送PING消息,若是接收PING消息的節點沒有在規定的時間內返回PONG消息,那麼發送PING消息的節點就會將其標記爲疑似下線(PFAIL)。各個節點會經過互相發送消息的方式來交換羣集中各個節點的狀態信息。若是在一個羣集裏,半數以上的主節點都將某個節點 X 報告爲疑似下線,那麼這個主節點 X 將被標記爲已下線(FAIL),同時會向羣集廣播一條關於主節點 X 的FAIL消息,全部收到這條FAIL消息的節點都會當即將主節點 X 標記爲已下線。ruby
當須要減小或增長羣集中的機器時,咱們須要將已經指派給某個節點(源節點)的槽改成指派給另外一個節點(目標節點),而且將相關槽所屬的鍵值對從源節點移動到目標節點。服務器
Redis羣集的從新分片操做是由Redis的羣集管理軟件redis-trib負責執行的,不支持自動的分片,並且須要本身計算從哪些節點上遷移多少Slot。在從新分片的過程當中,羣集不須要下線,而且源節點和目標節點均可以繼續處理命令請求。架構
架構細節
1.全部的redis節點彼此互聯,內部使用二進制協議優化傳輸速度和帶寬;
2.節點的失效在羣集中超過半數的主節點檢測失效才失效;
3.客戶端與redis節點直連,不須要中間代理層,客戶端不須要鏈接羣集全部節點,鏈接羣集中任何一個可用節點便可;
4.redis-cluster把全部的物理節點映射到【0-16383】slot上,cluster 負責維護node<->slot<->key;tcp
選舉過程是羣集中全部master參與,若是半數以上master節點與當前master節點通訊超時,認爲當前master節點掛掉。如圖:
ide
如下兩種狀況出現則爲羣集不可用:
- 若是羣集任意master掛掉,且當前master沒有slave,則羣集進入fail狀態,也能夠理解爲羣集的slot映射【0-16383】不完整時進入的fail狀態;
- 若是羣集中出現半數的master掛掉,不管是否有slave,羣集都進入fail狀態;
當羣集不可用時,全部對羣集的操做都不可用,收到((error)CLUSTERDOWN The cluster is down)錯誤。
默認狀況下,每一個羣集的節點都使用兩個TCP端口,一個是6379,一個是16379:
理解了Redis羣集原理以後,搭建redis羣集就變得很是簡單了。本次實驗採用6臺服務器搭建Redis羣集,其中3臺爲master,3臺爲salve。6臺服務器的IP地址爲192.168.1.1/24——192.168.1.6/24,服務器均爲centos 7系統。這裏就不上傳實驗拓補圖了。
Redis羣集部署的具體操做步驟主要分爲:
關於如何搭建Redis服務器及其軟件包獲取方式都可參考博文:非關係型數據庫(NoSQL)——Redis安裝及部署詳解
按照博文安裝便可,6臺服務器都需安裝Redis,安裝完成以後每臺服務器都須要修改成本機真實的IP地址,取消迴環地址(127.0.0.1),具體修改內容以下:
[root@localhost ~]# vim /etc/redis/6379.conf bind 192.168.1.1 //改成本機的真是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 //關於羣集這幾條默認是存在,只不過註釋了,取消註釋便可! [root@localhost ~]# /etc/init.d/redis_6379 restart //重啓redis服務 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端口都在監聽
第一個redis服務器已經搭建完畢,剩下5個同樣的作法,只是配置文件中都是自身的IP地址,別弄混了!
建立羣集要用到ruby的一個腳本,在建立羣集以前,須要先安裝ruby的運行環境和ruby的Redis客戶端,該操做在其中一臺服務器進行便可。gem命令是提早下載的redis-3.2.0 gem軟件包提供的,直接上傳服務器便可使用!
gem軟件包網盤連接:https://pan.baidu.com/s/1Fx7YI-ZwZoHOPm13HYeFKw
提取碼:cj0x
[root@localhost ~]# yum -y install ruby rubygems //安裝ruby的運行環境 [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命令
使用腳本建立羣集:
[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 ………… //省略部份內容 Can I set the above configuration? (type 'yes' to accept): yes ………… //省略部份內容 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. //建立羣集完成
[root@localhost src]# ./redis-trib.rb check 192.168.1.1:6379 //查看羣集狀態(能夠清楚的看到哪臺主機是master、哪臺主機時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.
登陸羣集,設置鍵值測試,須要用到「-c」參數來激活羣集,具體操做以下:
[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"
數據自動同步其redis服務器上,查看效果:
[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服務器上同步過來的
實驗完成!!!
———————— 本文至此結束,感謝閱讀 ————————