Redis的複製(Master/Slave)

來源:互聯網
上載者:User

標籤:收集   問題   開啟   status   master   ase   串連   var   root   

是什麼 :

  也就是我們所說的主從複製,主機資料更新後根據配置和策略,自動同步到備機的master/slaver機制,Master以寫為主,Slave以讀為主

能幹嘛:

  讀寫分離,容災恢複

怎麼玩:

  1.配從(庫)不配主(庫)

  2.從庫配置:slaveof 主庫IP 主庫連接埠

    每次與master斷開之後,都需要重新串連,除非你配置進redis.conf檔案

    Info replication

  3.修改設定檔細節操作

    拷貝多個redis.conf檔案

    開啟daemonize yes

    Pid檔案名稱字

    指定連接埠

    Log檔案名稱字

    Dump.rdb名字  

  4.常用3招:

    一主二僕

    薪火相傳

    反客為主

 

在同一台機器的不同連接埠示範,類似於多台機器

拷貝多份設定檔

[[email protected] myredis]# cp redis.conf redis6379.conf[[email protected] myredis]# cp redis.conf redis6380.conf[[email protected] myredis]# cp redis.conf redis6381.conf[[email protected] myredis]#

 

分別修改對應的設定檔

[[email protected] myredis]# vim redis6379.conf [[email protected] myredis]# vim redis6380.conf [[email protected] myredis]# vim redis6381.conf [[email protected] myredis]# 

 

info replication

127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0127.0.0.1:6379> 

 

 

127.0.0.1:6380> info replication# Replicationrole:masterconnected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0127.0.0.1:6380> 

 

 

127.0.0.1:6381> info replication# Replicationrole:masterconnected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0127.0.0.1:6381> 

 

 

一僕二主:

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) "k3"
2) "k2"
3) "k1"

 

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>

 

127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
127.0.0.1:6381> get k1
"v1"
127.0.0.1:6381>

 

再次輸入info replication

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=291,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=291,lag=0
master_repl_offset:291
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:290
127.0.0.1:6379>

 

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:333
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>

 

讀寫分離:

slave節點不能寫入

127.0.0.1:6380> set k6 v6(error) READONLY You can‘t write against a read only slave.127.0.0.1:6380> 

 

 

主機掛掉時:

127.0.0.1:6379> SHUTDOWN
not connected> exit
You have new mail in /var/spool/mail/root
[[email protected] ~]#

slave節點狀態:

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:753
master_link_down_since_seconds:17
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>

主機修複後:

[[email protected] ~]# redis-server /myredis/redis6379.conf
[[email protected] ~]# redis-cli -p 6379
127.0.0.1:6379> set k7 v7
OK
127.0.0.1:6379>

 

slave節點:

127.0.0.1:6380> get k7
"v7"
127.0.0.1:6380>

在當前這種狀體下,主機掛掉後從機不會改變狀態,會原地待命

從機down掉之後會需要與主機從新串連,除非寫進conf設定檔

127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> get k7
"v7"
127.0.0.1:6380>

 

 

薪火相傳:

配置6381的主節點為6380

127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381>

 

則此時節點狀態為

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=1957,lag=1
master_repl_offset:1957
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1956
127.0.0.1:6379>

 

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:4
master_sync_in_progress:0
slave_repl_offset:2027
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>

 

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:99
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 no one:使當前資料庫停止與其他資料庫的同步,轉成主要資料庫

127.0.0.1:6380> SLAVEOF no one
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=267,lag=0
master_repl_offset:267
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:266
127.0.0.1:6380>

 

複製原理:

  Slave啟動成功串連到master後會發送一個sync命令

  Master接到命令啟動背景存檔進程,同時收集所有接收到的用於修改資料集命令,在後台進程執行完畢後,master將傳送整個資料檔案到slave,以完成一次完全同步

  全量複製:slave服務在接收到資料庫檔案資料後,將其存檔並載入到記憶體中。

  差異複寫:Master繼續將新的所有收集到的修改命令依次傳給slave,完成同步,但是只要是重新串連master,一次完全同步(全量複製)將被自動執行

 

哨兵模式(sentinel):

  是什麼:

    反客為主的自動版,能夠後台監控主機是否故障,如果故障了根據投票數自動將從庫轉換為主庫。

  怎麼玩:

    調整結構,6379帶著80,81

    

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379OK127.0.0.1:6380> info repication127.0.0.1:6380> info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:7master_sync_in_progress:0slave_repl_offset:3833slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:225repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:224127.0.0.1:6380> 
127.0.0.1:6381> slaveof 127.0.0.1 6379OK127.0.0.1:6381> info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:5master_sync_in_progress:0slave_repl_offset:3861slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0127.0.0.1:6381> 

    自訂的/myredis目錄下建立sentinel.conf檔案,名字覺不能錯

      [[email protected] myredis]# touch sentinel.conf

      sentinel.conf 檔案的內容:(末尾的1表示誰的票數多餘1票,誰就是新的領導)

      sentinel monitor host6379 127.0.0.1 6379 1  

    啟動哨兵:

      使用 redis-sentinel /myredis/sentinel.conf 啟動

      

[[email protected] myredis]# redis-sentinel /myredis/sentinel.conf 9871:X 30 Nov 09:22:52.073 * Increased maximum number of open files to 10032 (it was originally set to 1024).                _._                                                             _.-``__ ‘‘-._                                                   _.-``    `.  `_.  ‘‘-._           Redis 3.0.4 (00000000/0) 64 bit  .-`` .-```.  ```\/    _.,_ ‘‘-._                                    (    ‘      ,       .-`  | `,    )     Running in sentinel mode |`-._`-...-` __...-.``-._|‘` _.-‘|     Port: 26379 |    `-._   `._    /     _.-‘    |     PID: 9871  `-._    `-._  `-./  _.-‘    _.-‘                                    |`-._`-._    `-.__.-‘    _.-‘_.-‘|                                   |    `-._`-._        _.-‘_.-‘    |           http://redis.io          `-._    `-._`-.__.-‘_.-‘    _.-‘                                    |`-._`-._    `-.__.-‘    _.-‘_.-‘|                                   |    `-._`-._        _.-‘_.-‘    |                                    `-._    `-._`-.__.-‘_.-‘    _.-‘                                         `-._    `-.__.-‘    _.-‘                                                 `-._        _.-‘                                                         `-.__.-‘                                               9871:X 30 Nov 09:22:52.077 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.9871:X 30 Nov 09:22:52.077 # Sentinel runid is 07858ebd94d326270f4a56e0501afefe82e444b19871:X 30 Nov 09:22:52.079 # +monitor master host6379 127.0.0.1 6379 quorum 19871:X 30 Nov 09:22:53.077 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 63799871:X 30 Nov 09:22:53.091 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6379

 

 

    原有的master掛了:

      哨兵的監看式視窗增加新的內容:

9895:X 30 Nov 09:42:54.522 # +sdown master host6379 127.0.0.1 63799895:X 30 Nov 09:42:54.522 # +odown master host6379 127.0.0.1 6379 #quorum 1/19895:X 30 Nov 09:42:54.522 # +new-epoch 19895:X 30 Nov 09:42:54.522 # +try-failover master host6379 127.0.0.1 63799895:X 30 Nov 09:42:54.648 # +vote-for-leader ccc2dc958a8ae1e16294b81567126ec4031bf192 19895:X 30 Nov 09:42:54.648 # +elected-leader master host6379 127.0.0.1 63799895:X 30 Nov 09:42:54.648 # +failover-state-select-slave master host6379 127.0.0.1 63799895:X 30 Nov 09:42:54.725 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 63799895:X 30 Nov 09:42:54.725 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 63799895:X 30 Nov 09:42:54.778 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 63799895:X 30 Nov 09:42:55.704 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 63799895:X 30 Nov 09:42:55.704 # +failover-state-reconf-slaves master host6379 127.0.0.1 63799895:X 30 Nov 09:42:55.752 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 63799895:X 30 Nov 09:42:56.778 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 63799895:X 30 Nov 09:42:56.778 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 63799895:X 30 Nov 09:42:56.877 # +failover-end master host6379 127.0.0.1 63799895:X 30 Nov 09:42:56.877 # +switch-master host6379 127.0.0.1 6379 127.0.0.1 63809895:X 30 Nov 09:42:56.878 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 63809895:X 30 Nov 09:42:56.878 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6380

    6380變為了新的master

127.0.0.1:6380> info replication# Replicationrole:masterconnected_slaves:1slave0:ip=127.0.0.1,port=6381,state=online,offset=123955,lag=0master_repl_offset:123955repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:123954127.0.0.1:6380> 

    此時6381的狀態

127.0.0.1:6381> info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6380master_link_status:upmaster_last_io_seconds_ago:1master_sync_in_progress:0slave_repl_offset:125992slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0127.0.0.1:6381> 

 

 

    問題:如果之前的master重啟回來,會不會雙master衝突

    啟動掛掉的6379後

    哨兵監控列印:

9895:X 30 Nov 09:43:26.931 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 63809895:X 30 Nov 09:45:51.015 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 63809895:X 30 Nov 09:46:00.994 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6380

 

    啟動後,6379的狀態:

    成為了當前master的salve節點

127.0.0.1:6379> info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6380master_link_status:upmaster_last_io_seconds_ago:1master_sync_in_progress:0slave_repl_offset:132805slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0127.0.0.1:6379> keys *1) "k7"127.0.0.1:6379> 

 

 

 

複製的缺點:

複製延時:由於所有的寫操作都是閑在Master上操作,然後同步更新到salve上,所以從Master同步到Slave機器有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,Slave機器數量的增加也會使這個問題更加嚴重。

 

Redis的複製(Master/Slave)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.