redis深度剖析: 04 redis cluster

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集羣的可靠性

相關文章
相關標籤/搜索