日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

redis cluster集群

發布時間:2023/12/13 综合教程 24 生活家
生活随笔 收集整理的這篇文章主要介紹了 redis cluster集群 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Redis集群工作原理:

Redis 集群沒有使用一致性hash, 而是引入了 哈希槽的概念。 Redis 集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽。集群的每個 節點負責一部分hash槽,舉個例子,比如當前集群有3個節點,那么: 節點 A 包含 0 到 5460號哈希槽. 節點 B 包含5461到10922號哈希槽. 節點 C 包含10923到16383號哈希槽. 這種結構很容易添加或者刪除節點,比如如果我想新添加個節點D,我需要從節點 A, B, C中得部分槽到 D上。如果我想移除節點A,需要將A中的槽移到B和C節點上,然后將沒有任何槽的A節點從集群中移除 即可。由于從一個節點將哈希槽移動到另一個節點并不會停止服務,所以無論添加刪除或者改變某個節 點的哈希槽的數量都不會造成集群不可用的狀態。

Redis 集群的主從復制模型:

為了使在部分節點失敗或者大部分節點無法通信的情況下集群仍然可用,所以集群使用了主從復制模型, 每個節點都會有N-1個復制品。 在上面具有A,B,C三個節點的集群,在沒有復制模型的情況下,如果節點B失敗了,那么整個集群就 會以為缺少5461到10922這個范圍的槽而不可用。 然而如果在集群創建的時候(或者過一段時間)我們為每個節點添加一個從節點A1,B1,C1,那么整個 集群便有三個master節點和三個slave節點組成,這樣在節點B失敗后,集群便會選舉B1為新的主節點 繼續服務,整個集群便不會因為槽找不到而不可用了,不過當B和B1 都失敗后,集群是不可用的。

redis cluster集群部署:
環境:
centos 7.X
redis 5.0.7
創建redis實例:

#創建redis-cluster 存放目錄:
mkdir -p /usr/local/redis-cluster

#用初始化腳本方式,快速創建實例配置文件,日志目錄:
cd /usr/src/redis-5.0.7
root@localhost redis-5.0.7]# ./utils/install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 7001
Please select the redis config file name [/etc/redis/7001.conf] /usr/local/redis-cluster/7001.conf     
Please select the redis log file name [/var/log/redis_7001.log] /usr/local/redis-cluster/7001.log
Please select the data directory for this instance [/var/lib/redis/7001] /usr/local/redis-cluster/7001
Please select the redis executable path [/usr/local/redis/bin/redis-server] /usr/local/redis/bin/redis-server
Selected config:
Port           : 7001
Config file    : /usr/local/redis-cluster/7001.conf
Log file       : /usr/local/redis-cluster/7001.log
Data dir       : /usr/local/redis-cluster/7001
Executable     : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/7001.conf => /etc/init.d/redis_7001
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

#以上是創建7001實例: 用相同的方式創建剩余的5個redis cluster實例;

開啟Redis集群模式:

#在每個redis 實例的配置文件中,開啟如下參數;
#將 cluster-enabled yes 前面的#去掉,意味著開啟 redis-cluster
cluster-enabled yes 
#將前面的#去掉,并且將配置文件改為 7001.conf,Redis Cluster 記錄的啟動信息文件, 文件由 cluster 自動生成,不需要用戶編輯 
cluster-config-file nodes-7001.conf 
#Redis 群集節點可以不可用的最長時間,而不會將其視為失敗。
cluster-node-timeout 5000 
#開啟 AOF 持久化 
appendonly yes

啟動Redis實例:

#啟動實例服務:
/etc/init.d/redis_7001 restart
/etc/init.d/redis_7002 restart
/etc/init.d/redis_7003 restart
/etc/init.d/redis_7004 restart
/etc/init.d/redis_7005 restart
/etc/init.d/redis_7006 restart

#批量啟動實例服務:
for i in `seq 1 6`;do /etc/init.d/redis_700$i start;sleep 2;done

