redis作为一个高性能内存数据库,常作为系统的缓存数据库来使用。然而在生产环境中,服务的稳定性非常重要,这篇博文则主要记录介绍使用redis主从哨兵集群来实现redis服务的高可用。
当然为了解决redis的高可用和伸缩性,redis有很多集群方法,非官方的常见的有codis,Redis Sharding,及多种第三方中间件来实现。但是随着redis官方的集群越来越稳定和官方持续的维护和支持,redis官方集群成为不错的选择,两种方案分别如下:
- redis主从哨兵方案
- redis cluster 分布式集群方案
主从哨兵集群架构图:
此图为最常见的一主两从结构,一个master主机,两个slave主机。每台主机上都运行着两个进程:
- redis-server 服务,处理redis正常的数据操作与响应。master服务可读写,slave服务为只读,当master服务接受到数据修改或写入的命令时,会异步将命令发送到slave上,以此保持master与slave上数据的一致性。
- redis-sentinel 哨兵服务,此服务会监控master和slave服务是否正常运行,当超过半数的哨兵认定master服务挂掉时,会进行选举,将slave服务选举设置为master服务,并恢复集群访问,当旧master节点恢复正常后,可以作为新的slave节点重新加入集群。
主从哨兵集群的优缺点:
- 优点:实现了数据备份,读负载均衡,自动化故障恢复,高可用。
- 缺点:没有伸缩性,数据存储的限制受到单机内存大小的限制,没发通过增加主机来增加存储空间。
所以,此主从哨兵集群在中小系统中广受使用,因为其简单好用的特性,在数据量不大的情况下,可以很好的提供服务,但是随着互联网企业的不断发展,数据量越来越大,单机存储已经无法满足需求,于是redis官方至3.0版本后推出了新一代的集群方案,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
2. 设置主从服务
1)在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
2)在两个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
上面已经依次修改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
到此哨兵服务在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,出现上面的信息,则证明哨兵服务已经正常运行