哨兵模式:只能恢复简单的,无法对从节点进行自动故障转移,在读写分离场景下。从节点故行会导致读服务不可用,需要对从节点做额外的监控,切换操作。
#主从复制的作用:
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
故障恢复,当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复,实际上是一种服务的冗余。
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写redis数据时应用连接主节点,读Redis数母时应用连接及节占),个相服条器负载,尤工是在写少远多的场是下,通过多个从节占分相速负载,可以大大提高Redts那各器的并发量。
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
#主从复制流程:
(1) 若启动一个slave机器进程,则它会向Master机器发送一个"sync command"命令,请求同步连接。
(2)无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同Master还会记录改数据的所有命令并缓存在数据文件中。
(3)后台进程完成缓存快作之后,Master机器就会向slave机器发送数据文件,slave洲机器将数据文件保在到使盘上,然后将其加载到内存中,按着Master机器就会将修改数据的所有换作一并发送给Slave端机器。若slave出现故障导致宕机,则恢复正常后会自动重新连接。
(4)Master机器收到slave端机器的连接后,将其完整的数据文件发送给slave端机器,如果aster同时收到多个slave发来的同步请求,则haster会在后台启动一个进程以保存数据文件,然后将其发送给所有的slave端机器,确保所有的slave端机器都正常。
如何判断主从数据不一致,通过命令查看偏移量,保持一致重新连接一次(手动的话:主也可以bgsave创建rdb传给从还可以
,把从原来的rdb文件删除,再与主对接一次,主持久化会自动将rdb自己会传给从。)
从服务器repliicaof 主的地址
vim /usr/local/redis/log/6379_log
info replication查看状态
sismember class
哨兵作用:
监控:哨兵会不断地检查主节点和从节点是否运作正常
自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效的主节点的其中一个从节点升级为主节点,并让其他从节点改为复制新的主节点
通知:哨兵可以将故障转移的结果发送给客户端
哨兵奇数台,三个起步
#故障转移机制:
1.由哨兵节点定期监控发现主节点是否出现了故障每个哨兵节点每隔1秒会向主节点、从节点及其它哨兵节点发送一次ping命令做一次心跳检测。如果主节点在一定时间范围内不回复或者是回复一个错误消息,那么这个哨兵就会认为这个主节点主观下线了 (单方面的)。当超过半数哨兵节点认为该主节点主观下线了,这样就客观下线了。
2,当主节点出现故障,此时哨兵节点会通过Rat算法 (选举算法)实现选举机制共同选举出一个哨兵节点为leader,来负责处理主节点的故障转移通知。所以整个运行哨兵的集群的数量不得少于3个节点。
3.由leader哨兵节点执行故障转移,过程如下:。将某一个从节点升级为新的主节点,让其它从节点指向新的主节点;·若原主节点恢复也变成从节点,并指向新的主节点;·通知客户端主节点已经更换。
需要特别注意的是,客观下线是主节点才有的概念:如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操
#主节点的选举:
1.过滤掉不健康的(已下线的) ,没有回复哨兵 ping 响应的从节点
2.选择配置文件中从节点优先级配置最高的。 (replica-priority,默认值为100)
3.选择复制偏移量最大,也就是复制最完整的从节点。
setinel.cnf文件
哨兵节点的端口号26376
设置master地址最小下线数量
sentinel monitor mymaster 192.168.232.27 6379 2
vim /usr/local/redis/conf/sentinel.conf
protected-mode no #6行,关闭保护模式
port 26379 #10行,Redis哨兵默认的监听端口
daemonize yes #15行,指定sentinel为后台启动
pidfile /usr/local/redis/log/redis-sentinel.pid #20行,指定 PID 文件
logfile "/usr/local/redis/log/sentinel.log" #25行,指定日志存放路径
dir /usr/local/redis/data #54行,指定数据库存放路径
sentinel monitor mymaster 192.168.80.10 6379 2 #73行,修改 指定该哨兵节点监控192.168.80.10:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
#sentinel auth-pass mymaster abc123 #76行,可选,指定Master节点的密码,仅在Master节点设置了requirepass
sentinel down-after-milliseconds mymaster 3000 #114行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000 #214行,同一个sentinel对同一个master两次failover之间的间隔时间(180秒)
运行哨兵
redis-sentinel sentinel.conf &
info sentinel
模拟故障
killall redis-server
redis集群
集群由多组节点node组成,redis的数据分布在这些节点中。集群的节点分布为主节点负责读写请求和集群信息维护;从节点只进行主节点数据和状态的复制
集群的作用
1)数据分区,解决写操作无法负载均衡,
2)高可用
redis hash槽0~16383
cd /usr/local/redis/
mkdir -p redis-cluster/redis600{1..6}
cd /usr/local/redis/
mkdir -p redis-cluster/redis600{1..6}
for i in {1..6}
do
cp /opt/redis-7.0.9/redis.conf /usr/local/redis/redis-cluster/redis600$1
cp /opt/redis-7.0.9/src/{redis-server,redis-cli} /usr/local/redis/redis-cluster/redis600$1
done
#开启群集功能:
#其他5个文件夹的配置文件以此类推修改,注意6个端口都要不一样。
cd /usr/local/redis/redis-cluster/redis6001
vim redis.conf
#bind 127.0.0.1 #87行,注释掉bind项,默认监听所有网卡
protected-mode no #111行,关闭保护模式
port 6001 #138行,修改redis监听端口
daemonize yes #309行,设置为守护进程,后台启动
pidfile /usr/local/redis/log/redis_6001.pid #341行,指定 PID 文件
logfile "/usr/local/redis/log/redis_6001.log" #354行,指定日志文件
dir ./ #504行,指定持久化文件所在目录
appendonly yes #1379行,开启AOF
cluster-enabled yes #1576行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf #1584行,取消注释,群集名称文件设置
cluster-node-timeout 15000 #1590行,取消注释群集超时时间设置
#启动redis节点
分别进入那六个文件夹,执行命令:redis-server redis.conf ,来启动redis节点
cd /usr/local/redis/redis-cluster/redis6001
redis-server redis.conf
for d in {1..6}
do
cd /usr/local/redis/redis-cluster/redis600$d
./redis-server redis.conf
done
ps -ef | grep redis
节点扩容
创建节点:
redis-cli -p 6001
cluster meet 127.0.0.1 6007
cluster meet 127.0.0.1 6008
#查看集群节点
redis-cli -c -p 6008 cluster nodes
将127.0.0.1:6008创建为127.0.0.1:6007的从节点。命令里需要指定一个已有节点以便于获取集群信息和主节点的node ID
redis-cli -p 6008
cluster replicate e44678abed249e22482559136bf45280fd3ac281
查看哈希槽并添加
clustor slots
redis-cli -p 6007 --cluster reshard 127.0.0.1:6001
集群总线16379
数据节点6379
步骤:添加新节点,主从对接,转移其他组的hash槽给新节点
查看集群状态
redis-cli -p 6001 cluster nodes