1. 程式人生 > >Redis|Sentinel 高可用架構

Redis|Sentinel 高可用架構

一 前言

Redis-Sentinel是Redis官方推薦的高可用性(HA)解決方案,當用Redis做Master-slave的高可用方案時,假如master宕機了,Redis本身(包括它的很多客戶端)都沒有實現自動進行主備切換,而Redis-sentinel本身也是一個獨立執行的程序,它能監控多個master-slave叢集,發現master宕機後能進行自懂切換。它的主要功能有:
1 不時地監控redis是否按照預期良好地執行;
2 如果發現某個redis節點執行出現狀況,能夠通知另外一個程序(例如它的客戶端);
3 能夠進行自動切換。當一個master節點不可用時,能夠選舉出master的多個slave(如果有超過一個slave的話)中的一個來作為新的master,其它的slave節點會將它所追隨的master的地址改為被提升為master的slave的新地址。

二 實踐

本文介紹搭建主從複製以及三節點的sentinel 構建redis的高可用系統。其中 redis 一套主從 ,sentinel 三個節點 因為機器資源限制 ,兩個sentinel 節點和 redis複用。

2.1 環境準備

Redis版本:Redis-3.2.8
OS 版本 CentOS 6
redis、sentinel 
10.9.34.172 reids master
10.9.43.207 reids slave
sentinel 
10.9.34.252 sentinel

2.2 軟體安裝

wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar zxvf redis-3.2.8.tar.gz
mv redis-3.2.8 /usr/local/redis
cd /usr/local/redis
make PREFIX=/usr/local/redis install
cd src && make test

建立軟連線

ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/redis-cli ; 
ln -s /usr/local/redis/bin/redis-sentinel /usr/local/bin/redis-sentinel ;
ln -s /usr/local/redis/bin/redis-server /usr/local/bin/redis-server ;

2.3 配置檔案

複製原始碼包裡中的sentinel.conf和redis.conf檔案到 /etc/redis 目錄,我們需要重寫編寫配置檔案,進行配置主從.

mkdir -p /etc/redis
cp /usr/local/redis/redis.conf /etc/redis/redis_7021.conf 
cp /usr/local/redis/sentinel.conf /etc/redis/sentinel_17021.conf
cp /usr/local/redis/utils/redis_init_script /etc/init.d/redis

當然如果是想MySQL單機多例項那樣,redis配置檔案還可以放到redis 的例項裡面 比如 /data/redis7021/redis.conf ,跟著redis例項走。
redis_7021.conf 的內容
需要注意的是 本人為了圖方便 去掉了許可權以及 bind 並且設定了protected-mode 為no ,安裝測試的過程中因為這兩個引數導致額外的幾個問題。生產上還是建議啟用這兩個引數的。還要記得本例子是主庫,從庫還要加上
slaveof master_ip port

redis.conf

#Redis configuration file example.
#./redis-server /path/to/redis.conf
################################## INCLUDES ###################################
#這在你有標準配置模板但是每個redis伺服器又需要個性設定的時候很有用。
# include /path/to/local.conf
# include /path/to/other.conf
################################ GENERAL #####################################
#是否在後臺執行,yes:後臺執行;no:不是後臺執行(老版本預設)
daemonize yes
#3.2裡的引數,是否開啟保護模式,預設開啟。要是配置裡沒有指定bind和密碼。開啟該引數後,redis只會本地進行訪問,拒絕外部訪問。要是開啟了密碼 和bind,可以開啟。否 則最好關閉,設定為no。
protected-mode no

#redis的程序檔案
pidfile "/data/redis_7021/run/redis.pid"

#redis監聽的埠號。
port 7021

#此引數確定了TCP連線中已完成佇列(完成三次握手之後)的長度, 當然此值必須不大於Linux系統定義的/proc/sys/net/core/somaxconn值,預設是511,而Linux的預設引數值是128。當系統併發量大並且客戶端速度緩慢的時候,可以將這二個引數一起參考設定。該核心引數預設值一般是128,對於負載很大的服務程式來說大大的不夠。一般會將它修改為2048或者更大。在/etc/sysctl.conf中新增:net.core.somaxconn = 2048,然後在終端中執行sysctl -p。
tcp-backlog 511

#指定 redis 只接收來自於該 IP 地址的請求,如果不進行設定,那麼將處理所有請求
#bind 10.9.34.172

#配置unix socket來讓redis支援監聽本地連線。
unixsocket "/data/redis_7021/run/redis.sock"
#配置unix socket使用檔案的許可權
# unixsocketperm 700

# 此引數為設定客戶端空閒超過timeout,服務端會斷開連線,為0則服務端不會主動斷開連線,不能小於0。
timeout 0

