redis的主从复制是单向的,只能有主节点到从节点,主节点以写为主从节点以读为主不能写入数据!因为系统的80%的需求都是读的需求。
redis服务默认自己是主节点,一个主节点由一个或多个从节点,一个从节点只有一个主节点。
全量复制:redis的从节点挂掉了,当再次连接到主机后,会全量复制主节点的所有数据来保证数据的一致性;
增量复制:当主节点挂掉了,从节点再次连接到重启后的主节点时,主节点存入新的数据,从节点也会存入相同的数据;
登录redis:
redis-cli -p 6379
有密码的话执行命令:AUTH 设置的redis的密码
查看主从redis的信息:
info replication
role:角色为主节点(默认值)
connected_slaves:连接的从节点数
我这里有三台服务器,因为redis默认自己是主节点所以在其中任选一台作为主节点,这个服务器的redis不用配置,我们去吧哪两个服务器的redis配置成这个主节点redis的从节点;
在两个从节点服务器连接redis后都执行:
slaveof 8.142.99.94 6379
slaveof :主从复制的命令
8.142.99.94 :主节点ip
6379 : 主节点redis的端口号
注意:如果主节点redis设置了密码一定要在从节点的配置文件中写上;所有节点的redis密码必须一样
加上主节点密码后再次连接即可;
可以看到两个从节点都连接上了主节点;
主节点也看到这两个从节点的信息了。
测试:
主节点
从节点1
从节点2
主从复制完成;
1) 哨兵模式是Redis的高可用方式,哨兵节点是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。
2) 哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis的主节点挂掉时,哨兵会第一时间感知到,并且在slave节点中重新选出来一个新的master,然后将新的master信息通知给client端,从而实现高可用。这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息
3) Sentinel 哨兵是redis官方提供的高可用方案,它可以用来监听多个redis实例的运行情况.
Sentinel是一个进程我们需要启动它,启动方式和redis一样;
新建一个sentinel文件;
文件夹中在新建一个conf和log文件夹;
在conf文件夹中创建一个名为sentinel.conf文件;
文件内容:
port 26379
dir "/var/log/sentinel"
logfile "/var/log/sentinel/sentinel-log.log"
# sentine1 monitor关键字
# master 给主从服务器集群起一个名字(监控主服务器,从服务器的信息也就获取了)主服务器的IP和端口
# 2主服务器失效的统计数,超过2票就认为失效
sentinel monitor mymaster 8.142.99.94 6379 1
# 如果主服务器redis有密码就在此设置主节点redis的密码
sentinel auth-pass mymaster 123456789
# 主服务器下线超过30秒就进行切换(默认30S)
#sentinel down-after-milliseconds mymaster 30000
port:sentinel的端口号(以后就是连接sentinel有sentinel去转发操作redis的命令)
dir : sentinel的工作目录用于生成文件;
logfile :日志文件的目录
sentinel monitor :设置监控的redis主机
mymaster :微监控的主机redis取一个名字 ;
192.168.243.4 : 监控主机的ip
6379 : redis的端口号
1 :有一个sentinel 连接不上主机的redis时认为主机挂掉了,这时就需要故障转移;
启动测试:
docker run -d --name sentinel -v /mydocker/sentinel/conf/sentinel.conf:/conf/sentinel.conf -v /mydocker/sentinel/log:/var/log/sentinel redis:6.2.6 redis-sentinel /conf/sentinel.conf
1、首先停止主节点redis服务
可以看到主节点变更了;
这个从节点的主节点也改成新的主节点了;
现在重启原先的主节点;
可以看到自动成为从节点并连接到了新的主节点了;
连接状是down 是因为没有在redis配置文件中配置主节点redis的连接密码:
masterauth 123456789
在配置文件中添加以上代码即可:
重启redis:
数据同步成功!
我这里在增加两个sentinel(哨兵),分别在这两个新的从机上启动sentinel进程使sentinel也实现高可用!
我这里重新停止了当前的sentinel进程重新在这三台服务器上创建sentinel进程;
按照上面启动sentinel的步骤在这三台服务器上创建即可:
port 26379
dir "/var/log/sentinel"
logfile "/var/log/sentinel/sentinel-log.log"
# sentine1 monitor关键字
# master 给主从服务器集群起一个名字(监控主服务器,从服务器的信息也就获取了)主服务器的IP和端口
# 2主服务器失效的统计数,超过2票就认为失效
sentinel monitor mymaster 43.143.198.158 6379 2
# 如果主服务器redis有密码就在此设置主节点redis的密码
sentinel auth-pass mymaster 123456789
# 主服务器下线超过10秒就进行切换(默认30S)
#sentinel down-after-milliseconds mymaster 30000
分别这在三台服务器上启动即可:
docker run -d --name sentinel -v /mydocker/sentinel/conf/sentinel.conf:/conf/sentinel.conf -v /mydocker/sentinel/log:/var/log/sentinel redis:6.2.6 redis-sentinel /conf/sentinel.conf
可以看到全部成功即可:
springboot配置:
spring:
redis:
timeout: 5000
sentinel:
master: mymaster
nodes: 8.142.97.14:26379,43.143.198.158:26379,8.142.99.94:26379
完事!