在redis集群中,自动配置主从结构,但是最少需要6台服务器。
不通过集群也可以配置redis主从结构。
1、结构:
一主一从,一主多从,主从从
2、工作原理:
①、slave向master发出数据同步的请求
②、master收到请求之后,会创建一个进程,这个进程在后台记录操作日志
③、日志写完之后会把这个日志文件发送给slave
④、slave会根据日志进行数据同步
# slave第一次会做完全同步,之后都是增量同步
# 从master中同步的数据会覆盖掉slave原有的数据,因此slave和master数据不必一致
3、主从配置:
# 仅需要对slave进行配置就可以了
redis-cli -h 192.168.4.52 -p 6352 #连接到4.52(想要成为slave的主机)
xxx> info replication #查看复制信息,默认是master
命令行临时配置:(立刻生效,重启失效)
xxx> slaveof 192.168.4.51 6351 #指明master主机
永久配置:
vim /etc/redis/6379.conf
slaveof 192.168.4.51 6351 #指明master主机
slave还原为独立的主机:
xxx> slaveof no one
或者注释掉slaveof 192.168.4.51 6351
# 一主多从,主从从结构,都是对想要成为slave的主机进行上述操作
4、配置带有验证的主从:(slave需要密码才可以同步数据)
master配置:
vim /etc/redis/6379.conf
requirepass 123456 #为master设置密码
slave配置:
vim /etc/redis/6379.conf
masterauth 123456 #设置主机的密码
或者
xxx> config set masterauth 123456 #通过命令行临时配置
xxx> config rewrite masterauth 123456 #通过命令行修改配置文件,永久配置
5、哨兵服务:(主从从结构)
# 在集群当中,master故障之后,slave会成为新的master
# 如果想要在主从、主从从结构中实现这个功能,需要开启哨兵服务
# 一般采用主从从结构
配置哨兵:(#这里在单独的主机4.100上配置哨兵)
# 可以是单独的主机,可以是redis服务器,用于监视master
# 如果在单独的主机上配置,不需要开启redis服务
tar -zxf redis-4.0.8.tar.gz
cd redis-4.0.8/
make && make install #之后可以不进行初始化,因为不需要redis服务
vim /etc/sentinel.conf #创建哨兵服务的主配置文件
port 26379 # 哨兵端口,自定义
daemonize yes # 后台运行
logfile /var/log/sentinel/aaa.log # 日志存储的文件,是具体的文件
sentinel monitor redis51 192.168.4.51 6379 1 #监视主服务器4.51, 自定义主机名为redis51,最后的1表示:有1个哨兵发现master坏掉之后就更换master
sentinel down-after-milliseconds redis51 60000 # 超过60000毫秒,认为master宕机
sentinel failover-timeout redis51 180000 # 故障转移的超时时长
sentinel parallel-syncs redis51 2 # 假设master宕机了,又从slave中选取了一个master,这个参数表示剩余的slave每次有2个连接到新的master上,从master上同步数据,这两个连接完毕之后再连接之后的2个slave到master上。一般使用默认 1 就可以了。
# 可以配置多条,用于监控不同master-slave集群。
bind 0.0.0.0 #哨兵服务地址(表示本机所有网络接口,基本上是监控本机的)
sentinel auth-pass server51 123456 #主服务器密码,没有可以不设置
redis-sentinel /etc/sentinel.conf #通过配置文件启动服务
# 当master宕机之后,哨兵会选择对应的slave成为新的master
# 选择新的master之后,哨兵服务的配置文件/etc/sentinel.conf也会发生变化
# 哨兵仍然监控当前的主机
# 当服务器恢复之后,成为当前master的slave,并且自动同步数据
写总结的第五十天!!!
补充:
基准压测:
redis-benchmark
-h ip
-c 客户端数量(默认50)
-n 总请求数 (默认100000)
-d set/get数据的大小(默认2bytes)
数据丢失的情况:
1. 异步复制导致数据丢失,master上的数据还没来得及向slave上同步就宕机了。
2. 集群脑裂,master所在的机器脱离了集群,这时候哨兵以为master故障,从而会选举一个新的master,那么就有两个master了,但是client那边还是会向之前的master上写数据,之前的master不会向最新的master上同步数据,因此就导致了数据的丢失。
解决数据丢失:(减少异步复制,脑裂导致的数据丢失的影响)
vim /etc/redis/6379.conf
min-slaves-to-write 1 # 451行
min-slaves-max-lag 10 # 452行
# 两个配置是一起使用的,表示至少有1个slave数据复制和同步的延迟不能超过10秒.
# 如果master和slave的时延超过了10秒,那么master就不会再接受写请求了,这样就能把丢失的数据控制在10秒内。此时client的请求可以写入到本地的缓存,或者是写的消息队列中等过一段时间去拿写如的数据,或者是尝试写入其他的master。
sdown和odown:
sdown:一个哨兵自己觉得master宕机,主观宕机。
odown:quorum数量的哨兵觉得master宕机,客观宕机。
salve选举master算法:
1. slave跟master断开的时长,如果大于某个值,则认为slave不适合作为master
2. slave-priority小的。
3. 如果slave-priority相同,选取slave数据多的(根据offset)。
4. 如果都相同,就选取run id小的。
关于哨兵集群:
多台机器做相同的哨兵配置就可以了。向哨兵集群中添加哨兵,会自动发现(通过订阅一个topic),如果某一个哨兵下线了,需要通知其他哨兵清理master状态。
sentinel reset * # 重置master状态,在所有哨兵上执行。
sentinel master masterName # 所有sentinel数量是否达成一致。
slave下线:
sentinel reset masterName # 重置master状态,在所有哨兵上执行。