Last Updated on

前言

redis作为一个高性能内存数据库,常作为系统的缓存数据库来使用。然而在生产环境中,服务的稳定性非常重要,这篇博文则主要记录介绍使用redis主从哨兵集群来实现redis服务的高可用。

当然为了解决redis的高可用和伸缩性,redis有很多集群方法,非官方的常见的有codis,Redis Sharding,及多种第三方中间件来实现。但是随着redis官方的集群越来越稳定和官方持续的维护和支持,redis官方集群成为不错的选择,两种方案分别如下:

  1. redis主从哨兵方案
  2. redis cluster 分布式集群方案

主从哨兵集群的架构大致如图:

此图为最常见的一主两从结构,一个master主机,两个slave主机。每台主机上都运行着两个进程:

  1. redis-server 服务,处理redis正常的数据操作与响应。master服务可读写,slave服务为只读,当master服务接受到数据修改或写入的命令时,会异步将命令发送到slave上,以此保持master与slave上数据的一致性。
  2. redis-sentinel 哨兵服务,此服务会监控master和slave服务是否正常运行,当超过半数的哨兵认定master服务挂掉时,会进行选举,将slave服务选举设置为master服务,并恢复集群访问,当旧master节点恢复正常后,可以作为新的slave节点重新加入集群。

主从哨兵集群的优缺点:

  • 优点:实现了数据备份,读负载均衡,自动化故障恢复,高可用。
  • 缺点:没有伸缩性,数据存储的限制受到单机内存大小的限制,没发通过增加主机来增加存储空间。

所以,此主从哨兵集群在中小系统中广受使用,因为其简单好用的特性,在数据量不大的情况下,可以很好的提供服务,但是随着互联网企业的不断发展,数据量越来越大,单机存储已经无法满足需求,于是redis官方至3.0版本后推出了新一代的集群方案,redis cluster分布式集群,此集群则在高可用的基础上,解决了伸缩性的问题。有兴趣的请看:

《centos7 Redis Cluster分布式集群搭建》

正文

1. 环境准备

由于哨兵的高可用和确保不是因为哨兵故障导致的master状态误判,所以集群的数量为单数最好,最低集群配置则为1主两从,3哨兵。

即需要3台服务器,每台服务器上运行一个redis-server,一个redis-sentinel

环境如下:

  • master: ip: 192.168.0.1 os: centos7 redis:5.0.5
  • slave: ip: 192.168.0.2 os: centos7 redis:5.0.5
  • slave: ip: 192.168.0.3 os: centos7 redis:5.0.5

这里redis服务的安装就不说了,有需要的请查看我之前的博文:Centos7 Redis的安装与简单使用 中使用源码安装redis服务。

2. 设置主从服务

首先,在master主机上操作:

# 修改redis配置文件,修改下面的列出的选项
$ vim /etc/redis/6379.conf
--------------------------------------------------------------------
# 允许任意用户连接
bind 0.0.0.0
# 关闭保护模式
protected-mode no 
# 开启守护进程
daemonize yes
# 如果是作为缓存服务器,需要注释掉三个数据持久化的选项
# save 900 1
# save 300 10
# save 60 10000
# 设置redis密码,如果要设置密码,则主从的密码要统一一致,这样在故障时切换master才能正常连接,如果不设密码则都不设密码
requirepass 123456
# 设置最大内存限制,避免内存过大造成服务器宕机
maxmemory 2gb
--------------------------------------------------------------------

# 启动服务
$ systemctl restart redis_6379
# 开启防火墙上6379端口
$ firewall-cmd --add-port=6379/tcp --permanent
$ firewall-cmd --reload

在两个salve主机上操作:

# 修改redis配置文件,修改下面的列出的选项
$ vim /etc/redis/6379.conf
--------------------------------------------------------------------
# 上面master上修改的配置项,这里要做一样的修改。就不重复写了
# 在master的基础上,额外需要修改如下配置
# 指定matser机的IP和端口
slaveof 192.168.0.1 6379
# master上redis的密码,如果没有设置密码则不需要配置
masterauth 123456
--------------------------------------------------------------------

# 启动服务
$ systemctl restart redis_6379
# 开启防火墙上6379端口
$ firewall-cmd --add-port=6379/tcp --permanent
$ firewall-cmd --reload

ok,上面已经依次修改mster和slave的配置并启动服务,现在来验证主从是否已经正常运行。

# 在master主机上,使用redis-cli登录redis,查看info信息
$ redis-cli -a 123456
127.0.0.1:6379> info
# 查看最下面 # Replication 内容
# 出现以下内容则证明主从配置已经正常运行
role:master
connected_slaves:2
slave0:ip=192.168.0.2,port=6379,state=online,offset=874800532,lag=1
slave1:ip=192.168.0.3,port=6379,state=online,offset=874800532,lag=1

# 可以简单测试以下,数据复制是否正常
# 在master上,创建一个key为a,值为1
127.0.0.1:6379> select 0
127.0.0.1:6379> set a 1


# 在任意slave主机上,登录redis,查看上面设置的a的key是否存在
$ redis-cli -a 123456
127.0.0.01:6379> select 0
127.0.0.01:6379> get a
"1"
# 如上,发现已经存在了键值为1的a的key,证明主从复制功能正常运行。

3. 设置哨兵服务

哨兵服务与redis-server服务是两个独立的进程,共同运行在每个redis主机上,下面依次在master和slave上设置与运行哨兵服务:

在master和slave上都执行以下操作

# redis通过源码安装后,在redis目录中,会有一个sentinel.conf的哨兵配置文件
# 修改下面列出的配置项,{your-redis-dir}换为你redis的文件目录
$ vim {your-redis-dir}/sentinel.conf
--------------------------------------------------------------------
# 设为后台启动
daemonize yes
# 设置log文件路径,方便出故障时进行排查
logfile "/var/log/redis/sentinel.log"
# 关闭保护模式
protected-mode no

# 设置监控master主机,只需要配置上master的ip和端口
# 后面的2,表示有两台或以上哨兵认定master挂掉了,则认为master挂掉,进行选举切换master
sentinel monitor mymaster 192.168.0.1 6379 2
# 指定master和slave的统一密码
sentinel auth-pass mymaster 123456
--------------------------------------------------------------------


# 指定配置文件,启动哨兵服务,{your-redis-dir}换为你redis的文件目录
$ redis-sentinel {your-redis-dir}/sentinel.conf
# 启动后默认监听26379端口
# 开启防火墙上26379端口的访问
$ firewall-cmd --add-port=26379/tcp --permanent
$ firewall-cmd --reload

ok,到此哨兵服务在3太服务器上都启动后。我们来验证以下服务是否正常运行:

# 任意在master或slave主机上,指定端口,登录redis的哨兵服务
$ redis-cli -p 26379
127.0.0.1:26379> info sentinel
# 查看哨兵信息,最下一行出现master的信息和slave和sentinel的数量信息
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.0.1:6379,slaves=2,sentinels=3

# ok,出现上面的信息,则证明哨兵服务已经正常运行

结束

OK,到此则完成了redis的主从哨兵集群搭建。还可以进行测试,主动关掉master的redis服务,查看是否会自动切换master,切换后的主从是否能正常复制数据。这个测试就留给大家自行去测试了,也很简单,停掉服务后,像上面服务验证一样,通过info信息查看master信息,通过创建键值来测试复制数据是否正常

有任何问题,欢迎留言讨论。