Redis主从复制
1、主从简介
配置多台 Redis 服务器,以主机和备机的身份分开。主机数据更新后,根据配置和策略,自动同步到备机的 master/salver 机制,Master 以写为主,Slave 以读为主,二者之间自动同步数据。
Redis主从复制目的:读写分离提高 Redis 性能;避免单点故障,容灾快速恢复。
2、主从原理
每次从机联通后,都会给主机发送 sync 指令,主机立刻进行存盘操作,发送 RDB 文件给从机,从机收到 RDB 文件后,进行全盘加载。之后每次主机的写操作,都会立刻发送给从机,从机执行相同的命令(第一次是全量加载数据,之后是增量;如果断开后重新连接则第一次全量,之后是增量)。
3、主从准备
除非是不同的主机配置不同的 Redis 服务,否则在一台机器上面跑多个 Redis 服务,需要配置多个 Redis 配置文件。
-
准备多个 Redis 配置文件,每个配置文件,需要配置以下属性
daemonize yes:服务在后台运行
port:端口号
pidfile:pid 保存文件
logfile:日志文件(如果没有指定的话,就不需要)
dump.rdb:RDB 备份文件的名称
appendonly 关掉,或者是更改 appendonly 文件的名称。aof(也可以不用配置)
-
根据多个配置文件,启动多个 Redis 服务
//主机执行
[root@centos102 myredis]# redis-server 6379.conf
[root@centos102 myredis]# redis-cli -p 6379
//从机执行
[root@centos102 myredis]# redis-server 6380.conf
[root@centos102 myredis]# redis-cli -p 6380
//从机执行
[root@centos102 myredis]# redis-server 6381.conf
[root@centos102 myredis]# redis-cli -p 6381
4. 主从建立
4.1 临时建立(临时建立每次从机断开后,需要重新执行命令进行连接;如果是永久建立,则把命令写进redis.conf配置文件中;永久建立参考下面的4.2)
原则:配从不配主
配置:在从服务器上执行 SLAVEOF IP:PORT命令(这里的 IP和 PORT都是指的master的IP 和 PORT)
查看:执行 info replication 命令
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379 //配置主从结构,在从机执行,这里的IP和port都是master的
OK
127.0.0.1:6381> info replication //从机
# Replication
role:slave //从机的角色
master_host:127.0.0.1 //主机IP
master_port:6379 //主机PORT
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:739
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8f6be09ce99db803a7969d51327ab912feb90520
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:739
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:446
repl_backlog_histlen:294
127.0.0.1:6381>
注意:从机只会读取,不能写入
4.2 永久建立
在从机的配置文件中,编写 slaveof 属性配置!
# slaveof 127.0.0.1 6379
4.3 恢复身份
执行命令 slaveof no one 恢复自由身!【反客为主】(使当前数据库停止与其他数据库的同步,转成主数据库)
127.0.0.1:6381> SLAVEOF no one //执行命令恢复自由之身
OK
127.0.0.1:6381> info replication
# Replication
role:master //状态
connected_slaves:0
master_replid:8ec57360f8ab64d59a2a786be1a14bd81f5530dc
master_replid2:8f6be09ce99db803a7969d51327ab912feb90520
master_repl_offset:2069
second_repl_offset:2070
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1720
repl_backlog_histlen:350
127.0.0.1:6381>
5. 主从常见问题
①从机是从头开始复制主机的信息,还是只复制切入以后的信息?
答:从头开始复制,即完全复制。实际上是读取主机的 rdb
②从机是否可以写?
答:不能
③主机 shutdown 后,从机是上位还是原地待命?
答:原地待命
④主机又回来了后,主机新增记录,从机还能否顺利复制?
答:可以
⑤从机宕机后,重启,宕机期间主机的新增记录,丛机是否会顺利复制?
答:可以(如果是永久建立连接关系,则可以顺利复制;如果是临时建立连接关系,则需要建立与主机的连接关系,否则将无法复制)
⑥其中一台从机 down 后重启,能否重认旧主?
答:不一定,看配置文件中是否配置了 slaveof
# slaveof 127.0.0.1 6379
⑦如果两台从机都从主机同步数据,此时主机的 IO 压力会增大,如何解决?
答:按照主---从(主)---从模式配置![薪火相传](此处如有不懂可私信我)
# slaveof 127.0.0.1 6380(slaveof 新主库IP 新主库端口)
6. 哨兵模式
6.1 简介
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
作用:
①Master 状态检测
②如果 Master 异常,则会进行 Master-Slave 切换,将其中一个 Slave 作为 Master,将之前的 Master 作为 Slave
6.2 配置
自定义的 /usr/local/bin(目录可以自定义) 目录下新建 sentinel.conf 文件(sentinel.conf 文件名字绝不能错)
# vim sentinel.conf
哨兵模式需要配置哨兵的配置文件!(文件中添加)
sentinel monitor mymaster 127.0.0.1 6379 1 //mymaster(这里的名字可以自定义)
//上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机
启动哨兵:./redis-sentinel sentinel.conf
说明:如果想自己指定主节点,则可以使用反客为主:127.0.0.1:6381> SLAVEOF no one
6.3 主机宕机后
主机宕机后通过投票选举方式从slave中产生新的master继续工作,如果之前的master重新回来,则会成为slave。