Mac搭建Redis cluster集群(一)


一:安裝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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM