Redis的主从复制的是什么?
主从复制就是主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slaver以读为主
有什么用处?
读写分离,性能扩展。容灾快速恢复。
配置服务器(配从不配主)
- 拷贝多个Redis.conf文件重命名,引入includeRedis.conf
- 配置pidfile名字
- 指定端口号
- 为dump.rdb从命名
- appendonly 关闭或改名
如redis6379.conf
include /opt/myredis/redis.conf
pidfile /var/run/redis6379.pid
port 6379
dbfilename dump6379.conf
分别开启服务并查看服务器配置:
如:启动端口为6379的服务
[root@localhost myredis]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:0f98abde24bd6e9da53d83a5ce1feec36a6a10f7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
端口为6380和6381的服务启动如上
info replication #打印主从复制的相关信息
slaveof #成为某个实例的从服务器
1、一主二从模式
我们设置6380和6381为6379的从服务器
如:设置6381
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave #设置本服务器为从服务器
master_host:127.0.0.1 # 主服务器IP
master_port:6379 # 主服务器端口
master_link_status:up # 主服务器状态
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:0
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:01f941bca7a76f19f88eea102b57dcc27c518b9c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
6381设置同上
打印6379主从复制相关信息
127.0.0.1:6379> info replication
# Replication
role:master
#从服务器信息
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=140,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=140,lag=1
master_replid:01f941bca7a76f19f88eea102b57dcc27c518b9c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140
特点:
从服务器始终与主服务器数据保持一致
从服务器不可写入数据
主服务器shutdown后从服务器原地待命
复制原理
- 每次从机联通后都会给主机发送sync指令
- 主机立刻进行存盘操作,发送rdb文件给从机
- 从机收到rdb后进行全盘加载
- 之后主机的每次写操作,都会发送给从机,从机执行相同命令
薪火相传
上一个Slave可以是下一个slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力。中途变更转向:会清除之前的数据,重新建立拷贝最新的。一旦某个slave宕机,后面的slave都没法备份
反客为主
SLAVEOF no one
使当前数据库停止与其他数据库的同步,转成主数据库
2、哨兵模式
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
使用方式
- 调整为一主二从模式
- 指定的/myredis的目录下新建sentinel.conf
- 在配置文件中填写 sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1
- 可以设置多个哨兵,上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机
- 启动哨兵执行redis-sentinel.conf sentinel.conf
故障恢复原理
主机宕机后,哨兵根据票从众多从服务器选出一个新的将其转成主服务。新的主服务向剩下的从服务发送slaveof复制新的master。当已下线的服务重新上线时sentinel会向其发送slaveof,让其成为新主服务的从服务