redis sentinel集群配置及haproxy配置


ip分布情況:

sentinel-1/redis 主 10.11.11.5
sentinel-2/redis 從 10.11.11.7
sentinel-3/redis 從 10.11.11.8
haproxy 10.11.11.10

 

軟件版本:

redis-2.8.20-3.el6.art.x86_64.rpm

haproxy-1.5.4-3.el6.x86_64

 

開始配置:

一 、redis配置

1.1 redis 主配置: /etc/redis.conf,詳細參考http://yijiebuyi.com/blog/bc2b3d3e010bf87ba55267f95ab3aa71.html

daemonize yes  #Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程
pidfile "/var/run/redis/redis.pid" #當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定
port 6379  #指定Redis監聽端口,默認端口為6379
tcp-backlog 511 # TCP接收隊列長度,受/proc/sys/net/core/somaxconn和tcp_max_syn_backlog這兩個內核參數的影響
bind 10.11.11.5 #綁定的主機地址
timeout 0 #當 客戶端閑置多長時間后關閉連接,如果指定為0,表示關閉該功能
tcp-keepalive 0 # 如果非零,則設置SO_KEEPALIVE選項來向空閑連接的客戶端發送ACK
loglevel notice
## debug (大量信息,對開發/測試有用)
## verbose (很多精簡的有用信息,但是不像debug等級那么多)
## notice (適量的信息,基本上是你生產環境中需要的)
## warning (只有很重要/嚴重的信息會記錄下來

logfile "/var/log/redis/redis.log" #日志名
databases 16 #設置數據庫的數量,可以使用SELECT <dbid>命令在連接上指定數據庫id
save 900 1
save 300 10
save 60 10000
#指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合save <seconds> <changes>
#分別表示900秒(15分鍾)內有1個更改,300秒(5分鍾)內有10個更改以及60秒內有10000個更改。


stop-writes-on-bgsave-error yes
# 默認如果開啟RDB快照(至少一條save指令)並且最新的后台保存失敗,Redis將會停止接受寫操作
# 這將使用戶知道數據沒有正確的持久化到硬盤,否則可能沒人注意到並且造成一些災難


rdbcompression yes #指定存儲至本地數據庫時是否壓縮數據,默認為yes,Redis采用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致數據庫文件變的巨大
rdbchecksum yes
dbfilename "dump.rdb"  #指定本地數據庫文件名,默認值為dump.rdb
dir "/var/lib/redis"  #指定本地數據庫存放目錄
slave-serve-stale-data yes# 當從庫同主機失去連接或者復制正在進行,從機庫有兩種運行方式:
#
# 1) 如果slave-serve-stale-data設置為yes(默認設置),從庫會繼續相應客戶端的請求
# 
# 2) 如果slave-serve-stale-data是指為no,出去INFO和SLAVOF命令之外的任何請求都會返回一個
#    錯誤"SYNC with master in progress"


slave-read-only yes
##你可以配置salve實例是否接受寫操作。可寫的slave實例可能對存儲臨時數據比較有用(因為寫入salve
##的數據在同master同步之后將很容易被刪除


repl-disable-tcp-nodelay no # 從庫會按照一個時間間隔向主庫發送PINGs.可以通過repl-ping-slave-period設置這個時間間隔,默認是10秒

slave-priority 100
# slave的優先級是一個整數展示在Redis的Info輸出中。如果master不再正常工作了,哨兵將用它來
# 選擇一個slave提升=升為master。
# 優先級數字小的salve會優先考慮提升為master,所以例如有三個slave優先級分別為10,100,25,
# 哨兵將挑選優先級最小數字為10的slave。
# 0作為一個特殊的優先級,標識這個slave不能作為master,所以一個優先級為0的slave永遠不會被
# 哨兵挑選提升為master



appendonly no# 默認情況下,redis會在后台異步的把數據庫鏡像備份到磁盤,但是該備份是非常耗時的,而且備份也不能很頻繁,如果發生諸如拉閘限電、拔插頭等狀況,那么將造成比較大范圍的數據丟失。
# 所以redis提供了另外一種更加高效的數據庫備份及災難恢復方式。
# 開啟append only模式之后,redis會把所接收到的每一次寫操作請求都追加到appendonly.aof文件中,當redis重新啟動時,會從該文件恢復出之前的狀態。
# 但是這樣會造成appendonly.aof文件過大,所以redis還支持了BGREWRITEAOF指令,對appendonly.aof 進行重新整理。
# 你可以同時開啟asynchronous dumps 和 AOF
appendfilename "appendonly.aof" # AOF文件名稱 (默認: "appendonly.aof")
appendfsync everysec
# Redis支持三種同步AOF文件的策略:
#
# no: 不進行同步,系統去操作 . Faster.
# always: always表示每次有寫操作都進行同步. Slow, Safest.
# everysec: 表示對寫操作進行累積,每秒同步一次. Compromise.
#
# 默認是"everysec",按照速度和安全折中這是最好的。
# 如果想讓Redis能更高效的運行,你也可以設置為"no",讓操作系統決定什么時候去執行
# 或者相反想讓數據更安全你也可以設置為"always"
#
# 如果不確定就用 "everysec".
 
