redis学习—redis主从复制和哨兵集群
1.什么是主从同步
主从同步原理:
-
从服务器向主服务器发送 SYNC 命令。
-
接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
-
当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
-
主服务器将缓冲区储存的所有写命令发送给从服务器执行。
注意:
-
在开启主从复制的时候,使用的是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