Redis进阶:Redis的集群模式介绍

Redis进阶:Redis的集群模式介绍

为什么要使用Redis集群

上一期我们介绍了Redis的哨兵机制,通过哨兵机制实现对Redis的监控、提醒,实现自动故障转移,这期我们继续学习下Redis的集群模式。

哨兵模式主要解决的是高可用,提升了Redis读性能,但是Redis的写性能及存储并没有得到有效提升,Redis的集群模式就是解决Redis缓存大数据量及提升写性能而推出的一种解决方案。

Redis通过分区来将数据自动分割到不同的节点,部分节点不可用时,整体上也能继续执行指令。

搭建Redis集群

准备Redis集群配置文件

新建配置文件 redis.conf

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

新建7000~7005,6个文件夹及配置文件。

[root@localhost redis-cluster]# mkdir 7000 7001 7002 7003 7004 7005
# 将上一步新增的配置文件放到各个文件夹中 注意修改成对应的端口号
[root@localhost 7000]# cp redis.conf ../7002/redis.conf

启动Redis服务

启动六个Redis服务实例,并加载对应的配置文件。

[root@localhost redis-5.0.7]# src/redis-server ../redis-cluster/7000/redis.conf 
[root@localhost redis-5.0.7]# src/redis-server ../redis-cluster/7001/redis.conf 

查看启动的Redis实例。

[root@localhost redis-5.0.7]# ps -ef | grep redis
root       7187      1  0 22:19 ?        00:00:00 src/redis-server *:7000 [cluster]
root       7192      1  0 22:19 ?        00:00:00 src/redis-server *:7001 [cluster]
root       7197      1  0 22:19 ?        00:00:00 src/redis-server *:7002 [cluster]
root       7202      1  0 22:19 ?        00:00:00 src/redis-server *:7003 [cluster]
root       7207      1  0 22:19 ?        00:00:00 src/redis-server *:7004 [cluster]
root       7212      1  0 22:19 ?        00:00:00 src/redis-server *:7005 [cluster]
root       7217   6944  0 22:20 pts/0    00:00:00 grep --color=auto redis

构建集群

/src/redis-cli --cluster create 127.0.0.0.1:7000 127.0.0.0.1:7001 127.0.0.0.1:7002 127.0.0.0.1:7003 127.0.0.0.1:7004 127.0.0.0.1:7005 --cluster-replicas 1
# 出现以下提示信息
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7000
...
Can I set the above configuration? (type 'yes' to accept): 

# 输入yea 回车确认
>>> Nodes configuration updated
...
[OK] All 16384 slots covered.
# 此时Redis集群已经构建完成

集群验证

# 查看集群信息
[root@localhost redis-5.0.7]# src/redis-cli -c -h 127.0.0.1 -p 7000 cluster nodes
# 集群中节点信息 角色及哈希槽起始位置
cbc71d81e642b3a710a44a9b9617bfa1c525650a 127.0.0.1:7001@17001 master - 0 1575989593817 2 connected 5461-10922
50f6148cadec975727de7ee5be27611f996fe4da 127.0.0.1:7004@17004 slave cbc71d81e642b3a710a44a9b9617bfa1c525650a 0 1575989593314 5 connected
889e34956aab96628d8d1e10acf96843c15db608 127.0.0.1:7003@17003 slave 44d41027fe05d00894e743ef638a97a8009e1541 0 1575989593314 1 connected
44d41027fe05d00894e743ef638a97a8009e1541 127.0.0.1:7000@17000 myself,master - 0 1575989593000 1 connected 0-5460
d54d65127d7eca5cc8ed8cbdec3f9ed2408f7ef5 127.0.0.1:7002@17002 master - 0 1575989594322 3 connected 10923-16383
e6ae8c680b61bd1594602ef4b1ef4dd857b01e16 127.0.0.1:7005@17005 slave d54d65127d7eca5cc8ed8cbdec3f9ed2408f7ef5 0 1575989593000 6 connected

# 通过客户端 设置属性
[root@localhost redis-5.0.7]# src/redis-cli -c -p 7000
127.0.0.1:7000> set name enjoyitlife
-> Redirected to slot [5798] located at 127.0.0.1:7001
OK
127.0.0.1:7001> get name
"enjoyitlife"

增加集群节点

增加主服务节点

新增一个端口7006的节点配置。作为主节点

[root@localhost redis-5.0.7]# src/redis-cli --cluster add-node  127.0.0.1:7006 127.0.0.1:7000

>>> Adding node 127.0.0.1:7006 to cluster 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 44d41027fe05d00894e743ef638a97a8009e1541 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: cbc71d81e642b3a710a44a9b9617bfa1c525650a 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 50f6148cadec975727de7ee5be27611f996fe4da 127.0.0.1:7004
   slots: (0 slots) slave
   replicates cbc71d81e642b3a710a44a9b9617bfa1c525650a
S: 889e34956aab96628d8d1e10acf96843c15db608 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 44d41027fe05d00894e743ef638a97a8009e1541
M: d54d65127d7eca5cc8ed8cbdec3f9ed2408f7ef5 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: e6ae8c680b61bd1594602ef4b1ef4dd857b01e16 127.0.0.1:7005
   slots: (0 slots) slave
   replicates d54d65127d7eca5cc8ed8cbdec3f9ed2408f7ef5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:7006 to make it join the cluster.
[OK] New node added correctly.

# 查看集群节点信息
[root@localhost redis-5.0.7]# src/redis-cli --cluster check 127.0.0.1:7000
127.0.0.1:7000 (44d41027...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7001 (cbc71d81...) -> 1 keys | 5462 slots | 1 slaves.
127.0.0.1:7006 (428162ab...) -> 0 keys | 0 slots | 0 slaves.
127.0.0.1:7002 (d54d6512...) -> 1 keys | 5461 slots | 1 slaves.
[OK] 2 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 44d41027fe05d00894e743ef638a97a8009e1541 127.0.0.1:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: cbc71d81e642b3a710a44a9b9617bfa1c525650a 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 428162ab9359bb3dd9dd922b3f3791e19e49dbbc 127.0.0.1:7006
   slots: (0 slots) master
S: 50f6148cadec975727de7ee5be27611f996fe4da 127.0.0.1:7004
   slots: (0 slots) slave
   replicates cbc71d81e642b3a710a44a9b9617bfa1c525650a
S: 889e34956aab96628d8d1e10acf96843c15db608 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 44d41027fe05d00894e743ef638a97a8009e1541
M: d54d65127d7eca5cc8ed8cbdec3f9ed2408f7ef5 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: e6ae8c680b61bd1594602ef4b1ef4dd857b01e16 127.0.0.1:7005
   slots: (0 slots) slave
   replicates d54d65127d7eca5cc8ed8cbdec3f9ed2408f7ef5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

可以看到7006作为新节点添加到集群服务中,但是没有分配哈希槽。

重新分配哈希槽,我们将7000节点服务的1000个哈希槽分配给7006。

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

src/redis-cli --cluster reshard 127.0.0.1:7000 --cluster-from 44d41027fe05d00894e743ef638a97a8009e1541 --cluster-to 428162ab9359bb3dd9dd922b3f3791e19e49dbbc --cluster-slots 1000 --cluster-yes
# 会出现如下指令列表
...
Moving slot 999 from 44d41027fe05d00894e743ef638a97a8009e1541
Moving slot 0 from 127.0.0.1:7000 to 127.0.0.1:7006: 
....

# 重新查看当前集群节点哈希槽分配情况
[root@localhost redis-5.0.7]# src/redis-cli --cluster check 127.0.0.1:7006
127.0.0.1:7006 (428162ab...) -> 0 keys | 1000 slots | 0 slaves.
127.0.0.1:7001 (cbc71d81...) -> 1 keys | 5462 slots | 1 slaves.
127.0.0.1:7002 (d54d6512...) -> 1 keys | 5461 slots | 1 slaves.
127.0.0.1:7000 (44d41027...) -> 0 keys | 4461 slots | 1 slaves.
[OK] 2 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7006)
M: 428162ab9359bb3dd9dd922b3f3791e19e49dbbc 127.0.0.1:7006
   slots:[0-999] (1000 slots) master
M: cbc71d81e642b3a710a44a9b9617bfa1c525650a 127.0.0.1:7001
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 50f6148cadec975727de7ee5be27611f996fe4da 127.0.0.1:7004
   slots: (0 slots) slave
   replicates cbc71d81e642b3a710a44a9b9617bfa1c525650a
M: d54d65127d7eca5cc8ed8cbdec3f9ed2408f7ef5 127.0.0.1:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: e6ae8c680b61bd1594602ef4b1ef4dd857b01e16 127.0.0.1:7005
   slots: (0 slots) slave
   replicates d54d65127d7eca5cc8ed8cbdec3f9ed2408f7ef5
M: 44d41027fe05d00894e743ef638a97a8009e1541 127.0.0.1:7000
   slots:[1000-5460] (4461 slots) master
   1 additional replica(s)
S: 889e34956aab96628d8d1e10acf96843c15db608 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 44d41027fe05d00894e743ef638a97a8009e1541
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

可以看到 目前7006服务节点新增了1000个哈希槽。

增加从服务节点

新增一个端口为7007服务节点。作为从服务节点并添加到集群中。

# 指定 主节点IO 不指定会随机到一个从节点较少的主节点上
src/redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id 428162ab9359bb3dd9dd922b3f3791e19e49dbbc

# 查看主从关系 确认从服务节点添加成功
root@localhost redis-5.0.7]# src/redis-cli -p 7007
127.0.0.1:7007> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:7006
master_link_status:up
....

删除节点

# 删除主节点的时候要把数据清空或重新分配给给其他主节点 <ip>:<port> <node-id>
src/redis-cli --cluster del-node 127.0.0.1:7007 519985462713d865a4a1c05aa99b6f3be9e74ae5

其他指令

# 可以通过help指令 来查询其他指令
[root@localhost redis-5.0.7]# src/redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
  ...

Redis集群相关知识点整理

  • 集群中的订阅发布会自动同步到所有的节点。例如在7000节点进行订阅,然后在7002节点进行消息发布,在7000节点也是可以读取到发布的消息。
  • Redis集群分配了16384个哈希槽,理论上可以有16384个集群实例,但是官网建议最多有1000个实例,这样性能和可扩展性能够保持最佳,在多也会对性能有一定影响了。
  • Redis集群也不能保证数据的强一致性,在部分情况下仍会存在数据丢失的情况。
    • 集群使用异步复制,在复制窗口期进行了故障转移,丢失部分数据。
    • 因为集群中可以分配网络分区,集群分为多个网络,会出现将从服务节点升级为主服务节点期间,原主节点新写的数据为来得及同步到从服务节点,那么数据就会丢失。
  • Redis集群节点之间通过额外的TCP端口进行通信。
  • Redis集群不能保证数据完全平均分配到各个节点,如果数据大量存储在某个节点,就造成了数据倾斜,可以通过重新reshard来进行数据的重新分配。
  • Redis集群的读写操作,默认都会转移到当前节点的主节点上进行操作,也就是不支持读写分离,因为本质都是读写主节点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值