#tcp keepalive引數。如果設定不為0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有兩個好處:檢測掛掉的對端。降低中間裝置出問題而導致網路看似連線卻已經與對端埠的問題。在Linux核心中,設定了keepalive,redis會定時給對端傳送ack。檢測到對端關閉需要兩倍的設定值。
tcp-keepalive 0

#指定了服務端日誌的級別。級別包括:debug(很多資訊,方便開發、測試),verbose(許多有用的資訊,但是沒有debug級別資訊多),notice(適當的日誌級別,適合生產環境),warn(只有非常重要的資訊)
loglevel notice

#指定了記錄日誌的檔案。空字串的話,日誌會列印到標準輸出裝置。後臺執行的redis標準輸出是/dev/null。
logfile "/data/redis_7021/log/alert.log"

#是否開啟記錄syslog功能
# syslog-enabled no

#syslog的識別符號。
# syslog-ident redis

#日誌的來源、裝置
# syslog-facility local0

#資料庫的數量,預設使用的資料庫是DB 0。可以通過”SELECT “命令選擇一個db
databases 16

################################ SNAPSHOTTING ################################
# 快照配置
# 註釋掉“save”這一行配置項就可以讓儲存資料庫功能失效
# 設定sedis進行資料庫映象的頻率。
# 900秒(15分鐘)內至少1個key值改變(則進行資料庫儲存--持久化)
# 300秒(5分鐘)內至少10個key值改變(則進行資料庫儲存--持久化)
# 60秒(1分鐘)內至少10000個key值改變(則進行資料庫儲存--持久化)
#save 900 1
#save 300 10
#save 60 10000

#當RDB持久化出現錯誤後,是否依然進行繼續進行工作,yes:不能進行工作,no:可以繼續進行工作,可以通過info中的rdb_last_bgsave_status瞭解RDB持久化是否有錯誤
stop-writes-on-bgsave-error yes

#使用壓縮rdb檔案,rdb檔案壓縮使用LZF壓縮演算法,yes:壓縮,但是需要一些cpu的消耗。no:不壓縮,需要更多的磁碟空間
rdbcompression yes

#是否校驗rdb檔案。從rdb格式的第五個版本開始,在rdb檔案的末尾會帶上CRC64的校驗和。這跟有利於檔案的容錯性,但是在儲存rdb檔案的時候,會有大概10%的效能損耗,所以如果你追求高效能,可以關閉該配置。
rdbchecksum no

#rdb檔案的名稱
dbfilename "dump.rdb"

#資料目錄,資料庫的寫入會在這個目錄。rdb、aof檔案也會寫在這個目錄
dir "/data/redis_7021/data"

################################# REPLICATION #################################
#複製選項,slave複製對應的master。
# slaveof <masterip> <masterport>

#如果master設定了requirepass,那麼slave要連上master,需要有master的密碼才行。masterauth就是用來配置master的密碼,這樣可以在連上master後進行認證。
#masterauth "youzan"

#當從庫同主機失去連線或者複製正在進行,從機庫有兩種執行方式:1) 如果slave-serve-stale-data設定為yes(預設設定),從庫會繼續響應客戶端的請求。2) 如果slave-serve-stale-data設定為no,除去INFO和SLAVOF命令之外的任何請求都會返回一個錯誤”SYNC with master in progress”。
slave-serve-stale-data yes

#作為從伺服器,預設情況下是隻讀的(yes),可以修改成NO,用於寫(不建議)。
slave-read-only yes

#是否使用socket方式複製資料。目前redis複製提供兩種方式,disk和socket。如果新的slave連上來或者重連的slave無法部分同步,就會執行全量同步,master會生成rdb檔案。有2種方式:disk方式是master建立一個新的程序把rdb檔案儲存到磁碟,再把磁碟上的rdb檔案傳遞給slave。socket是master建立一個新的程序,直接把rdb檔案以socket的方式發給slave。disk方式的時候,當一個rdb儲存的過程中,多個slave都能共享這個rdb檔案。socket的方式就的一個個slave順序複製。在磁碟速度緩慢,網速快的情況下推薦用socket方式。
repl-diskless-sync no

#diskless複製的延遲時間,防止設定為0。一旦複製開始,節點不會再接收新slave的複製請求直到下一個rdb傳輸。所以最好等待一段時間,等更多的slave連上來。
repl-diskless-sync-delay 5

#slave根據指定的時間間隔向伺服器傳送ping請求。時間間隔可以通過 repl_ping_slave_period 來設定,預設10秒。
repl-ping-slave-period 5

