你不知道的-主从复制,因为该命令redis作者曾摊上事?

推荐学习

  • Redis让我凉在美团一面 , 摸爬滚打3个月 , 二战逆袭成功斩获Offer
  • 缓存架构技术:Redis+MongDB , 阿里P7面试必跳的坑

你不知道的-主从复制,因为该命令redis作者曾摊上事?文章插图
一、什么是主从复制主从复制就是我们建立数据存档的时候 , 将一份数据进行复制保存多分存储在不同的机器上 。
二、为什么要用主从复制在redis持久化机制中 , 我们已经提到为了防止数据丢失 , redis提供了RDB和AOF两种方式持久化数据 , 将内存的数据持久化到磁盘上 。 但是当出现服务器出现故障 , 比如服务磁盘坏掉导致数据不可恢复时 。 那又该怎么办呢?
那么为了避免单点故障 , 我们需要将数据复制多份部署在多台不同的服务器上 , 即使有一台服务器出现故障其他服务器依然可以继续提供服务 。 这就要求当一台服务器上的数据更新后 , 自动将更新的数据同步到其他服务器上 , 这就是主从复制 。
你不知道的-主从复制,因为该命令redis作者曾摊上事?文章插图
当我们主节点压力比较大时 , 那么我们可以通过读写分离的方式 , 对复制的节点数据进行读操作 , 以增加我们的服务性能
你不知道的-主从复制,因为该命令redis作者曾摊上事?文章插图
总结来讲使用主从复制有以下原因
  1. 数据备份 , 容灾恢复
  2. 业务数据读写分离
三、redis主从复制实现redis实现主从很简单 , 只需要增加启动脚本或者配置文件中配置slaveof命令即可
1、启动命令启动redis服务时 , 后面新增 redis-server --slaveof ip(主redisip) port 。
该配置到5.0版本以上改为了 replicaof , Redis 作者在 GitHub 上发起了一个“用其他词汇代替 Redis 的主从复制术语”的 issue因为有人认为 Redis 中的术语 master/slave (主人 / 奴隶)冒犯到了别人(果然歪果仁们对这还是敏感啊 , 哈哈) , 要求 Redis 作者 ANTIREZ 修改这个术语 , 甚至连 ruby on rails 的作者 DHH 都在表态 。
你不知道的-主从复制,因为该命令redis作者曾摊上事?文章插图
2、配置文件新增环境两台机器:148.70.47.76(主),111.229.169.46(从)
1、148.70.47.76直接启动redis
2、修改111.229.169.46redis配置 , 新增slaveof 148.70.47.76 6379 配置或者使用replicaof配置
你不知道的-主从复制,因为该命令redis作者曾摊上事?文章插图
5.0以上
你不知道的-主从复制,因为该命令redis作者曾摊上事?文章插图
3、启动111.229.169.46 的redis
4、查看148.70.47.76 redis状态 , 发现role 为master主节点 , 有一个从节点 , 从节点ip为111.229.169.46(该信息很重要 , 哨兵机制会用到)
你不知道的-主从复制,因为该命令redis作者曾摊上事?文章插图
查看111.229.169.46 redis状态 , 发现role 为slave从节点 , 有一个主节点 , 主节点ip为148.70.47.76.
你不知道的-主从复制,因为该命令redis作者曾摊上事?文章插图
3、Tips:
  • 配置主从为了安全性可以修改配置文件的masterauth属性来增加同步密码
  • 从节点建议用只读模式slave-read-only=yes, 若从节点修改数据 , 主从数据不一致.
  • 传输延迟:主从一般部署在不同机器上 , 复制时存在网络延时问题 , redis 提供repl-disable-tcp-nodelay 参数决定是否关闭TCP_NODELAY,默认为关闭.参数关闭时:无论大小都会及时发布到从节点 , 占带宽 , 适用于主从网络好的场景.参数启用时:主节点合并所有数据成TCP 包节省带宽 , 默认为40 毫秒发一次 , 取决于内核 , 主从的同步延迟40 毫秒 , 适用于网络环境复杂或带宽紧张 , 如跨机房
四、主从复制原理1、主要流程redis主从主要流程如下:
你不知道的-主从复制,因为该命令redis作者曾摊上事?文章插图
redis的数据同步主要分为全量同步和增量同步
2、全量同步Redis全量复制一般发生在Slave初始化阶段 , 这时Slave需要将Master上的所有数据都复制一份 。master服务器会开启一个后台进程用于将redis中的数据生成一个rdb文件 , 与此同时 , 服务器会缓存所有接收到的来自客户端的写命令(包含增、删、改) , 当后台保存进程处理完毕后 , 会将该rdb文件传递给slave服务器 , 而slave服务器会将rdb文件保存在磁盘并通过读取该文件将数据加载到内存 , 在此之后master服务器会将在此期间缓存的命令通过redis传输协议发送给slave服务器 , 然后slave服务器将这些命令依次作用于自己本地的数据集上最终达到数据的一致性 。