Redis 主从复制是现在流行的 Redis 高可用方案,他的优点是可以分担压力,扩展读的能力,并且一台节点挂了,这个节点是主节点的话,从节点可以挑起大梁,承担重任。
Redis主从有啥缺点呢?
主节点宕机, 从节点上位, 那么需要人为修改所有应用方的主节点地址(改为新的master地址), 还需要命令所有从节点复制新的主节点。
Redis-sentinel (下面统称为哨兵)可以解决上面的问题。
废话不多说,我们直接来安装吧,使用版本如下:
Linux:CentOS 7 Redis:5.0.3
Redis 安装链接:https://www.cnblogs.com/heqiuyong/p/10463334.html
首先,在/usr/local/redis 目录下创建一个文件夹 conf 和 db,db下创建三个文件夹
mkdir conf db
cd db
mkdir master slave_one slave_two
然后,配置三个配置文件 redis-6379.conf、redis-6380.conf、redis-6381.conf
内容分别是:
redis-6379.conf:
# 使用后台模式启动
daemonize yes
# 注释以下内容开启远程访问
# bind 127.0.0.1
# 修改启动端口为6379
port 6379
# 修改pidfile指向路径--Redis以守护进程方式运行时把pid写入文件
pidfile /usr/local/redis/conf/redis_6379.pid
# 数据文件的存放位置
dir /usr/local/redis/db/
redis-6380.conf:
# 使用后台模式
daemonize yes
# 关闭保护模式
#protected-mode no
# 注释以下内容开启远程访问
# bind 127.0.0.1
# 修改启动端口为6379
port 6380
# 修改pidfile指向路径
pidfile /usr/local/redis/conf/redis_6380.pid
#数据库的存放位置
dir /usr/local/redis/db/slave_one
#可以将当前服务器转变为 xx服务的从服务
slaveof 127.0.0.1 6379
redis-6381.conf:
# 使用后台模式
daemonize yes
# 关闭保护模式
#protected-mode no
# 注释以下内容开启远程访问
# bind 127.0.0.1
# 修改启动端口为6379
port 6381
# 修改pidfile指向路径
pidfile /usr/local/redis/conf/redis_6381.pid
#数据库的存放位置
dir /usr/local/redis/db/slave_two/
#可以将当前服务器转变为 xx服务的从服务
slaveof 127.0.0.1 6379
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6379.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6380.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6381.conf
使用 info replication 可以查看主从状态
主库中, connected_slaved 属性表示从库数量
从库的 info replication 中,role:slave
表示自己是个从库。
master_last_io_seconds_ago
:7 表示距上次io同步已经过了7秒,默认是 10 秒一次。
我们在原来的 redis 安装包中, 找到 sentinel.conf ,复制到 conf 文件夹。复制三份,分别为 sentinel-26379.conf、sentinel-26380.conf和 sentinel-26381.conf。
sentinel-26379.conf 配置如下
# sentinel 节点的端口
port 26379
# 不在后台启动,因为后面看日志会比较方便
daemonize no
# 这里代表监听哪个redis服务,2代表权重
sentinel monitor mymaster 127.0.0.1 6379 2
# 这个地方默认30000,即30秒,为了测试方便设置了12秒
sentinel down-after-milliseconds mymaster 12000
sentinel-26380.conf 和 sentinel-26381.conf 的配置只有 port 属性改成对应端口即可,其他属性一致。
/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel-26379.conf
/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel-26380.conf
/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel-26381.conf
使用 info sentinel 命令验证是否启动正常
图中最后一行表示 状态正常,master 节点地址 是6379 端口,两个从节点和三个哨兵节点。
先进入 redis-cli -p 6380
,然后执行 shutdown。
此时,多个哨兵节点都打印了一行日志:
12702:X 18 May 2020 00:23:39.002 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
表示有一个从节点 127.0.0.1:6380 已经被标记为主观下线。
6380节点启动之后,哨兵们会报出日志:
12702:X 18 May 2020 00:33:35.670 * +reboot slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
12702:X 18 May 2020 00:33:35.746 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
进入主节点,然后进行 shutdown后,哨兵则输出日志:
我们可以看到,主节点挂了之后,6381 节点被选成了主节点,进入6381 查看主从状态:
图中可以看出,6381 成了主节点,6380 继续是从节点。
刚才 6381 成了主节点后,如果 6379 重新启动,会回到主节点的位置么?
答案是否,6379 只有当从节点的份。就比如你被一个小弟抢了你老大的位置,他肯给回你这个位置吗。因此当master 回来之后,他也只能当个小弟。
6379启动后,哨兵节点打印日志:
12714:X 18 May 2020 00:43:07.302 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
12714:X 18 May 2020 00:43:17.240 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381