(一)主從複製介紹
前面所講的關於redis的操作都屬於單機操作,單機操作雖然操作簡單,但是處理能力有限,無法高可用。所謂高可用性,就是指當一臺服務器宕機的時候,有備用的服務器能頂替上,在單機操作上這是無法實現的,因此就出現了主從複製。
我們把一臺服務器看作是主服務器(master),把另外多臺服務器看作是從服務器(slave),主從複製就是將master中的數據即時有效的複製到slave中。
一個master可以擁有多個slave,一個slave只對應於一個master
master負責執行寫數據,將出現變化的數據自動同步到slave
有了主從複製之後,就可以實現高可用了,當一臺slave宕機後,還有多臺slave存在;當master宕機後,由於slave的數據和master是一樣的,就可以推選一臺slave爲新的master,都能做到高可用。
負載均衡:由slave分擔master負載,並根據具體的需求可以改變slave的數量
故障恢復:當master出現問題時,可以由slave來代替master,實現快速恢復
(二)主從複製工作流程
2.1 建立連接階段
爲了實現上述過程,我分別在兩個端口開啓redis服務,6379代表master,6380代表slave
複製兩份redis的配置文件,重命名爲redis6379.conf和redis6380.conf,分別修改配置文件中的port爲6379和6380。在cmd下開啓兩個服務:
再開啓兩個客戶端分別連接兩個redis服務,6379是master,6380是slave
redis-cli -p 6379
redis-cli -p 6380
slaveof <masterip> <masterport>
此時主從連接已經完成,我在master設置一個name,在slave中可以直接獲取
主從連接除了可以用命令連接之外,還可以在配置文件中進行配置,在redis6380.conf中增加這一句
slaveof 127.0.0.1 6379
slaveof no one
2.2 數據同步階段
數據同步又分爲全量複製和部分複製兩塊,其中全量複製就是你啓動同步指令之後進行的RDB操作,把master中的數據通過RDB發送給slave。由於RDB採用bgsave指令,所以在全量複製期間master所做的操作會進入一個緩衝區,當全量複製結束後就需要通過部分複製來恢復緩衝區中的操作,這裏採用AOF。
通過上面的介紹我們知道了當在進行全量複製時所進行的操作會放入緩存區,但是如果緩存區設置過小就會導致master阻塞,通過下面方式可以設置緩存區大小:
repl-backlog-size 1mb
slave-server-stable-data yes|no
2.3 命令傳播階段
命令傳播階段就是當master數據庫狀態發生變化,就會通過命令傳播階段同步給slave
服務器的運行id、主服務器的複製積壓緩衝區、主從服務器的複製偏移量
服務器運行id是每臺服務器每次運行的身份識別碼,由40個字符組成,用於在服務器之間傳輸時識別身份。
複製積壓緩衝區又稱爲複製緩衝區,是一個先進先出的隊列。當master數據庫發生變化時,master會將要傳播給slave的命令保存在複製緩衝區中,slave分別從複製緩衝區接收信息。
因爲命令傳播階段首先由master把數據放入緩衝區中,因此master需要一個複製偏移量記錄發送給slave的指令對應的位置。而slave要把緩衝區中的數據同步到自己這裏,因此也需要一個複製偏移量記錄接收到的位置,如果因爲意外斷網,等網絡再次連接之後就可以直接從複製偏移量的位置繼續複製。
2.4 心跳機制
進入命令傳播階段後,master和slave需要通過心跳機制保持雙方連接
通過ping指令查詢slave是否在線,可由repl-ping-slave-period設置週期,默認10秒
replconf ack {offset}
作用:彙報slave自己的複製偏移量;判斷master是否在線
當slave多數都掉線或者slave延遲過高時,可以強制關閉master的寫功能,停止數據同步:
min-slaves-to-write 2 當連接的slave小於等於2臺時停止數據同步
min-slaves-max-lag 10 當連接的slave延遲大於10秒,停止數據同步