Redis哨兵模式

哨兵

        在一主多从架构中从节点可以起到数据冗余备份和读写分离的作用。如果主节点遇到故障导致无法提供服务时,可以采用手动方式将其一个从节点提升为主节点,保证Redis主从能够正常工作。主从切换通过手动完成比较耗时、费力,并且影响Redis正常服务。为此,Reids提供了哨兵功能,实现了自动化的系统监控和故障恢复功能

        哨兵(Sentinel),主要负责监控主从节点运行是否正常,以及当主节点出现故障时自动将一个从节点转换为新的主节点。哨兵是一个独立的进程

        哨兵最基础架构由两部分组成,包括哨兵节点和数据节点。其中,哨兵节点是特殊的Redis节点,并不存储数据,出于高可用方面考虑,哨兵架构中通常都是多个哨兵节点共同提供服务。数据节点用于存储Redis数据。包括主节点和从节点

配置哨兵

        资源列表

操作系统配置主机名IP角色
CentOS 7.92C4Gsentinel01192.168.27.143哨兵节点
CentOS 7.92C4Gsentinel02192.168.27.129哨兵节点
CentOS 7.92C4Gsentinel03192.168.27.130哨兵节点
CentOS 7.92C4Gmaster192.168.27.132主节点
CentOS 7.92C4Gslave01192.168.27.133从节点
CentOS 7.92C4Gslave02192.168.27.134从节点

        基础环境

                关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

                 关闭内核安全机制

setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config

                修改主机名,方便辨识

hostnamectl set-hostname sentinel01
hostnamectl set-hostname sentinel02
hostnamectl set-hostname sentinel03
hostnamectl set-hostname master
hostnamectl set-hostname slave01
hostnamectl set-hostname slave02

        安装部署redis

