主从复制:主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
作用:
在我的/myredis目录中,存在redis.conf配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LcJw1p1j-1671250147140)(https://pg3993-1311808981.cos.ap-nanjing.myqcloud.com/img/image-20221216112825444.png)]
接下来配置一个主机两个从机
第一步:
配置三个不同的redis配置文件;三台服务器对应的端口号,dump文件等信息要不同。
三台服务器对应的端口号分别是:6379,6380,6381
第二步:
启动三台服务器
使用命令:redis-server 配置文件 启动redis服务器
第三步:
客户端连接服务器
使用命令 :redis-cli -p port 连接redis服务器
使用info replication命令查看当前服务器状和各种消息
目前每台服务器都是主服务器,没有从服务器。
下面将6379redis服务器作为主服务器,6380和6381服务器作为从服务器。
只需要在6380和6381服务器上执行命令: slaveof ip port 挂载主服务器
在主服务器上写入数据,观察从服务器的数据变化
主服务器在执行命令后,从服务器的数据也会相应的发生改变。
从机无法进行写操作,只能执行读操作。
当我们在从机上进行写操作时,从机会报错。
当主机宕机,三个服务器会有什么现象?
当主机宕机后,从服务器会等待主服务器的重新连接。
在从服务器6380上执行shutdown命令。
从服务挂掉后,需要重新执行slaveof ip port命令挂载主服务器。
上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。
特点:
下面我们将6381服务器配置为6380服务器的从机
反客为主机制:
当6379服务器挂掉后。可以使用命令slaveof no one 让从机6380会成为主服务器:
主从服务器间第一次同步的过程分为三个阶段:
建立链接,协商同步。
从服务器执行slaveof ip port命令后,向主服务器发送psync命令,请求同步。psync包含两个参数:主服务器runID和复制进度offset。这两个参数是传入类型参数
主服务器收到psync命令后,向从服务器发送FULLRESYNC
作为响应命令返回给从服务器。该响应命令会传递两个参数:主服务器的 runID 和主服务器目前的复制进度 offset。从服务器收到响应后,会记录这两个值。
FULLRESYNC 响应命令的意图是采用全量复制的方式,主服务器会把所有的数据都同步给从服务器
主服务器同步数据给从服务器
服务器会执行 bgsave 命令来生成 RDB 文件,然后把文件发送给从服务器。从服务器收到 RDB 文件后,会先清空当前的数据,然后载入 RDB 文件。
同步主服务器的命令到从服务器中。
在主服务器生成的 RDB 文件发送完,从服务器收到 RDB 文件后,丢弃所有旧数据,将 RDB 数据载入到内存。完成 RDB 的载入后,会回复一个确认消息给主服务器。至此,第一次同步工作结束。
第一次同步结束后,主从服务器之间会建立一个TCP连接
后续主服务器可以通过这个连接继续将写操作命令传播给从服务器,然后从服务器执行该命令,使得与主服务器的数据库状态相同。
哨兵模式:反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
先让6379redis服务器成为主服务器,6380和6381成为6379的从服务器。
第一步:
创建一个sentinel.conf文件(文件名不能出错);在文件中填写相关的配置内容:
sentinel monitor 主服务器名 主服务器ip 主服务器port n
第二步:
执行命令:redis-sentinel 配置文件路径
该命令作用是启动哨兵服务器
redis-sentinel sentinel.conf
第三步:
测试:让主服务器6379shutdown,查看6380和6381的情况。
6379服务器挂掉后,6381按照一定的规则成为了新的服务器;选举主服务器的规则在原理一节中将会详细讲解。
哨兵模式的问题: