Redis学习之路(三)之Redis主从和哨兵模式
一、Redis主从配置
1、环境说明
主机名称 | IP地址 | redis版本和角色说明 |
---|---|---|
redis-master | 192.168.56.11 | redis 5.0.3(主) |
redis-slave01 | 192.168.56.12 | redis 5.0.3(从) |
redis-slave02 | 192.168.56.13 | redis 5.0.3(从) |
2、修改主从的redis配置文件
[root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf
bind 192.168.56.11
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis.log"
dir /var/redis/
[root@redis-slave01 ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf
bind 192.168.56.12
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis.log"
dir /var/redis/
replicaof 192.168.56.11 6379 #配置为master的从,如果master上有密码配置,还需要增加下面一项密码配置
masterauth 123456 #配置主的密码
[root@redis-slave02 ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf
bind 192.168.56.13
protected-mode yes
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis.log"
dir /var/redis/
replicaof 192.168.56.11 6379 #配置为master的从
masterauth 123456 #配置主的密码
3、启动主从redis
这里需要注意的是:redis主从和mysql主从不一样,redis主从不用事先同步数据,它会自动同步过去
[root@redis-master ~]# systemctl start redis
[root@redis-slave01 ~]# systemctl start redis
[root@redis-slave02 ~]# systemctl start redis
[root@redis-master ~]# netstat -tulnp |grep redis
tcp 0 0 192.168.56.11:6379 0.0.0.0:* LISTEN 1295/redis-server 1
[root@redis-slave01 ~]# netstat -tulnp |grep redis
tcp 0 0 192.168.56.12:6379 0.0.0.0:* LISTEN 1625/redis-server 1
[root@redis-slave02 ~]# netstat -tulnp |grep redis
tcp 0 0 192.168.56.13:6379 0.0.0.0:* LISTEN 1628/redis-server 1
3、数据同步验证
[root@redis-master ~]# redis-cli -h 192.168.56.11 #主上写入数据
192.168.56.11:6379> KEYS *
(empty list or set)
192.168.56.11:6379> set k1 123
OK
192.168.56.11:6379> set k2 456
OK
[root@redis-slave01 ~]# redis-cli -h 192.168.56.12 #slave01上查看是否数据同步
192.168.56.12:6379> KEYS *
1) "k2"
2) "k1"
192.168.56.12:6379> get k1
"123"
192.168.56.12:6379> get k2
"456"
[root@redis-slave02 ~]# redis-cli -h 192.168.56.13 #slave02上查看是否数据同步
192.168.56.13:6379> KEYS *
1) "k2"
2) "k1"
192.168.56.13:6379> get k1
"123"
192.168.56.13:6379> get k2
"456"
二、Redis哨兵模式
1、Redis sentinel介绍
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。
2、Redis Sentinel的主要功能
Sentinel的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、主从切换。Redis的Sentinel最小配置是一主一从。 Redis的Sentinel系统可以用来管理多个Redis服务器,该系统可以执行以下四个任务:
监控
Sentinel会不断的检查主服务器和从服务器是否正常运行。
通知
当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
自动故障转移
当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。
配置提供者
在Redis Sentinel模式下,客户端应用在初始化时连接的是Sentinel节点集合,从中获取主节点的信息。
3、Redis Sentinel的工作流程
Sentinel是Redis的高可用性解决方案:
由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求 。如下图:
Sentinel负责监控集群中的所有主、从Redis,当发现主故障时,Sentinel会在所有的从中选一个成为新的主。并且会把其余的从变为新主的从。同时那台有问题的旧主也会变为新主的从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从。
在Redis高可用架构中,Sentinel往往不是只有一个,而是有3个或者以上。目的是为了让其更加可靠,毕竟主和从切换角色这个过程还是蛮复杂的。
4、相关概念
主观失效
SDOWN(subjectively down),直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.
客观失效
ODOWN(objectively down),直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover
5、环境说明
主机名称 | IP地址 | redis版本和角色说明 |
---|---|---|
redis-master | 192.168.56.11:6379 | redis 5.0.3(主) |
redis-slave01 | 192.168.56.12:6379 | redis 5.0.3(从) |
redis-slave02 | 192.168.56.13:6379 | redis 5.0.3(从) |
redis-master | 192.168.56.11:26379 | Sentinel01 |
redis-slave01 | 192.168.56.12:26379 | Sentinel02 |
redis-slave02 | 192.168.56.13:26379 | Sentinel03 |
6、部署Sentinel
Sentinel.conf配置文件主要参数解析:
# 端口
port 26379
# 是否后台启动
daemonize yes
# pid文件路径
pidfile /var/run/redis-sentinel.pid
# 日志文件路径
logfile "/var/log/sentinel.log"
# 定义工作目录
dir /tmp
# 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 127.0.0.1 6379 2
# 如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes
修改三台Sentinel的配置文件,如下
[root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/sentinel.log"
dir "/tmp"
sentinel monitor mymaster 192.168.56.11 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
[root@redis-slave01 ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/sentinel.log"
dir "/tmp"
sentinel monitor mymaster 192.168.56.11 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
[root@redis-slave02 ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/sentinel.log"
dir "/tmp"
sentinel monitor mymaster 192.168.56.11 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
7、启动Sentinel
启动的顺序:主Redis --> 从Redis --> Sentinel1/2/3
[root@redis-master ~]# redis-sentinel /usr/local/redis/sentinel.conf
[root@redis-master ~]# ps -ef |grep redis
root 1295 1 0 14:03 ? 00:00:06 /usr/local/redis/src/redis-server 192.168.56.11:6379
root 1407 1 1 14:40 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 1412 1200 0 14:40 pts/1 00:00:00 grep --color=auto redis
[root@redis-slave01 ~]# redis-sentinel /usr/local/redis/sentinel.conf
[root@redis-slave01 ~]# ps -ef |grep redis
root 1625 1 0 14:04 ? 00:00:06 /usr/local/redis/src/redis-server 192.168.56.12:6379
root 1715 1 1 14:41 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 1720 1574 0 14:41 pts/0 00:00:00 grep --color=auto redis
[root@redis-slave02 ~]# redis-sentinel /usr/local/redis/sentinel.conf
[root@redis-slave02 ~]# ps -ef |grep redis
root 1628 1 0 14:07 ? 00:00:06 /usr/local/redis/src/redis-server 192.168.56.13:6379
root 1709 1 0 14:42 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 1714 1575 0 14:42 pts/0 00:00:00 grep --color=auto redis
8、Sentinel操作
[root@redis-master ~]# redis-cli -p 26379 #哨兵模式查看
127.0.0.1:26379> sentinel master mymaster #输出被监控的主节点的状态信息
1) "name"
2) "mymaster"
3) "ip"
4) "192.168.56.11"
5) "port"
6) "6379"
7) "runid"
8) "bae06cc3bc6dcbff7c2de1510df7faf1a6eb6941"
9) "flags"
10) "master"
......
127.0.0.1:26379> sentinel slaves mymaster #查看mymaster的从信息,可以看到有2个从节点
1) 1) "name"
2) "192.168.56.12:6379"
3) "ip"
4) "192.168.56.12"
5) "port"
6) "6379"
7) "runid"
8) "c86027e7bdd217cb584b1bd7a6fea4ba79cf6364"
9) "flags"
10) "slave"
......
2) 1) "name"
2) "192.168.56.13:6379"
3) "ip"
4) "192.168.56.13"
5) "port"
6) "6379"
7) "runid"
8) "61597fdb615ecf8bd7fc18e143112401ed6156ec"
9) "flags"
10) "slave"
......
127.0.0.1:26379> sentinel sentinels mymaster #查看其它sentinel信息
1) 1) "name"
2) "ba12e2a4023d2e9bcad282395ba6b14030920070"
3) "ip"
4) "192.168.56.12"
5) "port"
6) "26379"
7) "runid"
8) "ba12e2a4023d2e9bcad282395ba6b14030920070"
9) "flags"
10) "sentinel"
......
2) 1) "name"
2) "14fca3f851e9e1bd3a4a0dc8a9e34bb237648455"
3) "ip"
4) "192.168.56.13"
5) "port"
6) "26379"
7) "runid"
8) "14fca3f851e9e1bd3a4a0dc8a9e34bb237648455"
9) "flags"
10) "sentinel"
9、哨兵模式下的主从测试
模拟停止master上的Redis,查看Redis的主从变化,如下:
[root@redis-master ~]# systemctl stop redis #停止master上的redis
[root@redis-slave01 ~]# tail -n 20 /var/log/sentinel.log #查看哨兵日志
......
1747:X 19 Apr 2019 14:59:01.747 # +monitor master mymaster 192.168.56.11 6379 quorum 2
1747:X 19 Apr 2019 14:59:44.829 # +sdown sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379
1747:X 19 Apr 2019 14:59:46.950 # -sdown sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379
1747:X 19 Apr 2019 15:00:44.391 # +sdown master mymaster 192.168.56.11 6379
1747:X 19 Apr 2019 15:00:44.525 # +new-epoch 1
1747:X 19 Apr 2019 15:00:44.527 # +vote-for-leader 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 1
1747:X 19 Apr 2019 15:00:45.023 # +config-update-from sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379
1747:X 19 Apr 2019 15:00:45.023 # +switch-master mymaster 192.168.56.11 6379 192.168.56.13 6379
1747:X 19 Apr 2019 15:00:45.024 * +slave slave 192.168.56.12:6379 192.168.56.12 6379 @ mymaster 192.168.56.13 6379
1747:X 19 Apr 2019 15:00:45.024 * +slave slave 192.168.56.11:6379 192.168.56.11 6379 @ mymaster 192.168.56.13 6379
1747:X 19 Apr 2019 15:01:15.050 # +sdown slave 192.168.56.11:6379 192.168.56.11 6379 @ mymaster 192.168.56.13 6379
#从上面的日志可以看到master已经sdown,并切换为192.168.56.13为master节点,下面查看slave01上的配置,会自动的更改replicaof配置项,如下:
[root@redis-slave01 ~]# grep "replicaof" /usr/local/redis/redis.conf |grep -vE "#"
replicaof 192.168.56.13 6379
[root@redis-master ~]# redis-cli -p 26379 #哨兵模式下查看主从信息,也是可以看到主从的变化
127.0.0.1:26379> sentinel master mymaster
1) "name"
2) "mymaster"
3) "ip"
4) "192.168.56.13"
5) "port"
6) "6379"
7) "runid"
8) "61597fdb615ecf8bd7fc18e143112401ed6156ec"
9) "flags"
10) "master"
......
127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "192.168.56.12:6379"
3) "ip"
4) "192.168.56.12"
5) "port"
6) "6379"
7) "runid"
8) "c86027e7bdd217cb584b1bd7a6fea4ba79cf6364"
9) "flags"
10) "slave"
......
2) 1) "name"
2) "192.168.56.11:6379"
3) "ip"
4) "192.168.56.11"
5) "port"
6) "6379"
7) "runid"
8) ""
9) "flags"
10) "s_down,slave,disconnected" #提示该节点为从,并且状态为s_down,无法链接的状态
......
Redis学习之路(三)之Redis主从和哨兵模式的更多相关文章
- Redis——学习之路四(初识主从配置)
首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...
- Redis——学习之路三(初识redis config配置)
我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. ...
- 分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)
上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...
- Redis学习笔记(三)Redis支持的5种数据类型的总结
继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...
- Redis学习笔记(三)redis 的键管理
Redis 的键管理 一.Redis 数据库管理 Redis 是一个键值对(key-value pair)的数据库服务器,其数据保存在 src/server.h/redisDb 中(网上很多帖子说在 ...
- Redis——学习之路二(初识redis服务器命令)
上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息 s ...
- Redis学习之路(000)- 目录
本文是博主学习整理网上大神的文件以及自学的心得. Redis学习之路(000)- 目录 Redis学习之路(001)- Redis介绍以及安装(Linux) Redis学习之路(002)- Ubunt ...
- Redis学习笔记(2)——Redis的下载安装部署
一.下载Redis Redis的官网下载页上有各种各样的版本,如图 但是官网下载的Redis项目不正式支持Windows.如果需要再windows系统上部署,要去GitHub上下载.我下载的是Redi ...
- Redis学习笔记(1)——Redis简介
一.Redis是什么? Remote Dictionary Server(Redis) 是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value ...
- 学习之路三十九:新手学习 - Windows API
来到了新公司,一开始就要做个程序去获取另外一个程序里的数据,哇,挑战性很大. 经过两周的学习,终于搞定,主要还是对Windows API有了更多的了解. 文中所有的消息常量,API,结构体都整理出来了 ...
随机推荐
- Saltstack安装配置过程
一.安装配置 1.服务器配置情况 三台服务器,均需要关闭iptables和selinux(否则salt执行指令无效) master: 192.168.60.139 centos slave: 192. ...
- 购物商城学习--第三讲(tomcat插件启动web工程)
此处提到的tomcat插件即maven工程集成的tomcat插件,可以在添加maven的tomcat插件之后,在本地通过脚本或者命令行方式运行web工程,tomcat插件启动只需要修改一个端口即可,非 ...
- Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
新服务器搭建环境总是有很多问题.在安装MS SQL SERVER 2014 EXPRESS的时候提示无法安装成功,需要先安装 .NET Framework 3.5!但是新问题又来了,使用Windows ...
- 使用mysqldump备份时为什么要加上 -q 参数(5.7默认为on)
使用mysqldump备份时为什么要加上 -q 参数(5.7默认为on) 写在前面:我们在使用mysqldump备份数据时,请一定记住要加上 -q 参数,后果可能是很严重的,不要给自己挖坑哦. 先来看 ...
- (笔记)MySQL 之 Metadata Locking 研究(5.5版本)
MySQL5.5 中引入了 metadata lock. 顾名思义,metadata lock 不是为了保护表中的数据的,而是保护 database objects(元数据)的.包括表结构.sch ...
- MySQl新特性 GTID
GTID简介 概念 全局事务标识符(GTID)是创建的唯一标识符,并与在源(主)服务器上提交的每个事务相关联.此标识符不但是唯一的,而且在给定复制设置中的所有服务器上都是唯一的.所有交易和所有GTID ...
- Oracle Database 12c Preinstall Steps for Oracle Linux Simplified
This post is a quick reminder that Oracle Linux includes a handy RPM to address pre-installation req ...
- Cisco HSRP 配置方法(热备份路由协议)配置实例
转裁于51CTO.http://www.mamicode.com/info-detail-862350.html HSRP----热备份路由协议 思科私有协议,与VRRP 虚拟路由协议 相近,(国际标 ...
- load file within a jar
String examplejsPrefix = "example"; String examplejsSuffix = "js"; String exampl ...
- Linux之添加交换分区
Linux下的交换分区我们可以随意改变大小,如果说日常生活中分区不够用,今天我们来举个例子如何添加. 1.首先是使用dd命令创建一个空文件,这个空文件的大小就是你要继续添加的swap的大小,比如我这里 ...