#複製連線超時時間。master和slave都有超時時間的設定。master檢測到slave上次傳送的時間超過repl-timeout,即認為slave離線,清除該slave資訊。slave檢測到上次和master互動的時間超過repl-timeout,則認為master離線。需要注意的是repl-timeout需要設定一個比repl-ping-slave-period更大的值,不然會經常檢測到超時。
repl-timeout 60

#是否禁止複製tcp連結的tcp nodelay引數,可傳遞yes或者no。預設是no,即使用tcp nodelay。如果master設定了yes來禁止tcp nodelay設定,在把資料複製給slave的時候,會減少包的數量和更小的網路頻寬。但是這也可能帶來資料的延遲。預設我們推薦更小的延遲,但是在資料量傳輸很大的場景下,建議選擇yes。
repl-disable-tcp-nodelay no

#複製緩衝區大小,這是一個環形複製緩衝區,用來儲存最新複製的命令。這樣在slave離線的時候,不需要完全複製master的資料,如果可以執行部分同步,只需要把緩衝區的部分資料複製給slave,就能恢復正常複製狀態。緩衝區的大小越大,slave離線的時間可以更長,複製緩衝區只有在有slave連線的時候才分配記憶體。沒有slave的一段時間,記憶體會被釋放出來,預設1m。
repl-backlog-size 32mb

#master沒有slave一段時間會釋放複製緩衝區的記憶體,repl-backlog-ttl用來設定該時間長度。單位為秒。
repl-backlog-ttl 3600

#當master不可用,Sentinel會根據slave的優先順序選舉一個master。最低的優先順序的slave,當選master。而配置成0,永遠不會被選舉。
slave-priority 100

#redis提供了可以讓master停止寫入的方式,如果配置了min-slaves-to-write,健康的slave的個數小於N,mater就禁止寫入。master最少得有多少個健康的slave存活才能執行寫命令。這個配置雖然不能保證N個slave都一定能接收到master的寫操作,但是能避免沒有足夠健康的slave的時候,master不能寫入來避免資料丟失。設定為0是關閉該功能。
# min-slaves-to-write 3

#延遲小於min-slaves-max-lag秒的slave才認為是健康的slave。
# min-slaves-max-lag 10

# 設定1或另一個設定為0禁用這個特性。
# Setting one or the other to 0 disables the feature.
# By default min-slaves-to-write is set to 0 (feature disabled) and
# min-slaves-max-lag is set to 10.

################################## SECURITY ###################################
#requirepass配置可以讓使用者使用AUTH命令來認證密碼,才能使用其他命令。這讓redis可以使用在不受信任的網路中。為了保持向後的相容性,可以註釋該命令,因為大部分使用者也不需要認證。使用requirepass的時候需要注意,因為redis太快了,每秒可以認證15w次密碼,簡單的密碼很容易被攻破,所以最好使用一個更復雜的密碼。
#requirepass "youzan"

#把危險的命令給修改成其他名稱。比如CONFIG命令可以重新命名為一個很難被猜到的命令,這樣使用者不能使用,而內部工具還能接著使用。
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
rename-command SHUTDOWN REDIS_SHUTDOWN
rename-command FLUSHDB REDIS_FLUSHDB
rename-command FLUSHALL REDIS_FLUSHALL
rename-command KEYS REDIS_KEYS
#rename-command CONFIG REDIS_CONFIG
#rename-command SLAVEOF REDIS_SLAVEOF
#設定成一個空的值,可以禁止一個命令
# rename-command CONFIG ""
################################### LIMITS ####################################

# 設定能連上redis的最大客戶端連線數量。預設是10000個客戶端連線。由於redis不區分連線是客戶端連線還是內部開啟檔案或者和slave連線等,所以maxclients最小建議設定到32。如果超過了maxclients,redis會給新的連線傳送’max number of clients reached’,並關閉連線。
# maxclients 10000

#redis配置的最大記憶體容量。當記憶體滿了,需要配合maxmemory-policy策略進行處理。注意slave的輸出緩衝區是不計算在maxmemory內的。所以為了防止主機記憶體使用完,建議設定的maxmemory需要更小一些。
maxmemory 512mb

#記憶體容量超過maxmemory後的處理策略。
#volatile-lru:利用LRU演算法移除設定過過期時間的key。
#volatile-random:隨機移除設定過過期時間的key。
#volatile-ttl:移除即將過期的key,根據最近過期時間來刪除(輔以TTL)
#allkeys-lru:利用LRU演算法移除任何key。
#allkeys-random:隨機移除任何key。
#noeviction:不移除任何key,只是返回一個寫錯誤。
#上面的這些驅逐策略,如果redis沒有合適的key驅逐,對於寫命令,還是會返回錯誤。redis將不再接收寫請求,只接收get請求。寫命令包括:set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort。
maxmemory-policy allkeys-lru

