使用者.組和許可權
Redis主從複製
簡介
主從複製,是指將一臺Redis伺服器的資料,複製到其他的Redis伺服器,前者稱為主節點(master),後者成為從節點(slave),資料的複製是單向的,只能由主節點到從節點,Master以寫為主,Slave以讀為主
主從複製作用
- 資料冗餘:主從複製實現了資料的熱備份,是持久化以外的一種資料冗餘方式
- 故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復
- 負載均衡:在主從複製達到基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務,分擔伺服器負載,尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提示Redis服務的併發
- 高可用基石:主從複製還是哨兵和叢集的基礎,因此說主從複製是Redis高可用的基礎
一般來說,要將Redis運用於專案中,只使用一臺Redis是會出現如下問題
- 單Redis伺服器會發生單點故障,並且一臺伺服器需要處理所有的請求負載壓力較大
- 單Redis伺服器記憶體容量有限,就算一臺Redis伺服器記憶體256G,也不能所有記憶體用作Redis記憶體一般來說,單Redis最大使用記憶體不超過20G
- 因為80%情況下都是進行讀操作,主從複製讀寫分離可以大大減輕伺服器的壓力,一般情況下都是一主二從
環境配置
只配置從庫,不用配置主庫(Redis每一個服務預設是主庫)
使用info replication 檢視當前Redis資訊
拷貝多份conf檔案
cp redis.conf redis6379.conf
使用cp拷貝多份conf檔案 6401於6402是從機
編輯主機配置檔案
#埠6379 主機配置檔案
vim redis6379.conf
#修改log檔案輸出名稱和rdb檔案輸出名稱,不改會衝突
logfile "6379.log"
dbfilename dump6379.rdb
編輯從機配置檔案
#埠6401 從機配置檔案 vim redis6401.conf #修改埠6401 port 6401 #pidfile修改成於埠對應 pidfile /var/run/redis_6401.pid #修改log檔案輸出名稱和rdb檔案輸出名稱 logfile "6401.log" dbfilename dump6401.rdb #埠6402 從機配置檔案 vim redis6402.conf #修改埠6402 port 6402 #pidfile修改成於埠對應 pidfile /var/run/redis_6402.pid #修改log檔案輸出名稱和rdb檔案輸出名稱 logfile "6402.log" dbfilename dump6402.rdb
啟動3個Redis服務
./bin/redis-server redis6379.conf
./bin/redis-server redis6401.conf
./bin/redis-server redis6402.conf
配置成一主二從
我們可以看到預設情況下3臺Redis都是主機
使用SLAVEOF 127.0.0.1 6379
配置2臺從機器指定127.0.0.1:6379為主機
當然通過命令列的方式來配置主機,只是臨時配置,如果要從Redis啟動時就配置好需連線的主機,就需要修改配置檔案,的主從配置中的replicaof即可
我們在主機中set一個值,然後這值會被複制到從機中
如果我們嘗試在從機中寫入會報錯
主從複製原理
Slave啟動成功連線到Master後會傳送一個sync同步命令
Master接收到命令,啟動後臺的存檔程序,同時收集所有接收到用於修改資料集命令,在後臺程序執行完畢之後整個資料檔案到slave,並完成一次完全同步
全量複製:而slave服務在接收到資料檔案資料後,將其存檔並載入到記憶體中
增量複製:Master繼續將新的所有收集的修改命令依次傳給slave,完成同步
只要重新連線master,一次完成同步(全量複製)將被自動執行
宕機手動設定主機
入主機在生產環境中突然宕機,我們檢視2太從機的配置,我們會發現2臺從機沒有任何變化,還是連線的主機,問題是現在主機宕機了從機又不能執行寫入命令,那麼如何解決呢
手動執行
SLAVEOF no one
命令就可以將來我們的一臺從機,切換為master主機存在問題:如果master連線上了,那從機也不會變回去了,又需要手動把從機器配置上
哨兵模式
哨兵作用
- 通過傳送命令,讓Redis伺服器返回監控其執行狀態,包括主伺服器和從伺服器
- 當哨兵基礎到master宕機,會自動將slave切換成master,然後通過釋出訂閱模式通知其他從伺服器,修改配置檔案讓它們切換主機
單哨兵
主從切換技術方法是:當主伺服器宕機後,需要手動把一臺從伺服器切換為主伺服器,這需要人工干預,還會造成一段時間內服務不可用,Redis從2.8開始正式提供了Sentinel(哨兵模式)來解決這個問題
主從切換自動版,Redis提供一個哨兵的命令,哨兵是一個獨立的程序,獨立執行的,哨兵會通過傳送命令,等待Redis伺服器響應,從而介面執行中的多個Redis例項,如果主機宕機了,會根據投票票數最多的從機,將其自動切換為主機
多哨兵
單哨兵存在一個問題,如果最高哨兵死了呢,那麼就沒人進行監控了,所以在生產機中通常會存在多個哨兵同時監控Redis,並且多個哨兵也相互監控
假設主伺服器宕機,哨兵1先檢測到這個結果,系統並且不會馬上進行failover過程,僅僅是哨兵1主觀認為主伺服器不可用,這現象稱為主觀下線,當其它哨兵也檢測到主服務不可用,並且數量達到一定值,那麼這些哨兵之間就會進行一次投票,投票的由一個哨兵發起,進行failover(故障轉移)操作,切換成功後,就會通過釋出訂閱模式,讓各哨兵把自己監控的從伺服器實現切換主機客觀下線
部署多哨兵模式
#配置哨兵配置檔案,檔名不要錯,否則配置失敗
vim sentinel.conf
#sentinel monitor [被監控的名稱] [host] [port] [1]
sentinel monitor myredis 127.0.0.1 6379 1
#啟動哨兵
./bin/redis-sentinel sentinel.conf
模擬宕機
將來主機宕機,觀察哨兵的日誌,以及2臺從機的資訊
那如果主機回來了會怎麼樣呢
主機回來只能歸併到新的主機下,當從機
優缺點
優點:
- 哨兵叢集,基於主從複製模式,所有主從配置優點,它都有
- 主從可以切換,故障可以轉移,系統可用性就會更好
- 哨兵模式是主從模式的升級,手動到自動,更加健壯
缺點:
- Redis不好啊線上擴容,叢集容量一旦達到上限,線上擴容十分麻煩
- 實現哨兵模式的配置其實是很麻煩的,裡面有很多選擇
哨兵模式的配置檔案
# Example sentinel.conf
# 哨兵sentinel例項執行的埠 預設26379
port 26379
# 哨兵sentinel的工作目錄
dir /tmp
# 哨兵sentinel監控的redis主節點的 ip port
# master-name 可以自己命名的主節點名字 只能由字母A-z、數字0-9 、這三個字元".-_"組成。
# quorum 當這些quorum個數sentinel哨兵認為master主節點失聯 那麼這時 客觀上認為主節點失聯了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
# 當在Redis例項中開啟了requirepass foobared 授權密碼 這樣所有連線Redis例項的客戶端都要提供密碼
# 設定哨兵sentinel 連線主從的密碼 注意必須為主從設定一樣的驗證密碼
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# 指定多少毫秒之後 主節點沒有應答哨兵sentinel 此時 哨兵主觀上認為主節點下線 預設30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
# 這個配置項指定了在發生failover主備切換時最多可以有多少個slave同時對新的master進行 同步,
這個數字越小,完成failover所需的時間就越長,
但是如果這個數字越大,就意味著越 多的slave因為replication而不可用。
可以通過將這個值設為 1 來保證每次只有一個slave 處於不能處理命令請求的狀態。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
# 故障轉移的超時時間 failover-timeout 可以用在以下這些方面:
#1. 同一個sentinel對同一個master兩次failover之間的間隔時間。
#2. 當一個slave從一個錯誤的master那裡同步資料開始計算時間。直到slave被糾正為向正確的master那裡同步資料時。
#3.當想要取消一個正在進行的failover所需要的時間。
#4.當進行failover時,配置所有slaves指向新的master所需的最大時間。不過,即使過了這個超時,slaves依然會被正確配置為指向master,但是就不按parallel-syncs所配置的規則來了
# 預設三分鐘
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
# SCRIPTS EXECUTION
#配置當某一事件發生時所需要執行的指令碼,可以通過指令碼來通知管理員,例如當系統執行不正常時發郵件通知相關人員。
#對於指令碼的執行結果有以下規則:
#若指令碼執行後返回1,那麼該指令碼稍後將會被再次執行,重複次數目前預設為10
#若指令碼執行後返回2,或者比2更高的一個返回值,指令碼將不會重複執行。
#如果指令碼在執行過程中由於收到系統中斷訊號被終止了,則同返回值為1時的行為相同。
#一個指令碼的最大執行時間為60s,如果超過這個時間,指令碼將會被一個SIGKILL訊號終止,之後重新執行。
#通知型指令碼:當sentinel有任何警告級別的事件發生時(比如說redis例項的主觀失效和客觀失效等等),將會去呼叫這個指令碼,
這時這個指令碼應該通過郵件,SMS等方式去通知系統管理員關於系統不正常執行的資訊。呼叫該指令碼時,將傳給指令碼兩個引數,
一個是事件的型別,
一個是事件的描述。
如果sentinel.conf配置檔案中配置了這個指令碼路徑,那麼必須保證這個指令碼存在於這個路徑,並且是可執行的,否則sentinel無法正常啟動成功。
#通知指令碼
# sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/notify.sh
# 客戶端重新配置主節點引數指令碼
# 當一個master由於failover而發生改變時,這個指令碼將會被呼叫,通知相關的客戶端關於master地址已經發生改變的資訊。
# 以下引數將會在呼叫指令碼時傳給指令碼:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>總是“failover”,
# <role>是“leader”或者“observer”中的一個。
# 引數 from-ip, from-port, to-ip, to-port是用來和舊的master和新的master(即舊的slave)通訊的
# 這個指令碼應該是通用的,能被多次呼叫,不是針對性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh