您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關redis主從復制的搭建步驟,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
主從復制的原理
在Redis集群中,讓若干個Redis服務器去復制另一個Redis服務器,我們定義被復制的服務器為主服務器(master),而對主服務器進行復制的服務器則被稱為從服務器(slave),這種模式叫做主從復制模式。
來源:簡書主從復制的作用主從復制,讀寫分離,容災恢復。一臺主機負責寫入數據,多臺從機負責備份數據。在高并發的場景下,即便是主機掛了,可以用從機代替主機繼續工作,避免單點故障導致系統性能問題。讀寫分離,讓讀多寫少的應用性能更佳。
主從復制架構
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.
確實是簡單的,一個命令: slaveof 主機ip 主機port ,就可以確定主從關系;一個命令:./redis-sentinel sentinel.conf ,就可以開啟哨兵監控。
搭建是簡單的,維護是痛苦的。在高并發場景下,會有很多想不到的問題出現。我們只有清楚復制的原理,熟悉主機,從機宕機后的變化。才能很好的跨過這些坑。下面的每一個步驟都是一個小的知識點,小的場景。每做完一個步驟,你都會收獲到知識。
架構圖:一主二仆一兵(也可以多主多仆多兵)
主從復制的缺點
Redis的主從復制最大的缺點就是延遲,主機負責寫,從機負責備份,這個過程有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,從機器數量的增加也會使這個問題更加嚴重。
搭建前的準備工作
因為窮,筆者選擇用一臺服務器模擬三臺主機。和生產環境的區別僅僅是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 :給定的實例已經不再處于主觀下線狀態。
總結
1 查看主從復制關系命令:info replication
2 設置主從關系命令:slaveof 主機ip 主機port
3 開啟哨兵模式命令:./redis-sentinel sentinel.conf
4 主從復制原則:開始是全量賦值,之后是增量賦值
5 哨兵模式三大任務:監控,提醒,自動故障遷移
關于redis主從復制的搭建步驟就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。