#lru檢測的樣本數。使用lru或者ttl淘汰演算法,從需要淘汰的列表中隨機選擇sample個key,選出閒置時間最長的key移除。
# maxmemory-samples 5

############################## APPEND ONLY MODE ###############################
#預設redis使用的是rdb方式持久化,這種方式在許多應用中已經足夠用了。但是redis如果中途宕機,會導致可能有幾分鐘的資料丟失,根據save來策略進行持久化,Append Only File是另一種持久化方式,可以提供更好的持久化特性。Redis會把每次寫入的資料在接收後都寫入 appendonly.aof 檔案,每次啟動時Redis都會先把這個檔案的資料讀入記憶體裡,先忽略RDB檔案。
appendonly no

#aof檔名
appendfilename "appendonly.aof"

#aof持久化策略的配置
#no表示不執行fsync,由作業系統保證資料同步到磁碟,速度最快。
#always表示每次寫入都執行fsync,以保證資料同步到磁碟。
#everysec表示每秒執行一次fsync,可能會導致丟失這1s資料。
appendfsync everysec

# 在aof重寫或者寫入rdb檔案的時候,會執行大量IO,此時對於everysec和always的aof模式來說,執行fsync會造成阻塞過長時間,no-appendfsync-on-rewrite欄位設定為預設設定為no。如果對延遲要求很高的應用,這個欄位可以設定為yes,否則還是設定為no,這樣對持久化特性來說這是更安全的選擇。設定為yes表示rewrite期間對新寫操作不fsync,暫時存在記憶體中,等rewrite完成後再寫入,預設為no,建議yes。Linux的預設fsync策略是30秒。可能丟失30秒資料。
no-appendfsync-on-rewrite yes

#aof自動重寫配置。當目前aof檔案大小超過上一次重寫的aof檔案大小的百分之多少進行重寫,即當aof檔案增長到一定大小的時候Redis能夠呼叫bgrewriteaof對日誌檔案進行重寫。當前AOF檔案大小是上次日誌重寫得到AOF檔案大小的二倍(設定為100)時,自動啟動新的日誌重寫過程。
auto-aof-rewrite-percentage 100
#設定允許重寫的最小aof檔案大小,避免了達到約定百分比但尺寸仍然很小的情況還要重寫
auto-aof-rewrite-min-size 64mb

#aof檔案可能在尾部是不完整的,當redis啟動的時候,aof檔案的資料被載入記憶體。重啟可能發生在redis所在的主機作業系統宕機後,尤其在ext4檔案系統沒有加上data=ordered選項(redis宕機或者異常終止不會造成尾部不完整現象。)出現這種現象,可以選擇讓redis退出,或者匯入儘可能多的資料。如果選擇的是yes,當截斷的aof檔案被匯入的時候,會自動釋出一個log給客戶端然後load。如果是no,使用者必須手動redis-check-aof修復AOF檔案才可以。
aof-load-truncated yes

################################ LUA SCRIPTING ###############################
# 如果達到最大時間限制(毫秒),redis會記個log,然後返回error。當一個指令碼超過了最大時限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一個可以殺沒有調write命令的東西。要是已經呼叫了write,只能用第二個命令殺。
lua-time-limit 5000

################################ REDIS CLUSTER ###############################
#叢集開關,預設是不開啟叢集模式。
#cluster-enabled yes

#叢集配置檔案的名稱,每個節點都有一個叢集相關的配置檔案,持久化儲存叢集的資訊。這個檔案並不需要手動配置,這個配置檔案有Redis生成並更新,每個Redis叢集節點需要一個單獨的配置檔案,請確保與例項執行的系統中配置檔名稱不衝突
#cluster-config-file nodes-7021.conf

#節點互連超時的閥值。叢集節點超時毫秒數
#cluster-node-timeout 30000

#在進行故障轉移的時候,全部slave都會請求申請為master,但是有些slave可能與master斷開連線一段時間了,導致資料過於陳舊,這樣的slave不應該被提升為master。該引數就是用來判斷slave節點與master斷線的時間是否過長。判斷方法是:
#比較slave斷開連線的時間和(node-timeout * slave-validity-factor) + repl-ping-slave-period
#如果節點超時時間為三十秒, 並且slave-validity-factor為10,假設預設的repl-ping-slave-period是10秒,即如果超過310秒slave將不會嘗試進行故障轉移
#可能出現由於某主節點失聯卻沒有從節點能頂上的情況,從而導致叢集不能正常工作,在這種情況下,只有等到原來的主節點重新迴歸到叢集,叢集才恢復運作
#如果設定成0,則無論從節點與主節點失聯多久,從節點都會嘗試升級成主節
#cluster-slave-validity-factor 10

