Redis一主二从三哨兵模式
hostnamectl set-hostname //修改主机名
将提供的Redis安装文件下载redis-3.2.12.tar.gz到三台虚拟机中,解压到/opt目录中,并配置yum源使用本地目录,命令如下(三台虚拟机操作一致,以redis1主机为例):
shell
[root@redis1 ~]# curl -O #下载地址
[root@redis1 ~]# tar -xf redis-3.2.12.tar.gz -C /opt/
[root@redis1 ~]# mv /etc/yum.repos.d/* /media/
[root@redis1 ~]# cat << EOF >> /etc/yum.repos.d/redis.repo
[redis]
name=redis
baseurl=file:///opt/redis
gpgcheck=0
enabled=1
EOF
[root@redis1 ~]# yum clean all && yum repolist
在三个节点使用yum命令安装Redis服务并启动。 命令如下(三台虚拟机操作一致,以redis1主机为例):
shell
[root@redis1 ~]# yum install -y redis
... ...
Complete!
[root@redis1 ~]# systemctl start redis
[root@redis1 ~]# systemctl enable redis
按照主从Redis配置,将redis2节点和redis3节点作为redis1节点的从节点。 配置完成后的一主二从Redis集群将作为哨兵模式的基础。 命令如下:
redis1节点:
修改redis1节点的配置文件/etc/redis.conf如下:
shell
[root@redis1 ~]# vi /etc/redis.conf
#第一处修改
# bind 127.0.0.1 //找到bind 127.0.0.1这行并注释掉
#第二处修改
protected-mode no //将yes修改为no,外部网络可以访问
#第三处修改
daemonize yes //将no修改为yes,开启守护进程
#第四处修改
requirepass "123456" //添加设置访问密码
#第五处修改,设定主库密码与当前库密码同步,保证从库能够提升为主库
masterauth "123456"
#第六处修改,将no修改为yes,打开AOF持久化支持
appendonly yes
至此,redis1主节点配置完毕,重启服务,命令如下:
shell
[root@redis1 ~]# systemctl restart redis
edis2节点:
修改redis2节点的配置文件/etc/redis.conf如下:
shell
[root@redis2 ~]# vi /etc/redis.conf
#第一处修改
# bind 127.0.0.1 //找到bind 127.0.0.1这行并注释掉
#第二处修改
protected-mode no //将yes修改为no,外部网络可以访问
#第三处修改
daemonize yes //将no修改为yes,开启守护进程
#第四处修改
# requirepass foobared //找到该行
requirepass "123456" //在下方添加设置访问密码
#第五处修改
# slaveof <masterip> <masterport> //找到该行
slaveof 192.168.200.21 6379 //在下方添加访问的主节点IP与端口
#第六处修改
# masterauth <master-password> //找到该行
masterauth "123456" //在下方添加访问主节点密码
#第七处修改,将no修改为yes,打开AOF持久化支持
appendonly yes
至此,redis2主节点配置完毕,重启服务,命令如下:
shell
[root@redis2 ~]# systemctl restart redis
redis2主节点和redis2主节点配置相同
scp /etc/redis.conf root@ip:/etc/
验证:
redis1主节点:
shell
[root@redis1 ~]# redis-cli -h 192.168.200.21 -p 6379 -a 123456 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.200.22,port=6379,state=online,offset=9383,lag=0
slave1:ip=192.168.200.23,port=6379,state=online,offset=9238,lag=1
master_repl_offset:9383
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:9382
redis2从节点:
shell
[root@redis2 ~]# redis-cli -h 192.168.200.22 -p 6379 -a 123456 info replication
# Replication
role:slave
master_host:192.168.200.21
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:2648
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
redis3从节点:
shell
[root@redis3 ~]# redis-cli -h 192.168.200.23 -p 6379 -a 123456 info replication
# Replication
role:slave
master_host:192.168.200.21
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:8658
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
(2)Redis哨兵模式配置
redis1节点:
修改redis1节点的/etc/redis-sentinel.conf配置文件,具体内容如下:
shell
[root@redis1 ~]# vi /etc/redis-sentinel.conf
# 1. 保护模式修改为否,允许远程连接
protected-mode no
# 2. 修改监控地址,为主redis库的主机ip地址
sentinel monitor mymaster 192.168.200.21 6379 2
# 3. 添加配置5秒内没有响应,就反馈服务器挂了
sentinel down-after-milliseconds mymaster 5000
# 4. 修改配置15秒内master没有活起来,就重新选举主
sentinel failover-timeout mymaster 15000
# 5. 表示如果master重新选出来后,其它slave节点能同时并行从新master同步缓存的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最安全的设置为1,只同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。这里设置为2。
sentinel parallel-syncs mymaster 2
# 6. 添加配置主数据库密码为123456
sentinel auth-pass mymaster 123456
修改redis2从节点和redis3从节点的/etc/redis-sentinel.conf配置文件,修改内容与redis1主节点的/etc/redis-sentinel.conf配置文件一致。
修改完配置文件后,哨兵模式配置就完毕了,接下来需要重启服务。 因为Redis服务已经启动,现在只需要启动Redis哨兵服务。 命令如下所示:
所有节点启动哨兵:
shell
# systemctl restart redis-sentinel
# systemctl enable redis-sentinel
3)哨兵模式信息查看
在redis1节点,查看哨兵模式信息,命令如下:
shell
[root@redis1 ~]# redis-cli -h 192.168.200.21 -p 26379 INFO Sentinel
# 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.200.21:6379,slaves=2,sentinels=3
在redis2节点,查看哨兵模式信息,命令如下:
shell
[root@redis2 ~]# redis-cli -h 192.168.200.22 -p 26379 INFO Sentinel
# 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.200.21:6379,slaves=2,sentinels=3
在redis3节点,查看哨兵模式信息,命令如下:
shell
[root@redis3 ~]# redis-cli -h 192.168.200.23 -p 26379 INFO Sentinel
# 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.200.21:6379,slaves=2,sentinels=3
可以看到目前集群中有一个Redis主节点,两个Redis从节点,三个哨兵节点。
(4)哨兵模式验证
哨兵作为对Redis实例的监控,通过选举算法保证哨兵的鲁棒性和高可用,所以哨兵至少要部署3台,符合半数原则,需要5或者7,超过一半,不包含一半存活的时候,才能够选举出leader,才能进行主从的切换功能。
哨兵高可用测试:分别连接对应的Redis服务端,手动停止主Reids服务,看主从是否切换成功。
redis1节点,手动停止服务,然后查看主节点是否切换,命令如下:
SHELL
[root@redis1 ~]# systemctl stop redis
切换到redis2节点,查看Redis集群的主从信息(访问reids2节点的Redis服务),命令如下(redis主节点随机切换到从节点):
SHELL
[root@redis2 ~]# redis-cli -h 192.168.200.22 -p 6379 -a 123456 info replication
# Replication
role:slave
master_host:192.168.200.23
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:6591
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
可以看到,redis2节点的master_host变成了192.168.200.23,也就是说redis3节点变成了主节点。
然后切换到redis3节点,查看Redis集群的主从信息(访问reids3节点的Redis服务),命令如下:
shell
[root@redis3 ~]# redis-cli -h 192.168.200.23 -p 6379 -a 123456 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.200.22,port=6379,state=online,offset=7461,lag=0
master_repl_offset:7461
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:7460
redis3节点成功切换成了主节点。 可以看到,当主节点发生了宕机,其他的从节点可以自动切换成主节点。
切换到redis1节点,启动恢复Redis服务,查看redis集群的主从信息(访问reids1节点的Redis服务),命令如下:
shell
[root@redis1 ~]# systemctl restart redis
[root@redis1 ~]# systemctl restart redis-sentinel
[root@redis1 ~]# redis-cli -h 192.168.200.21 -p 6379 -a 123456 info replication
# Replication
role:slave
master_host:192.168.200.23
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:103524
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
可以看见redis1节点变成了从节点。 Redis哨兵模式的验证成功。