redis cluster

架构图

在这里插入图片描述

redis cluster从3.0之后,采取了无中心化得架构模式,即所有的节点都相互连接。官方推荐使用6个实例,3个主,3个从。 上图为了方便,所以画了两个。 redis cluster提供了主从复制、故障转移等一系列高可用 。
redis中文文档

Redis 集群的数据分片

Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:

节点 A 包含 0 到 5500号哈希槽.
节点 B 包含5501 到 11000 号哈希槽.
节点 C 包含11001 到 16384号哈希槽.
这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

redis集群主从复制模型

redis集群中直接涵盖了主从复制,例如上边的A/B/C三个主节点,在此基础上再添加A1,B1,B3三个从节点,这样当主节点的任何一个断开之后,与之对应的从节点会自动补上、但是如果A和A1坏掉,整个集群就不可用了 。

Redis 一致性保证

Redis 并不能保证数据的强一致性. 这意味这在实际中集群在特定的条件下可能会丢失写操作.

第一个原因是因为集群是用了异步复制. 写操作过程:

客户端向主节点B写入一条命令.
主节点B向客户端回复命令状态.
主节点将写操作复制给他得从节点 B1, B2 和 B3.
主节点对命令的复制工作发生在返回命令回复之后, 因为如果每次处理命令请求都需要等待复制操作完成的话, 那么主节点处理命令请求的速度将极大地降低 —— 我们必须在性能和一致性之间做出权衡。 注意:Redis 集群可能会在将来提供同步写的方法。 Redis 集群另外一种可能会丢失命令的情况是集群出现了网络分区, 并且一个客户端与至少包括一个主节点在内的少数实例被孤立。

举个例子 假设集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六个节点, 其中 A 、B 、C 为主节点, A1 、B1 、C1 为A,B,C的从节点, 还有一个客户端 Z1 假设集群中发生网络分区,那么集群可能会分为两方,大部分的一方包含节点 A 、C 、A1 、B1 和 C1 ,小部分的一方则包含节点 B 和客户端 Z1 .

Z1仍然能够向主节点B中写入, 如果网络分区发生时间较短,那么集群将会继续正常运作,如果分区的时间足够让大部分的一方将B1选举为新的master,那么Z1写入B中得数据便丢失了.

集群的使用

6个节点,3个主,3个从

节点ip地址
master1192.168.199.157
master2192.168.199.155
master3192.168.199.240
slave1192.168.199.141
slave2192.168.199.201
slave3192.168.199.121

这里使用ansible-playbook来进行编排,在157主机上

1)与其余5台机器做ssh认证

[root@ydong ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:LNqj7iftVTAj7d0Vcc2iazB70LGNouW4sqJygLz4aSA root@ydong.com
The key's randomart image is:
+---[RSA 2048]----+
|              ooo|
|       .    . .oo|
|      . =  . *.. |
|       + =*.=..  |
|o     . S=o*..   |
|E.   o .o.o +    |
|oo. ..o .. o     |
|o.o.o.+o.        |
| =+++=oo         |
+----[SHA256]-----+

[root@ydong ~]# ssh-copy-id -i .ssh/id_rsa.pub root@$IP ADDR



测试登录其中一台机器

[root@ydong ~]# ssh 192.168.199.155
Last login: Sun Sep  6 13:55:50 2020 from 192.168.199.111
[root@ydong ~]# exit

2)在157主机上安装redis

 yum install -y redis

3)在157上对主机进行配置集群配置文件,此处仍是使用默认的RDB持久化存储。

vim /etc/redis.conf
bind 0.0.0.0  #  绑定地址
cluster-enabled yes  #  开启集群
cluster-config-file nodes-6379.conf  #集群生成的配置文件,由集群服务统一管理
cluster-node-timeout 15000    # 集群节点互联超时市场
cluster-slave-validity-factor 10 # 从节点与主节点失联超过的时间(由timeout X 10),则不再升为主节点,如果设置为0,则此主节点永远尝试成为主节点

