Redis 主從複製

Redis 主從複製

本章介紹Redis的一個強大功能--主從複製。一臺master主機能夠擁有多臺slave從機。而一臺slave從機又能夠擁有多個slave從機。如此下去,造成強大的多級服務器集羣架構(高擴展)。能夠避免Redis單點故障,實現容災恢復效果(高可用)。讀寫分離的架構,知足讀多寫少的併發應用場景。html

主從複製的做用

主從複製,讀寫分離,容災恢復。一臺主機負責寫入數據,多臺從機負責備份數據。在高併發的場景下,即使是主機掛了,能夠用從機代替主機繼續工做,避免單點故障致使系統性能問題。讀寫分離,讓讀多寫少的應用性能更佳。前端

主從複製架構

At the base of Redis replication there is a very simple to use and configure master-slave replication that allows slave Redis servers to be exact copies of master servers.redis

官方說了,搭建主從架構 is a very simple 。官方鏈接:https://redis.io/topics/replication
確實是簡單的,一個命令: slaveof 主機ip 主機port ,就能夠肯定主從關係;一個命令:./redis-sentinel sentinel.conf ,就能夠開啓哨兵監控。
搭建是簡單的,維護是痛苦的。在高併發場景下,會有不少想不到的問題出現。咱們只有清楚複製的原理,熟悉主機,從機宕機後的變化。才能很好的跨過這些坑。下面的每個步驟都是一個小的知識點,小的場景。每作完一個步驟,你都會收穫到知識。加油!!!daydayup!!!!!!數據庫

架構圖:一主二僕一兵(也能夠多主多僕多兵)
主從複製架構vim

搭建前的準備工做

由於窮,筆者選擇用一臺服務器模擬三臺主機。和生產環境的區別僅僅是ip地址和port端口不一樣。
第一步:將redis.conf 拷貝三份,名字分別是,redis6379.conf,redis6380.conf,redis6381.conf
第二步:修改三個文件的port端口,pid文件名,日誌文件名,rdb文件名
第三步:分別打開三個窗口模擬三臺服務器,開啓redis服務。服務器

[root@itdragon bin]# cp redis.conf redis6379.conf
[root@itdragon bin]# cp redis.conf redis6380.conf
[root@itdragon bin]# cp redis.conf redis6381.conf
[root@itdragon bin]# vim redis6379.conf
logfile "6379.log"
dbfilename dump_6379.rdb
[root@itdragon bin]# vim redis6380.conf
pidfile /var/run/redis_6380.pid
port 6380
logfile "6380.log"
dbfilename dump_6380.rdb
[root@itdragon bin]# vim redis6381.conf
port 6381
pidfile /var/run/redis_6381.pid
logfile "6381.log"
dbfilename dump_6381.rdb
[root@itdragon bin]# ./redis-server redis6379.conf
[root@itdragon bin]# ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> keys *
(empty list or set)
[root@itdragon bin]# ./redis-server redis6380.conf 
[root@itdragon bin]# ./redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> keys *
(empty list or set)
[root@itdragon bin]# ./redis-server redis6381.conf 
[root@itdragon bin]# ./redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> keys *
(empty list or set)

主從複製搭建步驟

基礎搭建 (๑ŐдŐ)b

第一步:查詢主從複製信息,分別選擇三個端口,執行命令:info replication。架構

# 6379 端口
[root@itdragon bin]# ./redis-server redis6379.conf
[root@itdragon bin]# ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
......

# 6380 端口
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
......

# 6381 端口
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
......

三個端口都打印相同的信息:role:master 角色是master,connected_slaves:0 鏈接從機數量爲零。瞭解更多參數含義可訪問鏈接: http://redisdoc.com/server/info.html併發

第二步:選擇6379端口,執行命令:set k1 v1高併發

127.0.0.1:6379> set k1 v1
OK

第三步:設置主從關係,分別選擇6380端口和6381端口,執行命令:SLAVEOF 127.0.0.1 6379性能

# 6380 端口
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
......

# 6381 端口
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
......

# 6379 端口
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=98,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=98,lag=1
......

主從關係發生了變化:
6380端口和6381端口打印的信息: role:slave 從機;master_host:127.0.0.1 主機的ip地址;master_port:6379 主機的port 端口。
6379端口打印的信息: role:master 主機;connected_slaves:2 連了兩個從機; slaveX : ID、IP 地址、端口號、鏈接狀態、從庫信息

第四步:全量複製,分別選擇6380端口和6381端口,執行命令:get k1

# 6380 端口
127.0.0.1:6380> get k1
"v1"

# 6381 端口
127.0.0.1:6381> get k1
"v1"

兩個端口均可以打印k1的值,說明在創建主從關係時,從機便擁有了主機的數據。

第五步:增量複製,選擇6379端口,執行命令:set k2 v2。而後分別選擇6380端口和6381端口,執行命令:get k2

# 6379 端口
127.0.0.1:6379> set k2 v2
OK

# 6380 端口
127.0.0.1:6380> get k2
"v2"

# 6381 端口
127.0.0.1:6381> get k2
"v2"

兩個端口均可以打印k2的值,說明創建主從關係後,主機新增的數據都會複製給從機。

第六步:主從的讀寫分離,選擇6380端口,執行命令:set k3 v3

# 6380 端口
127.0.0.1:6380> set k3 v3
(error) READONLY You can't write against a read only slave.

# 6379 端口
127.0.0.1:6379> set k3 v3
OK

從機6380寫入失敗,是由於讀寫分離的機制。

第七步:主機宕機的狀況,選擇6379端口,執行命令:shutdown

# 6379 端口
127.0.0.1:6379> SHUTDOWN
not connected> QUIT

# 6380 端口
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
......

# 6381 端口
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
......

從打印的結果得知:從機原地待命

第八步:主機宕機後恢復,選擇6379端口,重啓Redis服務,執行命令:set k4 v4。分別選擇6380端口和6381端口,執行命令:get k4

# 6379 端口
[root@itdragon bin]# ./redis-server redis6379.conf 
[root@itdragon bin]# ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set k4 v4
OK

# 6380 端口
127.0.0.1:6380> get k4
"v4"

# 6381 端口
127.0.0.1:6381> get k4
"v4"

主機重啓後,一切正常。

第九步:從機宕機後恢復,選擇6380端口,執行命令:shutdown。選擇6379端口,執行命令:set k5 v5。選擇6380端口,重啓Redis服務後執行命令:get k5

# 6380 端口
127.0.0.1:6380> SHUTDOWN
not connected> QUIT
[root@itdragon bin]# ./redis-server redis6380.conf
[root@itdragon bin]# ./redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
......
127.0.0.1:6380> get k5
"v5"

# 6379 端口
127.0.0.1:6379> set k5 v5
OK

從機宕機後,一切正常。筆者用的是redis.4.0.2版本的。看過其餘教程,從機宕機恢復後,只能同步主機新增數據,也就是k5是沒有值的,但是筆者反覆試過,均有值。留着備忘!

第十步:去中性化思想,選擇6380端口,執行命令:SLAVEOF 127.0.0.1 6381。選擇6381端口,執行命令:info replication

# 6380 端口
127.0.0.1:6380> SLAVEOF 127.0.0.1 6381
OK

# 6381 端口
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
......
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=1677,lag=1
......

雖然6381 是6380的主機,是6379的從機。在Redis眼中,6381依舊是從機。一臺主機配多臺從機,一臺從機在配多臺從機,從而實現了龐大的集羣架構。同時也減輕了一臺主機的壓力,缺點是增長了服務器間的延遲。

從機上位 (๑ŐдŐ)b

模擬主機宕機,人爲手動慫恿從機上位的場景。先將三個端口恢復成6379是主機,6380和6381是從機的架構。
從機上位步驟:
第一步:模擬主機宕機,選擇6379端口,執行命令:shutdown
第二步:斷開主從關係,選擇6380端口,執行命令:SLAVEOF no one
第三步:從新搭建主從,選擇6381端口,執行命令:info replication,SLAVEOF 127.0.0.1 6380
第四步:以前主機恢復,選擇6379端口,重啓Redis服務,執行命令:info replication
在6379主機宕機後,6380從機斷開主從關係,6381開始還在原地待命,後來投靠6380主機後,6379主機回來了當它已經是孤寡老人,空頭司令。

# 6379端口

127.0.0.1:6379> SHUTDOWN
not connected> QUIT

# 6380端口
127.0.0.1:6380> SLAVEOF no one
OK
127.0.0.1:6380> set k6 v6
OK

# 6381端口
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
......
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> get k6
"v6"

哨兵監控 (๑ŐдŐ)b

從機上位是須要人爲控制,在生產環境中是不可取的,不可能有人實時盯着它,也不可能大半夜起牀從新搭建主從關係。在這樣的需求促使下,哨兵模式來了!!!
哨兵有三大任務:
1 監控:哨兵會不斷地檢查你的Master和Slave是否運做正常
2 提醒:當被監控的某個Redis出現問題時, 哨兵能夠經過API向管理員或者其餘應用程序發送通知
3 故障遷移:若一臺主機出現問題時,哨兵會自動將該主機下的某一個從機設置爲新的主機,並讓其餘從機和新主機創建主從關係。

哨兵搭建步驟:
第一步:新開一個窗口,取名sentinel,方便觀察哨兵日誌信息
第二步:建立sentinel.conf文件,也能夠從redis的解壓文件夾中拷貝一份。
第三步:設置監控的主機和上位的規則,編輯sentinel.conf,輸入 sentinel monitor itdragon-redis 127.0.0.1 6379 1 保存退出。解說:指定監控主機的ip地址,port端口,得票數。
第四步:前端啓動哨兵,執行命令:./redis-sentinel sentinel.conf。
第五步:模擬主機宕機,選擇6379窗口,執行命令:shutdown。
第六步:等待從機投票,在sentinel窗口中查看打印信息。
第七步:啓動6379服務器,
語法結構:sentinel monitor 自定義數據庫名 主機ip 主機port 得票數
若從機得票數大於設置值,則成爲新的主機。若以前的主機恢復後,
若是哨兵也宕機了???那就多配幾個哨兵而且相互監控。

# sentinel窗口
[root@itdragon bin]# vim sentinel.conf
sentinel monitor itdragon-redis 127.0.0.1 6379 1
[root@itdragon bin]# ./redis-sentinel sentinel.conf
......
21401:X 29 Nov 15:39:15.052 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ itdragon-redis 127.0.0.1 6380
21401:X 29 Nov 15:39:15.052 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ itdragon-redis 127.0.0.1 6380
21401:X 29 Nov 15:39:45.081 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ itdragon-redis 127.0.0.1 6380

21401:X 29 Nov 16:40:52.055 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ itdragon-redis 127.0.0.1 6380
21401:X 29 Nov 16:41:02.028 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ itdragon-redis 127.0.0.1 6380
......

# 6379端口
127.0.0.1:6379> SHUTDOWN
not connected> QUIT

# 6380端口
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=72590,lag=0
......

# 6381端口
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
......

+slave :一個新的從服務器已經被 Sentinel 識別並關聯。
+sdown :給定的實例如今處於主觀下線狀態。
-sdown :給定的實例已經再也不處於主觀下線狀態。
更多內容能夠訪問官網:https://redis.io/topics/sentinel

主從複製的原理

全量複製
實現原理:創建主從關係時,從機會給主機發送sync命令,主機接收命令,後臺啓動的存盤進程,同時收集全部用於修改命令,傳送給從機。
增量複製
實現原理:主機會繼續將新收集到的修改命令依次傳給從機,實現數據的同步效果。

主從複製的缺點

Redis的主從複製最大的缺點就是延遲,主機負責寫,從機負責備份,這個過程有必定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,從機器數量的增長也會使這個問題更加嚴重。

總結

1 查看主從複製關係命令:info replication
2 設置主從關係命令:slaveof 主機ip 主機port
3 開啓哨兵模式命令:./redis-sentinel sentinel.conf
4 主從複製原則:開始是全量賦值,以後是增量賦值
5 哨兵模式三大任務:監控,提醒,自動故障遷移

Redis 的主從複製到這裏就結束了,有什麼不對的地方歡迎指正。下一章Redis 的集羣搭建和整合Spring

相關文章
相關標籤/搜索