一、主从复制概念
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
主从复制的作用:
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
- 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
- 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担- 读负载,可以大大提高Redis服务器的并发量。
- 高可用:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
二、主从复制集群搭建
1、准备工作
- 配置“一主二从”的Redis集群,需要开启三个服务端(这里只是用于测试, 就只在一台服务器上开启,生产环境应该是有多台服务器的)
将Redis 安装目录下的
redis.conf
文件复制出三份, 分别用作 “一主二从” 启动时的配置文件
我演示环境的配置文件都存放在 /etc/redisConf 下,其中 “redis6379.conf” 为“master”启动的配置文件, “redis6380.conf” 和“redis6381.conf”为 “slave” 启动的配置文件修改三个配置文件中的配置
- 将 redis6380.conf 和 redis6381.conf 中的 “port 6379” 改成 “port 6380”、“port 6381”
- 将“daemonize no” 改成 “daemonize yes” (启用后台进程运行)
- 将“pidfile /var/run/redis_6379.pid” 改成对应的端口名称(例如:redis6380.conf配置文件改成 pidfile /var/run/redis_6380.pid)
- 将“logfile “”” 改成对应端口的标识, 和上述一致
- 将“dbfilename dump.rdb” 改成对应端口的标识, 和上述一致
- 修改 redis6380.conf 和 redis6381.conf 的 replicaof
2、根据配置文件启动三个Redis 服务
[root@TR redisConf]# redis-server redis6379.conf
[root@TR redisConf]# redis-server redis6380.conf
[root@TR redisConf]# redis-server redis6381.conf
[root@TR redisConf]# ps -ef | grep redis
root 70069 1 0 19:55 ? 00:00:06 redis-server 127.0.0.1:6379
root 70192 1 0 21:14 ? 00:00:00 redis-server 127.0.0.1:6380
root 70199 1 0 21:14 ? 00:00:00 redis-server 127.0.0.1:6381
root 70207 69768 0 21:15 pts/1 00:00:00 grep --color=auto redis
[root@TR redisConf]#
3、启动三个客户端、测试
前面讲到,Master以写为主,Slave 以读为主,下面就来试试, 在master主机中写入数据,看slave是否可以正常的读取到数据!
4、测试宕机
假设1:主机挂了,查看从机信息,主机恢复,再次查看信息
假设2:从机挂了,查看主机信息,从机恢复,查看从机信息
三、哨兵模式
从上面两个测试可以看出, 当master 宕机之后,另外两台服务器的状态依旧是 slave 角色 ,这个模式是存在一些问题的。 因为我们都知道,master 主要负责写入数据, 而 slave 主要是用来读取数据,当 master 宕机后,就会出现, 只能读数据,没办法写数据。如果是生产环境,可能会导致所有业务都有问题。
思考:
能不能当master宕机之后,在slave 中随机选择一个服务器,赋予 master 的角色呢? (就好比古代的皇帝如果驾崩了, 肯定会是“储君”上位, 否则国家会发生动乱。)答案是可以的, 这里就需要用到 哨兵模式。
1、哨兵模式概述
主从切换技术的方法是:当主服务器(master)宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了Sentinel(哨兵)
架构来解决这个问题。“储君”上位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
这里的哨兵有两个作用
- 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
然而一个哨兵进程对Redis服务器进行监控,可能会出现”哨兵”挂掉的问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。(是不是和俄罗斯的套娃一样 )
2、搭建哨兵模式的准备工作
首先, 还是和配置Redis服务的时候一样, 复制出一份sentinel.conf 配置文件到 /etc/redisConf 下。因为 sentinel.conf 默认是一 127.0.0.1 6379 为 master 主服务, 所以这里就不需要更改了。
redis-sentinel /etc/redisConf/sentinel.conf
测试,master 主服务器宕机以后, 会发生什么
可以看到,当 6379 主服务器宕机以后,哨兵会通过投票,将 6381 服务器选举为新的“master”服务器,并且另外一个 6380 的从服务器也自动归属在 6381 服务器下。
查看我们复制出的 sentinel.conf 文件的内容
[root@TR ~]# cd /etc/redisConf
[root@TR redisConf]# ls
6379.log 6381.log dump6380.rdb redis6379.conf redis6381.conf
6380.log dump6379.rdb dump6381.rdb redis6380.conf sentinel.conf
[root@TR redisConf]# vim sentinel.conf
可以看到,当 master 发生变化之后, 对应的 sentinel.conf 配置文件也发生了变化!
测试从新将 6379 服务器上线, 我们可以看到, 当 master 服务器宕机之后, 重新上线,角色有原来的master 变成了 slave。
五、总结
1、哨兵模式的优缺点
优点:
- 哨兵集群模式是基于主从模式的,所有主从的优点,哨兵模式同样具有。
- 主从可以切换,故障可以转移,系统可用性更好。
- 哨兵模式是主从模式的升级,系统更健壮,可用性更高。
缺点:
- Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
- 实现哨兵模式的配置也不简单,甚至可以说有些繁琐
暂无评论