Redis(六)叢集
Redis叢集
1.1 存在的問題
-
容量不夠Redis如何擴容
-
併發寫操作,Redis如何分攤
-
當主機或者從機宕機,薪火相傳、反客為主等主從模式都會導致ip發生變化,應用程式中的配置需要對應修改主機地址以及埠號等資訊。
主機代理方式
主機代理方式指的是不需要客戶端去尋找需要的服務,而是隻暴露一個代理伺服器,由代理伺服器轉發服務請求,並且代理伺服器也可以向其他服務的主機一樣,新增一個從機防止主機宕機。
類似nginx以及前端的跨域代理,這樣做的缺點是總共需要八臺伺服器,後期維護也很不方便
無中心化叢集方式
無中心化的叢集方式,則是任意的服務都可以作為叢集的入口,並且各個服務之間能夠相互連通呼叫,同樣的功能無中心化叢集配置只需要六臺伺服器即可實現了。
1.2 簡介
Redis叢集實現了對Redis的水平擴容,即總共啟動N個Redis節點,將整個資料庫分佈儲存在這N個節點中,每個節點儲存的資料佔總的資料的1/N。
Redis叢集通過分割槽(partition)
來提供一定程度的可用性(aviability)
,即使叢集中有一部分節點失效無法進行通訊,redis叢集也能夠繼續處理請求命令。
1.3 Redis叢集的搭建
刪除原有的RDB檔案以及其他的配置檔案
[root@hadoop100 myredis]# rm -rf redis6381.conf redis6382.conf
配置叢集節點
6380
include /myredis/redis.conf pidfile "/var/run/redis_6380.pid" port 6380 dbfilename "dump6380.rdb" cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 15000
製作6個例項:6381 6382 6383 6384 6385
81為80的從機,83為82的,85為84的
[root@hadoop100 myredis]# cp redis6380.conf redis6381.conf [root@hadoop100 myredis]# cp redis6380.conf redis6382.conf [root@hadoop100 myredis]# cp redis6380.conf redis6383.conf [root@hadoop100 myredis]# cp redis6380.conf redis6384.conf [root@hadoop100 myredis]# cp redis6380.conf redis6385.conf [root@hadoop100 myredis]# ls redis6380.conf redis6381.conf redis6382.conf redis6383.conf redis6384.conf redis6385.conf redis.conf sentinel.conf
然後修改裡面的埠號、RDB檔名稱以及叢集節點名,這裡就不贅述了
啟動redis
[root@hadoop100 myredis]# ls /var/lib/redis/
dump6380.rdb dump6381.rdb dump6382.rdb dump.rdb nodes-6379.conf nodes-6381.conf nodes-6382.conf nodes-6383.conf nodes-6384.conf nodes-6385.conf
[root@hadoop100 myredis]# ps -ef | grep redis
root 2476 1 0 11月08 ? 00:01:37 redis-server 127.0.0.1:6378
polkitd 16606 16545 0 13:04 ? 00:00:42 redis-server *:6379
root 121480 1 0 23:03 ? 00:00:00 redis-server 127.0.0.1:6380 [cluster]
root 121628 1 0 23:03 ? 00:00:00 redis-server 127.0.0.1:6381 [cluster]
root 121743 1 0 23:03 ? 00:00:00 redis-server 127.0.0.1:6382 [cluster]
root 121814 1 0 23:03 ? 00:00:00 redis-server 127.0.0.1:6383 [cluster]
root 121885 1 0 23:03 ? 00:00:00 redis-server 127.0:6384 [cluster]
root 121957 1 0 23:03 ? 00:00:00 redis-server 127.0.0.1:6385 [cluster]
root 126306 21149 0 23:06 pts/4 00:00:00 grep --color=auto redis
然後可以在生成rdb檔案的目錄下發現生成的叢集節點配置檔案
[root@hadoop100 myredis]# ls /var/lib/redis/
dump6380.rdb dump6381.rdb dump6382.rdb dump.rdb nodes-6379.conf nodes-6381.conf nodes-6382.conf nodes-6383.conf nodes-6384.conf nodes-6385.conf
將六個節點合成叢集
切換到安裝目錄下的src
執行合成叢集命令
redis-cli --cluster create --cluster-replacas 1 X X X X X X
這裡不能使用127.0.0.1,需要使用真實的IP地址
主從的分配原則儘量保證兩個伺服器執行在不同的IP地址
--cluster-replacas 1表示使用一臺主機一個從機的模式
使用叢集方式連線 redis-cli -c -p
使用任何一個埠號都可以連線到叢集
cluster nodes檢視叢集資訊
1.4 Redis叢集slots插槽
在上面合成叢集的命令執行後,會有一行All 16384 slots covered,slots即是redis插槽,叢集使用CRCkey(16)%16384來計算鍵key屬於哪一個插槽,叢集的每一個節點只負責一部分插槽,如上面的幾個主機分別負責0-5460,5461-10922,10923-16383插槽
在叢集中錄入值
在redis每次錄入、查詢鍵值,redis都會計算出該key對應的插槽,如果不是當前客戶端對應的插槽則會報錯並告知應前往對應的插槽的redis例項地址和埠。
redis-cli客戶端提供了 -c引數 實現了自動重定向。
redis-cli -c -p 6379
不在同一個插槽的鍵值,不能夠使用mget、mset等操作
在叢集中以組的形式錄入多個值 mset k1{g1} v1 k2{g2} v2
如上面所說,插入多個值的時候由於多個值對應的插槽不同,因此不能進行同時插入,redis提供了一種分組的形式來錄入多個值,即將多個值宣告為一個組,在計算插槽的時候按照組的名稱計算,這樣就實現了插入多個值
mset name{user} lucy age{user} 20
cluster keyslot 查詢值對應的插槽
cluster countkeysinslot 查詢key值對應插槽中的值的個數
注意只能檢視當前客戶端的插槽
cluster getkeysinslot 4847 10 返回10個指定key插槽中的值
1.5 叢集的故障修復
和哨兵模式相同,主機宕機後,經過設定的延時時間15000,從機就變為了主機,這時候主機再連線會變為原來從機的從機。
主從伺服器全部宕機的情況
如果某一段插槽的主從全部掛掉了,而cluster-require-full-coverage
為yes,那麼整個叢集都會掛掉。如果cluster-require-full-coverage
為no,則僅僅是該主機對應的插槽不能使用。
1.6 叢集的Jedis開發
即使連線的不是主機,redis也會自動進行主從切換,實現讀寫分離
無中心化,能夠實現無論是哪個主機上寫的資料,其他從機上都能讀到
叢集類也可以通過一個HostAndPort的集合建立,這樣做也可以防止連線的ip宕機導致無法連線叢集。
1.7 Redis集合的不足
多鍵操作不支援,多鍵的Redis事務是不被支援的,lua指令碼(主要用於redis的悲觀鎖效果)也不支援。