天天看點

Redis主從哨兵叢集搭建

  

  redis作為一個高性能記憶體資料庫,常作為系統的緩存資料庫來使用。然而在生産環境中,服務的穩定性非常重要,這篇博文則主要記錄介紹使用redis主從哨兵叢集來實作redis服務的高可用。

當然為了解決redis的高可用和伸縮性,redis有很多叢集方法,非官方的常見的有codis,Redis Sharding,及多種第三方中間件來實作。但是随着redis官方的叢集越來越穩定和官方持續的維護和支援,redis官方叢集成為不錯的選擇,兩種方案分别如下:

  1. redis主從哨兵方案
  2. redis cluster 分布式叢集方案

主從哨兵叢集架構圖:

Redis主從哨兵叢集搭建

此圖為最常見的一主兩從結構,一個master主機,兩個slave主機。每台主機上都運作着兩個程序:

  1. redis-server 服務,處理redis正常的資料操作與響應。master服務可讀寫,slave服務為隻讀,當master服務接受到資料修改或寫入的指令時,會異步将指令發送到slave上,以此保持master與slave上資料的一緻性。
  2. redis-sentinel 哨兵服務,此服務會監控master和slave服務是否正常運作,當超過半數的哨兵認定master服務挂掉時,會進行選舉,将slave服務選舉設定為master服務,并恢複叢集通路,當舊master節點恢複正常後,可以作為新的slave節點重新加入叢集。

主從哨兵叢集的優缺點:

  • 優點:實作了資料備份,讀負載均衡,自動化故障恢複,高可用。
  • 缺點:沒有伸縮性,資料存儲的限制受到單機記憶體大小的限制,沒發通過增加主機來增加存儲空間。

是以,此主從哨兵叢集在中小系統中廣受使用,因為其簡單好用的特性,在資料量不大的情況下,可以很好的提供服務,但是随着網際網路企業的不斷發展,資料量越來越大,單機存儲已經無法滿足需求,于是redis官方至3.0版本後推出了新一代的叢集方案,redis cluster分布式叢集,此叢集則在高可用的基礎上,解決了伸縮性的問題。

開始搭建

1. 環境準備

由于哨兵的高可用和確定不是因為哨兵故障導緻的master狀态誤判,是以叢集的數量為單數最好,最低叢集配置則為1主兩從,3哨兵。

即需要3台伺服器,每台伺服器上運作一個redis-server,一個redis-sentinel

環境如下:

  • master: ip: 192.168.0.1 os: centos7 redis:5.0.5
  • slave: ip: 192.168.0.2 os: centos7 redis:5.0.5
  • slave: ip: 192.168.0.3 os: centos7 redis:5.0.5

2. 設定主從服務

  1)在master上操作

# 修改redis配置檔案,修改下面的列出的選項
$ vim /etc/redis/6379.conf
--------------------------------------------------------------------
# 允許任意使用者連接配接
bind 0.0.0.0
# 關閉保護模式
protected-mode no 
# 開啟守護程序
daemonize yes
# 如果是作為緩存伺服器,需要注釋掉三個資料持久化的選項
# save 900 1
# save 300 10
# save 60 10000
# 設定redis密碼,如果要設定密碼,則主從的密碼要統一一緻,這樣在故障時切換master才能正常連接配接,如果不設密碼則都不設密碼
requirepass 123456
# 設定最大記憶體限制,避免記憶體過大造成伺服器當機
maxmemory 2gb
--------------------------------------------------------------------

# 啟動服務
$ systemctl restart redis_6379
# 開啟防火牆上6379端口
$ firewall-cmd --add-port=6379/tcp --permanent
$ firewall-cmd --reload      

  2)在兩個salve主機上操作

# 修改redis配置檔案,修改下面的列出的選項
$ vim /etc/redis/6379.conf
--------------------------------------------------------------------
# 上面master上修改的配置項,這裡要做一樣的修改。就不重複寫了
# 在master的基礎上,額外需要修改如下配置
# 指定matser機的IP和端口
slaveof 192.168.0.1 6379
# master上redis的密碼,如果沒有設定密碼則不需要配置
masterauth 123456
--------------------------------------------------------------------

# 啟動服務
$ systemctl restart redis_6379
# 開啟防火牆上6379端口
$ firewall-cmd --add-port=6379/tcp --permanent
$ firewall-cmd --reload      

上面已經依次修改mster和slave的配置并啟動服務,現在來驗證主從是否已經正常運作。

# 在master主機上,使用redis-cli登入redis,檢視info資訊
$ redis-cli -a 123456
127.0.0.1:6379> info
# 檢視最下面 # Replication 内容
# 出現以下内容則證明主從配置已經正常運作
role:master
connected_slaves:2
slave0:ip=192.168.0.2,port=6379,state=online,offset=874800532,lag=1
slave1:ip=192.168.0.3,port=6379,state=online,offset=874800532,lag=1

# 可以簡單測試以下,資料複制是否正常
# 在master上,建立一個key為a,值為1
127.0.0.1:6379> select 0
127.0.0.1:6379> set a 1


# 在任意slave主機上,登入redis,檢視上面設定的a的key是否存在
$ redis-cli -a 123456
127.0.0.01:6379> select 0
127.0.0.01:6379> get a
"1"
# 如上,發現已經存在了鍵值為1的a的key,證明主從複制功能正常運作。      

3. 設定哨兵服務

哨兵服務與redis-server服務是兩個獨立的程序,共同運作在每個redis主機上,下面依次在master和slave上設定與運作哨兵服務:

在master和slave上都執行以下操作

# redis通過源碼安裝後,在redis目錄中,會有一個sentinel.conf的哨兵配置檔案
# 修改下面列出的配置項,{your-redis-dir}換為你redis的檔案目錄
$ vim {your-redis-dir}/sentinel.conf
--------------------------------------------------------------------
# 設為背景啟動
daemonize yes
# 設定log檔案路徑,友善出故障時進行排查
logfile "/var/log/redis/sentinel.log"
# 關閉保護模式
protected-mode no

# 設定監控master主機,隻需要配置上master的ip和端口
# 後面的2,表示有兩台或以上哨兵認定master挂掉了,則認為master挂掉,進行選舉切換master
sentinel monitor mymaster 192.168.0.1 6379 2
# 指定master和slave的統一密碼
sentinel auth-pass mymaster 123456
--------------------------------------------------------------------


# 指定配置檔案,啟動哨兵服務,{your-redis-dir}換為你redis的檔案目錄
$ redis-sentinel {your-redis-dir}/sentinel.conf
# 啟動後預設監聽26379端口
# 開啟防火牆上26379端口的通路
$ firewall-cmd --add-port=26379/tcp --permanent
$ firewall-cmd --reload      
# 任意在master或slave主機上,指定端口,登入redis的哨兵服務
$ redis-cli -p 26379
127.0.0.1:26379> info sentinel
# 檢視哨兵資訊,最下一行出現master的資訊和slave和sentinel的數量資訊
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.0.1:6379,slaves=2,sentinels=3

# ok,出現上面的資訊,則證明哨兵服務已經正常運作      

繼續閱讀