Redis高可用-主从,哨兵,集群 (3)

当然你也可以在客户端和服务端同时部署哨兵;

配置示例: #指出master地址和端口 以及仲裁数 sentinel monitor mymaster 127.0.0.1 6379 2 # 与master通讯超时时间,达到超时时间则sdown+1 sentinel down-after-milliseconds mymaster 60000 # 同一个master,开始新的故障转移的时间(将是上一次的两倍) # 若slave连接到错误的master超过这个时间后slave将被重新连接到正确的master # 取消正在进行中的故障转移等待时间 # 按照parallel-syncs指定的配置进行复制的时间,超时候将不再受parallel-syncs的限制 sentinel failover-timeout mymaster 180000 # 发生故障转移后,同时进行同步的副本数量 sentinel parallel-syncs mymaster 1 集群

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

Redis集群并不支持处理多个keys的命令(如mset),因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.

Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:

自动分割数据到不同的节点上。

整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

示意图:

image-20200602161912338

集群的数据分片

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会自动的将指令移动到相关节点上;

主从复制模型

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,集群使用了主从复制模型,每个节点都会有至少一个slave;

集群在没有slave的情况下,如果某个节点故障了,那么整个集群就会以为缺少一部分槽而不可用.

然而如果在创建集群时为每个节点都添加了从节点,在某个节点故障后,其从节点将被选举为新的主节点,整个集群就不会因找不到槽而不可用,当然若某个节点与其所有子节点都故障了那么整个节点将不可用;

一致性保证

Redis 并不能保证数据的强一致性. 这意味这在实际中集群在特定的条件下可能会丢失写操作,主要有两方面原因:

主节点到从节点之间的指令复制是异步完成的,主从之间在某个时间点可能不一致

出现网络分区,导致主节点可正常写入,但是从节点已经被其他分区节点选举为新的master,写入的数据将丢失

容错性

image-20200602165948571

当某master节点故障时,其他master节点将发起投票,若一半以上的master认为其不可用,则从该节点的从节点中(若存在)选举新的master;

若该master没有从节点,则集群将不可用

另外当集群一半以上的节点都不可用时则无论这些节点是否有从节点,集群立即不可用;

创建集群:

Redis在5.0版本时放弃了Ruby集群的方式,改为C语言编写的 redis-cli方式,使得集群的构建方式复杂度大大降低。

集群至少需要三个节点,每个节点一个从节点总共为6个

配置:

若要以集群方式运行,则需要按以下方式修改配置文件,以启用集群:

cluster-enabled yes

在实际开发中仍然建议使用单独的虚拟机来部署所有的redis节点,下例为了简化操作,在同一台虚拟机上搭建集群来进行测试:

添加上述配置后将bin目录复制6分名称为7001-7006,端口从7001-7006

image-20200602174538250

分别启动6个redis示例

image-20200602174555152

使用redis-cli创建集群

redis-cli --cluster create 10.211.55.9:7001 10.211.55.9:7002 10.211.55.9:7003 10.211.55.9:7004 10.211.55.9:7005 10.211.55.9:7006 --cluster-replicas 1

过程中集群将重写配置文件,需输入yes确认

创建完成后提示如下信息:

![image-20200602174849244](/Users/jerry/Library/Application Support/typora-user-images/image-20200602174849244.png)

可以看到,集群自动为每个master平均分配了哈希槽,并且设置了一个slave

连接集群

./redis-cli -h 10.211.55.9 -p 7001 -c # 参数 -c 即表示连接到集群

查看集群状态

cluster info

查看节点信息,包括ip,port,id,槽,主/从;

cluster nodes

添加节点

Redis集群支持动态扩展,期间redis可正常响应客户端访问

首先制作新的redis实例端口为7007并启动

添加到集群中

./redis-cli --cluster add-node 10.211.55.9:7007 10.211.55.9:7001

添加成功:

image-20200602180930266

新的节点默认作为master,但是该master没有分配槽位,使用前必须分配哈希槽

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxyzd.html