文章目录
redis-集群
集群原理
redis有16384个hash槽,key经过运算得到hash值,会被分配到其中一个hash槽。所有的hash槽都会被分配到主结点中。redis集群中最少有3个主结点。如果主结点挂掉,它的从节点会成为主结点。如果主结点和它的所有从节点都挂掉了。集群就不可用了。
集群搭建
1.集群的结构
根据官网描述要让redis集群环境正常运行我们必须准备至少3个主节点,所以在本文中的集群环境我们准备3个主节点实例及对应的给每个主节点准备一个从节点实例,一共6个redis实例。正常需要6个虚拟机节点,本文我们在一个虚拟机上模拟。
2.集群的环境准备
搭建集群需要使用到官方提供的ruby脚本。
需要安装ruby的环境。安装ruby
apt-get install ruby
3.搭建集群环境
3.1创建实例
在/opt目录下创建redis-cluster目录,并在该目录下创建9个redis实例
ps:redis实例指安装成功的redis文件夹
3.2修改配置文件
分别修改9个实例的配置文件
1.修改端口号
2.打开cluster-enable前面的注释
3.注释掉绑定ip
4.保护模式修改为no
5.设置日志存储路径
注意重复修改9次。
3.3复制ruby脚本
3.4启动6个实例
编写简单脚本启动
start-all.sh
cd /opt/redis-cluster/redis7001
rm -rf dump.rdb nodes.conf appendonly.aof *.log
src/redis-server redis.conf
cd /opt/redis-cluster/redis7002
rm -rf dump.rdb nodes.conf appendonly.aof *.log
src/redis-server redis.conf
cd /opt/redis-cluster/redis7003
rm -rf dump.rdb nodes.conf appendonly.aof *.log
src/redis-server redis.conf
cd /opt/redis-cluster/redis7004
rm -rf dump.rdb nodes.conf appendonly.aof *.log
src/redis-server redis.conf
cd /opt/redis-cluster/redis7005
rm -rf dump.rdb nodes.conf appendonly.aof *.log
src/redis-server redis.conf
cd /opt/redis-cluster/redis7006
rm -rf dump.rdb nodes.conf appendonly.aof *.log
src/redis-server redis.conf
启动前检查是否这些实例已经开启
ps -ef |grep redis
如果有就杀死已经开启的redis实例,搭建集群的redis节点,必须是空节点。
改变文件脚本权限模式:
chmod 777 start-all.sh
然后再启动:./start-all.sh
启动
./start-all.sh
6个节点全部开启。
3.5创建集群
现在我们已经有了六个正在运行中的 Redis 实例, 接下来我们需要使用这些实例来创建集群, 并为每个节点编写配置文件。
通过使用 Redis 集群命令行工具 redis-trib , 编写节点配置文件的工作可以非常容易地完成: redis-trib 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作
./redis-trib.rb create --replicas 1 192.168.197.131:7001 192.168.197.131:7002 192.168.197.131:7003 192.168.197.131:7004 192.168.197.131:7005 192.168.197.131:7006
命令说明
选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点
之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slave
redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes, redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到如下信息:
root@ttxs:/opt/redis-cluster# ./redis-trib.rb create --replicas 1 192.168.197.131:7001 192.168.197.131:7002 192.168.197.131:7
003 192.168.197.131:7004 192.168.197.131:7005 192.168.197.131:7006>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.197.131:7001
192.168.197.131:7002
192.168.197.131:7003
Adding replica 192.168.197.131:7005 to 192.168.197.131:7001
Adding replica 192.168.197.131:7006 to 192.168.197.131:7002
Adding replica 192.168.197.131:7004 to 192.168.197.131:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 4ff5db3c3ce17e0939292e81fe158e923d22d0bf 192.168.197.131:7001
slots:0-5460 (5461 slots) master
M: 2b4bfa9d5b3a5cbdea13627c69674cffe6295fd4 192.168.197.131:7002
slots:5461-10922 (5462 slots) master
M: 0e1a99432fe0ab2530c62cba49d921a67cdf5424 192.168.197.131:7003
slots:10923-16383 (5461 slots) master
S: 263dc17067deab450bd8d09bb2dd167be909c458 192.168.197.131:7004
replicates 2b4bfa9d5b3a5cbdea13627c69674cffe6295fd4
S: 1e2bbf1c0fadc1f881b35263416053133d13d8be 192.168.197.131:7005
replicates 0e1a99432fe0ab2530c62cba49d921a67cdf5424
S: 2eed5bdf1695dc17a3b7c30694ebe5a4ad64dbc3 192.168.197.131:7006
replicates 4ff5db3c3ce17e0939292e81fe158e923d22d0bf
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 192.168.197.131:7001)
M: 4ff5db3c3ce17e0939292e81fe158e923d22d0bf 192.168.197.131:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 1e2bbf1c0fadc1f881b35263416053133d13d8be 192.168.197.131:7005
slots: (0 slots) slave
replicates 0e1a99432fe0ab2530c62cba49d921a67cdf5424
S: 2eed5bdf1695dc17a3b7c30694ebe5a4ad64dbc3 192.168.197.131:7006
slots: (0 slots) slave
replicates 4ff5db3c3ce17e0939292e81fe158e923d22d0bf
M: 2b4bfa9d5b3a5cbdea13627c69674cffe6295fd4 192.168.197.131:7002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 263dc17067deab450bd8d09bb2dd167be909c458 192.168.197.131:7004
slots: (0 slots) slave
replicates 2b4bfa9d5b3a5cbdea13627c69674cffe6295fd4
M: 0e1a99432fe0ab2530c62cba49d921a67cdf5424 192.168.197.131:7003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
root@ttxs:/opt/redis-cluster#
这表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。
4.测试集群
登录命令
redis7001/src/redis-cli -h 192.168.197.131 -p 7001 -c
添加一个key被分配到7002节点上,注意连接的端口变为了7002。
5.查看集群环境
命令 | 说明 |
---|---|
cluster info | 打印集群的信息 |
cluster nodes | 列出集群当前已知的所有节点( node),以及这些节点的相关信息。节点 |
cluster meet | 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。 |
cluster forget <node_id> | 从集群中移除 node_id 指定的节点。 |
cluster replicate <node_id> | 将当前节点设置为 node_id 指定的节点的从节点。 |
cluster saveconfig | 将节点的配置文件保存到硬盘里面。槽(slot) |
cluster addslots [slot …] | 将一个或多个槽( slot)指派( assign)给当前节点。 |
cluster delslots [slot …] | 移除一个或多个槽对当前节点的指派。 |
cluster flushslots | 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 |
cluster setslot node <node_id> | 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。 |
cluster setslot migrating <node_id> | 将本节点的槽 slot 迁移到 node_id 指定的节点中。 |
cluster setslot importing <node_id> | 从 node_id 指定的节点中导入槽 slot 到本节点。 |
cluster setslot stable | 取消对槽 slot 的导入( import)或者迁移( migrate)。键 |
cluster keyslot | 计算键 key 应该被放置在哪个槽上。 |
cluster countkeysinslot | 返回槽 slot 目前包含的键值对数量。 |
cluster getkeysinslot | 返回 count 个 slot 槽中的键 |
cluster info命令
cluster nodes
6.增加节点
添加新的节点的基本过程就是添加一个空的节点然后移动一些数据给它,有两种情况,添加一个主节点和添加一个从节点(添加从节点时需要将这个新的节点设置为集群中某个节点的复制)
添加一个新的实例
启动新的7007节点,使用的配置文件和以前的一样,只要把端口号改一下即可,过程如下:
在终端打开一个新的标签页.
进入redis-cluster 目录.
复制并进入redis7007文件夹.
和其他节点一样,创建redis.conf文件,需要将端口号改成7007.
最后启动节点 …/redis-server ./redis.conf
如果正常的话,节点会正确的启动.
start-7007.sh
其它的脚本也是类似的。
cd /opt/redis-cluster/redis7007
rm -rf dump.rdb nodes.conf appendonly.aof *.log
src/redis-server redis.conf
6.1.添加主节点
ps:添加节点, dump.rdb nodes.conf appendonly.aof
文件已经被删除,然后再开启节点。
./redis-trib.rb add-node 192.168.197.131:7007 192.168.197.131:7001
第一个参数是新节点的地址,第二个参数是任意一个已经存在的节点的IP和端口
输出
root@ttxs:/opt/redis-cluster# ./redis-trib.rb add-node 192.168.197.131:7007 192.168.197.131:7001
>>> Adding node 192.168.197.131:7007 to cluster 192.168.197.131:7001
>>> Performing Cluster Check (using node 192.168.197.131:7001)
M: 4ff5db3c3ce17e0939292e81fe158e923d22d0bf 192.168.197.131:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 1e2bbf1c0fadc1f881b35263416053133d13d8be 192.168.197.131:7005
slots: (0 slots) slave
replicates 0e1a99432fe0ab2530c62cba49d921a67cdf5424
S: 2eed5bdf1695dc17a3b7c30694ebe5a4ad64dbc3 192.168.197.131:7006
slots: (0 slots) slave
replicates 4ff5db3c3ce17e0939292e81fe158e923d22d0bf
M: 2b4bfa9d5b3a5cbdea13627c69674cffe6295fd4 192.168.197.131:7002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 263dc17067deab450bd8d09bb2dd167be909c458 192.168.197.131:7004
slots: (0 slots) slave
replicates 2b4bfa9d5b3a5cbdea13627c69674cffe6295fd4
M: 0e1a99432fe0ab2530c62cba49d921a67cdf5424 192.168.197.131:7003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 192.168.197.131:7007 to make it join the cluster.
[OK] New node added correctly.
root@ttxs:/opt/redis-cluster#
新节点现在已经连接上了集群, 成为集群的一份子, 并且可以对客户端的命令请求进行转向了, 但是和其他主节点相比, 新节点还有两点区别:
- 新节点没有包含任何数据, 因为它没有包含任何哈希槽.
- 尽管新节点没有包含任何哈希槽, 但它仍然是一个主节点, 所以在集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中。
重新分配slot
./redis-trib.rb reshard 192.168.197.131:7001
只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点
7007节点被分类slot,成了真正意义上的主节点
6.2.添加从节点
添加的从节点被随机的配置任意的主节点
./redis-trib.rb add-node --slave 192.168.197.131:7008 192.168.197.131:7001
输出
root@ttxs:/opt/redis-cluster# ./redis-trib.rb add-node --slave 192.168.197.131:7008 192.168.197.131:7001
>>> Adding node 192.168.197.131:7008 to cluster 192.168.197.131:7001
>>> Performing Cluster Check (using node 192.168.197.131:7001)
M: 4ff5db3c3ce17e0939292e81fe158e923d22d0bf 192.168.197.131:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 1e2bbf1c0fadc1f881b35263416053133d13d8be 192.168.197.131:7005
slots: (0 slots) slave
replicates 0e1a99432fe0ab2530c62cba49d921a67cdf5424
M: aafc302c232c2205621d738674a32c9d239f09db 192.168.197.131:7007
slots:10923-10932 (10 slots) master
0 additional replica(s)
S: 2eed5bdf1695dc17a3b7c30694ebe5a4ad64dbc3 192.168.197.131:7006
slots: (0 slots) slave
replicates 4ff5db3c3ce17e0939292e81fe158e923d22d0bf
M: 2b4bfa9d5b3a5cbdea13627c69674cffe6295fd4 192.168.197.131:7002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 263dc17067deab450bd8d09bb2dd167be909c458 192.168.197.131:7004
slots: (0 slots) slave
replicates 2b4bfa9d5b3a5cbdea13627c69674cffe6295fd4
M: 0e1a99432fe0ab2530c62cba49d921a67cdf5424 192.168.197.131:7003
slots:10933-16383 (5451 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Automatically selected master 192.168.197.131:7007
>>> Send CLUSTER MEET to node 192.168.197.131:7008 to make it join the cluster.
Waiting for the cluster to join.
>>> Configure node as replica of 192.168.197.131:7007.
[OK] New node added correctly.
将从节点添加给指定的主节点
cluster replicate 4ff5db3c3ce17e0939292e81fe158e923d22d0bf
[外链图片转存失败(img-jnNwd1sD-1564921754429)(C:\Users\32996\AppData\Roaming\Typora\typora-user-images\1564889301878.png)]
7.删除节点
使用del-node命令移除节点。
./redis-trib.rb del-node 192.168.2.11:7007 <node-id>
第一个参数:任意集群中现有的地址192.168.88.121:7001
第二个参数:你想移除的节点id ab853f5e95f1e32e0ee40543a9687d60fc3bd941
(该id可以在想要移除的节点nodes.conf文件中找到)
./redis-trib.rb del-node 192.168.197.131:7008 ad63201f11bb0023a9a2c171b9a75d48b0bee0b3
关闭redis
redis7001/redis-cli -p 7001 shutdown
./redis-cli shutdown
pkill -9 redis-server –关闭所有的redis服务
pkill -9 redis-server