分布式缓存Redis之主从复制与Sentinel哨兵

时间:2022-09-15 11:01:26

写在前面

本学习教程所有示例代码见GitHub:https://github.com/selfconzrr/Redis_Learning

Redis主从复制

  • Master可以拥有多个slave
  • 多个slave可以连接同一个Master外,还可以连接到其他的slave
  • 主从复制不会阻塞Master,在主从复制时,Master可以处理client请求。
  • 提供系统的伸缩性。
  • 支持slave只读模式
  • 异步的

主从复制的过程

  分布式缓存Redis之主从复制与Sentinel哨兵

  1. Slave端在配置文件中添加了slave of指令,于是Slave启动时读取配置文件,初始状态为REDIS_REPL_CONNECT。
  2. Slave端在定时任务serverCron(Redis内部的定时器触发事件)中连接Master,发送sync命令,然后阻塞等待master发送回其内存快照文件(最新版的Redis已经不需要让Slave阻塞)
  3. Master端收到sync命令简单判断是否有正在进行的内存快照子进程,没有则立即开始内存快照,有则等待其结束,当快照完成后会将该文件发送给Slave端。
  4. Slave端接收Master发来的内存快照文件,保存到本地,待接收完成后,清空内存表,重新读取Master发来的内存快照文件,重建整个内存表数据结构,并将最终状态置位为 REDIS_REPL_CONNECTED状态,Slave状态机流转完成。
  5. Master端在发送快照文件过程中,接收的任何会改变数据集的命令都会暂时先保存在Slave网络连接的发送缓存队列里(list数据结构),待快照完成后,依次发给Slave,之后收到的命令相同处理,并将状态置位为 REDIS_REPL_ONLINE。

主从复制的配置

  我们创建三台linux服务器,一台作为主服务器Master,ip为192.168.1.10,另外两台作为slave,ip分别为192.168.1.11和192.168.1.12。

  三台服务器分别安装redis,当然这里我们要确保三台服务器之间是能进行互相通信的,即互相可以ping通。然后Master服务器不需要做什么配置,将11和12两台服务器的redis.conf配置文件进行修改之后,redis就会自动的为我们实现主从复制。

  那么如何修改两台slave的redis.conf这个配置文件呢?

  如果主服务器没有设置密码,那么我们只要找到slaveof ,这里我们的主服务器ip是192.168.1.10,redis端口是6379,那么我们只需要在redis.conf配置文件中加入slaveof 192.168.1.10 6379,然后保存即可。

  如果主服务器设置了密码,我们还需要修改masterauth (主服务器的密码)这个配置项。

  然后同时启动三台服务器,进入到redis-cli客户端用info命令进行查看状态(此处我的Master的ip是192.168.1.231,slave的ip分别为229和230)

  分布式缓存Redis之主从复制与Sentinel哨兵

  我们看到上面的role显示此台机器是master,有两个slave,还可以看到对应的ip和端口。

  此时我们在slave只能进行读操作,只能通过master进行写操作。并且我们每次的写操作会发现在每一台服务器上面都是同步的。

  简单的说Redis主从复制,假设我们有三台Redis服务器,一台主服务器Master,两台从服务器slave,slave中只能做读操作。Master可做读写操作,每次对Master进行写操作之后,首先Master会将数据存储在硬盘中,然后通过sync同步命令将每一个slave的数据进行更新,然后每一个slave都将更新的数据写在自己的硬盘中,这样就保证了数据的一致性

Sentinel 哨兵模式

  分布式缓存Redis之主从复制与Sentinel哨兵

  如果我们在使用主从复制的情况下,Master服务器进行了down机的情况,我们的系统就不能再进行写的操作,所以此时redis在2.6版本引入了哨兵模式,但是并不稳定,2.8版本之后哨兵模式才稳定了起来。一个健壮的部署至少需要三个哨兵实例

  顾名思义Redis的哨兵模式就是对redis系统进行实时的监控,其主要功能有:

  • 监测主数据库和从数据库是否正常运行。
  • 当我们的主数据库出现故障的时候,可以自动将从数据库转换为主数据库,实现自动的切换。
  • 当被监控的某个Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。

  例如:

  分布式缓存Redis之主从复制与Sentinel哨兵

  在Server1掉线后:

  分布式缓存Redis之主从复制与Sentinel哨兵

  升级Server2为新的主服务器:

  分布式缓存Redis之主从复制与Sentinel哨兵

实现步骤

  这里我们还是使用上面的redis服务器的ip,Master的ip为192.168.1.229,slave1为:192.168.1.230,slave2为:192.168.1.231

  在其中一台服务器配置sentinel.conf (比如192.168.1.230)

  • 进入解压的redis文件夹中使用cp命令将sentinel.conf文件copy到你的redis中的etc文件夹。
  • 修改sentinel.conf这个配置文件

  打开这个文件,我们注意到哨兵使用的端口号是26379

  dir “/usr/local/redis/etc” 这个dir相当于哨兵的一些日志,我们修改他的路径,让他存放在我们想要保存的目录中。

  sentinel monitor mymaster 192.168.1.229 6379 1 对应的分别是 名称,ip,端口,投票选举的次数(那么我们哨兵监听的肯定是master的ip,然后端口是6379,1说明当master主服务器down机之后,剩下的服务器要进行一个投票选举出一个主服务器)

  sentinel down-after-milliseconds mymaster 5000 这个配置代表哨兵5s进行一次检查这个集群。

  sentinel parallel-syncs mymaster 2 这个配置代表你的几个从节点将支持转换为主服务器的这个事情。

  需要修改的几乎就这几个配置。

  然后,我们分别启动三台redis服务器:

  输入bin/redis-server etc/sentinel.conf –sentinel & 这个命令启动哨兵

  /usr/local/redis/bin/redis-cli -h 192.168.1.230 -p 26379 info sentinel 这个命令是查看哨兵的状态

  分布式缓存Redis之主从复制与Sentinel哨兵

  我们看到我的主服务器现在是229现在有两个slave

  这样我们的哨兵模式就已经开启了,此时我们可以试图关闭229的redis,然后看哨兵会不会去从两个从服务器中选举一台充当主服务器。

  Sentinel配置文件详解:

  分布式缓存Redis之主从复制与Sentinel哨兵

  更多关于哨兵的命令操作参考博客:

  http://redis.majunwei.com/topics/sentinel.html Redis哨兵-实现Redis高可用

—–乐于分享,共同进步
—–Any comments greatly appreciated
—–诚心欢迎各位交流讨论!QQ:1138517609