1. Redis高可用概述
在 Web 服务器中,高可用 是指服务器可以 正常访问 的时间,衡量的标准是在 多长时间 内可以提供正常服务(99.9%、99.99%、99.999% 等等)。在 Redis 层面,高可用 的含义要宽泛一些,除了保证提供 正常服务(如 主从分离、快速容灾技术 等),还需要考虑 数据容量扩展、数据安全 等等。
在 Redis 中,实现 高可用 的技术主要包括 持久化、复制、哨兵 和 集群,下面简单说明它们的作用,以及解决了什么样的问题:
- 持久化:持久化是 最简单的 高可用方法。它的主要作用是 数据备份,即将数据存储在 硬盘,保证数据不会因进程退出而丢失。
- 复制:复制是高可用 Redis 的基础,哨兵 和 集群 都是在 复制基础 上实现高可用的。复制主要实现了数据的多机备份以及对于读操作的负载均衡和简单的故障恢复。缺陷是故障恢复无法自动化、写操作无法负载均衡、存储能力受到单机的限制。
- 哨兵:在复制的基础上,哨兵实现了 自动化 的 故障恢复。缺陷是 写操作 无法 负载均衡,存储能力 受到 单机 的限制。
- 集群:通过集群,Redis 解决了 写操作 无法 负载均衡 以及 存储能力 受到 单机限制 的问题,实现了较为 完善 的 高可用方案。
2. Redis Sentinel的基本概念
redis sentinel是redis高可用的实现方案,在实际生产环境中,对提高整个系统的高可用性是非常有帮助的,当主节点发生故障时,redis sentinel能自动完成故障发现和故障转移,并通知应用方,从而实现高可用。

当主节点宕机后,sentinel在从节点中选举新的节点成为主节点,解决redis单点问题,实现高可用。
下面进行环境搭建:

一.redis主从复制
安装redis(三台机器都要安装) redis安装请看这里 传送门

(172.17.0.2 – master )修改redis配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
vim /etc/redis/6379.conf 修改 bind 127.0.0.1 daemonize no appendonly no 为 bind 0.0.0.0 daemonize yes #开启后台启动 appendonly yes #开启aof持久化 appendfsync everysec #每秒一次aof写 注:在配置文件中默认的bind接口是127.0.0.1,这样的话访问redis服务只能通过本机的客户端链接,无法通过远程连接,这样可以避免将redis服务暴露再危险的网络环境中,防止一些不安全的人随便远程连接到redis服务,如果将bind接口注释掉将会接受所有来自于可用网络接口的连接 设置密码:如果你的redis需要设置密码,那么你需要在三台节点机器的配置文件中需要修改如下配置 requirepass "123456" #永久设置redis密码 masterauth "123456" #从服务器向主机master请求的认证密码 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
REDIS启用密码认证的疑问 首先,Redis主从和clsuter是支持密码认证的。 其次,关于启用redis密码认证的涉及的几个问题: 1、是否只设置requirepass就可以?masterauth是否需要同步设置? 答案:redis启用密码认证一定要requirepass和masterauth同时设置。 如果主节点设置了requirepass登录验证,在主从切换,slave在和master做数据同步的时候首先需要发送一个ping的消息给主节点判断主节点是否存活,再监听主节点的端口是否联通,发送数据同步等都会用到master的登录密码,否则无法登录,log会出现响应的报错。也就是说slave的masterauth和master的requirepass是对应的,所以建议redis启用密码时将各个节点的masterauth和requirepass设置为相同的密码,降低运维成本。当然设置为不同也是可以的,注意slave节点masterauth和master节点requirepass的对应关系就行。 2、requreipass和master的作用? masterauth作用:主要是针对master对应的slave节点设置的,在slave节点数据同步的时候用到。 requirepass作用:对登录权限做限制,redis每个节点的requirepass可以是独立、不同的。 注意:建议将masterauth 和 requirepass 设置为一样,不一样有可能无法同步数据,亲测。 |
重启redis
1 |
/etc/init.d/redis_6379 restart |

2.配置另外2台从节点
(172.17.0.3 – slaveof)编辑配置文件,修改一行,添加一行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
vim /etc/redis/6379.conf 修改 bind 127.0.0.1 daemonize no appendonly no 为 bind 0.0.0.0 daemonize yes #开启后台启动 appendonly yes #开启aof持久化 appendfsync everysec #每秒一次aof写 #在最后一行添加 (指向主节点) slaveof 172.17.0.2 6379 注意:如果你的redis需要设置密码,那么你需要在三台节点机器的配置文件中需要修改如下配置 requirepass "123456" #永久设置redis密码 masterauth "123456" #从服务器向主机master请求的认证密码 |
重启服务

(172.17.0.4 – slaveof) 编辑配置文件,修改一行,添加一行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
vim /etc/redis/6379.conf 修改 bind 127.0.0.1 daemonize no appendonly no 为 bind 0.0.0.0 daemonize yes #开启后台启动 appendonly yes #开启aof持久化 appendfsync everysec #每秒一次aof写 #在最后一行添加 slaveof 172.17.0.2 6379 注意:如果你的redis需要设置密码,那么你需要在三台节点机器的配置文件中需要修改如下配置 requirepass "123456" #永久设置redis密码 masterauth "123456" #从服务器向主机master请求的认证密码 |
重启服务

切换到主节点master(172.17.0.2) 使用info命令查看redis信息
1 2 |
[root@2ae9954388c7 redis]# redis-cli 127.0.0.1:6379> info |

切换到从节点(172.17.0.3 和 172.17.0.4) 使用info命令查看信息


在主节点上写入数据
1 2 3 4 5 6 7 8 |
[root@2ae9954388c7 ~]# redis-cli 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> set name shooter OK 127.0.0.1:6379> get name "shooter" 127.0.0.1:6379> |
然后再从节点获取(检测是否可以获取到)


到此(redis主从复制配置完成)
1 2 3 4 |
#redis密码登录 redis-cli -h 127.0.0.1 -p 6379 -a 123456 #redis密码退出 redis-cli -a 123456 shutdown |
二、redis的高可用
1.配置哨兵节点(三台哨兵节点都装在各自机器)
1 2 3 |
#修改哨兵模式配置文件,进入redis安装文件,可以看到哨兵sentinel.conf配置文件,将sentinel.conf文件拷贝到/etc/redis cp sentinel.conf /etc/redis |
编辑sentinel文件:指定主节点redis的信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
vim /etc/redis/sentinel.conf 把下面几项进行修改:(你也可以清空原来配置文件直接复制下面内容保存) protected-mode no port 26379 dir /tmp sentinel monitor mymaster 172.17.0.2 6379 1 sentinel auth-pass mymaster 123456 #因为我的master是设有密码的,所以这里我必须配置 sentinel down-after-milliseconds mymaster 10000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 60000 PS:主机ip地址,端口号,1表示在sentinel集群中只要有两个节点检测到redis主节点出故障就进行切换,2是一个阈值,代表有两台或两台以上哨兵判断主节点redis不通的话就认定这个节点有问题,实行故障转移。 如果你的redis带有密码那么这里要配置下(三个节点都要配置),没有就算了 sentinel auth-pass mymaster 123456 #配置哨兵后台运行增加如下配置 daemonize yes (建议测试完成后再配置此选项) 然后执行 redis-server /etc/redis/sentinel.conf --sentinel 就不会一直保持在控制台 |
三台哨兵节点的redis都需要修改。( 将修改好的文件传给(172.17.0.3)和(172.13.0.4) )

传输完成后,重启下三台机器redis
重启后查看配置文件你会发现,多了几行

测试
每个节点都执行监控命令
1 2 3 4 5 |
redis-sentinel /etc/redis/sentinel.conf 或者 redis-server /etc/redis/sentinel.conf --sentinel 当你第二次执行这个命令的时候 就不会有+slave出现了,不要奇怪,因为只有在第一次的时候会写入配置文件,不信你看你的sentinel.conf末尾行 |
可以看到执行后有两行+slave,显示的是两个+slave的信息



重新打开一个shell,ssh连接node1,宕掉node1上的redis
1 2 3 4 |
[root@2ae9954388c7 ~]# redis-cli 127.0.0.1:6379> shutdown not connected> not connected> |
这时候去看 node1的控制台信息

打开新的shell窗口登录redis查看 其他节点当前状态



(完)
小错误:
2.你可能在启动的时候会遇到此类错误,意思是: 对一个高负载的环境来说tcp设置128这个值,太小了。 这是我的理解,绝体的还需到官网理解。然后我们可以手动设置,或者设置永久值.所以执行:

1 |
echo 511 > /proc/sys/net/core/somaxconn |
就把这个问题解决了
永久解决,打开/etc/sysctl.conf
添加如下行
1 2 |
net.core.somaxconn= 1024 然后执行sysctl -p 就可以永久消除这个warning |
- 本文固定链接: https://www.yoyoask.com/?p=672
- 转载请注明: shooter 于 SHOOTER 发表