本章介紹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)
第一步:查詢主從複製信息,分別選擇三個端口,執行命令: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依舊是從機。一臺主機配多臺從機,一臺從機在配多臺從機,從而實現了龐大的集羣架構。同時也減輕了一臺主機的壓力,缺點是增長了服務器間的延遲。
模擬主機宕機,人爲手動慫恿從機上位的場景。先將三個端口恢復成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"
從機上位是須要人爲控制,在生產環境中是不可取的,不可能有人實時盯着它,也不可能大半夜起牀從新搭建主從關係。在這樣的需求促使下,哨兵模式來了!!!
哨兵有三大任務:
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