# cluster-migration-barrier 1  从节点最小数量,只要达到这个数时,主节点才会转移故障
# cluster-require-full-coverage yes   如果有一部分哈希槽不见了,也许是挂掉了,集群则会停止接受查询操作,如果设置为no,则继续接受查询操作,只不过查不到有一部分挂掉的哈希槽内的键查不到

4)编写playbook,只是安装和启动

[root@ydong playbooks]# cat redis-cluster.yaml 
---

- hosts: all
  remote_user: root
  tasks:
    - name: install epel
      yum: name=epel-release.noarch state=present
    
    - name: install redis 
      yum: name=redis state=present
   
    - name: copy conf file
      copy: src=/etc/redis.conf dest=/etc/redis.conf
 
    - name: start redis
      service: name=redis state=started

5)157主机上的cluster状态,中文网址

[root@ydong playbooks]# redis-cli 
127.0.0.1:6379> CLUSTER INFO 
cluster_state:fail  #ok状态表示集群可以正常接受查询请求。fail 状态表示,至少有一个哈希槽没有被绑定(说明有哈希槽没有被绑定到任意一个节点),或者在错误的状态(节点可以提供服务但是带有FAIL 标记),或者该节点无法联系到多数master节点。.
cluster_slots_assigned:0  #已经分配的哈希槽
cluster_slots_ok:0   #哈希槽状态不是FAIL或PFAIL的数量
cluster_slots_pfail:0  # 哈希槽状态是 PFAIL的数量。只要哈希槽状态没有被升级到FAIL状态,这些哈希槽仍然可以被正常处理。PFAIL状态表示我们当前不能和节点进行交互,但这种状态只是临时的错误状态。
cluster_slots_fail:0  #哈希槽状态是FAIL的数量。如果值不是0,那么集群节点将无法提供查询服务,除非cluster-require-full-coverage被设置为no .
cluster_known_nodes:1 #集群中节点数量,包括处于握手状态还没有成为集群正式成员的节点.   需要跟其它成员MEET之后才能识别更多成员
cluster_size:0   #至少包含一个哈希槽且能够提供服务的master节点数量 
cluster_current_epoch:0   #集群本地Current Epoch变量的值。这个值在节点故障转移过程时有用,它总是递增和唯一的
cluster_my_epoch:0  #当前正在使用的节点的Config Epoch值. 这个是关联在本节点的版本值.
cluster_stats_messages_sent:0  #通过node-to-node二进制总线发送的消息数量.
cluster_stats_messages_received:0  # 通过node-to-node二进制总线接收的消息数量.

6)开始给3个主节点分配slots

[root@ydong playbooks]# redis-cli -c -h 192.168.199.157 cluster addslots {0..5500}
OK
[root@ydong playbooks]# redis-cli -c -h 192.168.199.155 cluster addslots {5501..11000}
OK
[root@ydong playbooks]# redis-cli -c -h 192.168.199.240 cluster addslots {11001..16383}
OK

7)让3个主节点握手连接

[root@ydong playbooks]# redis-cli
127.0.0.1:6379> CLUSTER MEET 192.168.199.155 6379
OK
127.0.0.1:6379> CLUSTER MEET 192.168.199.240 6379
OK
127.0.0.1:6379> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:3
cluster_current_epoch:2
cluster_my_epoch:0
cluster_stats_messages_sent:28
cluster_stats_messages_received:28

8)查看3个节点信息

127.0.0.1:6379> CLUSTER NODES
492dd173876d88bb5ade19f045b28536cde0c53a 192.168.199.240:6379 master - 0 1599379562529 2 connected 11001-16383
7f63f2ea47e01e1e34387ac2ac0e8b34513e13ff 192.168.199.155:6379 master - 0 1599379561522 1 connected 5501-11000
ce5ff4f1d48e0f7ad722f9755b008726c55168cd 192.168.199.157:6379 myself,master - 0 0 0 connected 0-5500

如果要设置键的话,可能出现以下情况。

127.0.0.1:6379> SET name xiaowang
(error) MOVED 5798 192.168.199.155:6379  #这表示name这个键应该落在5501-11000的哈希槽上。所以显示被移动到155上。

[root@ydong ~]# redis-cli -h 192.168.199.155
192.168.199.155:6379> SET name xiaowang
OK

这样一个只有主节点集群的就成功了。现在添加从节点。
11)让集群发现所有的从节点

[root@ydong playbooks]# redis-cli
127.0.0.1:6379> cluster meet 192.168.199.201 6379
OK
127.0.0.1:6379> cluster meet 192.168.199.121 6379
OK
127.0.0.1:6379> cluster meet 192.168.199.141 6379
OK

10)在各个从节点上使用cluster replicate <master_nodeid>即可

192.168.199.141:6379> CLUSTER REPLICATE ce5ff4f1d48e0f7ad722f9755b008726c55168cd
OK
192.168.199.141:6379> CLUSTER NODES
ce5ff4f1d48e0f7ad722f9755b008726c55168cd 192.168.199.157:6379 master - 0 1599380322605 0 connected 0-5500
8661d52213a75e3dc27d2693d3049cdf50d89d99 192.168.199.141:6379 myself,slave ce5ff4f1d48e0f7ad722f9755b008726c55168cd 0 0 3 connected  #就是slave状态,和157是主从关系
7f63f2ea47e01e1e34387ac2ac0e8b34513e13ff 192.168.199.155:6379 master - 0 1599380325627 1 connected 5501-11000
492dd173876d88bb5ade19f045b28536cde0c53a 192.168.199.240:6379 master - 0 1599380324620 2 connected 11001-16383

查看现在集群上节点信息

192.168.199.157:6379> CLUSTER NODES
f4cff69e562bebdab30e9f07e61a96e6f66355a7 192.168.199.201:6379 slave 7f63f2ea47e01e1e34387ac2ac0e8b34513e13ff 0 1599381894769 1 connected
7f63f2ea47e01e1e34387ac2ac0e8b34513e13ff 192.168.199.155:6379 master - 0 1599381891247 1 connected 5501-11000
8661d52213a75e3dc27d2693d3049cdf50d89d99 192.168.199.141:6379 slave ce5ff4f1d48e0f7ad722f9755b008726c55168cd 0 1599381895274 4 connected
ce5ff4f1d48e0f7ad722f9755b008726c55168cd 192.168.199.157:6379 myself,master - 0 0 4 connected 0-5500
5528d02ced9776ec5e66fde191e6a779518e944c 192.168.199.121:6379 slave 492dd173876d88bb5ade19f045b28536cde0c53a 0 1599381893276 5 connected
492dd173876d88bb5ade19f045b28536cde0c53a 192.168.199.240:6379 master - 0 1599381894284 2 connected 11001-16383

#此正好对应1从1主的顺序

11)读取从节点中的数据,由于官方默认从节点是不分担读写请求的,所以无法在从节点get到键,必须先在命令行中指明read only

192.168.199.201:6379> GET name
(error) MOVED 5798 192.168.199.155:6379

192.168.199.201:6379> readonly
OK
192.168.199.201:6379> get name
"xiaowang"

12)我们试着停掉192.168.199.155的master节点

192.168.199.157:6379> CLUSTER NODES
f4cff69e562bebdab30e9f07e61a96e6f66355a7 192.168.199.201:6379 master - 0 1599382309735 6 connected 5501-11000
7f63f2ea47e01e1e34387ac2ac0e8b34513e13ff 192.168.199.155:6379 master,fail - 1599382276182 1599382273968 1 disconnected
#可以看到 201主机上的从节点自动升级成了master,155重新启动之后,会自动降级成为slave

如果需要用redis-trib.rb或者redis-cli --cluster 管理集群的话,需要重新编译,而yum安装的没有这两个软件。会重新写一遍关于编译来启动redis集群的文章。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值