redis系列(九):Redis主从复制概念及实现集群功能

主从复制概念

主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,master以写为主,slave以读为主。

主从复制可以进行读写分离,容灾,备灾。

从库第一次运行是全量复制,断开重新连接主库也是全量复制。

配置从库

redis.conf修改配置:
6.0版本是replicaof 。
低版本:slaveof

主库的密码:masterauth

测试主从复制

启动三个redis服务器

注意事项:redis6.0版本配置从库需要修改redis.conf配置文件。执行replicaof ip port 命令不好使。

查看当前服务的信息

命令:info replication

6380、6381端口绑定主库


从库绑定成功后,就可以获取主库里的key。

几种实现方式

一主多从
链式实现的一主多从(薪火相传似的,一个库绑定上一个库)

实现思路:一个库绑定上一个库

哨兵模式(sentinel)只做简单了解

监控主机是否故障,如果故障根据投票数自动将从库转为主库。
如果哨兵监控的master挂了,恢复后不会替代被选举后的master(变成了一个独立的服务)
哨兵模式可以监控多个master。

使用步骤
  • 调整结构,6379为主,6980、6981为俩从库。

  • 自定义的redis目录下新建sentinel.conf文件,名字不能错。

  • sentinel.conf文件内容:sentinel monitor 被监控数据库名字(自定义的) 127.0.0.1 6379 1
    数字1表示主机挂掉后salve投票看谁接替成为主机,得票数多少后成为主机。

  • 哨兵启动命令:redis-sentinel /opt/myredis/sentinel.conf

ps:在redis安装路径下启动。

  • 选举master的时候会有延迟。
测试哨兵模式是否可用

主库下线:

cluster模式

cluster集群原理

Redis Cluster不使用一致的哈希,而是使用不同形式的分片,其中每个键从概念上讲都是我们称为哈希槽的一部分。

Redis集群中有16384个哈希槽,要计算给定密钥的哈希槽,我们只需对密钥的CRC16取模16384。

Redis群集中的每个节点都负责哈希槽的子集,因此,例如,您可能有一个包含3个节点的群集,其中:

  • 节点A包含从0到5500的哈希槽。
  • 节点B包含从5501到11000的哈希槽。
  • 节点C包含从11001到16383的哈希槽。

这样可以轻松添加和删除集群中的节点。例如,如果我想添加一个新的节点D,则需要将一些哈希槽从节点A,B,C移到D。类似地,如果我想从群集中删除节点A,则只需移动A所服务的哈希槽到B和C。当节点A为空时,我可以将其从群集中完全删除。

因为将哈希槽从一个节点移动到另一个节点不需要停止操作,所以添加和删除节点或更改节点持有的哈希槽的百分比不需要任何停机时间。

只要单个命令执行(或整个事务或Lua脚本执行)中涉及的所有键都属于同一个哈希槽,Redis Cluster就支持多种键操作。用户可以通过使用称为哈希标签的概念来强制多个键成为同一哈希槽的一部分。

哈希标签记录在Redis群集规范中,但是要点是,如果密钥中{}括号之间有一个子字符串,则仅对该字符串内的内容进行哈希处理,因此,例如this{foo}key,another{foo}key 并保证它们在同一哈希槽中,并且可以在带有多个键作为参数的命令中一起使用。

配置文件参数
  • cluster-enabled<yes/no>:如果是yes,则在特定的Redis实例中启用Redis Cluster支持。否则,该实例将像往常一样作为独立实例启动。

  • cluster-config-file:请注意,尽管有此选项的名称,但它不是用户可编辑的配置文件,而是Redis Cluster节点每次发生更改时都会自动保留集群配置(基本上是状态)的文件,为了能够在启动时重新阅读它。该文件列出了诸如群集中其他节点之类的内容,它们的状态,持久变量等等。通常,由于收到某些消息,此文件将被重写并刷新到磁盘上。

  • cluster-node-timeout:Redis群集节点不可用的最长时间(不将其视为失败)。如果主节点无法访问的时间超过指定的时间长度,则其主节点将对其进行故障转移。此参数控制Redis Cluster中的其他重要事项。值得注意的是,在指定的时间内无法到达大多数主节点的每个节点都将停止接受查询。

  • cluster-slave-validity-factor:如果设置为零,则从服务器将始终认为自己是有效的,因此将始终尝试对主服务器进行故障转移,而与主服务器和从服务器之间的链接保持断开状态无关。如果该值为正,则将最大断开时间计算为节点超时值乘以此选项提供的因子,如果节点是从节点,则如果断开主链接的时间超过指定的时间,它将不会尝试启动故障转移。例如,如果节点超时设置为5秒,而有效性因子设置为10,则与主服务器断开连接的从服务器超过50秒将不会尝试对其主服务器进行故障转移。请注意,如果没有从属设备可以对其进行故障转移,则任何不为零的值都可能导致Redis Cluster在主服务器发生故障后不可用。在这种情况下,只有当原始主服务器重新加入群集后,群集才会恢复可用。

  • cluster-migration-barrier:主机将保持连接的最小数量的从机,以便另一个从机迁移到不再受任何从机覆盖的主机。有关更多信息,请参见本教程中有关副本迁移的相应部分。

  • cluster-require-full-coverage<yes/no>:如果设置为yes,默认情况下,如果某个节点未覆盖一定比例的密钥空间,集群将停止接受写入。如果该选项设置为no,即使仅可以处理有关密钥子集的请求,群集仍将提供查询。

  • cluster-allow-reads-when-down<yes/no>:如果将其设置为no(默认情况下为默认值),则当Redis群集被标记为失败时,或者当节点无法到达时,Redis群集中的节点将停止为所有流量提供服务法定人数的主持人或未达到完全覆盖的情况。这样可以防止从不知道群集更改的节点读取可能不一致的数据。可以将此选项设置为yes,以允许在失败状态期间从节点进行读取,这对于希望优先考虑读取可用性但仍希望防止写入不一致的应用程序很有用。当仅使用一个或两个分片的Redis Cluster时,也可以使用它,因为它允许节点在主服务器发生故障但无法进行自动故障转移时继续为写入提供服务。

启动6个redis服务节点

6个配置文件:

启动节点后 加入到集群

命令:redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1 -a nmb18612371148

使用redis-cli客户端链接集群

连接命令:redis-cli -c -h ip -p 6379 -a 密码
-c 是连接集群的意思。
查看集群信息命令:cluster info

测试节点读写信息

测试节点故障

断开6379端口的redis服务:

测试节点读写信息

测试写入:

测试读:

  • 6379端口里的keys

  • 6379端口挂掉以后,获取它之前的数据

经过测试6379节点挂掉后,6379的原数据,依旧是可以拿到的,因为每个小集群都是一个主从复制的结构。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值