Redis学习笔记—主从复制和集群

主从复制

主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主,只能有一个主,可以多个从。

用处:

  • 读写分离,性能扩展
  • 容灾快速恢复
    master宕机,重启后一起如初,slave宕机重启后需要重新连接到master。slaveof <ip><port>

主从复制原理:

  1. 当 slave连接上master后,向slave发送消息请求数据同步
  2. master收到消息后,把数据进行持久化写入rdb文件,把文件发送给slave,slave读取后回复数据,是全量复制
  3. 每次master的写操作都书主动同步slave,此时是增量复制,只传输写的内容
薪火相传

上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,上游Master只需要同步该Slave,该slave作为了链条中下一个的master负责向下同步, 可以有效减轻master的写压力,去中心化降低风险。

中途变更转向:会清除之前的数据,重新建立拷贝最新的。风险是一旦某个slave宕机,后面的slave都没法备份。主机挂了,从机还是从机,无法写数据了

反客为主

当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。
slaveof no one 将从机变为主机

哨兵模式

redis主目录下新建sentinel.conf文件,写入sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量。
执行redis-sentinel /myredis/sentinel.conf

哨兵从所有slave中挑选一个作为master,然后向其他slave发送slaveof命令复制新的master,当旧的master再次上线后哨兵也会做同样操作让其成为新master的slave

哨兵选举规则:

  1. 优先级靠前
  2. 偏移量大
  3. runid小
    优先级在redis.conf中默认slave-priority 100,值越小越高;偏移量指获得原主机数据最全的;runid是每个redis实例启动后随机生成的40位数
    容量不够,redis如何进行扩容?并发写操作, redis如何分摊?另外,主从模式,薪火相传模式,主机宕机会导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。之前通过代理主机来解决,但是redis3.0中提供了解决方案,就是无中心化集群配置

集群

Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请

redis cluster配置修改

include /home/bigdata/redis.conf
port 6379
pidfile "/var/run/redis_6379.pid"
dbfilename "dump6379.rdb"
------------------------------------上面同S-L的配置
dir "/home/bigdata/redis_cluster" //指定db文件存储位置
logfile "/home/bigdata/redis_cluster/redis_err_6379.log"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
请确保所有redis实例启动后,nodes-xxxx.conf文件都生成正常,进入src目录执行

redis-cli --cluster create --cluster-replicas 1 192.168.11.101:6379 192.168.11.101:6380 192.168.11.101:6381 192.168.11.101:6389 192.168.11.101:6390 192.168.11.101:6391

此处不要用127.0.0.1,使用真实ip,replicas表集群方式,参数1表示一个M一个S,即最简单的集群。最少需要6个节点,3个M和3个S

登录:
普通方式登录可能直接进入读主机,存储数据时,会出现MOVED重定向操作。所以,应该以集群方式登录可以自动重定向:
redis-cli -c -p 端口号写操作会自动切换到相应master
cluster nodes查看集群信息
分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

slots-插槽

一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点,
其中:
节点 A 负责处理 0 号至 5460 号插槽。
节点 B 负责处理 5461 号至 10922 号插槽。
节点 C 负责处理 10923 号至 16383 号插槽。
slots的作用就是把k-v尽量平均的分配到集群各处

在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。
不在一个slot下的键值,是不能使用mget,mset等多键操作。
可以通过{组名}来定义组的概念,计算slots用组名,从而使同组的键值对放到一个slot中去。

#只能查看该节点内的插槽
cluster keyslot 组名或键名 //获取对应插槽id
cluster getkeysinslot slot count //获取某一插槽里count数量的keys
cluster countkeysinslot slot //获取制定插槽内key数量

故障恢复

  1. 集群中某个M节点宕机后,S节点会升为M节点(达到超时时间后),原M节点恢复后变为S节点

  2. 如果所有某一段插槽的主从节点都宕掉,取决于配置

    cluster-require-full-coverage 为yes ,整个集群都挂掉

    cluster-require-full-coverage 为no ,该插槽数据全都不能使用,也无法存储

总结:
Redis集群实现扩容,可以分摊节点压力,无中心配置相对简单
多键操作是不被支持,多键的Redis事务是不被支持的,lua脚本不被支持

posted @   ArthurFleck  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示