#查看服務進程:
netstat -nutlp
ps -ef|grep redis-server

搭建集群:

現在已經有了6個redis實例了,接下來可以直接用這些實例創建集群,并為每個節點編寫配置文件, redis5版本可以直接使用redis-cli命令創建集群,檢查或重新新硬化現有集群等等。

#創建集群:
redis-cli --cluster create 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 127.0.0.1:7006  --cluster-replicas 1

--cluster-replicas 1 表示為集群中的每個主節點創建一個從節點。
其中指定了6個redis的ip:port,3個master3個slave。 
以上命令回車后,當我們輸入yes,redis-cli就會將這份配置應用到集群當中,讓各個節點開始互相通訊,
最 后可以得到如下信息: 
... [OK] 
All 16384 slots covered

系統就開始執行 cluster 的相關配置,最終 哈希槽均被配置完 畢,且配置好每個主節點和和從節點的對應關系。

執行完畢后,所有主機的 redis 實例數據目錄下,都會自動生成 dump.rdb 和 nodes7000.conf 文件

#查看集群信息或狀態:
[root@localhost redis-5.0.7]# redis-cli -p 7001 cluster info

#查看集群節點:
[root@localhost redis-5.0.7]# redis-cli -p 7001 cluster nodes

添加新的節點:

# 重新初始化一個節點:
[root@localhost redis-5.0.7]# ./utils/install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 7007
Please select the redis config file name [/etc/redis/7007.conf] /usr/local/redis-cluster/7007.conf
Please select the redis log file name [/var/log/redis_7007.log] /usr/local/redis-cluster/7007.log
Please select the data directory for this instance [/var/lib/redis/7007] /usr/local/redis/7007
Please select the redis executable path [/usr/local/redis/bin/redis-server] /usr/local/redis/bin/redis-server
Selected config:
Port           : 7000
Config file    : /usr/local/redis-cluster/7000.conf
Log file       : /usr/local/redis-cluster/7000.log
Data dir       : /usr/local/redis/7000
Executable     : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/7000.conf => /etc/init.d/redis_7007
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@localhost redis-5.0.7]# 
#修改配置文件添加如下或開啟:
cluster-enabled yes 
cluster-config-file nodes-7000.conf 
cluster-node-timeout 5000 
appendonly ye
#啟動服務:
    /etc/init.d/redis_7000 restart
#添加新節點:
redis-cli  --cluster add-node 127.0.0.1:7000 127.0.0.1:7001

重新分片:

雖然節點添加成功,但是還沒有分配散列槽,需要重新分片,就是將其他節點上的部分散列槽移動到該 節點上。

