Redis的主从复制
可实现功能
1.读写分离
2.容灾
实现
1.搭建一主多从
因为没有多个服务器,所以我们选择创建不同的redis服务来监听不同的端口
创建过程
1.引入redis配置文件
include /myredis/redis.conf
2.分配进程号
pidfile /var/run/redis_6379.pid
3.分配端口号
port 6379
4.持久化
dbfilename dump6379.rdb
启动多台服务器
redis-server /myredis/redis6380.conf
redis-server /myredis/redis6381.conf
redis-server /myredis/redis6379.conf
查看主机信息
redis-cli -p 6379
into replication
查看到的信息
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:6e4db8b34705223bf21e95c4e8fed2b4100c8669
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
配置主从库
在从机上执行命令
slaveof:成为某个实例的从服务器
之后查看info replication后可以发现从服务器和主服务器中的内容发生了改变
# Replication
role:master
connected_slaves:1//标志从服务器的数量
slave0:ip=112.74.183.130,port=6380,state=online,offset=84,lag=0//从服务器的相关信息
master_failover_state:no-failover
master_replid:486e5cf748dc1e314b742cf15bb392f08338be9a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
# Replication
role:slave//标志为从服务器
master_host:112.74.183.130//主服务器地址
master_port:6379//主服务器端口
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:84
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:486e5cf748dc1e314b742cf15bb392f08338be9a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
测试
主服务器写,从服务器读
我们在主服务中写入数据,可以从=在从服务器中读取到,因为发生了读取操作
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set a1 v1
OK
127.0.0.1:6379> keys *
1) "a1"
127.0.0.1:6379> get a1
"v1"
127.0.0.1:6379>
127.0.0.1:6380> keys *
1) "a1"
127.0.0.1:6380>
我们在实验下在从服务器中进行写操作可以吗
127.0.0.1:6380> set k1 va
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380>
结果是不可以的,因为从服务器只可以进行读操作
主从复制原理
1.从服务器连接主服务器后,从服务器向主服务器发送进行数据同步的消息
2.主服务器接受到数据同步的消息后,把主服务器中的数据进行持久化rdb文件,把rdb文件发送给从服务器,从服务器进行读取数据
每次主服务器进行写操作之后,和从服务器进行数据同步
缺点
复制延时
常用三招
一主二仆
注意:
当一台从服务器挂掉后,我重启他的服务,这台服务器会重新变为主服务器
当主服务器挂掉会发生什么
从服务器不会主动尚未成为主服务器,但是会发现主服务器挂掉,当主服务器重新启动后,还是主服务器
# Replication
role:slave
master_host:112.74.183.130
master_port:6379
master_link_status:down//标识主机已经挂掉
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1664
master_link_down_since_seconds:8
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:486e5cf748dc1e314b742cf15bb392f08338be9a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1664
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1664
薪火相传
从服务器还可以挂从服务器,特点于一主二仆相似
反客为主
主服务器后,从服务器成为主服务器
在要成为主机的从服务器中执行
slaveof no one
缺点:需要手动完成
哨兵模式(反客为主自动版)
后台监控主机是否故障,如果故障根据投票数将从服务器升级为主服务器
使用步骤
1.先创建sentinel.conf文件。名字不能错
2.在sentinel.conf文件中写入命令:
sentinel monitor mymaster 127.0.0.1 6379 1
mymaster是给被监控的服务器名称 数字代表至少有多少个哨兵同意才能升级
3.启动哨兵
使用命令:
redis-sentinel sentinel.conf
出现这个,代表启动成功
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.2.5 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 20264
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
20264:X 08 Aug 2021 15:29:53.886 # Sentinel ID is dbbf57d5657ee22daaaa87d5c04bbc5b4d689255
20264:X 08 Aug 2021 15:29:53.886 # +monitor master mymaster 127.0.0.1 6379 quorum 1
20264:X 08 Aug 2021 15:29:53.886 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
20264:X 08 Aug 2021 15:29:53.891 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
当主机挂了,从机选举出主机
选举规则
1.优先级靠前的(redis.conf中slave-priority 100值越小,优先级越高)
2.选择偏移量大的(获得原主机数据最全的)
3.选择runid最小的从服务(每个redis实例启动都会随机生成一个40位的runid)