本篇文章給大家介紹一下redis中的cluster集群,看看tcp端口、數據分片,了解一下如何利用docker搭建一個三主三從的redis集群。
redis Cluster (Redis集群)
Redis Cluster是Redis的分布式實現。 當我們傳輸數據到 Redis Cluster,數據會自動分片,存儲到各個Redis節點上?!鞠嚓P推薦:redis】
Redis Cluster相對于單點Redis,可以在一些節點出現故障或無法通信時繼續運行。但是,如果服務器出現較大故障(例如,超過一半以上的服務器不可用),群集將停止運行。
Redis Cluster TCP端口
每個Redis群集節點都需要打開兩個TCP連接。 一是用于服務客戶端的常規TCP端口,默認為6379。 第二個端口用于群集總線,默認設置16379,二進制協議的節點到節點通信通道。節點利用群集總線用于故障檢測,配置更新,故障轉移授權等。
- 客戶端永遠不要嘗試與群集總線端口進行通信,而應始終與普通的Redis命令端口進行通信,但是請確保同時打開防火墻中的兩個端口,否則Redis群集節點將無法進行通信。命令端口和集群總線端口的偏移量是固定的,并且始終為10000。
- 如果沒有同時打開兩個TCP端口,則群集將無法正常工作。
- 集群總線使用不同的二進制協議進行節點到節點的數據交換,它更適合于用很少的帶寬和處理時間在節點之間交換信息。
Redis Cluster數據分片
Redis Cluster不使用一致性哈希,而是使用一種叫哈希槽hash_slot的東西。
Redis群集中有16384個哈希槽,當我們在Redis中存儲一對Key-Value時,要計算給定Key的哈希槽。方法是先計算Key的CRC16,然后對計算出的結果取模16384:
hash_slot = CRC16(key) mod 16384
Redis群集中的每個Redis節點都負責哈希槽的子集,因此,如果有一個包含3個節點的群集,其中:
- 節點A包含從0到5500的哈希槽。
- 節點B包含從5501到11000的哈希槽。
- 節點C包含從11001到16383的哈希槽。
這樣可以輕松添加和刪除集群中的節點。例如,如果我想添加一個新節點D,則需要將一些哈希槽從節點A,B,C移到D。類似地,如果我想從群集中刪除節點A,則只需移動A所服務的哈希槽到B和C。當節點A為空時,我可以將其從群集中完全刪除。
因為將哈希槽從一個節點移動到另一個節點不需要停止操作,所以添加或刪除或者更改節點持有的哈希槽的占比不需要任何停機時間。
接下來我們利用docker搭建一個三主三從的Redis集群。
使用Docker搭建RedisCluster
Redis配置
port?${PORT}???????????????????????????????????????##節點端口 protected-mode?no??????????????????????????????????##開啟集群模式 cluster-enabled?yes????????????????????????????????##cluster集群模式 cluster-config-file?nodes.conf?????????????????????##集群配置名 cluster-node-timeout?5000??????????????????????????##超時時間 cluster-announce-ip?192.168.1.XX???????????????????##實際為各節點網卡分配ip??先用一個ip代替 cluster-announce-port?${PORT}??????????????????????##節點映射端口 cluster-announce-bus-port?1${PORT}?????????????????##節點總線端口 appendonly?yes?????????????????????????????????????##持久化模式
創建自定義network
docker?network?create?redis-net
自定義路徑
mkdir?-p?/usr/redis_cluster cd?/usr/redis_cluster
在自定義路徑下生成成conf和data目標,并生成配置信息
for?port?in?`seq?6001?6006`;?do ????mkdir?-p?./${port}/conf ????touch?./${port}/conf/redis.conf? ????mkdir?-p?./${port}/data? ????echo?"port?${port}"?>>./${port}/conf/redis.conf ????echo?"protected-mode?no"?>>./${port}/conf/redis.conf ????echo?"cluster-enabled?yes"?>>./${port}/conf/redis.conf ????echo?"cluster-config-file?nodes.conf"?>>./${port}/conf/redis.conf ????echo?"cluster-node-timeout?5000"?>>./${port}/conf/redis.conf ????echo?"cluster-announce-ip?192.168.1.XX"?>>./${port}/conf/redis.conf ????echo?"cluster-announce-port?${port}"?>>./${port}/conf/redis.conf ????echo?"cluster-announce-bus-port?1${port}"?>>./${port}/conf/redis.conf ????echo?"appendonly?yes"?>>./${port}/conf/redis.conf done
- cluster-announce-ip 192.168.1.XX 中的IP必須是容器間通信的ip,之后可以在之前新增的network中查看。
- 共生成6個文件夾,從6001到6006,每個文件夾下包含data和conf文件夾,同時conf里面有redis.conf配置文件。
啟動Redis容器
for?port?in?`seq?6001?6006`;?do? ??docker?run?-d?--privileged=true?-p?${port}:${port}?-p?1${port}:1${port} ??-v?$PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf? ??-v?$PWD/${port}/data:/data? ??--restart?always?--name?redis-${port}?--net?redis-net? ??redis:5.0.5?redis-server?/usr/local/etc/redis/redis.conf;? done
啟動集群
#?進入任意Redis容器 docker?exec?-it?redis-6001?/bin/bash #?初始化Redis集群命令 redis-cli?--cluster?create?172.19.0.2:6601?172.19.0.3:6602?172.19.0.4:6603?172.19.0.5:6604?172.19.0.6:6605?172.19.0.7:6606?--cluster-replicas?1
- 創建成功后我們可以使用redis-cli命令連接到其中一個Redis服務.
#?單機模式啟動 redis-cli?-h?127.0.0.1?-p?6001 #?集群模式啟動 redis-cli?-c?-h?127.0.0.1?-p?6001
- 之后通過cluster nodes命令可以查看節點信息,發現符合3主3從的預期
參考文檔
更多編程相關知識,請訪問:redis??!