14.5、redis-sentinel高可用
1、redis主从同步配置:
(0)主机配置:
服务器名称 |
ip地址 |
实例6379 |
实例6380 |
实例6381 |
controller-node1 |
172.16.1.90 |
主 |
从 |
从 |
(1)确定主从:
1)将redis 6379实例确定为redis主服务器;
修改redis 6379的"/data/6379/redis.conf"参数如下:
requirepass root
#redis安全保护模式认证密码设置为root;
2)将redis 6380实例和redis 6381实例确定为redis从服务器;
修改redis 6380和redis 6381实例的redis.conf文件,修改参数如下:
vim /data/6380/redis.conf | vim /data/6381/redis.conf
requirepass root
#redis安全保护模式认证密码设置为root;
replicaof 172.16.1.90 6379
#设置主从同步主库的ip和端口号;
masterauth root
#设置主从同步主库的密码;
(2)启动redis:
for nu in 79 80 81;do /data/63$nu/redis.sh start;done
START REDIS [ 确定 ]
START REDIS [ 确定 ]
START REDIS [ 确定 ]
netstat -tunlp | grep -E "6379|6380|6381"
tcp 0 0 172.16.1.90:6379 0.0.0.0:* LISTEN 1894/redis-server 1
tcp 0 0 172.16.1.90:6380 0.0.0.0:* LISTEN 1906/redis-server 1
tcp 0 0 172.16.1.90:6381 0.0.0.0:* LISTEN 1918/redis-server 1
(3)验证:
1)主6379实例:
172.16.1.90:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.1.90,port=6381,state=online,offset=364,lag=0
slave1:ip=172.16.1.90,port=6380,state=online,offset=364,lag=1
172.16.1.90:6379> set lc1 1
OK
172.16.1.90:6379> keys *
1) "lc1"
2)从6380实例:
172.16.1.90:6380> info replication
# Replication
role:slave
master_host:172.16.1.90
master_port:6379
master_link_status:up
172.16.1.90:6380> keys *
1) "lc1"
3)从6381实例:
172.16.1.90:6381> info replication
# Replication
role:slave
master_host:172.16.1.90
master_port:6379
master_link_status:up
172.16.1.90:6381> keys *
1) "lc1"
2、redis主从同步手动切换主从:
(1)关闭主redis 6379实例:
172.16.1.90:6379> shutdown
not connected>
172.16.1.90:6380> info replication
# Replication
role:slave
master_host:172.16.1.90
master_port:6379
master_link_status:down
172.16.1.90:6381> info replication
# Replication
role:slave
master_host:172.16.1.90
master_port:6379
master_link_status:down
(2)将redis 6380实例提升为主:
172.16.1.90:6380> slaveof no one
OK
删除"/data/6380/redis.conf"文件的参数为"replicaof 172.16.1.90 6379";
(3)修改redis 6381实例指向新的主:
172.16.1.90:6381> slaveof 172.16.1.90 6380
OK
修改"/data/6381/redis.conf"文件的参数为"replicaof 172.16.1.90 6380";
(4)验证:
1)redis 6380实例:
172.16.1.90:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.1.90,port=6381,state=online,offset=1102,lag=0
2)redis 6381实例:
172.16.1.90:6381> info replication
# Replication
role:slave
master_host:172.16.1.90
master_port:6380
master_link_status:up
(5)修复redis 6379实例:
修改"/data/6379/redis.conf"文件的参数为"replicaof 172.16.1.90 6380、masterauth root"
重启redis 6379实例,该实例就加入到了主从复制的集群中了;
3、redis主从同步自动切换主从:
将环境恢复到未手动切换主从前一步;
修改redis 6379实例"/data/6379/redis.conf"文件的参数为"masterauth root",并重启redis 6379实例;
(1)redis sentinel介绍:
redis sentinel是redis官方推荐的高可用解决方案,当用redis做master-slave的高可用方案时,加入master宕机了,reids本
身(包括它的很多客户端)都没有实现主备切换,而redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集
群,发现master宕机后能进行自动切换,实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障
的Redis部署。
(2)功能:
1)监控:
Sentinel不断的检查master和slave是否正常的运行;
2)通知:
如果发现某个redis节点运行出现问题,可以通过API通知系统管理员和其他的应用程序;
3)自动故障转移:
能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave中的一个来作为新
的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址,sentinel会
修改相应redis实例的redis.conf文件添加或删除"replicaof <master-IP> <master-port>"配置;
4)配置提供者:
哨兵作为Redis客户端发现的权威来源,客户端连接到哨兵请求当前可靠的master的地址,如果发生故
障,哨兵将报告新地址;
5)sentinel的分布式特性:
很显然,只使用单个sentinel进程来监控redis集群是不可靠的,当sentinel进程宕掉后(sentinel本身也
有单点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行。所以有必要使用sentinel
集群,这样有几个好处:即使有一些sentinel进程宕掉了,依然可以进行redis集群的主备切换;如果只有
一个sentinel进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现redis集群的主备切换
如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息。
6)sentinel的自动发现机制:
A、sentinel集群中各个sentinel都互相连接彼此来检查对方的可用性以及互相发送消息;
B、不需要在sentinel中配置某个master的所有slave的地址,sentinel会通过询问master来得到这些slave的地址的;
C、每个sentinel发送的消息中也包含了其当前维护的最新的master配置,如果某个sentinel发现自己的配置版本低于接收到的配
置版本,则会用新的配置更新自己的master配置;
D、当检测到了新的sentinel,则将其加入到自身维护的master监控列表中;
7)通常使用sentinel集群(每个redis实例设置一个sentinel)监控reids集群;
(3)配置:
1)复制编译包中的sentinel.conf文件到各个redis实例的目录:
sed -ri.bak "/#|^$/d" /application/redis/sentinel.conf
for nu in 79 80 81;do cp -a /application/redis/sentinel.conf /data/63$nu/;done
2)修改各个参数:
A、实例6379:
vim /data/6379/sentinel.conf
bind 172.16.1.90
port 26379
daemonize yes
pidfile "/data/6379/redis-sentinel.pid"
logfile "/data/6379/redis-sentinel.log"
dir "/tmp"
sentinel monitor mymaster 172.16.1.90 6379 2
sentinel auth-pass mymaster root
sentinel parallel-syncs mymaster 1
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
B、实例6380:
vim /data/6380/sentinel.conf
bind 172.16.1.90
port 26380
daemonize yes
pidfile "/data/6380/redis-sentinel.pid"
logfile "/data/6380/redis-sentinel.log"
dir "/tmp"
sentinel monitor mymaster 172.16.1.90 6379 2
sentinel auth-pass mymaster root
sentinel parallel-syncs mymaster 1
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
C、实例6381:
vim /data/6381/sentinel.conf
bind 172.16.1.90
port 26381
daemonize yes
pidfile "/data/6381/redis-sentinel.pid"
logfile "/data/6381/redis-sentinel.log"
dir "/tmp"
sentinel monitor mymaster 172.16.1.90 6379 2
sentinel auth-pass mymaster root
sentinel parallel-syncs mymaster 1
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
D、参数说明:
cat /data/6379/sentinel.conf
bind 172.16.1.90
#绑定的ip;
port 26379
#sentinel监听的端口号;
daemonize yes
#sentinel以守护进程的方式运行;
pidfile /data/6379/redis-sentinel.pid
#sentinel以守护进程运行生成的pid文件路径;
logfile /data/6379/redis-sentinel.log
#sentinel日志文件;
dir /tmp
#进程工作的目录;
sentinel monitor mymaster 172.16.1.90 6379 2
#######################################################
#指定监控的master,2表示要2个sentinel认为redis
#主实例宕机才有效;
#######################################################
sentinel auth-pass mymaster root
#连接redis验证密码,该密码和redis.cof中配置的安全验证密码一致;
sentinel down-after-milliseconds mymaster 30000
#超过30000毫秒(30s)后认为redis主实例宕机;
sentinel parallel-syncs mymaster 1
########################################################
#发生主备切换时有1个slave同时对新的master进行同步,通常
#将这个值设为1来保证每次只有一个slave 处于不能处理命令请
#求的状态;
#########################################################
sentinel failover-timeout mymaster 180000
#当主从切换超过180000毫秒(180s)后认为主从切换失败;
sentinel deny-scripts-reconfig yes
#########################################################
#不允许使用SENTINEL SET设置notification-script和
#client-reconfig-script;
#########################################################
(4)配置sentinel脚本文件:
vim /data/6379/sentinel.sh
#!/bin/sh
. /etc/init.d/functions
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
IP="172.16.1.90"
PORT="6379"
SENTINEL_PORT="26379"
SENTINEL_HOME="/application/redis/src/redis-sentinel"
CONFIG="/data/$PORT/sentinel.conf"
SENTINEL_ADMIN="redis-cli -h $IP -p ${SENTINEL_PORT}"
SENTINEL_PID="/data/$PORT/redis-sentinel.pid"
[ $UID -eq 0 ] || {
echo "please use root"
exit 1
}
function usage (){
echo "USAGE:sh $0 |start|stop|restart|"
}
RETVAL=0
function check() {
RETVAL="$?"
if [ $RETVAL -eq 0 ]; then
action "$1" /bin/true
else
action "$1" /bin/false
fi
}
function start() {
if [ -f ${SENTINEL_PID} ]; then
echo "SENTINEL_${SENTINEL_PORT} IS RUNNIG......"
else
${SENTINEL_HOME} $CONFIG
check "START SENTINEL_${SENTINEL_PORT}"
fi
}
function stop() {
if [ -f ${SENTINEL_PID} ]; then
${SENTINEL_ADMIN} shutdown &>/dev/null
check "STOP SENTINEL_${SENTINEL_PORT}"
else
echo "SENTINEL_${SENTINEL_PORT} IS STOP......"
fi
}
function main(){
if [ $# -eq 1 ]; then
case "$1" in
start)
start
sleep 2
;;
stop)
stop
sleep 2
;;
restart)
stop
start
;;
*)
usage
;;
esac
else
usage
fi
}
main $*
chmod u+x sentinel.sh
说明:仿照上面的脚本,完成redis 6380实例、redis 6381实例的sentinel脚本;
(5)启动各个sentinel实例:
for nu in 79 80 81;do /data/63$nu/sentinel.sh start;done
netstat -tunlp | egrep "26379|26380|26381"
tcp 0 0 172.16.1.90:26379 0.0.0.0:* LISTEN 2475/redis-sentinel
tcp 0 0 172.16.1.90:26380 0.0.0.0:* LISTEN 2477/redis-sentinel
tcp 0 0 172.16.1.90:26381 0.0.0.0:* LISTEN 2485/redis-sentinel
(6)验证:
1)关闭主redis 6379实例:
172.16.1.90:6379> shutdown
not connected>
2)通过sentinel日志查看主从接替过程:
tailf /data/6380/redis-sentinel.log
2673:X 17 May 2019 23:21:03.206 * +slave slave 172.16.1.90:6380 172.16.1.90 6380 @ mymaster 172.16.1.90 6379
2673:X 17 May 2019 23:21:33.363 * +slave slave 172.16.1.90:6381 172.16.1.90 6381 @ mymaster 172.16.1.90 6379
2673:X 17 May 2019 23:26:45.840 # +sdown master mymaster 172.16.1.90 6379
2673:X 17 May 2019 23:26:45.907 # +new-epoch 1
2673:X 17 May 2019 23:26:45.909 # +vote-for-leader 73b994f2ff6ab006c450f8c5662861ab90ee1c04 1
2673:X 17 May 2019 23:26:45.911 # +odown master mymaster 172.16.1.90 6379 #quorum 2/2
2673:X 17 May 2019 23:26:45.911 # Next failover delay: I will not start a failover before Fri May 17 23:32:46 2019
2673:X 17 May 2019 23:26:46.384 # +config-update-from sentinel 73b994f2ff6ab006c450f8c5662861ab90ee1c04 172.16.1.90 26381 @ mymaster 172.16.1.90 6379
2673:X 17 May 2019 23:26:46.384 # +switch-master mymaster 172.16.1.90 6379 172.16.1.90 6381
2673:X 17 May 2019 23:26:46.385 * +slave slave 172.16.1.90:6380 172.16.1.90 6380 @ mymaster 172.16.1.90 6381
2673:X 17 May 2019 23:26:46.385 * +slave slave 172.16.1.90:6379 172.16.1.90 6379 @ mymaster 172.16.1.90 6381
2673:X 17 May 2019 23:27:16.424 # +sdown slave 172.16.1.90:6379 172.16.1.90 6379 @ mymaster 172.16.1.90 6381
3)查看主从信息:
A、redis 6380实例:
172.16.1.90:6380> info replication
# Replication
role:slave
master_host:172.16.1.90
master_port:6381
master_link_status:up
B、redis 6381实例:
172.16.1.90:6381> info replication
#Replication
role:master
connected_slaves:1
slave0:ip=172.16.1.90,port=6380,state=online,offset=974710,lag=1
(7)将redis 6379实例启动:
启动redis 6379实例后,sentinel 3个运行进程中的一个会在"/data/6379/redis.conf"配置文件最后一行
追加"replicaof 172.16.1.90 6381" 配置,然后重启redis 6379实例,这样redis 6379实例就会被加入到集
群中作从服务器;
(8)sentinel命令:
1)SENTINEL get-master-addr-by-name <master name>:
返回给定名字的主服务器的 IP 地址和端口号。
例:
[root@controller-node1 ~]# redis-cli -h 172.16.1.90 -p 26380
172.16.1.90:26380> sentinel get-master-addr-by-name mymaster
1) "172.16.1.90"
2) "6381"
2)PING :
返回 PONG;
3)SENTINEL masters:
列出所有被监视的主服务器,以及这些主服务器的当前状态;
4)SENTINEL master <master name>:
显示指定master的信息和状态;
5)SENTINEL slaves <master name>:
列出给定主服务器的所有从服务器,以及这些从服务器的当前状态;
6)SENTINEL reset <pattern>:
重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置
操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主
服务器的所有从服务器和 Sentinel;
7)SENTINEL failover <master name>:
当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移(不过发起故障转
移的 Sentinel 会向其他 Sentinel 发送一个新的配置,其他 Sentinel 会根据这个配置进行相应的更新);
3、将redis和sentinel脚本加入开机自启动:
chmod +x /etc/rc.d/rc.local
vim /etc/rc.d/rc.local
/data/6379/redis.sh start &>/dev/null
/data/6380/redis.sh start &>/dev/null
/data/6381/redis.sh start &>/dev/null
/data/6379/sentinel.sh start &>/dev/null
/data/6380/sentinel.sh start &>/dev/null
/data/6381/sentinel.sh start &>/dev/null
加入开机自启动在启动的时候可能由于主节点不能及时启动,可能导致主节点转换,但这都不是问题,
sentinel能做好任何故障的转移,除了sentinel选举票数(宕机较多)不够;
4、sentinel模式下主从同步集群扩容:
以redis 6381实例为主库为例;
(1)建立新的redis 6382实例:
mkdir -p /data/6382/
cp -a /data/6379/sentinel.conf /data/6382/
cp -a /data/6379/sentinel.sh /data/6382/
cp -a /data/6379/redis.conf /data/6382/
cp -a /data/6379/redis.sh /data/6382/
(2)修改sentinel.sh、redis.conf、redis.sh文件的参数为对应实例的端口号和路径并确保sedis.conf配置文件中
有以下参数:
requirepass root
#redis安全保护模式认证密码设置为root;
replicaof 172.16.1.90 6381
#设置主从同步主库的ip和端口号;
masterauth root
#设置主从同步主库的密码;
(3)修改sentinel.conf的配置文件指向新的主:
bind 172.16.1.90
port 26382
daemonize yes
pidfile "/data/6382/redis-sentinel.pid"
logfile "/data/6382/redis-sentinel.log"
dir "/tmp"
sentinel monitor mymaster 172.16.1.90 6381 2
sentinel auth-pass mymaster root
sentinel parallel-syncs mymaster 1
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
(4)将新的redis 6382实例加入到开机自启动即可;
5、小结:
(1)集群有密码验证的情况下每个redis实例必须要有的参数:
requirepass root
#redis安全保护模式认证密码设置为root;
masterauth root
#设置主从同步主库的密码;
哪个redis实例为主,哪个redis实例为从,由sentinel选举,然后在各个实例redis.conf文件中增删
replicaof <master ip> <master prot>参数来决定;
(2)从节点的只读是默认的(是对从节点的一种保护,有助于主从的一致性),但是需要在redis 实例的
redis.conf文件中设置replicaof <master ip> <master prot>参数从节点只读才能生效;
(3)redis主从同步是实时异步增量同步;
14.5、redis-sentinel高可用的更多相关文章
- Redis Sentinel 高可用实现说明
背景: 前面介绍了Redis 复制.Sentinel的搭建和原理说明,通过这篇文章大致能了解Sentinel的原理和实现方法以及相关的搭建.这篇文章就针对Redis Sentinel的搭建做 ...
- Redis Sentinel高可用架构
Redis目前高可用的架构非常多,比如keepalived+redis,redis cluster,twemproxy,codis,这些架构各有优劣,今天暂且不说这些架构,今天主要说说redis se ...
- Redis Sentinel 高可用服务搭建
阅读目录: 关于 Redis 的概念 关于 Redis Sentinel 的概念 搭建 Redis Server(master) 搭建 Redis Server(slave) 搭建 Redis Sen ...
- 【转载】Redis Sentinel 高可用服务架构搭建
作者:田园里的蟋蟀 出处:http://www.cnblogs.com/xishuai/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 阅读 ...
- Redis|Sentinel 高可用架构
一 前言 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端 ...
- Redis Sentinel 高可用方案
redis 主从复制的问题 Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用: 1,一旦主节点宕机,从节点作为主节点的备份可以随时顶上来. 2,扩展主节点的读能力,分担主节点读压 ...
- Redis Sentinel 高可用部署实践集群
一.Redis Sentinel 介绍 1.Sentinel 数据库环境搭建,从单机版到主备.再到多数据库集群,我们需要一个高可用的监控:比如Mysql中,我们可能会采用MHA来搭建我们 ...
- redis sentinel 高可用(HA)方案部署,及python应用示例
redis sentinel(哨兵)高可用集群的部署方法,并通过 python 程序实例讲解如何使用 redis sentinel 简介 介绍 redis sentinel(哨兵)集群的部署,配置一主 ...
- Redis Sentinel 高可用机制
内容目录: Sentinel 如何工作的? 核心配置项 怎么选出新 master 的? Sentinel 有多个,具体谁来执行故障转移? Sentinel 是怎么发现 slave 和其他 sentin ...
- Redis+sentinel 高可用实践
1.环境规划 10.213.50.138(主) redis+sentinel 10.213.50.168(从) redis+sentinel 10.213.50.227 作为客户端测试插入数 2.r ...
随机推荐
- [bug] java.text.ParseException: Unparseable date: "2020-01-01"
原因 输入的字符串应和目标字符串格式长度都一样 如返回的字符串是:2019-11-11,但解析的格式是:yyyy-MM-dd HH:mm:ss,导致错误 参考 https://blog.csdn.n ...
- Linux后台执行命令:&和nohup nohup和&后台运行,进程查看及终止
nohup和&后台运行,进程查看及终止 阅读目录 nohup和&后台运行,进程查看及终止 1.nohup 2.& 3.nohup和&的区别 &:是指在后台运 ...
- 安装 Centos 7.x
学习 python 至今,一直是在 linux 上操作,感觉还是 linux 对 python 的支持更加友好,默认安装了 python 的版本 2 和 3 .为了打造更好的 python 开发环境, ...
- 本文介绍使用windows系统自带的远程桌面mstsc连接Centos 7.x远程桌面的基本方法。
本文介绍使用windows系统自带的远程桌面mstsc连接Centos 7.x远程桌面的基本方法. 一.前言 我希望用windows远程访问centos图形界面.xmanager连接centos远程桌 ...
- Docker——JVM 感知容器的 CPU 和 Memory 资源限制
前言 对于那些在Java应用程序中使用Docker的CPU和内存限制的人来说,可能会遇到一些挑战.特别是CPU限制,因为JVM在内部透明地设置GC线程和JIT编译器线程的数量. 这些可以通过命令行选项 ...
- MyBatis 高级查询之一对一查询(九)
高级查询之一对一查询 查询条件:根据游戏角色ID,查询账号信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据角色ID查询账号信息 * @para ...
- PCB布线规范
模拟电路和数字电路PCB设计的不同点 http://linear.eefocus.com/module/forum/thread-593593-1-1.html 合集 PCB给种设计资料 http ...
- CentOS 下解决ssh登录 locale 警告
最近登录一台CentOS 6机器,发现每次登录都提示如下警告: -bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF ...
- python 如何让俩个对象相等及如何让俩个对象具有相同的id值
- jrebel 插件使用
最近遇到一件神奇的事情,idea原本配置了热部署,但是修改java文件之后需要重启俩次才能编译成功,网上各种问度娘都没有解决,偶尔看到了jrebel这个插件,折腾了一番,终于完美解决,记录一下,供后来 ...