#master的slave數量大於該值,slave才能遷移到其他孤立master上,如這個引數若被設為2,那麼只有當一個主節點擁有2 個可工作的從節點時,它的一個從節點會嘗試遷移。
#主節點需要的最小從節點數,只有達到這個數,主節點失敗時,它從節點才會進行遷移。
# cluster-migration-barrier 1

#預設情況下,叢集全部的slot有節點分配,叢集狀態才為ok,才能提供服務。設定為no,可以在slot沒有全部分配的時候提供服務。不建議開啟該配置,這樣會造成分割槽的時候,小分割槽的master一直在接受寫請求,而造成很長時間資料不一致。
#在部分key所在的節點不可用時,如果此引數設定為”yes”(預設值), 則整個叢集停止接受操作;如果此引數設定為”no”,則叢集依然為可達節點上的key提供讀操作
#cluster-require-full-coverage yes

################################## LOG ###################################
###slog log是用來記錄redis執行中執行比較慢的命令耗時。當命令的執行超過了指定時間,就記錄在slow log中,slog log儲存在記憶體中,所以沒有IO操作。
#執行時間比slowlog-log-slower-than大的請求記錄到slowlog裡面,單位是微秒,所以1000000就是1秒。注意,負數時間會禁用慢查詢日誌,而0則會強制記錄所有命令。
slowlog-log-slower-than 10000

#慢查詢日誌長度。當一個新的命令被寫進日誌的時候,最老的那個記錄會被刪掉。這個長度沒有限制。只要有足夠的記憶體就行。你可以通過 SLOWLOG RESET 來釋放記憶體。
slowlog-max-len 128

################################ LATENCY MONITOR ##############################
#延遲監控功能是用來監控redis中執行比較緩慢的一些操作,用LATENCY列印redis例項在跑命令時的耗時圖表。只記錄大於等於下邊設定的值的操作。0的話,就是關閉監視。預設延遲監控功能是關閉的,如果你需要開啟,也可以通過CONFIG SET命令動態設定。
latency-monitor-threshold 0

############################# EVENT NOTIFICATION ##############################
#鍵空間通知使得客戶端可以通過訂閱頻道或模式,來接收那些以某種方式改動了 Redis 資料集的事件。因為開啟鍵空間通知功能需要消耗一些 CPU ,所以在預設配置下,該功能處於關閉狀態。
#notify-keyspace-events 的引數可以是以下字元的任意組合,它指定了伺服器該傳送哪些型別的通知:
##K 鍵空間通知,所有通知以 __keyspace@__ 為字首
##E 鍵事件通知,所有通知以 __keyevent@__ 為字首
##g DEL 、 EXPIRE 、 RENAME 等型別無關的通用命令的通知
##$ 字串命令的通知
##l 列表命令的通知
##s 集合命令的通知
##h 雜湊命令的通知
##z 有序集合命令的通知
##x 過期事件:每當有過期鍵被刪除時傳送
##e 驅逐(evict)事件:每當有鍵因為 maxmemory 政策而被刪除時傳送
##A 引數 g$lshzxe 的別名
#輸入的引數中至少要有一個 K 或者 E,否則的話,不管其餘的引數是什麼,都不會有任何 通知被分發。詳細使用可以參考http://redis.io/topics/notifications

notify-keyspace-events "e"

############################### ADVANCED CONFIG ###############################
#資料量小於等於hash-max-ziplist-entries的用ziplist,大於hash-max-ziplist-entries用hash
hash-max-ziplist-entries 512
#value大小小於等於hash-max-ziplist-value的用ziplist,大於hash-max-ziplist-value用hash。
hash-max-ziplist-value 64

#資料量小於等於list-max-ziplist-entries用ziplist,大於list-max-ziplist-entries用list。
list-max-ziplist-entries 512
#value大小小於等於list-max-ziplist-value的用ziplist,大於list-max-ziplist-value用list。
list-max-ziplist-value 64

#資料量小於等於set-max-intset-entries用iniset,大於set-max-intset-entries用set。
set-max-intset-entries 512

#資料量小於等於zset-max-ziplist-entries用ziplist,大於zset-max-ziplist-entries用zset。
zset-max-ziplist-entries 128
#value大小小於等於zset-max-ziplist-value用ziplist,大於zset-max-ziplist-value用zset。
zset-max-ziplist-value 64

#value大小小於等於hll-sparse-max-bytes使用稀疏資料結構(sparse),大於hll-sparse-max-bytes使用稠密的資料結構(dense)。一個比16000大的value是幾乎沒用的,建議的value大概為3000。如果對CPU要求不高,對空間要求較高的,建議設定到10000左右。
hll-sparse-max-bytes 3000

#Redis將在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行重新hash,可以降低記憶體的使用。當你的使用場景中,有非常嚴格的實時性需要,不能夠接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置為no。如果沒有這麼嚴格的實時性要求,可以設定為yes,以便能夠儘可能快的釋放記憶體。
activerehashing yes

##對客戶端輸出緩衝進行限制可以強迫那些不從伺服器讀取資料的客戶端斷開連線,用來強制關閉傳輸緩慢的客戶端。
#對於normal client,第一個0表示取消hard limit,第二個0和第三個0表示取消soft limit,normal client預設取消限制,因為如果沒有尋問,他們是不會接收資料的。
client-output-buffer-limit normal 0 0 0
#對於slave client和MONITER client,如果client-output-buffer一旦超過256mb,又或者超過64mb持續60秒,那麼伺服器就會立即斷開客戶端連線。
client-output-buffer-limit slave 256mb 64mb 60
#對於pubsub client,如果client-output-buffer一旦超過32mb,又或者超過8mb持續60秒,那麼伺服器就會立即斷開客戶端連線。
client-output-buffer-limit pubsub 32mb 8mb 60

sentinel_17021.conf 的內容 master 的名稱為youzan

port 17021
dir "/data/sentinel_17021"
logfile "/data/sentinel_17021/log/alert.log"
daemonize yes
protected-mode no
sentinel monitor youzan 10.9.34.172 7021 2
sentinel down-after-milliseconds youzan 5000
sentinel failover-timeout youzan 120000
#sentinel client-reconfig-script youzan /opt/bin/notify.py
rename-command SHUTDOWN REDIS_SHUTDOWN
#sentinel auth-pass youzan xxx

/etc/init.d/redis 的內容

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
REDISPORT=7021
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/data/redis_${REDISPORT}/run/redis.pid
CONF="/etc/redis/redis_${REDISPORT}.conf"
HOST=`hostname -i`
case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                su redis -c "$EXEC $CONF"
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -h $HOST -p $REDISPORT redis_shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac

2.4 新增redis和 sentinel 賬號。

避免使用root賬號直接啟動 redis (存在相關安全隱患 利用Redis配置不當的漏洞對linux伺服器root提權體驗 )

useradd redis 
mkdir -p /data/redis_7021/{data,log,run} ;
mkdir -p /data/sentinel_17021/{log,run} ;
chown -R redis.redis /data/redis_7021/ ;
chown -R redis.redis /etc/redis/ ;
useradd sentinel ; 
chown -R sentinel.sentinel /data/sentinel_17021/ ;
chown -R sentinel.sentinel /etc/redis/sentinel_17021.conf ;
chmod 664 /etc/redis/sentinel_17021.conf

2.5 部署其他節點

上面的過程是配置redis主庫和其中的一個sentinel,複製上面的過程在10.9.43.207 重新執行一遍進行安裝redis和sentinel,不過需要注意的是 我們設定10.9.43.207為redis的slave節點 ,所以要在配置檔案redis_7021.conf中加上 slaveof 10.9.34.172 7021 。對於安裝第三個sentinel節點10.9.34.252,只需選取上面步驟中的 sentinel相關的步驟就好。

2.6 啟動redis和sentinel

啟動redis

/etc/init.d/redis start
關閉redis
/etc/init.d/redis stop
su sentinel -c "redis-sentinel /etc/redis/sentinel_17021.conf"
啟動sentinel之後的日誌如下

32126:X 31 Jul 23:28:41.570 # Sentinel ID is b28ca1bb3d722e09d0de905caa380397455e8e3c
32126:X 31 Jul 23:28:41.570 # +monitor master youzan 10.9.34.172 7021 quorum 2
32126:X 31 Jul 23:28:41.571 * +slave slave 10.9.43.207:7021 10.9.43.207 7021 @ youzan 10.9.34.172 7021
32126:X 31 Jul 23:28:54.484 * +sentinel sentinel 5c44560584c3245590e86fa78880eacccdfe8318 10.9.34.252 17021 @ youzan 10.9.34.172 7021

2.7 進行故障演練

在主庫上進行

10.9.34.172:7021> debug sleep 30
OK
(30.01s)
觀察sentinel的log輸出