# 可以看到雖然7000新節點添加成功,但是沒有分配散列槽: 
[root@localhost redis-5.0.7]# redis-cli --cluster check 127.0.0.1:7001 
 127.0.0.1:7001 (e8cf1e59...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7000 (1186fbcb...) -> 0 keys | 0 slots | 0 slaves.
127.0.0.1:7002 (b02a78af...) -> 0 keys | 5462 slots | 1 slaves.
127.0.0.1:7003 (dd351704...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: e8cf1e5955caba283e843a57b01f3d5bf04a3f77 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 1186fbcb65016b5ce42fa95c77de872b4e9c7e6b 127.0.0.1:7000
   slots: (0 slots) master
M: b02a78af5e9106cb1100e5feff1d56146c911bb1 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: db67bfb7580ee7f6067f381e8ddd92ebb27044bc 127.0.0.1:7004
   slots: (0 slots) slave
   replicates dd3517043af0ae6f936ae820036079101b61b2b4
S: a1e53727be8fdb39485427d5054c70e9964cddbc 127.0.0.1:7006
   slots: (0 slots) slave
   replicates b02a78af5e9106cb1100e5feff1d56146c911bb1
M: dd3517043af0ae6f936ae820036079101b61b2b4 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: fd471711e0d771b22e63dad5e4312aff0144b066 127.0.0.1:7005
   slots: (0 slots) slave
   replicates e8cf1e5955caba283e843a57b01f3d5bf04a3f77
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

重新分配,只需指定一個節點,redis-cli將自動找到其他節點:

#重新分配
redis-cli --cluster reshard 127.0.0.1:7001

首先指定分配多少散列槽:
# 重新分配多少個散列槽,這里嘗試重新設置2048個散列槽: 
How many slots do you want to move (from 1 to 16384)? 2048

指定接收哈希槽的節點ID:
# 指定接受的redis節點ID,注意不是指定ip地址: (7000實例的ID)
What is the receiving node ID? 1186fbcb65016b5ce42fa95c77de872b4e9c7e6b

指定從哪些節點獲取散列槽:

Please enter all the source node IDs.  
Type 'all' to use all the nodes as source nodes for the hash slots.  
Type 'done' once you entered all the source nodes IDs. 
Source node #1: all
# all:  表示自動在所有節點進行分配。 
# done: 表示指定節點結束,一般用在移除節點時,指定完Source node #1: 節點ID,再輸入done, 表示輸入結束

是否確定分配:yes

在最終確認之后,redis-cli開始執行重新分配:
重新分片正在進行中時,程序不受影響地運行。
檢查集群的運行狀態:

# 可以看到散列槽已經分配了 
[root@node5 ~]# redis-cli --cluster check 127.0.0.1:7000 127.0.0.1:7001
[root@localhost redis-5.0.7]#  redis-cli -h 127.0.0.1 -p 7000 cluster nodes

免交互重新分片腳本:

可以自動執行重新分片,而無需以交互方式手動輸入參數。這可以使用如下命令行:

redis-cli reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes

刪除節點:
刪除節點與添加節點類似,就是一定要注意,刪除節點之前一定要先將數據移到其他節點,不能直接刪 除,不過也不用擔心,即使有數據,不小心執行了刪除節點指令,也會報有數據存在,不可以刪除的錯 誤。

# 通過重新分片,將散列槽移到其他節點: 
redis-cli  --cluster reshard 127.0.0.1:7000

How many slots do you want to move (from 1 to 16384)? 2047 
# 用來接受散列槽的節點,可以任意指定: 
What is the receiving node ID? b02a78af5e9106cb1100e5feff1d56146c911bb1 
Please enter all the source node IDs.  
 Type 'all' to use all the nodes as source nodes for the hash slots.  
  Type 'done' once you entered all the source nodes IDs.  
  # 7000節點的id(意思是把該節點的散列槽分配給其他節點): 
  Source node #1: 1186fbcb65016b5ce42fa95c77de872b4e9c7e6b 
  Source node #2: done

# 查看狀態: 
[root@node5 ~]# redis-cli --cluster check 127.0.0.1:7000 
127.0.0.1:7001 (aa04c256...) -> 0 keys | 4779 slots | 1 slaves. 
127.0.0.1:7002 (f6838a0e...) -> 0 keys | 4779 slots | 1 slaves. 
# 已經沒有了散列槽: 
127.0.0.1:7006 (44124bd9...) -> 0 keys | 0 slots | 0 slaves. 
127.0.0.1:7004 (e4f85202...) -> 1 keys | 6826 slots | 1 slaves.

以下刪除節點:

# 確定沒問題了,執行下面命令,可以實現刪除節點: 127.0.0.1:7000
[root@node5 ~]# redis-cli --cluster del-node 127.0.0.1:7000 1186fbcb65016b5ce42fa95c77de872b4e9c7e6b 
>>> Removing node 1186fbcb65016b5ce42fa95c77de872b4e9c7e6b from cluster 127.0.0.1:7000 
>>> Sending CLUSTER FORGET messages to the cluster... 
>>> SHUTDOWN the node

總結

以上是生活随笔為你收集整理的redis cluster集群的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。