redis的主从复制原理及步骤
怎么玩:
1.配从库不赔主库
2.从库配置:slaceof 主库IP主库端口
在没有SLAVEOF之前,三个机器处于都是master的角色,但是当执行SLAVEOF之后,主机的角色就是role
,从机的角色就是slave,执行SLAVEOF之后,会把主机上的所有数据按照主从复制的原则复制一份,并且从机上不能够
修改和创建数据,只能在主机上进行创建和修改数据
主机
[123456@localhost Desktop]$ su
Password:
[root@localhost Desktop]# cd /etc/redis
[root@localhost redis]# ls -l
total 192
-rw-r--r--. 1 root root 46710 Nov 23 14:52 redis6379.conf
-rw-r--r--. 1 root root 46710 Nov 23 14:55 redis6380.conf
-rw-r--r--. 1 root root 46710 Nov 23 14:57 redis6381.conf
-rw-r--r--. 1 root root 46698 Nov 21 17:36 redis.conf
[root@localhost redis]# redis-server redis6379.conf
[root@localhost redis]# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
127.0.0.1:6379> set k4 v4
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=501,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=501,lag=0
master_repl_offset:501
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:500
127.0.0.1:6379> set k6 v6
OK
从机1
[root@localhost Desktop]# redis-server /etc/redis/redis6380.conf
[root@localhost Desktop]# redis-cli
127.0.0.1:6379> exit
[root@localhost Desktop]# redis-server /etc/redis/redis6380.conf
[root@localhost Desktop]# redis-cli -p 6380
127.0.0.1:6380> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> clear
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> get k4
"v4"
127.0.0.1:6380> get k2
"v2"
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:515
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> set k6 v66
(error) READONLY You can't write against a read only slave.
127.0.0.1:6380> get k6
"v6"
从机2
[root@localhost 123456]# redis-server /etc/redis/redis6381.conf
[root@localhost 123456]# redis-cli -p 6381
127.0.0.1:6381> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6381> get k4
"v4"
127.0.0.1:6381> get k1
"v1"
127.0.0.1:6381> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:529
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> set k6 v666
(error) READONLY You can't write against a read only slave.
127.0.0.1:6380> get k6
"v6"
当主机关机或者停止工作的时候角色变化:
127.0.0.1:6379> SHUTDOWN
not connected> exit
127.0.0.1:6380> keys *
1) "k2"
2) "k4"
3) "k1"
4) "k3"
5) "k6"
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:4338
master_link_down_since_seconds:18
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:4338
master_link_down_since_seconds:208
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
当主机重新开始的时候:
[root@localhost redis]# redis-server redis6379.conf
[root@localhost redis]# redis-cli
127.0.0.1:6379> set k7 v7
OK
从机1
127.0.0.1:6380> get k7
"v7"
从机2
127.0.0.1:6381> get k7
"v7"
主机正常工作但是其中一个从机坏了!每次与master断开,都需要重新连接,除非写进配置文件redis.conf中
127.0.0.1:6379> set k8 v8
OK
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=1703,lag=1
master_repl_offset:1703
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1702
127.0.0.1:6379> get k8
"v8"
从机重新开始连接,
[root@localhost Desktop]# redis-server /etc/redis/redis6380.conf
[root@localhost Desktop]# redis-cli -p 6380
127.0.0.1:6380> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> get k8
(nil)
主从复制的薪火相传
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=85,lag=0
master_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84
127.0.0.1:6379> keys *
1) "k3"
2) "k4"
3) "k1"
4) "k7"
5) "k2"
6) "k6"
7) "k8"
127.0.0.1:6379> set k9 v9
OK
127.0.0.1:6379> get k9
"v9"
从机1;80是79的从机
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
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:85
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=71,lag=1
master_repl_offset:71
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:70
127.0.0.1:6380> get k9
"v9"
81是80的从机:
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:71
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> get k9
"v9"
主从复制之反客为主:当主机停止工作的时候,从机2SLAVEOF no one,从机3重新SLAVEOF 127.0.0.1 6380
[root@localhost Desktop]# redis-server /etc/redis/redis.conf
[root@localhost Desktop]# redis-cli
127.0.0.1:6379> SHUTDOWN
not connected> EXIt
[root@localhost Desktop]# redis-server /etc/redis/redis6380.conf
[root@localhost Desktop]# redis-cli -p 6380
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> keys *
1) "k1"
2) "k6"
3) "k4"
4) "k3"
5) "k7"
6) "k2"
7) "k9"
8) "k8"
127.0.0.1:6380> SLAVEOF no one
OK
127.0.0.1:6380> clear
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> set k10 v10
OK
127.0.0.1:6380> get k10
"v10"
[root@localhost Desktop]# redis-server /etc/redis/redis6381.conf
[root@localhost Desktop]# redis-cli -p 6381
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6381> keys *
1) "k1"
2) "k7"
3) "k3"
4) "k9"
5) "k4"
6) "k6"
7) "k2"
8) "k8"
127.0.0.1:6381> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:43
master_link_down_since_seconds:563
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> get k10
"v10"
127.0.0.1:6381>
复制原理:
slave启动成功连接到master后会发送一个sync命令
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,
在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
哨兵配置:
[root@localhost redis]# vim sentinel.conf
[root@localhost redis]# redis-sentinel sentinel.conf
[root@localhost Desktop]# redis-server /etc/redis/redis.conf
[root@localhost Desktop]# redis-cli
127.0.0.1:6379> SHUTDOWN
not connected> exi
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> exit
[root@localhost Desktop]# redis-server /etc/redis/redis.conf
[root@localhost Desktop]# redis-cli
127.0.0.1:6379> keys *
1) "k10"
2) "k1"
3) "k9"
4) "k8"
5) "k6"
6) "k4"
7) "k2"
8) "k3"
9) "k7"
127.0.0.1:6379> SHUTDOWN
not connected> exit
[root@localhost Desktop]#
哨兵会监控到主机停止工作并且让从机2称为主机:
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=263864,lag=1
master_repl_offset:263864
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:263576
repl_backlog_histlen:289
127.0.0.1:6380> set k10 v10
OK
从机三成为2的从机:
127.0.0.1:6381> INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:264130
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6381> get k10
"v10"
当主机1开始工作之后:
[root@localhost Desktop]# redis-server /etc/redis/redis.conf
[root@localhost Desktop]# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> get k10
"v10"