# appendfsync always


no-appendfsync-on-rewrite no
# AOF策略設置為always或者everysec時,后台處理進程(后台保存或者AOF日志重寫)會執行大量的I/O操作
# 在某些Linux配置中會阻止過長的fsync()請求。注意現在沒有任何修復,即使fsync在另外一個線程進行處理
#
# 為了減緩這個問題,可以設置下面這個參數no-appendfsync-on-rewrite

auto-aof-rewrite-percentage 100  #自動重寫AOF文件
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000 # Lua 腳本的最大執行時間,毫秒為單位
slowlog-log-slower-than 10000   # Redis慢查詢日志可以記錄超過指定時間的查詢
slowlog-max-len 128 # 這個長度沒有限制。只是要主要會消耗內存。你可以通過 SLOWLOG RESET 來回收內存。


hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# 當hash只有少量的entry時,並且最大的entry所占空間沒有超過指定的限制時,會用一種節省內存的
# 數據結構來編碼。可以通過下面的指令來設定限制

list-max-ziplist-entries 512
list-max-ziplist-value 64
# 與hash似,數據元素較少的list,可以用另一種方式來編碼從而節省大量空間。
# 這種特殊的方式只有在符合下面限制時才??以用

set-max-intset-entries 512
# set有一種特殊編碼的情況:當set數據全是十進制64位有符號整型數字構成的字符串時。
# 下面這個配置項就是用來設置set使用這種編碼來節省內存的最大長度。

zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# 與hash和list相似,有序集合也可以用一種特別的編碼方式來節省大量空間。
# 這種編碼只適合長度和元素都小於下面限制的有序集合

hll-sparse-max-bytes 3000
# HyperLogLog稀疏結構表示字節的限制。該限制包括
# 16個字節的頭。當HyperLogLog使用稀疏結構表示
# 這些限制,它會被轉換成密度表示。
# 值大於16000是完全沒用的,因為在該點
# 密集的表示是更多的內存效率。
# 建議值是3000左右,以便具有的內存好處, 減少內存的消耗

activerehashing yes # 啟用哈希刷新,每100個CPU毫秒會拿出1個毫秒來刷新Redis的主哈希表(頂級鍵值映射表)

hz 10
# 默認情況下,“hz”的被設定為10。提高該值將在Redis空閑時使用更多的CPU時,但同時當有多個key
# 同時到期會使Redis的反應更靈敏,以及超時可以更精確地處理



aof-rewrite-incremental-fsync yes  # 當一個子進程重寫AOF文件時,如果啟用下面的選項,則文件每生成32M數據會被同步
unixsocket "/var/run/redis/redis.sock"
unixsocketperm 755
maxclients 4064

1.2 redis 從服務器配置

scp 主節點上的/etc/redis.conf配置到從節點的/etc下,然后增加如下配置:

slaveof 10.11.11.5 6379
# 主從復制. 設置該數據庫為其他數據庫的從數據庫. 
# 設置當本機為slav服務時,設置master服務的IP地址及端口,在Redis啟動時,它會自動從master進行數據同步
#
# slaveof <masterip> <masterport>
 
 
 
 1.3 啟動redis 主從上的服務,查看主從狀態
redis-cli -h 10.11.11.5 info Replication,可以看到主從狀態,此時redis主從己配置完成
image
 
 

二、redis sentinel配置

sentinel介紹請參考:https://segmentfault.com/a/1190000002680804

安裝部署:

編輯sentinel配置文件 ,主要如下

grep -Ev '^#|^$'  /etc/sentinel.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2 #配置master名、ip、port、需要多少個sentinel才能判斷[客觀下線](2)
sentinel down-after-milliseconds mymaster 30000 #配置sentinel向master發出ping,最大響應時間、超過則認為主觀下線
sentinel parallel-syncs mymaster 1 #配置在進行故障轉移時,運行多少個slave進行數據備份同步(越少速度越快)
sentinel failover-timeout mymaster 180000  #配置當出現failover時下一個sentinel與上一個sentinel對[同一個master監測的時間間

 

sentinel-1 sentinel-2 sentinel-3節點上的配置文件一樣

啟動sentinel,sentinel啟動后中,sentinel.conf和redis.conf都由sentinel來控制,主從切換時會寫入相關配置(redis.conf配置文件從節點會添加slaveof  master ip   port,主節點去掉slavvof項),啟動后,sentinel.conf配置文件變化:

image

redis-server   /etc/sentinel.conf  --sentinel >> /var/log/redis/sentinel.log &

可通過/var/log/redis/sentinel.log日志看到一些相關信息

Sentinel服務啟動后會打印一些相關日志信息,以下是相關日志特殊字符說明:

+reset-master <instance details> :主服務器已被重置。

