redis作為一個高性能內存數據庫,常作為系統的緩存數據庫來使用。然而在生產環境中,服務的穩定性非常重要,這篇博文則主要記錄介紹使用redis主從哨兵集群來實現redis服務的高可用。
當然為了解決redis的高可用和伸縮性,redis有很多集群方法,非官方的常見的有codis,Redis Sharding,及多種第三方中間件來實現。但是隨着redis官方的集群越來越穩定和官方持續的維護和支持,redis官方集群成為不錯的選擇,兩種方案分別如下:
- redis主從哨兵方案
- redis cluster 分布式集群方案
主從哨兵集群架構圖:
此圖為最常見的一主兩從結構,一個master主機,兩個slave主機。每台主機上都運行着兩個進程:
- redis-server 服務,處理redis正常的數據操作與響應。master服務可讀寫,slave服務為只讀,當master服務接受到數據修改或寫入的命令時,會異步將命令發送到slave上,以此保持master與slave上數據的一致性。
- 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
到此哨兵服務在3太服務器上都啟動后。我們來驗證以下服務是否正常運行:
# 任意在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,出現上面的信息,則證明哨兵服務已經正常運行