Redis集群模式Cluster

虽然Redis哨兵模式可以做到故障自动切换,但每台Redis储存相同的数据,很浪费内存,从节点下线后,连接到从的客户端也没办法连接到其他可用的从节点。
redis集群模式就能有效的解决这个问题。

搭建

先新建存放配置文件的文件夹

mkdir 7000 7001 7002 7003 7004 7005

在每个配置文件夹中创建redis.conf,下列配置是最少选项的集群的配置文件,记得将port修改成对应文件夹的端口

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

文件中的 cluster-enabled 选项用于开实例的集群模式, 而 cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为 nodes.conf.节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。
要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。
启动redis

redis-server redis.conf 

在这里插入图片描述
nodes.conf 文件不存在, 所以每个节点都为它自身指定了一个新的 ID,从而保证在集群中是独一无二
当把所有Redis实例启动后运行以下命令创建集群

redis-cli --cluster create 127.0.0.1:7000 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 \
--cluster-replicas 1

–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点
执行了以上命令再输入yes集群就创建好了
随便连接集群中的一个Redis节点,与普通连接方式不同,客户端要连接集群模式需要在命令中加-c

 redis-cli -c -p 7000

插入和查数据时,Redis会让key通过CRC16校验后对16384取模来决定放置哪个槽,自动重定向到对应槽位的节点,这样的好处很方便的添加和删除节点

127.0.0.1:7000> set k1 hello
-> Redirected to slot [12706] located at 127.0.0.1:7002
OK
127.0.0.1:7000> get k1
-> Redirected to slot [12706] located at 127.0.0.1:7002
"hello"

节点操作

重新分片

redis-cli --cluster reshard 127.0.0.1:7000

以上命令用来迁移slot节点,127.0.0.1:7000是表示是哪个集群,端口填[7000-7005]都可以
它会询问迁移多少slot到7000上,例如输入5000,然后会询问节点ID,再填入7000的节点ID就行了
在这里插入图片描述
它还会询问你迁移的槽位是从所有节点取,还是从特定的节点取,如果不是从特定节点取,可以输入all,然后从其他主节点迁移槽位再确认
Redis集群模式Cluster_第1张图片
最后可以看到7000节点上的槽位不是连续的。

添加一个新节点
首先创建一个新的Redis实例,配置文件和之前一样的,只需要改端口号,例如一个添加7006的实例配置如下

port 7006
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

再启动新实例,再执行以下命令

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

第一个地址是新节点的地址,第二个地址是任意一个已经存在的节点的IP和端口
使用地址查看可以看到7006已经添加到集群中
在这里插入图片描述
和其他节点相比,此时新节点没有任何数据和哈希槽,需要执行重新分片的操作为新节点分配槽位,注意:就算它没数据和槽位它此时也是个主节点,只有分配的哈希槽才算一个真正的主节点
添加一个从节点
例如为上面新添加的主节点添加一个从节点,后面指定新节点的ID就好了

redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id bb9b7fface7d790c00454b52e26cfa577c856f16

如果不需要指定主节点,就不需要–cluster-master-id,系统将会随机分配一个主节点
也可以直接将从节点改成其他主节点的从节点

127.0.0.1:7007> cluster replicate 668f01dc0a16bddbbba35f7051d79bff59a7eb7e
OK

再查看668f01dc0a16bddbbba35f7051d79bff59a7eb7e的从节点信息时,已经多了7007这个节点

[root@my src]#  redis-cli -p 7000 cluster nodes | grep slave | grep 668f01dc0a16bddbbba35f7051d79bff59a7eb7e
fc6a07ef893802de6edaf69c17d2d7133f084063 127.0.0.1:7003@17003 slave 668f01dc0a16bddbbba35f7051d79bff59a7eb7e 0 1629571902694 7 connected
ce170fe20a53bbed76a9c26ea842a14cbc1260e5 127.0.0.1:7007@17007 slave 668f01dc0a16bddbbba35f7051d79bff59a7eb7e 0 1629571901588 7 connected

删除节点
只要使用 del-node 命令即可,后面接需要删除的节点ID,例如

[root@my src]# redis-cli --cluster del-node 127.0.0.1:7000 ce170fe20a53bbed76a9c26ea842a14cbc1260e5
>>> Removing node ce170fe20a53bbed76a9c26ea842a14cbc1260e5 from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

再次查集群的节点信息已经没有7007这个节点了

127.0.0.1:7000> cluster nodes
fc6a07ef893802de6edaf69c17d2d7133f084063 127.0.0.1:7003@17003 slave 668f01dc0a16bddbbba35f7051d79bff59a7eb7e 0 1629572230678 7 connected
0c13067f6ed3f6e5603e0214fc15aae5de16dd15 127.0.0.1:7004@17004 slave e5f1e9d453c0f0a881d94bfb521a4d6dae01f4c7 0 1629572231083 3 connected
bb9b7fface7d790c00454b52e26cfa577c856f16 127.0.0.1:7006@17006 master - 0 1629572232713 0 connected
048313d1749a4c893858605669cbc9c717ae97e9 :0@0 master,fail,noaddr - 1629571365502 1629571363000 9 disconnected
e5f1e9d453c0f0a881d94bfb521a4d6dae01f4c7 127.0.0.1:7002@17002 master - 0 1629572231000 3 connected 13504-16383
b0bc1b722321060fba92096c69b23936b4d122d7 :0@0 slave,fail,noaddr bb9b7fface7d790c00454b52e26cfa577c856f16 1629571627093 1629571625000 0 disconnected
12d39a693674278e32f203cf9def21487e83778f 127.0.0.1:7000@17000 myself,master - 0 1629572230000 8 connected 0-7879 11173-13503
548effc75e66a52a977d1b61b9c60ec5a6408284 127.0.0.1:7005@17005 slave 12d39a693674278e32f203cf9def21487e83778f 0 1629572231183 8 connected
668f01dc0a16bddbbba35f7051d79bff59a7eb7e 127.0.0.1:7001@17001 master - 0 1629572231686 7 connected 7880-11172

你可能感兴趣的:(redis,redis)