+slave <instance details> :一個新的從服務器已經被 Sentinel 識別並關聯。

+failover-state-reconf-slaves <instancedetails> :故障轉移狀態切換到了reconf-slaves 狀態。

+failover-detected <instance details>:另一個 Sentinel 開始了一次故障轉移操作,或者一個從服務器轉換成了主服務器。

+slave-reconf-sent <instance details>:領頭(leader)的 Sentinel 向實例發送了 SLAVEOF 命令,為實例設置新的主服務器。

+slave-reconf-inprog <instancedetails> :實例正在將自己設置為指定主服務器的從服務器,但相應的同步過程仍未完成。

+slave-reconf-done <instance details>:從服務器已經成功完成對新主服務器的同步。

-dup-sentinel <instance details> :對給定主服務器進行監視的一個或多個 Sentinel 已經因為重復出現而被移除 —— 當 Sentinel 實例重啟的時候,就會出現這種情況。

+sentinel <instance details> :一個監視給定主服務器的新 Sentinel 已經被識別並添加。

+sdown <instance details> :給定的實例現在處於主觀下線狀態。

-sdown <instance details> :給定的實例已經不再處於主觀下線狀態。

+odown <instance details> :給定的實例現在處於客觀下線狀態。

-odown <instance details> :給定的實例已經不再處於客觀下線狀態。

+new-epoch <instance details> :當前的紀元(epoch)已經被更新。

+try-failover <instance details> :一個新的故障遷移操作正在執行中,等待被大多數 Sentinel 選中(waiting to be elected by themajority)。

+elected-leader <instance details> :贏得指定紀元的選舉,可以進行故障遷移操作了。

+failover-state-select-slave <instancedetails> :故障轉移操作現在處於select-slave 狀態 —— Sentinel 正在尋找可以升級為主服務器的從服務器。

no-good-slave <instance details> :Sentinel 操作未能找到適合進行升級的從服務器。Sentinel 會在一段時間之后再次嘗試尋找合適的從服務器來進行升級,又或者直接放棄執行故障轉移操作。

selected-slave <instance details> :Sentinel 順利找到適合進行升級的從服務器。

failover-state-send-slaveof-noone<instance details> :Sentinel 正在將指定的從服務器升級為主服務器,等待升級功能完成。

failover-end-for-timeout <instancedetails> :故障轉移因為超時而中止,不過最終所有從服務器都會開始復制新的主服務器(slaves will eventually be configured to replicate with the newmaster anyway)。

failover-end <instance details> :故障轉移操作順利完成。所有從服務器都開始復制新的主服務器了。

+switch-master <master name><oldip> <oldport> <newip> <newport> :配置變更,主服務器的 IP 和地址已經改變。 這是絕大多數外部用戶都關心的信息。

+tilt :進入 tilt 模式。

-tilt :退出 tilt 模式。

 

測試驗證

可以對master-slave進行測試,將master關閉,此時slave會自動充當新的new-master;

當old-master恢復后,會充當new-master的slave,即:在這個過程中,sentinel.conf會被改寫,改寫為當前監控的主機master服務;

如下圖測試所示:

Master服務停止:redis-cli -h 10.11.11.5 info Replication  查看10.11.11.7 為master

image

 

如圖:master己切換到10.11.11.5

 

三、haproxy 配置,提供負載均衡功能和vip

haproxy 節點:10.11.11.10

vim  /etc/haproxy/haproxy.cfg

global
  daemon
  group  haproxy
  log  /dev/log local0
  maxconn  16000
  pidfile  /var/run/haproxy.pid
  stats  socket /var/lib/haproxy/stats
  tune.bufsize  32768
  user  haproxy

defaults
  log  global
  maxconn  8000
  mode  http
  option  redispatch
  retries  3
  stats  enable
  timeout  http-request 10s
  timeout  queue 1m
  timeout  connect 10s
  timeout  client 1m
  timeout  server 1m
  timeout  check 10s

listen stats *:10000
  mode http
  stats enable
  stats uri /
  stats refresh 5s
  stats show-node
  stats show-legends
  stats hide-version



listen awredis
  bind 10.11.11.10:6379
  balance  leastconn
  mode  tcp
  option tcp-check #redis 健康檢查,確保只有master提供連接
  tcp-check connect   
  tcp-check send PING\r\n
  tcp-check expect string +PONG
  tcp-check send info\ replication\r\n
  tcp-check expect string role:master
  tcp-check send QUIT\r\n
  tcp-check expect string +OK
  server redis01 10.11.11.5:6379   check port 6379 inter 5s fastinter 2s downinter 5s rise 3 fall 3
  server redis02 10.11.11.7:6379   check port 6379 inter 5s fastinter 2s downinter 5s rise 3 fall 3
  server redis03 10.11.11.8:6379   check port 6379 inter 5s fastinter 2s downinter 5s rise 3 fall 3

啟動haproxy 服務,可以通過10.11.11.10:10000端口看haproxy的狀態

image

 

如圖:只有master 是up狀態


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM