15.redis的主從複製
阿新 • • 發佈:2022-05-26
概念: 主從複製,是指將一臺Reedis伺服器的資料,複製到其他的redis伺服器。前者成為主節點(master/leader),後者成為從節點(slave/follower); 資料的複製是單向的(),只能從主節點到從和節點。 Master以寫為主,slave以讀為主 預設情況下:每天reids伺服器都是主節點 且一個主節點可以有很多從節點(或沒有從節點),但是一個從節點只能由一個主節點(父親可以由很多兒子,但是兒子只能由一個父親) 主從複製的作用: 1.資料冗餘:主從複製實現了資料的熱備份,是持久化的一種資料冗餘方式 2.故障恢復:當主節點出現問題,可以由從節點提供服務,實現快速的故障恢復;實際是一種服務的冗餘 3.負載均衡:從主從複製的基礎上,配合讀寫分離,可以從主機點提供寫服務,從節點提供讀服務(即寫Redis資料時應用連線住主節點 讀Reedis資料應用時連線從節點),分擔伺服器負載;尤其時在寫少讀多的情況下,通過多個節點分擔負載,可以大大提高redis伺服器的併發量 4.高可用(叢集)基石:出了上述作用意外,主從複製還是哨兵和集權能夠實施的基礎,因此說主從複製是redis高可用的基礎 一般來說,要將redis運用於工程專案中,必須使用叢集(最少三臺:一主兩從) 原因如下: 1.從結構上,單個redis伺服器會發生單點故障,並且一臺伺服器需要處理所有的請求負載,壓力較大 2.從容量上,單個redis伺服器的記憶體容量有限,就算一臺redis伺服器的記憶體容量是256g,也不能將所有的記憶體用於redis儲存記憶體 一般來說,單臺redis最大使用記憶體不應該超過20G 3.
環境配置:
只需要配置從庫,預設每個redis伺服器都是主節點 命令1:檢視當前redis的資訊 127.0.0.1:6379> info replication # Replication role:master---->角色:主節點 connected_slaves:0:從機個數 master_replid:7d537d9cb615f9341f2c941e1bf5ccd086eb4ff6 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
叢集搭建
在192.168.2.128(主),192.168.2.129(從),192.168.2.130(從)三臺伺服器上搭建redis叢集 1.每臺機器上安裝redis(步驟和前面一樣) 2.啟動每臺伺服器的redis 3.因為每隔redis伺服器都預設是主節點,所以只需要在要做從節點的伺服器上認主節點即可 3.1在129伺服器的客戶端執行 127.0.0.1:6379> SLAVEOF 192.168.2.128 6379(認主節點:主節點的IP 和埠) OK 在執行檢視命令: 127.0.0.1:6379> info replication(檢視) # Replication role:slave---->成了從節點 master_host:192.168.2.128(主節點的ip) master_port:6379(主節點的埠) master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_repl_offset:0 master_link_down_since_seconds:1603622777 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:50ccc030bd4f59f00ee0132036b7ab007e236e04 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 3.2在128伺服器上執行一樣 SLAVEOF 192.168.2.128 6379(認主節點:主節點的IP 和埠) 4.這裡搭建叢集會出現問題: 1.主機和從機都無法telnet 主機的6379埠 2.主redis啟動失敗: Could not create server TCP listening socket 192.168.2.128:6379: bind: Cannot assign requested address 1:M 25 Oct 2020 03:09:01.270 # Configured to not listen anywhere, exiting. 3.從機啟動失敗: 1:S 25 Oct 2020 10:51:26.056 * MASTER <-> REPLICA sync started 1:S 25 Oct 2020 10:51:26.056 # Error condition on socket for SYNC: Operation now in progress 改變: 主機的配置中: bind 0.0.0.0或直接註釋掉bind這行(不設定預設將處理所有請求) protected-mode no(保護模式改為no) 從機: 註釋掉bind xxxxx 直接加上:slaveof 192.168.2.128 6379(這樣不用每次重啟redis都得執行主從複製命令) 5.主機客戶端上執行: 127.0.0.1:6379> info replication # Replication role:master connected_slaves:2(有兩個從機) slave0:ip=192.168.2.129,port=6379,state=online,offset=308,lag=1(從機1) slave1:ip=192.168.2.130,port=6379,state=online,offset=308,lag=1(從機2) master_replid:74fe9ac84343467f580cb2a175c00914648d37d3 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:308 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:308
細節1:主機負責寫,從機負責讀
主機負責寫,從機負責讀!主機中的所有資料和資訊都會被從機儲存
測試:
在主機上:
127.0.0.1:6379> set k1 v1(可以寫入)
OK
127.0.0.1:6379> get k1(也可以獲取出來)
"v1"
在從機上:
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> get k1(只能讀)
"v1"
127.0.0.1:6379> set k2 v2(不能寫)
(error) READONLY You can't write against a read only replica.
細節2:主機宕機
1.當主機斷了或宕機了,從機的info replication依舊是從機,沒有配置哨兵模式,不會在從機中推舉出主機
2.在此期間,從機依舊可以進行讀操作
3.當主機恢復了,重新寫入資料,從機依舊是可以獲取到的
細節3:從機宕機
1.當從機宕機了,主機在此期間內發生了寫操作,
2.從機恢復了,依舊是可以拿到主機在從機宕機期間內寫的值
複製原理:
slave(從機)啟動成功後連線到master(主機)會發送一個sync(全量)同步命令
Master接收到命令後,啟動後臺的存檔程序,同時收集所有接收到的用於修改資料集的命令,在後臺程序執行完畢之後,master
將傳送整個資料檔案到slave,並完成一次完全同步
全量複製:slave服務在接收到主機的資料檔案後,將其存檔,並載入到記憶體中
增量複製:master繼續將新的所有收集到的修改命令依次傳給slave,完成同步
結論:當從機重新連線主機時,會自動進行一次全量複製,我們的資料一定會被看到