在master slave01 slave02节点上执行以下操作
yum -y install gcc gcc-c++ make
tar -zxvf redis-6.2.4.tar.gz -C /usr/src/
cd /usr/src/redis-6.2.4/
make && make PREFIX=/usr/local/redis install   # PREFIX指定安装路径
ln -s /usr/local/redis/bin/* /usr/local/bin/

                 make && make PREFIX=/usr/local/redis install只是安装了二进制文件到系统中,并没有启动脚本和配置文件。Redis提供了默认的配置文件,将配置文件复制到/etc/目录下,然后编写服务脚本用于启动Redis及设置开机启动。当Redis启动完成后,默认监听6379端口。

# 创建配置文件目录
mkdir /etc/redis


# 适用默认配置文件
cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf

                编写服务脚本

cat > /etc/systemd/system/redis.service << EOF
[Unit]
Description=Redis
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf   

[Install]
WantedBy=multi-user.target
EOF

        修改配置文件

                在master节点 

vi /etc/redis/6379.conf

                        监听地址为当前节点的IP 

 

                        启动服务查看端口号

systemctl daemon-reload
systemctl start redis
systemctl enable redis
netstat -anpt | grep 6379

                slave01节点

vi /etc/redis/6379.conf

 

systemctl daemon-reload
systemctl start redis
systemctl enable redis
netstat -anpt | grep 6379

     

                        slave02节点

vi /etc/redis/6379.conf

systemctl daemon-reload
systemctl start redis
systemctl enable redis
netstat -anpt | grep 6379

        主从配置 

                在slave01,slave02节点上操作

#slave01节点
vi /etc/redis/6379.conf
# 末尾添加即可
# IP地址和端口添加主库的IP和端口
slaveof 192.168.27.132 6379
# slave02节点
[root@slave02 ~]# vi /etc/redis/6379.conf
# 末尾添加即可
# IP地址和端口添加主库的IP和端口
slaveof 192.168.27.132 6379

                 重启redis服务

systemctl restart redis

        验证主从数据

                在主节点上操作

[root@master ~]# redis-cli 
127.0.0.1:6379> info replication
# Replication
role:master   # 自己的角色
connected_slaves:2   # 两个从节点
slave0:ip=192.168.27.133,port=6379,state=online,offset=84,lag=1   # 从节点对应的记录
slave1:ip=192.168.27.134,port=6379,state=online,offset=84,lag=1   # 从节点对应的记录
...

                 在从节点上执行

[root@slave01 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave  # 自己的角色
master_host:192.168.27.132  # 主节点
master_port:6379
master_link_status:up
...

                验证数据同步

127.0.0.1:6379> set abc 100   # 主节点写入数据
OK


127.0.0.1:6379> get abc       # slave01节点查看数据是否同步
"100"


127.0.0.1:6379> get abc       # slave02节点查看数据是否同步
"100"

        部署哨兵(三台哨兵节点,一样的配置) 

                安装redis,上传redis软件包(redis-6.2.4.tar.gz)

yum -y install gcc gcc-c++ make
tar -zxf redis-6.2.4.tar.gz -C /usr/src/
cd /usr/src/redis-6.2.4/
make && make install
mkdir /etc/redis
cp /usr/src/redis-6.2.4/redis.conf /etc/redis/6379.conf

                修改配置文件

[root@sentinel01 redis-6.2.4]# vim /etc/redis/6379.conf
sentinel monitor master 192.168.27.132 6379 2  # 末尾添加即可
bind 0.0.0.0   # 默认75行进行修改
daemonize yes  # 默认257行进行修改


# 解释
sentinel monitor:哨兵命令
master:主节点名字
192.168.93.27.132 2:主节点IP和端口,最后的2表示,当主节点出现故障,至少需要两个哨兵节点同意,才能判定主节点故障

                写入服务脚本

# 仔细观察可以发现ExecStart的执行命令是redis-sentinel(哨兵启动命令)
cat > /etc/systemd/system/redis.service << EOF
[Unit]
Description=Redis
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-sentinel /etc/redis/6379.conf   

[Install]
WantedBy=multi-user.target
EOF

                启动服务

# 启动服务
systemctl daemon-reload 
systemctl start redis
systemctl enable redis
# 查看进程
ps -aux | grep redis
root      13230  0.2  0.2 165064  9232 ?        Ssl  12:05   0:00 /usr/local/bin/redis-sentinel 0.0.0.0:6379 [sentinel]
root      13255  0.0  0.0 112824   980 pts/1    R+   12:06   0:00 grep --color=auto redis

                查看哨兵状态信息

# 哨兵1
[root@sentinel01 ~]# redis-cli
127.0.0.1:6379> 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=master,status=ok,address=192.168.27.132:6379,slaves=2,sentinels=3
# 哨兵2
[root@sentinel02 ~]# redis-cli
127.0.0.1:6379> 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=master,status=ok,address=192.168.27.132:6379,slaves=2,sentinels=3
###############################################################################
# 哨兵3
[root@sentinel03 ~]# redis-cli
127.0.0.1:6379> 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=master,status=ok,address=192.168.27.132:6379,slaves=2,sentinels=3

                哨兵配置完成后会自动添加内容,例如

[root@sentinel01 ~]# tail -9 /etc/redis/6379.conf 
user default on nopass ~* &* +@all
sentinel myid 70ffb1f3f2d3e5416e0754a18b87a58d14390081
sentinel config-epoch master 0
sentinel leader-epoch master 0
sentinel current-epoch 0
sentinel known-replica master 192.168.93.106 6379
sentinel known-replica master 192.168.93.105 6379
sentinel known-sentinel master 192.168.93.103 6379 5ad8fc19259b812e91b56ae57fbcd309a0b88c5c
sentinel known-sentinel master 192.168.93.102 6379 746bec065aaae0b1f6b83f0612875cbf0af6b77b


# 其中,myid对应哨兵节点的ID。带有epoch的参数与配置纪元有关(配置纪元是一个从0开始的计数器,每进行一次领导者哨兵选举,都会增加1。领导者哨兵选举在故障切换时适用)。known-replica和known-sentinel显示哨兵已经发现的从节点和其他哨兵节点

        模拟故障转移

                1.停止master节点服务

#当主节点出现故障时,故障发现和转移是由哨兵来控制的,此时会将主节点切换到其他从节点上
systemctl stop redis

                2.在哨兵01节点查看状态就会发现,节点IP会切换到从节点

127.0.0.1:6379> 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=master,status=ok,address=192.168.27.133:6379,slaves=2,sentinels=3
###############################################################################

                3.当主节点进行切换后,一个从节点变成了主节点。此时从节点数量仍然是2,是因为在进行主从切换时,原来的故障的节点会被设置为新主的从节点,哨兵系统并不会对故障节点进行客观下线,而是认为该从节点一致存在。当故障修复之后,将会变为新的从节点投入适用

# 目前作为主节点的节点操作
[root@slave02 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master   # 角色变成master
connected_slaves:1   # 因为有一个处于坏的状态,所以此除目前为1
slave0:ip=192.168.27.134,port=6379,state=online,offset=212499,lag=1
master_failover_state:no-failover
master_replid:07998603985d0b656d717d4f37e0bdb02c953982
master_replid2:5e55c3d768b534ecef617403530ee4680c4be1f7
master_repl_offset:212639
second_repl_offset:160901
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:85
repl_backlog_histlen:212555

                4.继续使用主节点,验证是否会切换回来

# 继续投入使用
[root@master ~]# systemctl start redis
[root@slave02 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2  # 此时变凉了2个slave了
slave0:ip=192.168.27.134,port=6379,state=online,offset=246920,lag=1
slave1:ip=192.168.27.132,port=6379,state=online,offset=247060,lag=0
master_failover_state:no-failover
master_replid:07998603985d0b656d717d4f37e0bdb02c953982
master_replid2:5e55c3d768b534ecef617403530ee4680c4be1f7
master_repl_offset:247060
second_repl_offset:160901
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:85
repl_backlog_histlen:246976

                5.查看哨兵epoch数字

#对于哨兵节点,主要是epoch相关配置的变化,进行一次主从切换,epoch相关的参数都会加1
[root@sentinel01 ~]# tail -9 /etc/redis/6379.conf 
user default on nopass ~* &* +@all
sentinel myid 70ffb1f3f2d3e5416e0754a18b87a58d14390081
###############################################################################
sentinel config-epoch master 1
sentinel leader-epoch master 1
sentinel current-epoch 1
###############################################################################
sentinel known-replica master 192.168.93.104 6379
sentinel known-replica master 192.168.93.105 6379
sentinel known-sentinel master 192.168.93.103 6379 5ad8fc19259b812e91b56ae57fbcd309a0b88c5c
sentinel known-sentinel master 192.168.93.102 6379 746bec065aaae0b1f6b83f0612875cbf0af6b77b

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值