redis哨兵实现

Posted 無心的Man,

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis哨兵实现相关的知识,希望对你有一定的参考价值。

原理:

 

 

 

 

 

 基于一主两从架构实现哨兵

哨兵的前提是已经实现了一个redis的主从复制的运行环境,从而实现一个一主两从基于哨兵的高可用
redis架构
注意: master 的配置文件中masterauth 和slave 都必须相同

所有节点安装redis:

tar xf redis-5.0.7.tar.gz -C /usr/local/src/
cd /usr/local/src/redis-5.0.7
make PREFIX=/apps/redis install
ll /apps/redis/bin/
echo \'PATH=/apps/redis/bin:$PATH\' > /etc/profile.d/redis.sh
. /etc/profile.d/redis.sh
mkdir /apps/redis/{etc,log,data,run}
cp /usr/local/src/redis-5.0.7/redis.conf /apps/redis/etc/

创建 redis 用户和数据目录

useradd -r -s /sbin/nologin redis
chown -R redis.redis /apps/redis/

编辑 redis 服务启动文件

vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target

scp /usr/lib/systemd/system/redis.service 10.0.0.18:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/redis.service 10.0.0.28:/usr/lib/systemd/system/

验证 redis 启动

systemctl daemon-reload
systemctl start redis
systemctl status redis

所有主节点的redis.conf中关键配置

bind 0.0.0.0
masterauth "123456"
requirepass "123456"
logfile "/apps/redis/log/redis.log"
dir /apps/redis/data

scp /apps/redis/etc/redis.conf 10.0.0.18:/apps/redis/etc/
scp /apps/redis/etc/redis.conf 10.0.0.28:/apps/redis/etc/

 配置master

 配置slave1

REPLICAOF 10.0.0.8 6379  #启用主从同步复制,并把ip指向master(10.0.0.8)

 配置slave2

 编辑哨兵的配置文件

sentinel配置
Sentinel实际上是一个特殊的redis服务器,有些redis指令支持,但很多指令并不支持.默认监听在
26379/tcp端口.
哨兵可以不和Redis服务器部署在一起,但一般部署在一起,所有redis节点使用相同的以下示例的配置
文件

我这里才用的是源码编译安装,在源码目录有sentinel.conf,复制到安装目录即可

cp sentinel.conf /apps/redis/etc/

#如果是编译安装,在所有哨兵服务器执行下面操作启动哨兵
vi /apps/redis/etc/sentinel.conf #修改以下内容

  bind 0.0.0.0
  port 26379
  daemonize yes
  pidfile /apps/redis/run/redis-sentinel.pid
  logfile "/apps/redis/log/sentinel_26379.log"
  dir /apps/redis/data
  sentinel monitor mymaster 10.0.0.8 6379 2
  sentinel auth-pass mymaster 123456
  sentinel down-after-milliseconds mymaster 15000
  sentinel parallel-syncs mymaster 1
  sentinel failover-timeout mymaster 180000
  sentinel deny-scripts-reconfig yes

 

#修改sentinel.conf文件权限(3台主机都执行)

chown redis.redis /apps/redis/etc/sentinel.conf

#创建sentinel.service启动文件

vi /usr/lib/systemd/system/redis-sentinel.service

[Unit]
Description=Redis Sentinel
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf --supervised systemd
ExecStop=/apps/redis/bin/redis-shutdown redis-sentinel
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target

 

scp /usr/lib/systemd/system/redis-sentinel.service 10.0.0.18:/usr/lib/systemd/system/

scp /usr/lib/systemd/system/redis-sentinel.service 10.0.0.28:/usr/lib/systemd/system/

#启动哨兵

[root@redis-master ~]#systemctl daemon-reload
[root@redis-master ~]#systemctl start redis-sentinel.service

确保每个哨兵主机的myid不同

[root@redis-slave1 ~]#vi /apps/redis/etc/sentinel.conf
sentinel myid 782765adb0402fd686313ff99f49862f3c7f3d9c

[root@redis-slave2 ~]#vi /apps/redis/etc/sentinel.conf
sentinel myid 782765adb0402fd686313ff99f49862f3c7f3d9d

[root@redis-master ~]#systemctl enable --now redis-sentinel.service
[root@redis-slave1 ~]#systemctl enable --now redis-sentinel.service
[root@redis-slave2 ~]#systemctl enable --now redis-sentinel.service

当前sentinel状态

 在sentinel状态中尤其是最后一行,涉及到masterIP是多少,有几个slave,有几个sentinels,必须是

符合全部服务器数量

[root@redis-master ~]#redis-cli -p 26379
127.0.0.1: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=10.0.0.8:6379,slaves=2,sentinels=3 #两个
slave,三个sentinel服务器

停止Redis Master测试故障转移

[root@redis-master ~]#killall redis-server

查看各节点上哨兵信息:

[root@redis-master ~]#redis-cli -a 123456 -p 26379
Warning: Using a password with \'-a\' or \'-u\' option on the command line interface
may not be safe.
127.0.0.1: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=10.0.0.18:6379,slaves=2,sentinels=2

 

以上是关于redis哨兵实现的主要内容,如果未能解决你的问题,请参考以下文章

高级开发运维从简单学:Redis哨兵和集群小贴士

高级开发运维从简单学:Redis哨兵和集群小贴士

11.Redis 哨兵集群实现高可用

Redis-哨兵机制,实现高可用

Redis进阶高可用之哨兵

Sentinel 哨兵-实现Redis高可用