1. 程式人生 > 實用技巧 >使用者.組和許可權

使用者.組和許可權

Redis主從複製

簡介

主從複製,是指將一臺Redis伺服器的資料,複製到其他的Redis伺服器,前者稱為主節點(master),後者成為從節點(slave),資料的複製是單向的,只能由主節點到從節點,Master以寫為主,Slave以讀為主

主從複製作用

  1. 資料冗餘:主從複製實現了資料的熱備份,是持久化以外的一種資料冗餘方式
  2. 故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復
  3. 負載均衡:在主從複製達到基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務,分擔伺服器負載,尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提示Redis服務的併發
  4. 高可用基石:主從複製還是哨兵和叢集的基礎,因此說主從複製是Redis高可用的基礎

在這裡插入圖片描述

一般來說,要將Redis運用於專案中,只使用一臺Redis是會出現如下問題

  1. 單Redis伺服器會發生單點故障,並且一臺伺服器需要處理所有的請求負載壓力較大
  2. 單Redis伺服器記憶體容量有限,就算一臺Redis伺服器記憶體256G,也不能所有記憶體用作Redis記憶體一般來說,單Redis最大使用記憶體不超過20G
  3. 因為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臺從機的資訊

在這裡插入圖片描述

那如果主機回來了會怎麼樣呢

主機回來只能歸併到新的主機下,當從機

在這裡插入圖片描述

優缺點

優點

  1. 哨兵叢集,基於主從複製模式,所有主從配置優點,它都有
  2. 主從可以切換,故障可以轉移,系統可用性就會更好
  3. 哨兵模式是主從模式的升級,手動到自動,更加健壯

缺點

  1. Redis不好啊線上擴容,叢集容量一旦達到上限,線上擴容十分麻煩
  2. 實現哨兵模式的配置其實是很麻煩的,裡面有很多選擇

哨兵模式的配置檔案

# 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