32126:X 01 Aug 09:24:12.752 # +sdown master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:12.828 # +odown master youzan 10.9.34.172 7021 #quorum 2/2
32126:X 01 Aug 09:24:12.828 # +new-epoch 1
32126:X 01 Aug 09:24:12.828 # +try-failover master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:12.838 # +vote-for-leader b28ca1bb3d722e09d0de905caa380397455e8e3c 1
32126:X 01 Aug 09:24:12.842 # 5c44560584c3245590e86fa78880eacccdfe8318 voted for b28ca1bb3d722e09d0de905caa380397455e8e3c 1
32126:X 01 Aug 09:24:12.928 # +elected-leader master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:12.928 # +failover-state-select-slave master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:12.995 # +selected-slave slave 10.9.43.207:7021 10.9.43.207 7021 @ youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:12.995 * +failover-state-send-slaveof-noone slave 10.9.43.207:7021 10.9.43.207 7021 @ youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:13.047 * +failover-state-wait-promotion slave 10.9.43.207:7021 10.9.43.207 7021 @ youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:13.893 # +promoted-slave slave 10.9.43.207:7021 10.9.43.207 7021 @ youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:13.893 # +failover-state-reconf-slaves master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:13.942 # +failover-end master youzan 10.9.34.172 7021
32126:X 01 Aug 09:24:13.942 # +switch-master youzan 10.9.34.172 7021 10.9.43.207 7021
32126:X 01 Aug 09:24:13.943 * +slave slave 10.9.34.172:7021 10.9.34.172 7021 @ youzan 10.9.43.207 7021
32126:X 01 Aug 09:24:18.986 # +sdown slave 10.9.34.172:7021 10.9.34.172 7021 @ youzan 10.9.43.207 7021
32126:X 01 Aug 09:24:37.041 # -sdown slave 10.9.34.172:7021 10.9.34.172 7021 @ youzan 10.9.43.207 7021
32126:X 01 Aug 09:24:47.041 * +convert-to-slave slave 10.9.34.172:7021 10.9.34.172 7021 @ youzan 10.9.43.207 7021

觀察sentinel 的配置檔案以及被修改重寫.

三 總結

本文算是一篇入門級別的how to文件,介紹如何安裝部署redis sentinel 高可用架構,內容比較淺顯,需要注意的是運維一套資料庫儲存系統肯定不會這麼簡單,還要涉及到相關程序,日誌,效能監控等等,本文的案例距離生產實踐還有一大段路要走,繼續學習。

四 參考文章

[1] Redis之Sentinel高可用安裝部署
[2] Redis Sentinel機制與用法(一)
[3] Redis Sentinel機制與用法(二)


本公眾號長期關注於資料庫技術以及效能優化,故障案例分析,資料庫運維技術知識分享,個人成長和自我管理等主題,歡迎掃碼關注。

相關推薦

MySQL之可用架構—MHA

mysql mha MySQL高可用目前有heartbeat+drbd、MHA、MySQL復制等幾種較成熟的方案,heartbeat+drbd的方案可擴展性較差,而且讀寫都由主服務器負責,從庫並不提供讀功能,適合於數據增長量不大、一致性要求很高的環境,如銀行、金融業等。今天重點講下MHA的高可用架構。

MySQL可用架構之MHA

mysql1、關於MHAMHA(Master HA)是一款開源的MySQL的高可用程序,它為MySQL主從復制架構提供了automating master failover功能。MHA在監控到master節點故障時,會提升其中擁有的最新數據的slave節點成為新的master節點,在此期間,MHA會通過其它從

CentOS 搭建 Mysql MMM 可用架構

install 高可用 padding log isa har mmm_mond replica tro 環境 CentOS Mysql 5.1 前提 安裝了EPEL,詳細安裝步驟請參照 http://blog.csdn.net/robinsonmhj/articl

京東618:商城交易平臺的可用架構之路

資源 系統 定位問題 修復 tle 峰值 網絡 寫入 差異 據騰訊科技報道,6月18日零點,京東全民年中購物節拉開了高潮的序幕。第一個小時的銷售額超過去年同期的250%。從淩晨開始的海量訂單讓6月1日就拉開序幕的京東年中購物節奏出最強音,大量用戶瞬間湧入,峰值訂單被不斷刷新

mysql mha可用架構的安裝

pin 變量 log-bin dump 控制 masters 否則 ava 1.5 MMM無法全然地保證數據的一致性,所以MMM適用於對數據的一致性要求不是非常高。可是又想最大程度的保證業務可用性的場景對於那些對數據一致性要求非常高的業務,非常不建議採用MMM的這樣

單表60億記錄等大數據場景的MySQL優化和運維之道 | 可用架構

點數據 dump fwe wide 更新 lock redo 可靠 index 015-08-09 楊尚剛 高可用架構 此文是根據楊尚剛在【QCON高可用架構群】中,針對MySQL在單表海量記錄等場景下,業界廣泛關註的MySQL問題的經驗分享整理而成,轉發請註明出處。 楊

