一:安裝Redis和配置Redis
Redis版本是:redis-5.0.14.cluster
如上圖所示,一共是三個master(redis1,redis2,redis3),三個從節點(redis1-1,redis3-1,redis2-1,)。六個節點端口號分別為:7001、7002、7003、7004、7005、7006。
修改Redis.conf,如下所示:
# 端口號,每個目錄都不同 port 7001 # 開啟集群模式 cluster-enabled yes #節點超時實際,單位毫秒 設定節點失聯時間,超過該時間(毫秒),集群自動進行主從切換。 cluster-node-timeout 5000 #集群內部配置文件(默認為 nodes-6379.conf) cluster-config-file nodes.conf # 啟動 AOF appendonly yes # 默認是no,改成 yes,意思是是否要后台啟動。 daemonize yes
這時候進入redis1目錄 執行命令,redis啟動,然后在關閉他,我就簡單粗暴了, ps -ef|grep redis 找到redis進程 ,kill -9 進程id。這步啟動然后關閉,其目的是為生成一些文件。
redis-server redis.conf ps -ef|grep redis kill -9 進程
二、啟動6個節點的redis
分別進入每一個端口下的redis 執行啟動命令,例如
cd redis2
redis-server redis.conf
6個節點都啟動成功后,自己看一下 ps -ef|grep redis
guodong@sh-guodong src % ps -ef|grep redis 501 72133 1 0 11:21上午 ?? 0:15.68 redis-server 127.0.0.1:7001 [cluster] 501 72389 1 0 11:21上午 ?? 0:15.58 redis-server 127.0.0.1:7002 [cluster] 501 72594 1 0 11:21上午 ?? 0:15.58 redis-server 127.0.0.1:7003 [cluster] 501 72891 1 0 11:22上午 ?? 0:15.34 redis-server 127.0.0.1:7004 [cluster] 501 73095 1 0 11:22上午 ?? 0:15.33 redis-server 127.0.0.1:7005 [cluster] 501 73216 1 0 11:22上午 ?? 0:15.03 redis-server 127.0.0.1:7006 [cluster] 501 9060 93357 0 12:25下午 ttys001 0:00.00 grep redis
三、關聯所有節點
進入7001節點的redis src目錄中執行命令,進入控制台
redis-cli -p 7001
依次執行下面的命令
127.0.0.1:7001> cluster meet 127.0.0.1 7002 OK 127.0.0.1:7001> cluster meet 127.0.0.1 7003 OK 127.0.0.1:7001> cluster meet 127.0.0.1 7004 OK 127.0.0.1:7001> cluster meet 127.0.0.1 7005 OK 127.0.0.1:7001> cluster meet 127.0.0.1 7006 OK
此時,所有的節點都關聯起來了。
四、 分配 slot
redis Cluster 是由 16384 個 slot 組成的,那么我們需要將這些槽分散到這其中 3 個節點里(3 主 3 從)。
進入7003的redis目錄中執行命令
redis-cli -p 7001 cluster addslots {0..5461} redis-cli -p 7003 cluster addslots {5462..10922} redis-cli -p 7005 cluster addslots {10923..16383}
此時節點已經分配好了。通過以下命令驗證:
redis-cli -p 7000 cluster nodes
現在6個節點都是主節點,並且給7001 、7003 、7005分配了槽。
五、變成主從復制
去7001的redis目錄下執行
redis-cli -p 7001 cluster nodes
5e94ae9b31b2029b2e881e9e302800941e1debcd 127.0.0.1:7004@17004 master - 0 1648956907000 3 connected
9c807c577b336d3aa4c86b4c5c2da452d3e3383d 127.0.0.1:7005@17005 master - 0 1648956908478 4 connected 10923-16383
7f3d314fb9c504861dc2cbe767f63cfc78d30b8e 127.0.0.1:7002@17002 master - 0 1648956906000 1 connected
cb1cb00f48aab147d3dd3eef9e4b81b2c1226f9e 127.0.0.1:7001@17001 myself,master - 0 1648956904000 0 connected 0-5461
5500c4ce07bbb0b9f0d10ade053a423fd319afa6 127.0.0.1:7003@17003 master - 0 1648956907000 2 connected 5462-10922
ab84c1e455a92cfb4c49eb56b0f4197badea7b5b 127.0.0.1:7006@17006 master - 0 1648956907466 5 connected
看到我框上的那一串 16 進制字符串,其實就是后面對應進程節點的NodeId,這個是用處的,先放着。
然后分別設置7002、 7004 、7006節點的主庫,執行下面命令,你們要對應自己的NodeId。
redis-cli -p 7002 cluster replicate cb1cb00f48aab147d3dd3eef9e4b81b2c1226f9e (7001的nodeID) OK redis-cli -p 7004 cluster replicate 5500c4ce07bbb0b9f0d10ade053a423fd319afa6 (7003的nodeID) OK redis-cli -p 7006 cluster replicate 9c807c577b336d3aa4c86b4c5c2da452d3e3383d (7005的nodeID) OK
這時候在執行
redis-cli -p 7001 cluster nodes
guodong@sh-guodong src % redis-cli -p 7001 cluster nodes 5e94ae9b31b2029b2e881e9e302800941e1debcd 127.0.0.1:7004@17004 slave 5500c4ce07bbb0b9f0d10ade053a423fd319afa6 0 1648960701331 2 connected 9c807c577b336d3aa4c86b4c5c2da452d3e3383d 127.0.0.1:7005@17005 master - 0 1648960700322 4 connected 10923-16383 7f3d314fb9c504861dc2cbe767f63cfc78d30b8e 127.0.0.1:7002@17002 slave cb1cb00f48aab147d3dd3eef9e4b81b2c1226f9e 0 1648960700000 0 connected cb1cb00f48aab147d3dd3eef9e4b81b2c1226f9e 127.0.0.1:7001@17001 myself,master - 0 1648960697000 0 connected 0-5461 5500c4ce07bbb0b9f0d10ade053a423fd319afa6 127.0.0.1:7003@17003 master - 0 1648960699302 2 connected 5462-10922 ab84c1e455a92cfb4c49eb56b0f4197badea7b5b 127.0.0.1:7006@17006 slave 9c807c577b336d3aa4c86b4c5c2da452d3e3383d 0 1648960698000 4 connected guodong@sh-guodong src %
到這里三主三從已經設置好了。記住一下:從redis5.0開始,建議使用redis-cli作為創建集群的命令,不推薦再使用redis-trib.rb來創建集群了,畢竟使用redis-trib.rb還要安裝Ruby程序,比redis-cli麻煩的多。
六、集群客戶端命令(redis-cli -c -p port)
記住:-c是以集群模式啟動redis客戶端
集群 cluster info :打印集群的信息 cluster nodes :列出集群當前已知的所有節點( node),以及這些節點的相關信息。 節點 cluster meet <ip> <port> :將 ip 和 port 所指定的節點添加到集群當中,讓它成為集群的一份子。 cluster forget <node_id> :從集群中移除 node_id 指定的節點。 cluster replicate <node_id> :將當前節點設置為 node_id 指定的節點的從節點。 cluster saveconfig :將節點的配置文件保存到硬盤里面。 槽(slot) cluster addslots <slot> [slot ...] :將一個或多個槽( slot)指派( assign)給當前節點。 cluster delslots <slot> [slot ...] :移除一個或多個槽對當前節點的指派。 cluster flushslots :移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。 cluster setslot <slot> node <node_id> :將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給 另一個節點,那么先讓另一個節點刪除該槽>,然后再進行指派。 cluster setslot <slot> migrating <node_id> :將本節點的槽 slot 遷移到 node_id 指定的節點中。 cluster setslot <slot> importing <node_id> :從 node_id 指定的節點中導入槽 slot 到本節點。 cluster setslot <slot> stable :取消對槽 slot 的導入( import)或者遷移( migrate)。 鍵 cluster keyslot <key> :計算鍵 key 應該被放置在哪個槽上。 cluster countkeysinslot <slot> :返回槽 slot 目前包含的鍵值對數量。 cluster getkeysinslot <slot> <count> :返回 count 個 slot 槽中的鍵
redis --help命令查看信息
guodong@sh-guodong src % redis-cli --help redis-cli 6.2.6 Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]] -h <hostname> Server hostname (default: 127.0.0.1). -p <port> Server port (default: 6379). -s <socket> Server socket (overrides hostname and port). -a <password> Password to use when connecting to the server. You can also use the REDISCLI_AUTH environment variable to pass this password more safely (if both are used, this argument takes precedence). --user <username> Used to send ACL style 'AUTH username pass'. Needs -a. --pass <password> Alias of -a for consistency with the new --user option. --askpass Force user to input password with mask from STDIN. If this argument is used, '-a' and REDISCLI_AUTH environment variable will be ignored. -u <uri> Server URI. -r <repeat> Execute specified command N times. -i <interval> When -r is used, waits <interval> seconds per command. It is possible to specify sub-second times like -i 0.1. -n <db> Database number. -3 Start session in RESP3 protocol mode. -x Read last argument from STDIN. -d <delimiter> Delimiter between response bulks for raw formatting (default: \n). -D <delimiter> Delimiter between responses for raw formatting (default: \n). -c Enable cluster mode (follow -ASK and -MOVED redirections).
查看Redis集群信息
guodong@sh-guodong src % redis-cli -p 7001 cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:5 cluster_my_epoch:0 cluster_stats_messages_ping_sent:5293 cluster_stats_messages_pong_sent:5052 cluster_stats_messages_meet_sent:5 cluster_stats_messages_sent:10350 cluster_stats_messages_ping_received:5052 cluster_stats_messages_pong_received:5298 cluster_stats_messages_received:10350 guodong@sh-guodong src %
七:Redis操作命令如下
guodong@sh-guodong src % redis-cli -c -p 7001 127.0.0.1:7001> set name gg -> Redirected to slot [5798] located at 127.0.0.1:7003 OK 127.0.0.1:7003> set age 66 -> Redirected to slot [741] located at 127.0.0.1:7001 OK 127.0.0.1:7001> get name -> Redirected to slot [5798] located at 127.0.0.1:7003 "gg" 127.0.0.1:7003> get age -> Redirected to slot [741] located at 127.0.0.1:7001 "66" 127.0.0.1:7001>
如上圖所示:在集群模式啟動下,會重定向到指定的節點存儲數據、獲得數據。如果以不是集群的方式啟動,則會報錯,如下所示:
guodong@sh-guodong src % redis-cli -p 7001 127.0.0.1:7001> set name guodong (error) MOVED 5798 127.0.0.1:7003 127.0.0.1:7001> set age 99 OK 127.0.0.1:7001> get name (error) MOVED 5798 127.0.0.1:7003 127.0.0.1:7001>
1:Redis Cluster特點
- 多主多從,去中心化:從節點作為備用,復制主節點,不做讀寫操作,不提供服務
- 不支持處理多個key:因為數據分散在多個節點,在數據量大高並發的情況下會影響性能;
- 支持動態擴容節點:這是我認為算是Rerdis Cluster最大的優點之一;
- 節點之間相互通信,相互選舉,不再依賴sentinel:准確來說是主節點之間相互“監督”,保證及時故障轉移
2:Redis Cluster與其它集群模式的區別
- 相比較sentinel模式,多個master節點保證主要業務(比如master節點主要負責寫)穩定性,不需要搭建多個sentinel實例監控一個master節點;
- 相比較一主多從的模式,不需要手動切換,具有自我故障檢測,故障轉移的特點;
- 相比較其他兩個模式而言,對數據進行分片(sharding),不同節點存儲的數據是不一樣的;
- 從某種程度上來說,Sentinel模式主要針對高可用(HA),而Cluster模式是不僅針對大數據量,高並發,同時也支持HA。