介绍
redis多机部署的一种形式,通过读写分离来降低服务器的工作负载。
服务器被分为master和slave:
- master
- 接收写请求(特殊情况同样可接收读请求)
- 将新数据异步同步到slave数据库
- slave
- 接收读请求
缺陷
- master宕机后需要人工干预才能从slave中重选一个作为master以维持服务。
- slave数量较多,或是多次传递(master→slave→slave...),则会存在一定复制延迟。
工作原理
- slave首次连接master,发送sync命令,执行全量复制,slave自身数据被清除。
- master接收sync命令后,后台保存rdb快照,同时将所有写命令存入缓存,rdb保存完成后,将rdb文件和缓存的命令都发送给slave。
- slave接收rdb和缓存命令后开始初始化。
- master定期向slave发送心跳包;同时将新的所有收集到的写命令自动传给slave完成同步。
- slave下线后如果重练,master将从backlog中获得slave当前复制的offset和masterid,根据offset将未复制的数据传递给slave。
案例演示
配置文件更改
复制只需要修改slave的配置文件即可:
- 如果master设置了密码,则需要将masterauth设置为对应的密码。
- 可以将replicaof 192.168.146.128 6379设置为对应的主机ip和端口号,这样开机时就是从机。
完整配置文件修改内容:
- daemonize yes
- #bind 127.0.0.1
- protected-mode no
- port 6379(端口)
- dir ./(工作目录)
- pidfile /var/run/redis.pid(pid文件)
- logfile ./redis.log(日志文件)
- requirepass 123456(密码)
- dbfilename dump.rdb(rdb文件名)
- appendonly yes
- appendfilename "appendonly.aof"(aof文件名)
- masterauth 123456(从机设置主机密码)
主从设置命令
- slaveof masterip masterport:指定master数据库并同步。
- slaveof no one:将自身设置为master。
- info replication:查看主从关系。
配置为持久生效,无论master或者slave宕机都不会改变主从关系;命令为当次生效,从机宕机后关系即失效。
架构说明
一主二从
使用一主二从结构:
从机只能读不能写:
master查看主从关系:
从机查看主从关系:
主机日志:
slave链
将其中一个slave的slaveof改为另一个slave:
结构为:
master的info replication:
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.146.129,port=6379,state=online,offset=1120,lag=0
master_failover_state:no-failover
master_replid:2ffea1d7eca897713c47588d2b9042f7b694c690
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1120
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1120
slave1的info replication:
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.146.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:1204
slave_repl_offset:1204
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:1
slave0:ip=192.168.146.130,port=6379,state=online,offset=1204,lag=1
master_failover_state:no-failover
master_replid:2ffea1d7eca897713c47588d2b9042f7b694c690
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1204
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:1190
slave2的info replication:
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.146.129
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:1302
slave_repl_offset:1302
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:2ffea1d7eca897713c47588d2b9042f7b694c690
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1302
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:1288
master中设置:
slave2中顺利接收: