redis学习—redis主从复制和哨兵集群

一、redis主从同步

1.什么是主从同步

主从同步原理:

  1. 从服务器向主服务器发送 SYNC 命令。

  2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。

  3. 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。

  4. 主服务器将缓冲区储存的所有写命令发送给从服务器执行。

注意:

  • 在开启主从复制的时候,使用的是RDB方式的,同步主从数据的

  • 同步开始之后,通过主库命令传播的方式,主动的复制方式实现

  • 2.8以后实现PSYNC的机制,实现断线重连

2.redis主从同步实战

1.准备两个或两个以上的redis实例。

这里我准备了3个,也是为了方便后面故障切换实验。

注意点:

  • redis的主从复制是基于rdb的持久化文件来实现从库数据的同步,所以一定要配置rdb的持久化

  • redis的主从复制无法通过aof来实现。

redis-6379.conf(主库)配置文件如下:

port 6379
daemonize yes
pidfile /var/redis/master-slave-log/redis.pid
loglevel notice
logfile "/var/redis/master-slave-log/6379/redis.log"
dbfilename dump.rdb
dir /var/redis/master-slave-log/6379
protected-mode no

redis-6380.conf(从库1)配置文件如下:

port 6380
daemonize yes
pidfile /var/redis/master-slave-log/redis.pid
loglevel notice
logfile "/var/redis/master-slave-log/6380/redis.log"
dbfilename dump.rdb
dir /var/redis/master-slave1-log/6380
protected-mode no
slaveof 127.0.0.1 6379

redis-6381.conf(从库2)配置文件如下:

port 6381
daemonize yes
pidfile /var/redis/master-slave-log/redis.pid
loglevel notice
logfile "/var/redis/master-slave-log/6380/redis.log"
dbfilename dump.rdb
dir /var/redis/master-slave1-log/6381
protected-mode no
slaveof 127.0.0.1 6379

注意新建配置文件中用到的文件夹。

mkdir -p /var/redis/master-slave-log/{6379,6380,6381}

2.分别启动三个数据库

redis-server redis-6379.conf 
redis-server redis-6380.conf
redis-server redis-6381.conf
# 注意配置文件的路径,这里以相对位置启动

3.分别登陆数据库,查看设数据库之前的关系

redis-cli # 不指定端口,默认登录6379
127.0.0.1:6379> info replication
# 身份是master
​
redis-cli -p 6380
127.0.0.1:6379> info replication
# 身份是slave
​
redis-cli -p 6381
127.0.0.1:6381> info replication
# 身份是slave

4.数据写入查看测试

redis-cli -p 6379 set name ryxiong
ok  # 主库写入成功
​
redis-cli -p 6380
127.0.0.1:6380> set age 18
(error) READONLY You can't write against a read only slave.  # 写入报错
​
# 查看数据
keys * 
1) "name"  # 主库写入的数据同步了

3.主从同步故障恢复

现在我们有一个主库,两个从库,在实际工作中,主库可能因为负载太大或别的原因而宕机,这个时候我们需要立即切换一个从机为主机,从而保证数据的正常写入。

1.我们模拟主机宕机,杀死6379主数据库

ps -ef | grep redis
# 找到6379的进程id
kill -9 6379的进程id

2.主库宕机,没有主机,无法正常写入数据,我们选择让6380为新的主机

redis-cli -p 6380 slaveof no one  # 去除6380的slave身份
redis-cli -p 6380 info replication  # 查看6380身份,是master

3.修改其他从机指定的主机服务器

redis-cli -p 6381 slaveof 127.0.0.1 6380

4.测试新的主库6380的写入功能

redis-cli -p 6380
127.0.0.1:6380> set age 18
ok  # 成功

二、redis哨兵集群

上面模拟的情况在主机停止工作后,我们手动切换从机为主机,但是实际工作中,我们也不能24小时都有人来监视服务器的运行状态。

这个redis已经为我们考虑到了,redis提供了哨兵功能,哨兵的作用是来监视主服务器的。

1.redis-sentinel简介

Redis-Sentinel是redis官方推荐的高可用性解决方案,

当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能。

而redis-sentinel就是一个独立运行的进程,用于监控多个master-slave集群, 自动发现master宕机,进行自动切换slave > master。

