Redis 多机
【摘要】 Redis 多机集群当数据量过大时,单个 Redis 数据库就无法存放。我们需要多个 Redis 数据库组成集群(cluster),去分别存放不同的数据。key-value 数据进行存入时,会根据 key 的哈希值对 16384 取模,放入相应的槽(slot)存放。这 16384 个槽会分发给各个存储空间。各个存储空间之间会相互通信,并记录所有编号的槽都存储在哪个存储空间:保证最多访问 Re...
Redis 多机
集群
当数据量过大时,单个 Redis 数据库就无法存放。我们需要多个 Redis 数据库组成集群(cluster),去分别存放不同的数据。
- key-value 数据进行存入时,会根据 key 的哈希值对 16384 取模,放入相应的槽(slot)存放。这 16384 个槽会分发给各个存储空间。
- 各个存储空间之间会相互通信,并记录所有编号的槽都存储在哪个存储空间:保证最多访问 Redis 两次可以命中。
配置文件
cluster enabled yes # 开启集群
cluster-config-file nodes-6379.conf # 集群配置文件(默认为 nodes.conf)Copy to clipboardErrorCopied
复制代码
集群指令
- 通过
redis-cli
打开 Redis 集群中的数据库,输入指令去插入不属于这个存储空间的键值,会返回错误。 - 通过
redis-cli -c
打开 Redis 集群中的数据库,会自动将插入数据指令转发到相应的存储空间。
主从复制
如果数据只交给一个 Redis 服务器处理,那么可能面临两大问题:
- 服务器同时处理过多读写操作,超过服务器负载。
- 一旦服务器宕机,就会导致服务异常中断。
为了避免这两个问题,我们必须引入多个 Redis 服务器来保存相同数据,并采用主从复制结构:一个主服务器 Master 对应多个从服务器 Slave 。
- 读写分离:Master 负责写入数据;Slave 则会自动同步数据,并负责读取数据。起到均衡负载的作用。
- 数据冗余:即使某个 Slave 故障,由于其他 Slave 已保存了这些数据,并不会导致服务中断。
容错机制
- 主从之间使用心跳建立连接。 Slave 每秒 ping 一次,汇报自己的偏移量、获取最新的指令。Master 默认每 10s ping 一次 Slave, 检查 slave 是否在线:如果 Slave 多数掉线或者高延迟,Master 停止写和数据同步功能,保障数据稳定性。
- 在分布式系统里还会部署多个 Redis 服务器作为哨兵(除端口号外完全相同),不提供数据服务,只负责监控主从机制的运行:如果发现 Master 宕机,哨兵将通知所有机器,使 Master 下线并开启投票机制选用一个 Slave 担任 Master 。
配置连接
Master 和 Slave 通过以下过程建立连接。
相比于输入指令,我们一般直接修改 conf 文件夹内的配置文件,由机器自动建立连接。
# Master
requirepass 123456 # 连接主服务器需要密码(可选)
# Slave
slaveof 127.0.0.1 6379 # 根据套接字自动连接主服务器
masterauth 123456 # 主服务器密码Copy to clipboardErrorCopied
复制代码
数据同步
Slave 会定期复制 Master 的持久化文件,以保证数据同步。
复制缓冲区:一个先入先出队列,用来存储 AOF 形式指令。由偏移量记录当前执行到的位置。
- 如果开启 AOF ,在创建时就会开启复制缓冲区。(偏移量记录自己执行到的位置)
- 如果使用 RDB ,在成为 Master 时会开启复制缓冲区。(Master 可以含有多个偏移量,记录不同 Slave 读取到的位置。)
如果 Slave 过多,数据同步也会导致 Master 负载过高。因此 Slave 也可以兼职 Master,向下级 Slave 提供服务。但层次太多会导致数据延迟,慎用。
- 数据同步阶段应避免流量高峰期,防止影响业务正常执行;也不要多个从服务器同时同步数据。
- 缓冲区应该足够大,否则一旦发生数据溢出会反复进行全量复制。
# Master
repl-backlog-size 2mb # 修改缓冲区大小(默认 1mb)
# Slave
slave-serve-stale-data no # 不允许同步数据时读数据Copy to clipboardErrorCopied
复制代码
命令传播
服务器每次启动都会随机生成一个运行 ID(40 位 16 进制字符) ,Master 和 Slave 之间正是依靠 Master 的运行 ID 相互识别。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)