原理:
1. 從服務器向主服務器發送 SYNC 命令。
2. 接到 SYNC 命令的主服務器會調用BGSAVE 命令,建立一個 RDB 文件,並使用緩衝區記錄接下來執行的全部寫命令。
3. 當主服務器執行完 BGSAVE 命令時,它會向從服務器發送 RDB 文件,而從服務器則會接收並載入這個文件。
4. 主服務器將緩衝區儲存的全部寫命令發送給從服務器執行。redis
-------------
一、在開啓主從複製的時候,使用的是RDB方式的,同步主從數據的
二、同步開始以後,經過主庫命令傳播的方式,主動的複製方式實現
三、2.8之後實現PSYNC的機制,實現斷線重連數據庫
主庫:6380的redis(master)
從庫1:6381的redis(slave)
從庫2:6382的redis(slave)
port 6380 # 端口 daemonize yes # 在後臺運行 pidfile /data/6380/redis.pid # 進程id loglevel notice logfile "/data/6380/redis.log" # 日誌文件,需本身建立 dbfilename dump.rdb # 持久化存儲 dir /data/6380 protected-mode no
port 6381 daemonize yes pidfile /data/6381/redis.pid loglevel notice logfile "/data/6381/redis.log" dbfilename dump.rdb dir /data/6381 protected-mode no slaveof 192.168.61.129 6380 # 指定主庫的ip和端口
port 6382 daemonize yes pidfile /data/6382/redis.pid loglevel notice logfile "/data/6382/redis.log" dbfilename dump.rdb dir /data/6382 protected-mode no slaveof 192.168.61.129 6380
注意:服務器
若是主庫中設置了密碼,那麼咱們在從庫的配置文件中就須要添加主庫的密碼spa
masterauth root # 指定主庫的密碼
redis-server /data/6380/redis.conf redis-server /data/6381/redis.conf redis-server /data/6382/redis.conf
[root@szx /data/6380 21:46:33]#redis-cli -p 6380 -h 192.168.61.129 192.168.61.129:6380> info replication # Replication role:master connected_slaves:2 # 有兩個從庫鏈接 slave0:ip=192.168.61.129,port=6381,state=online,offset=2100,lag=0 slave1:ip=192.168.61.129,port=6382,state=online,offset=2100,lag=0 master_replid:a70b4cc777e7f27efef1d2463f4d78d556a0162b master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2100 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2100
[root@szx /data/6381 21:50:27]#redis-cli -p 6381 -h 192.168.61.129 192.168.61.129:6381> info replication # Replication role:slave # 從庫 master_host:192.168.61.129 # 主庫ip master_port:6380 # 主庫端口 master_link_status:up # 鏈接主庫正常 master_last_io_seconds_ago:4 master_sync_in_progress:0 slave_repl_offset:2226 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:a70b4cc777e7f27efef1d2463f4d78d556a0162b master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2226 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2226
[root@szx /data/6382 21:50:27]#redis-cli -p 6382 -h 192.168.61.129 127.0.0.1:6382> info replication # Replication role:slave master_host:192.168.61.129 master_port:6380 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:2366 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:a70b4cc777e7f27efef1d2463f4d78d556a0162b master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2366 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:43 repl_backlog_histlen:2324
192.168.61.129:6380> SET name "alex" OK 192.168.61.129:6380> mset name "wusir" age 88 OK
192.168.61.129:6381> get name "alex" 192.168.61.129:6381> mget name age 1) "wusir" 2) "88"
127.0.0.1:6382> get name "alex" 127.0.0.1:6382> mget name age 1) "wusir" 2) "88"
從庫掛了無所謂 主庫掛了得當即恢復主庫,或者將從庫切換爲主庫,繼續工做 -.實驗步驟 1.分別啓動 6380 6381 6382 三個數據庫實例,創建好主從關係 2.殺死6380主庫,此時6381 6382 羣龍無首 3.選擇讓6381爲新的主庫,就要去除6381的從的身份 redis-cli -p 6381 slaveof no one #查看此時6381的身份 redis-cli -p 6381 info replication 4.此時將6382的主人改成6381 redis-cli -p 6382 slaveof 192.168.61.129 6381
這種故障恢復只是臨時生效,重啓服務器後就不生效了日誌