主要功能

  • 不时的监控redis是否良好运行,如果节点不可达就会对节点进行下线标识

  • 如果被标识的是主节点,sentinel就会和其他的sentinel节点“协商”,如果其他节点也人为主节点不可达,就会选举一个sentinel节点来完成自动故障转义

  • 在master-slave进行切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换

redis主从复制背景问题

Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用:

  • 一旦主节点宕机,从节点作为主节点的备份可以随时顶上来。

  • 扩展主节点的读能力,分担主节点读压力。

但是问题是:

  • 一旦主节点宕机,从节点上位,那么需要人为修改所有应用方的主节点地址(改为新的master地址),还需要命令所有从节点复制新的主节点

那么这个问题,redis-sentinel就可以解决了

2.redis-sentinel架构

几个查看状态命令

官网地址:http://redisdoc.com/
redis-cli info  # 查看redis数据库信息
redis-cli info replication  # 查看redis的复制授权信息
redis-cli info sentinel  # 查看redis的哨兵信息

1.环境配置

因为本博客只用来做测试,只准备了一台linux服务器

主节点master的redis-6379.conf

port 6379
daemonize yes
pidfile /var/redis/master-slave-log/redis.pid
loglevel notice
logfile "/var/redis/master-slave-log/6379/redis.log"
dbfilename dump.rdb
dir /var/redis/master-slave-log/6379
protected-mode no

从节点1:redis-6380.conf

port 6380
daemonize yes
pidfile "/var/redis/master-slave-log/redis.pid"
loglevel notice
logfile "/var/redis/master-slave-log/6380/redis.log"
dbfilename "dump.rdb"
dir "/var/redis/master-slave-log/6380"
protected-mode no
slaveof 127.0.0.1 6379

从节点2:redis-6381.conf

port 6381
daemonize yes
pidfile "/var/redis/master-slave-log/redis.pid"
loglevel notice
logfile "/var/redis/master-slave-log/6381/redis.log"
dir "/var/redis/master-slave-log/6381"
protected-mode no
slaveof 127.0.0.1 6379

2.启动这三个redis数据库实例

redis-server redis-6379.conf
redis-server redis-6380.conf
redis-server redis-6381.conf

查看三个redis服务器的状态

redis-cli info replication
redis-cli -p 6380 info replication
redis-cli -p 6381 info replication

写入数据测试主从关系是否成功了

3.配置redis-sentinel文件

这里我们准备3个哨兵,当然也就需要3个哨兵配置文件了。

port 26379
dir /var/redis/sentinel/26379
logfile "/var/redis/sentinel/26379/sentinel.log"
​
​
// 当前Sentinel节点监控 127.0.0.1:6379 这个主节点
// 2代表判断主节点失败至少需要2个Sentinel节点节点同意
// mymaster是主节点的别名
sentinel monitor master 127.0.0.1   6379  2//每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
sentinel down-after-milliseconds master 30000//当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,
原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs master 1//故障转移超时时间为180000毫秒
sentinel failover-timeout master 180000
//让哨兵在后台运行
daemonize yes

sentinel-26380.conf和sentinel-26381.conf仅仅只是端口不同,我们通过sed命令快速生成

sed "s/26379/26380/g"  sentinel-26379.conf > sentinel-26380.conf
sed "s/26379/26381/g"  sentinel-26379.conf > sentinel-26381.conf

注意:创建哨兵的配置文件夹

mkdir -p /var/redis/sentinel/{26379,26380,26381}

4.分别运行3个哨兵

redis-sentinel sentinel-26379.conf 
redis-sentinel sentinel-26380.conf 
redis-sentinel sentinel-26381.conf 

检查哨兵运行状态

redis-cli -p 26379 info sentinel
# 查看到如下参数,哨兵就正确了
master0:name=s20master,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3

5.杀死主库,30秒后查看从库状态,看是否会切换

ps -ef | grep redis
kill -9 主库进程id

查看两个slave状态

master_link_down_since_seconds:13  # 主库失去连接的时间

查看从库的身份

redis-cli -p 6380 info replication
redis-cli -p 6380 info replication

我们发现有一个从库身份变为master,另一个从库的mater指向了新的master,说明大功告成了

posted @ 2019-07-06 15:50  ryxiong728  阅读(159)  评论(0编辑  收藏  举报