主从复制
简介
主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主,如下图:
好处:
1.读写分离,性能扩展
2.容灾快速恢复
搭建
我这里准备了三台Linux设备(一台阿里云服务器,两台虚拟机),服务器当主机,两台虚拟机当从机。我在两台虚拟机上面也安装了Redis。
过程:
-
启动三台设备上的Redis服务
-
然后使用info replication命令查看主从复制的相关信息
一般显示的信息都如下图所示:
我们可以看到,一开始,三台设备还没设置主从时都属于主机。 -
配置主机
主机一定要修改bind 127.0.0.1 -::1,将127.0.0.1修改成自己主机的ip地址或者修改成0.0.0.0(表示所有主机都可以连接到redis),我这里因为设置了密码所以设置成所有主机都可以访问,如下图:
配置完之后重启Redis!!! -
配置从机
(1)关闭从机的防火墙;
(2)修改从机的bind 127.0.0.1 -::1,将127.0.0.1修改成0.0.0.0;
(3)如果redis的主机设置了密码,需要在从机的config文件中进行配置。对从机的redis.conf文件中的masterauth位置进行配置,如下图:
(4)重启Redis之后,使用slaveof命令配置从机
slaveof 主机的ip 主机redis运行使用的端口号
在两台虚拟机上面执行该命令之后,重新info replication命令查询状态,如下图:
我们可以看到,此时虚拟机的角色从主机变成了从机。
我们新增一个键进行测试,如下图:
这表明我们主从复制成功搭建起来了。
特点:
1.在主机上写,在从机上可以读取数据,在从机上写数据报错,如下图:
从机写数据报错
2.主机挂掉,重启就行,一切如初;从机挂掉之后要重新使用slaveof命令设置为从机
主从复制原理
全量复制:而从服务器(slave)在接收到rdb数据库文件数据后,将其存盘并加载到内存中
全量复制过程:
- 当从服务器(slave)启动成功连接到主服务器(master)后会发送一个进行数据同步的消息;
- 主服务器(master)接到消息之后会启动后台的存盘进程(把主服务器数据进行持久化),同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,主服务器(master)将传送整个rdb数据文件到从服务器(slave),完成一次完全同步;
增量复制:主服务器(master)继续将新的所有收集到的修改命令依次传给从服务器(slave),完成同步。
注意:这个过程是主服务器(master)主动去做的,不需要从服务器(slave)发出消息申请进行。
只要是从服务器(slave)重新连接主服务器(master),一次完全同步(全量复制)将被自动执行
主从复制常用操作
“薪火相传”
上一个从服务器(slave)可以是下一个从服务器(slave)的主服务器(master),slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力,去中心化降低风险,如下图:
用法:
slaveof ip 端口号(port)
中途变更转向:会清除之前的数据,重新建立拷贝最新的
风险:
1.一旦某个slave宕机,后面的slave都没法备份;
2.主机挂了,从机还是从机,无法写数据了;
“反客为主”
当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。
用法:
slaveof no one
用 slaveof no one 将从机变为主机。
哨兵模式
简介
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库,如下图:
使用步骤
配置哨兵
1.在主机配置文件目录下新建sentinel.conf文件。名字绝不能错
2.配置哨兵,填写内容
在sentinel.conf文件里面填写,
sentinel monitor mymaster 主机ip 6379 1
sentinel auth-pass mymaster 密码
其中mymaster为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量(意为有多少个哨兵认为主机挂掉了才同意迁移,1是一个哨兵认为主机挂掉了就迁移,2是得两个哨兵都认为主机挂掉了才可以迁移)
注意:sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。
3.启动哨兵
在sentinel.conf文件目录底下执行 redis-sentinel sentinel.conf 命令,启动哨兵,如下图:
上面红框中就是从机的信息,正好和master的slave信息对应着,如下图:
配置哨兵这里有个坑要说一下:
哨兵启动后找不到slave
原因:
1.没有在服务器开放26379端口,阿里云服务器的还要在阿里云安全组也开放这个端口;
2.slave挂掉了…
哨兵监控
当主机挂掉后,从机选举会产生新的主机
我们人为地把主机的进程 kill 掉,
(大概10秒左右可以看到哨兵窗口日志,切换了新的主机)
哪个从机会被选举为主机呢?根据优先级别:slave-priority
原主机重启后会变为从机。
我这里一直出问题…主服务器挂掉之后一直启用不了从服务器作为master😭
复制延时
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
故障恢复
关于选择条件的解释:
优先级在redis.conf中默认:slave-priority 100,值越小优先级越高
偏移量是指获得原主机数据最全的
每个redis实例启动后都会随机生成一个40位的runid