1. 程式人生 > >redis的主從復制原理及步驟

redis的主從復制原理及步驟

class offset sta 127.0.0.1 etc 上進 sla 主機 原理

怎麽玩:
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"

redis的主從復制原理及步驟