1.數據分佈算法node
講解分佈式數據存儲的核心算法,數據分佈的算法redis
從老到新的算法演變:算法
hash算法 -> 一致性hash算法 -> redis cluster,hash slot 算法vim
1) redis cluster基本介紹api
(1)自動將數據進行分片,每一個master上放一部分數據緩存
(2)提供內置的高可用支持,部分master不可用時,仍是能夠繼續工做的網絡
在redis cluster架構下,每一個redis要放開兩個端口號,好比一個是6379,另一個就是加10000的端口號,好比16379架構
16379端口號是用來進行節點間通訊的,也就是cluster bus的東西,集羣總線。cluster bus的通訊,用來進行故障檢測,配置更新,故障轉移受權app
cluster bus用了另一種二進制的協議,主要用於節點間進行高效的數據交換,佔用更少的網絡帶寬和處理時間負載均衡
2) hash算法(最老土,有不少弊端)
計算哈希值, 拿哈希值和master數量取模, 得出取模結果,發佈到對應的master上
`最大的弊端,只要一臺master宕機,基本上全部的key都會所有失效
3) 一致性hash算法(自動緩存遷移)+ 虛擬節點(自動負載均衡)
一致性hash算法:
若是master宕掉一臺: 只會丟失 1/N 的數據
可能會有一個緩存熱點的問題,某個master上的數據特別多
爲了解決這個問題,引入了虛擬節點,實現負載均衡:
4) redis cluster的hash slot算法:
redis cluster有固定的16384個hash slot,對每一個key計算CRC16值,而後對16384取模,能夠獲取key對應的hash slot
redis cluster中每一個master都會持有部分slot,好比有3個master,那麼可能每一個master持有5000多個hash slot
hash slot讓node的增長和移除很簡單,增長一個master,就將其餘master的hash slot移動部分過去,減小一個master,就將它的hash slot移動到其餘master上去
移動hash slot的成本是很是低的
客戶端的api,能夠對指定的數據,讓他們走同一個hash slot,經過hash tag來實現
經過hash slot 可讓數據分佈儘可能的均勻
某臺master宕機以後, redis cluster 會在最短的時間把宕機的master 的hash slot平分給正常運行的master上
2.redis cluster集羣搭建(redis 5.0)
這裏說一下redis5.0 以後,集羣搭建變的簡單許多,直接能夠經過redis-cli 搭建集羣
配置文件說明:
# redis後臺運行 daemonize yes # 綁定的主機端口 bind 127.0.0.1 # 數據存放目錄 dir /usr/local/redis-cluster/data/redis-6379 # 進程文件 pidfile /var/run/redis-cluster/${自定義}.pid # 日誌文件 logfile /usr/local/redis-cluster/log/${自定義}.log # 端口號 port 6379 # 開啓集羣模式,把註釋#去掉 cluster-enabled yes # 集羣的配置,配置文件首次啓動自動生成 cluster-config-file /usr/local/redis-cluster/conf/${自定義}.conf # 請求超時,設置15秒 cluster-node-timeout 15000 # aof日誌開啓,有須要就開啓,它會每次寫操做都記錄一條日誌 appendonly yes |
redis cluster集羣,要求至少3個master,每一個master建議至少給一個slave
正式環境下建議都是在6臺機器上去搭建,至少3臺機器
保證,每一個master都跟本身的slave不在同一臺機器上
1) 配置redis
一、首先正常安裝一個redis
[root@localhost ~]# tar zxf redis-5.0.5.tar.gz
[root@localhost ~]# cd redis-5.0.5
[root@localhost redis-3.2.3]# make&& make install
[root@localhost redis-3.2.3]# cd utils/
[root@localhost utils]# ./install_server.sh
#按照默認位置便可(回車下去就好)
二、修改主配置文件
#cp /etc/redis/6379.conf /etc/redis/redis.conf
#vim /etc/redis/redis.conf
daemonize yes
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf . //這個編號最好是等於你的端口號
cluster-node-timeout 15000
appendonly yes
三、用6份配置文件啓動6個實例
#mkdir -p /redis/{7000,7001,7002,7003,7004,7005}
#cp /etc/redis/redis.conf /redis/7000/
#cp /etc/redis/redis.conf /redis/7001/
#cp /etc/redis/redis.conf /redis/7002/
#cp /etc/redis/redis.conf /redis/7003/
#cp /etc/redis/redis.conf /redis/7004/
#cp /etc/redis/redis.conf /redis/7005/
四、分別修改6個配置文件
#vim /redis/7001/redis.conf
port 7001
cluster-config-file nodes-7001.conf .
#vim /redis/7002/redis.conf
port 7002
cluster-config-file nodes-7002.conf .
#vim /redis/7003/redis.conf
port 7003
cluster-config-file nodes-7003.conf .
#vim /redis/7004/redis.conf
port 7004
cluster-config-file nodes-7004.conf
#vim /redis/7005/redis.conf
port 7005
cluster-config-file nodes-7005.conf
五、啓動服務
#redis-server /redis/7000/redis.conf
#redis-server /redis/7001/redis.conf
#redis-server /redis/7002/redis.conf
#redis-server /redis/7003/redis.conf
#redis-server /redis/7004/redis.conf
#redis-server /redis/7005/redis.conf
啓動後查看是否啓動成功
#netstat -anput | grep redis
2) 集羣配置
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
登陸集羣驗證便可:
127.0.0.1:7000> CLUSTER NODES
3.redis cluster經過master水平擴容,來提升吞吐量
1) 建立新的redis
兩個: 一個作master 一個作 slave
建立配置文件:
#mkdir -p /redis/{7006,7007}
#cp /etc/redis/redis.conf /redis/7006/
#cp /etc/redis/redis.conf /redis/7007/
#vim /redis/7006/redis.conf
port 7006
cluster-config-file nodes-7006.conf .
#vim /redis/7007/redis.conf
port 7007
cluster-config-file nodes-7007.conf .
啓動:
#redis-server /redis/7006/redis.conf
#redis-server /redis/7007/redis.conf
2) 配置7006爲集羣主節點
#redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
127.0.0.1:7000 是已經存在節點
加入成功後,集羣如今有 7 臺機器, 4個master 3 個slave
3) 咱們爲新節點手工分配hash槽
隨便找一臺主節點,讓它進行從新分片操做
# redis-cli --cluster reshard 127.0.0.1:7000
4) 配置7007加入集羣,成爲7006的從節點
加入集羣:
#redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000
咱們須要執行replicate命令來指定當前節點(從節點)的主節點id爲哪一個:
首先登陸 7007:
# redis-cli -p 7007
查看集羣狀態(目前應該是5個master,3個slave),記錄7006的id:
127.0.0.1:7007> cluster nodes 33206e9384297092b5b8a85c944f3564e5d983d7 127.0.0.1:7000@18003 master - 0 1544885646000 3 connected 10923-16383 60a0f7ced303374d8b36e7aa219cbcd4ff5b0caf 127.0.0.1:7003@18005 slave 662809cf2d5bb138912dea7fb1e452f6e0f149da 0 1544885647000 1 connected fea53768189af3e3e4849038af13607f59ec84b0 127.0.0.1:7001@18007 master - 0 1544885647003 7 connected 0-999 71404f4e815c2e315926ac788389120f82029958 127.0.0.1:7007@18008 myself,master - 0 1544885643000 0 connected 7b5f6aa6dcb4d5aca4a94e57ddeea6971b38bba6 127.0.0.1:7002@18002 master - 0 1544885646000 2 connected 5461-10922 662809cf2d5bb138912dea7fb1e452f6e0f149da 127.0.0.1:7006@18001 master - 0 1544885648015 1 connected 1000-5460 b0db47b7bbd3694596f293aa522488882e8fe647 127.0.0.1:7004@18004 slave 33206e9384297092b5b8a85c944f3564e5d983d7 0 1544885649022 3 connected 194a31057d2e098483bcd2ad01e1bba6a1af6a7d 127.0.0.1:7005@18006 slave 7b5f6aa6dcb4d5aca4a94e57ddeea6971b38bba6 0 1544885646000 2 connected |
配置7007做爲7006的從節點:
# CLUSTER REPLICATE 662809cf2d5bb138912dea7fb1e452f6e0f149da
至此,咱們擴展redis集羣已經實現
這裏說一個slave冗餘的概念:
就是一個master下掛載兩個或多個slave
能更大程度上保證redis集羣的可靠性