上篇文章介紹了哨兵架構以及叢集搭建。
一、redisCluster
接着上篇文章繼續講解,前面一個linux伺服器已經有了8001和8004節點,現在繼續新增兩個linux伺服器,并且分别加上兩個節點。
安裝redis
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar -zvxf redis-5.0.7.tar.gz
# 進入redis檔案
make
make install
# 改為守護線程方式啟動
daemonize yes
安裝叢集
另兩台分别建立8002,8005,8003,8006的redis
port 8002
dir /home/keying/Desktop/redis-5.0.7/redis-cluster/8002/
#叢集啟動指令
cluster-enabled yes
cluster-config-file node-8002.conf
cluster-node-timeout 5000
# bind 127.0.0.1
# 關閉保護模式
protected-mode no
appendonly yes
(配置如上,記得分别改成自己的端口号)
可以用幫助指令:redis-cli --cluster help
這時候我們搭建了6個redis,需要檢視cluster指令幫助文檔,如何建立叢集。
指令:
src/redis-cli --cluster create --cluster-replicas 1 192.168.81.128:8001 192.168.81.129:8002 192.168.81.130:8003 192.168.81.128:8004 192.168.81.129:8005 192.168.81.130:8006
有密碼的話加上:
src/redis-cli --cluster -a keying create --cluster-replicas 1 192.168.81.128:8001 192.168.81.129:8002 192.168.81.130:8003 192.168.81.128:8004 192.168.81.129:8005 192.168.81.130:8006
當出現上面綠色字型就代表叢集搭建成功。
通過指令進入8001redis:
src/redis-cli -c -h 192.168.81.128 -p 8001
用cluster info 和 cluster nodes檢視叢集資訊
可以看到有三個master和三個slave
是以cluster_size是3,cluster_knows_nodes是6
(由上可以看出來,正常前面的會是主結點)
為了防止機器損壞,主從結點都是在不同的機器,這就是錯峰連結。
這些叢集資訊都會寫入config檔案,為什麼呢?
如果整個叢集都關閉,下次啟動叢集則是按配置檔案裡的主從關系來重新開機。
執行set:
192.168.81.128:8001> set keying 1
-> Redirected to slot [9901] located at 192.168.81.128:8002
OK
192.168.81.128:8002>
這個行為叫做“跳轉重定位”:
我們可以看到redis叢集通過取模擷取到槽位9901,9901是在8002端口的redis。
是以set完之後,直接從8001跳轉到8002
槽位的擷取:HASH_SLOT=CRC16(key)mod 16384
重新選舉:
當我們把某個主節點停機,他的從結點是會重新選舉成主節點的,大家可以自己試試。
RedisCluster由多個主從分布式叢集,高可用,分片,複制特征。這種可以水準擴充,官方推薦不超過1000個從結點。
Cluster-node-timeout:
5s逾時時間,這個不能設定太小,太小的話,直接選舉新的master,導緻多個master,防止網絡抖動連接配接異常而導緻問題。
叢集腦裂問題
Redis叢集過半機制會有腦裂問題,導緻多個master對外提供服務,一旦網絡分區恢複正常,會有大量資料丢失。可以加上redis配置:
# 寫資料最少同步slave數量
min-slave-to-write 1
注意:這個配置會影響叢集可用性,當slave要是少于1,就算叢集leader正常也不能提供服務。
(這個盡量少用,根據場景來,作為緩存,少量丢失資料并沒有影響,但是如果slave當機而導緻不可以才是不允許的)
小叢集挂了如何還能對外服務?
cluster-require-full-converage no
如果配置yes,挂了一個則不可以服務
Redis批量操作
要注意key字首保持一緻,保證落在同一個槽位。
mset {user1}:1:name keying {user1}:1:age 18
這樣的話算哈希值就隻用user1,防止keying和age落在不同的槽位,如果落在不同槽位,其中一個槽位當機,則set失敗。
如何新增叢集node呢?
Src/redis-cli --cluster add-node 192.168.0.0:8007 192.168.0.0:8001
後面8001代表存活的任意節點都可以,前面8007代表新增的節點。
這時候gossip會發送meet請求,把8007加入叢集。