可用架構(轉載)

get ges 其他 廣泛 優先 ssi 聯網 asp.net 目前 一、可用性度量與考核   首先,不得不說:要保證一個網站永遠完全可用幾乎是一件不可能完成的任務(Mission Impossible,是不是有點碟中諜的感覺)。   (1)如何度量網站可用性?   一

互聯網可用架構,為什麽要服務化?

新的 公司 拼接 垂直拆分 nginx 而是 擴容 導致 演進   一、互聯網高可用架構,為什麽要服務化?    【服務化之前高可用架構】    在服務化之前,互聯網的高可用架構大致是這樣一個架構:    (1)用戶端是瀏覽器browser,APP客戶端    (2)後端入

實現基於Haproxy_NAT+Keepalived負載均衡可用架構

haproxy實驗思路:1.做這個實驗首先可以想象一個場景,用戶訪問webserver的時候首先會經過調度器,首先需要明白的一點就是一般公司一般是在內網,客戶端是通過外網訪問webserver的。2.haproxy是一個負載均衡器,Keepalived通過VRRP功能能再結合LVS負載均衡軟件即可部署一個高性

實現基於Haproxy+Keepalived負載均衡可用架構

keepalived+haproxy一:環境準備centos系統服務器4臺,兩臺用於做haproxy主從架構,兩臺作為後端server,服務器配置好yum源,防火墻關閉,關閉selinux,各節點時鐘服務同步,各節點之間可以通過主機名互相通信。二:安裝步驟1.iptables –F &&set

mysql實現可用架構之MHA

行數據 reading glob restart 比較 實驗 是否 其余 one 一、簡介   MHA(Master HA)是一款開源的 MySQL 的高可用程序,它為 MySQL 主從復制架構提供了 automating master failover 功能。MHA 在監

基於DR模式的keepalived主從模式可用架構搭建

linuxkeepalived高可用一:架構圖示2.keepalived是什麽?Keepalived的作用是檢測服務器的狀態,如果有一臺web服務器宕機 ,或工作出現故障,Keepalived將檢測到,通過VRRP協議,將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常後 K

SaltStack實例:構建可用架構

saltstack、構建、高可用 本章主要介紹通過saltstack構建系統高可用架構,以滿足業務需求。通過Haproxy實現負載均衡調度後端Nginx+PHP服務器,Keepalived實現系統高可用功能,Memcached存儲session會話,後端數據庫采用Mysql並且實現主從復制以及讀寫分

LVS+Keepalied可用架構

## 流量 load ref extra 沒有 star entos address LVS+Kee

Memcached主主復制+Keepalived可用架構

Memcached+Keepalived 實驗報告 第一、實驗環境: 第二、實驗步驟:配置memcached主緩存節點和從緩存節點-----兩臺配置相同解包:tar xf

Azure技術12-可用--在Azure上創建典型可用架構應用(2)

公有雲 azure PHP mysql 高可用 下面創建虛擬機,我們分別創建兩臺Windows2012 的虛擬機吧,這裏填入虛擬機名,磁盤類型(這裏就比以前老門戶方便多了,以前要創建SSD還需要powershell,見我寫的博客Azure技術08-虛擬機-創建高性能存儲,創建DS系列虛擬機

Azure技術12-可用--在Azure上創建典型可用架構應用(1)

公有雲 高可用 mysql azure PHP 在上篇文章中我說了我會結合IaaS與雲端PaaS,本次我將在Azure上部署一個最簡單最常規的高可用架構,雲端產品主要包含,PaaS層采用Azure Database for MYSQL作為數據庫後端服務器,部署兩臺Windows虛擬機做前端

Azure技術12-可用--在Azure上創建典型可用架構應用(3)

azure php mysql 負載平衡器 高可用 等待安裝完成將PHPBB的文件夾中的數據復制到相應的目錄中,我這裏為了方便直接放到了wwwroot文件夾中,就不需要另外建網站,直接用默認網站然後我們展開至Install文件夾,找到index.html瀏覽來安裝PHPBB論壇根據提示一步

基於Consul的數據庫可用架構【轉】

main mas sentinel rec handle mat nload hand unless 幾個月沒有更新博客了,已經長草了,特意來除草。本次主要分享如何利用consul來實現redis以及mysql的高可用。以前的公司mysql是單機單實例,高可用MHA加vip

Dubbo可用架構篇 Dubbo分布式系統架構視頻教程-ZooKeeper-第三方支付項目精華課程

Java課程介紹:Dubbo是阿裏巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和Spring框架無縫集成.-------------------課程目錄-------------------第01節--zookeeper集群的安裝、配置、高可用測試.d