1. 程式人生 > 其它 >15.redis的主從複製

15.redis的主從複製

概念:
    主從複製,是指將一臺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,完成同步

結論:當從機重新連線主機時,會自動進行一次全量複製,我們的資料一定會被看到