1. 程式人生 > 實用技巧 >redis 學習筆記-哨兵

redis 學習筆記-哨兵

目錄

sentinel

sentinel(哨崗,哨兵),是redis高可用方案。

​ 由一個或多個Sentinel例項(instance)組成的Sentinel系統監視任意多個主伺服器和從伺服器。主下線後,自動升級某個從伺服器為主,然後由新主繼續處理命令

1.1 Sentinel字典

哨兵 Sentinel

  1.Sentinel狀態中的masters字典記錄了所有被Sentinel監視的主伺服器的相關資訊:
  2.字典的鍵是被監視主伺服器的名字 
  3.字典的值則是被監視主伺服器對應的結構
  4.例項結構:代表一個被Sentinel監視的Redis伺服器例項,例項可以是主,從,或是另一個Sentinel
  5.Sentinel字典的值是鍵所對應的Sentinel例項結構。比如:對於鍵“127.0.0.1:26379”來說,這個鍵在sentinels字典中的值就是IP為127.0.0.1:26379,埠為26379的Sentinel的例項結構。

1.2 會有兩個連線

  初始化後的Sentinel將成為主伺服器的客戶端,可向主伺服器傳送命令,從命令回覆中獲取相關資訊。
  1.命令連線
  2.訂閱連線,防止接受資訊的客戶端不線上,漏掉資訊

1.3 sentinel 聯絡

  當一個Sentinel接收到其他的Sentinel發來的資訊時,(我們稱傳送資訊的為源Sentinel,接收的為目標Sentinel)目標Sentinel會從資訊中分析並提取出兩方面引數:
  與Sentinel有關的引數:源Sentinel的ip地址、埠號、執行ID和配置紀元
  與主伺服器有關的引數:源Sentinel正在監視的主伺服器名稱、ip地址、埠號、配置紀元

1.4 檢查主觀下線狀態

  1.Sentinel每秒一次頻率與所建立的命令連線例項傳送PING命令,並通過返回判斷例項是否線上
  2.有效回覆:+PONG 、-LOADING、-MASTERDOWN
  3.無效恢復:除了三種外的其他回覆
  4.Sentinel配置中 down-after-milliseconds 指定了例項進入主觀下線所需的時間長度 
比如:sentinel monitor master 127.0.0.1 6379 2
sentinel  down-after-milliseconds  master 50000
  5.多個Sentinel設定主觀下線時長可能不同
   Sentinel 判斷為主觀下線後,為確保真的下線了,會向其他Sentinel詢問,取證是否真的下線了,從其他Sentinel接受足夠數量的已下線判斷後,Sentinel將主伺服器判斷為客觀下線,並對主執行故障轉移操作。

1.5 客觀下線狀態判斷條件

  已經認為主伺服器進入下線狀態的Sentinel的數量,超過Sentinel配置中的quorum引數的值,就會認為主伺服器已經進入客觀下線狀態。
  比如:監視同一個主伺服器的五個Sentinel來說,如果Sentinel1啟動時載入的配置:
sentinel monitor master 127.0.0.1 6379 2
當5個裡面有兩個認為主伺服器下線,Sentinel1就將主伺服器判斷為客觀下線。

1.6 傳送與接收SENTINEL is-master-down-by-addr命令

Sentinel 使用:
SENTINEL is-master-down-by-addr <ip> <port> <current_epoch> <runid>
被判斷下線主伺服器的IP
被判斷下線主伺服器的port
current_epoch Sentinel當前的配置紀元,用於選領頭Sentinel
runid Sentnel執行ID 、*用於檢測主伺服器客觀下線狀態

1.7 選舉領頭Sentinel

  1.當一個主伺服器被確診為客觀下線時,監視下線主伺服器的各個Sentinel會進行協商,並選出一個領頭Sentinel,並由領頭Sentinel對下線主伺服器執行故障轉移操作
  2.所有線上的Sentinel都有資格成為老大
  3.每次進行老大選舉後,不管成沒成,所有Sentinel的配置紀元都會自增一次。配置紀元實際上就是一個計數器,沒啥特別的。
  4.每個Sentinel都有一次機會通過紀元將某個Sentinel設定為老大的機會,配置紀元一旦設定不可更改。
  5.每個發現主伺服器進入客觀下線的Sentinel都會要求其他Sentinel將其設定為領頭Sentinel
  6.當一個Sentinal向另一個Sentinel傳送SENTINEL is-master-down-by-addr命令,runid引數不是*而是執行ID時,,如果再命令發來前沒有設定老大的話,會將執行ID設定為自己的區域性領頭Sentinel,則表示源Sentinel要求目標Sentinel將前者設定為後者的領頭Sentinel
  7.設定頭領是先到先得規則。之後接收的要求就拒絕了
  8.回覆的時候會帶著RUNID,源sentinel會對比自己的runid,統計選舉自己的數量,以此判斷目標sentinel是否將自己作為了老大
  9.某個sentinel超過半數的支援就勝出了
  10.因為只能設定一次區域性領頭Sentinel,所以在配置紀元中只會出現一個領頭Sentinel
  11.如果再給定時間內沒有選舉出來,過一段時間在此選舉,直到選出來領頭的為止

1.8 故障轉移

選舉出領頭Sentinel之後,領頭Sentinel對主伺服器故障轉移分三步

  1)在所有從伺服器中挑選一個作為新主伺服器 /sentinel像從傳送SLAVEOF no one ,領頭會以每秒一次的頻率(平時是每十秒一次)向被升級的從伺服器傳送INFO命令,直到role資訊中slave變成了master
  2)讓其他從伺服器改複製新的住伺服器 /sentinel向其他從伺服器傳送SLAVEOF命令,SLAVEOF <server3_ip> <server3_port>,使其複製新的主伺服器
  3)將下線的主伺服器設定為新主的從,舊主重新上線後將成為新主的從 、舊主重新上線後,sentinel會向他傳送SLAVEOF命令,成為新主的從伺服器

1.9 挑選主伺服器

  領頭的sentinel會將下線的主伺服器中所有的從伺服器儲存在一個列表中,按照下面規則,一項一項過濾
  1)刪除列表中所有下線和斷線狀態的從伺服器,保證列表中的從都是線上的
  2)刪除列表中所有最近5秒沒回復過頭領sentinel INFO命令的從伺服器,剩下的保證最近都有聯絡
  3)刪掉超過down-after-milliseconds * 10毫秒的伺服器。該選項判斷主伺服器下線所需要的的時間,刪除超過指定時間的從伺服器可保證列表中剩下的都沒過早的與主斷開連線,可以說是剩下從中的資料都是比較新的。 
   之後,領頭Sentinel會根據從伺服器優先順序,對列表中剩餘從伺服器排序,並選出優先順序最高的從伺服器
   如果有多個從伺服器最高優先順序相同的情況,領頭sentinel會根據從伺服器的複製偏移量,對具有相同最高優先順序的從伺服器進行排序,選出複製偏移量最大的從伺服器。
   如果最高優先順序和複製偏移量的從伺服器有多個,那麼領頭sentinel將按照執行ID對這些從伺服器排序,選出執行ID最小的從伺服器

1.10 擴充套件複製部分

2.8版本後,採用PSYNC代替SYNC執行進行復制時的同步操作
PSYNC具有完整重同步、部分重同步兩種模式
完整重同步:第一次時候
部分重同步:斷開重新複製的情況。從伺服器將斷開期間的資料同步

部分重同步由以下三個部分組成:

主服務的複製偏移量 和 從伺服器的複製偏移量
主伺服器的複製積壓緩衝區
伺服器的執行ID

...go on...

#複製偏移量:
主伺服器和從伺服器都會記錄執行命令的位元組數,裝在各自複製偏移量裡。比如主向從傳多少個累積為 offset = 111  ,從收到的也累積為 offset = 111

#複製積壓緩衝區
複製積壓緩衝區是一個由主伺服器維護的固定長度的先進先出對接,預設大小為1M,可調整

固定長度的先進先出佇列:出隊、入隊方式與普通先進先出佇列一致,新元素由一邊進入,舊元素由另一邊彈出,不同的地方在於長度固定,例如長度為3的固定長度的先進先出佇列,我們將1,2,3,4,5存入其中時,那麼1,2,3會被放入佇列中,當4放入時,1被彈出,5入隊時,2被彈出,因此最終會儲存:3,4,5

#從伺服器連線上後,從通過PSYNC命令將自己的偏移量offset傳送給主,主根據複製偏移量來決定下一步操作。
1.如果offset偏移量之後的資料存在與複製積壓緩衝區中,那麼主伺服器將對從伺服器執行部分重同步
2.如果offset偏移量之後的資料已經不存在於複製積壓緩衝區中,那麼主服務會對從伺服器採用完整重同步
##Redis複製積壓緩衝區的大小可以設定,一般將其設定為 second * write_size_per_second * 2的大小

#伺服器執行ID
1.主從伺服器都有自己的執行ID
2.ID在伺服器啟動時生成,有40個隨機16進位制字元組成
3.從第一次複製時會儲存主傳來的ID
4.斷開重連時,從會將執行ID發給主,主比對看是自己的否,不是直接執行完成同步,是主的ID,看情況決定採用部分同步還是完成同步

連結:https://www.jianshu.com/p/6da6668b2f6f

慢日誌

慢日誌查詢

  此功能用於記錄執行時間超過給定的命令請求,使用者通過產生的日誌來監控和優化查詢
  下面說兩個相關的選項
  1. slow-log-slower-than  執行超過多少微妙的命令就記錄在日誌中   (1秒 = 1000毫秒  1毫秒 = 1000微妙  1微妙 = 1000納秒)
  2.slow-max-len 指定伺服器儲存多少條慢查詢日誌

  redis> SLOWLOG GET  #檢視伺服器儲存的慢查詢日誌
  redis> SLOWLOG GET 5 #可返回N個最近條目
  屬於先入先出原則,超過規定儲存數量,後來的日誌會插在前頭,刪除最老的那條記錄
  
  
 127.0.0.1:6379> config set slowlog-log-slower-than 0
OK
127.0.0.1:6379> config set slowlog-max-len 5
OK
127.0.0.1:6379> slowlog get 
1) 1) (integer) 4                     #日誌的唯一識別符號(uid)
   2) (integer) 1596012184            #命令執行時的UNIX時間戳
   3) (integer) 8                     #命令執行的時長,以微妙計算
   4) 1) "config"
      2) "set"
      3) "slowlog-max-len"
      4) "5"
   5) "127.0.0.1:51986"
   6) ""
2) 1) (integer) 3
   2) (integer) 1596012175
   3) (integer) 1
   4) 1) "cluster"
      2) "info"
   5) "127.0.0.1:52713"
   6) ""
  redis 127.0.0.1:6379> slowlog get 2

慢查詢記錄儲存

伺服器狀態中包含和慢查詢日誌功能相關的屬性:
struct redisServer{
//下一條慢查詢日誌的ID
long long slowlog_entry_id; #showlog_entry_id 初始值為0,每建立一條新的慢查詢日誌,這個屬性就會附給新日誌id,之後屬性值會加1,;比如現在id=3 新日誌id就是3 ,原來3在加1變成4

//儲存了所有慢查詢日誌的連結串列
list *slowlog;  #連結串列中包含了從3到1的日誌,最新的3排在連結串列的表頭,最舊的排在表尾,他的長度也就是慢日誌的數量

//伺服器配置 slow-log-slower-than 選項的值
long long slow-log-slower-than;

//伺服器配置 slow-max-len 選項的值
unsigned long slow-max-len;

};

監視器

 1.客戶端通過執行MONITOR命令,客戶端可以將自己變成一個監視器,實時接收並打印出伺服器當前處理的命令請求的相關資訊
 2.當客戶端從普通客戶端變成監視器時,該客戶端的 REDIS_MONITOR 標識會被開啟,客戶端本身會被新增到monitors連結串列的表尾。
 3.伺服器將所有監視器都記錄在monitors連結串列中
 4.每次處理命令請求時,伺服器都會遍歷monitors連結串列,將相關資訊傳送給監視器

#執行
redis>  MONITOR
....

.

....

可以使用命令:redis-cli -p埠 -hIP地址 keys “*” |wc -l
如果是叢集:redis-cli -c -p埠 -hIP地址 keys "*" |wc -l(多了個-c)
注意keys 命令只能列出當前的節點的key的數量

命令

常用命令

(1)指定配置檔案啟動Redis:
/usr/local/redis3/bin/redis-server /usr/local/redis3/conf/redis_6379.conf  &

(2)登陸Redis
/usr/local/redis3/bin/redis-cli  -a password  -p port

(3)手動開啟複製 ,指定master
>slaveof 192.168.0.142 6379

(4)啟動Sentinel
/usr/local/redis3/bin/redis-server /usr/local/redis3/conf/sentinel.conf  --sentinel  &
或
/usr/local/redis3/bin/redis-sentinel /usr/local/redis3/conf/sentinel.conf

(5)登陸Sentinel
/usr/local/redis3/bin/redis-cli -p port

sentinel 命令

1.sentinel master <master name> 顯示指定master的資訊和狀態。
>sentinel master mymaster

2.sentinel slaves <master name> 顯示指定master的所有slave及它們的狀態。
> sentinel slaves mymaster 

3.sentinel sentinels <master name> 顯示指定master的sentinel節點集合(不包含當前節點)。
> sentinel sentinels mymaster

4.sentinel get-master-addr-by-name <master name> 返回指定master的ip和port,如果正在進行failover或者failover已經完成,將會顯示被提升為master的slave的ip和port。

5.sentinel failover <master name>強制sentinel執行failover,並且不需要得到其它sentinel的同意。但是failover後會將最新的配置傳送給其它sentinel。

6.sentinel ckquorum <master name>  檢視可用節點數
> sentinel  ckquorum mymaster

7.sentinel masters 顯示被監控的所有master以及它們的狀態。

redis單節點安裝

路徑規劃

安裝目錄 /usr/local/redis3
配置檔案目錄 /usr/local/redis3/conf
資料儲存目錄 /database/redis
日誌目錄 /var/log/redis
服務啟動使用者名稱 root

命名

型別 規則
例項配置檔名 redis_埠.conf
例項資料目錄名 redis_埠
例項日誌檔名 redis_埠.log

優化配置

主要是安裝服務前伺服器的優化,視伺服器情況決定是否使用以下優化配置,不配置以下優化服務啟動會有WARNING警告,但服務可以正常啟動和執行。

1、禁用Linux透明大頁()

         cd /etc/init.d

         wget http://y-tools.up366.cn/tools/mongodb/disable-transparent-hugepages

         chmod 755 /etc/init.d/disable-transparent-hugepages

         chkconfig --add disable-transparent-hugepages

          /etc/init.d/disable-transparent-hugepages start

2、/proc/sys/net/core/somaxconn  socket監聽(listen)的backlog上限(系統預設是128,限制了接收新 TCP 連線偵聽佇列的大小,redis配置檔案預設tcp-backlog是511)

        編輯/etc/sysctl.conf檔案新增以下內容

        net.core.somaxconn = 1024

        執行命令使生效:sysctl -p

3、記憶體分配策略()

        編輯/etc/sysctl.conf檔案新增以下內容

        vm.overcommit_memory = 1

        執行命令使生效:sysctl -p

開始部署

解壓:tar -zxvf redis-3.0.7.tar.gz

安裝:

進入解壓後的目錄(redis-3.0.7) 

make  PREFIX=/usr/local/redis3  (如果有malloc的報錯,則執行  make PREFIX=/usr/local/redis3 MALLOC=libc )

如果編譯的時候遇見如下圖錯誤,則執行如下命令。

yum install -y gcc epel-release jemalloc-devel;cd deps/; make hiredis  jemalloc  linenoise  lua

cd ..

make

echo $?

接著裝

make install PREFIX=/usr/local/redis3
mkdir -p /usr/local/redis3/conf /database/redis /var/log/redis

2、配置一個redis例項(以例項埠為6379為例)

建立例項資料儲存目錄

mkdir -p /database/redis/redis_6379

從解壓目錄(redis-3.0.7)中複製配置檔案redis.conf到/usr/local/redis3/conf目錄下

1、redis叢集配置檔案

redis主備&哨兵模式配置檔案:redis_6379.conf

redis_cluster叢集配置檔案:redis_cluster.conf

2、redis單機配置檔案

cp redis.conf /usr/local/redis3/conf/redis_6379.conf

編輯配置檔案redis_6379.conf,按照下表中的配置項修改配置檔案
配置項 配置引數 配置項含義
1 port 6379 #指定例項埠
2 logfile "/var/log/redis/redis_6379.log" #指定日誌檔案路徑
3 dir /database/redis/redis_6379/ #指定資料儲存目錄
4 pidfile /var/run/redis_6379.pid #指定pid檔案路徑
5 dbfilename dump.rdb #指定dump檔名
6 daemonize yes #指定是否後臺執行,yes:是,no:否
7 appendonly yes #啟用AOF持久化方式,yes:啟用,no:禁用

啟動、關閉服務和檢查

1、啟動

啟動redis服務:/usr/local/redis3/bin/redis-server /usr/local/redis3/conf/redis_6379.conf

檢查服務程序是否正常:ps -ef |grep 6379

檢查日誌是否有報錯:/var/log/redis/redis_6379.log

2、關閉

獲取程序pid:ps -ef |grep 6379

關閉服務:kill -2 pid 

檢查服務程序狀態確認是否關閉:ps -ef |grep 6379

錯誤

主從連線不上

1.主庫 info replication 沒有slave連線 
檢視主日誌,看病因  我這次是配置有漏寫的引數,也不知道咋就沒了
12365:M 05 Aug 10:30:02.029 # Redis is now ready to exit, bye bye...
28422:signal-handler (1596594644) Received SIGTERM scheduling shutdown...
28422:M 05 Aug 10:30:44.190 # User requested shutdown...
28422:M 05 Aug 10:30:44.190 * Calling fsync() on the AOF file.
28422:M 05 Aug 10:30:44.190 * Saving the final RDB snapshot before exiting.
28422:M 05 Aug 10:30:44.190 # Failed opening .rdb for saving: No such file or dire
  ory
28422:M 05 Aug 10:30:44.190 # Error trying to save the DB, can't exit.
28422:M 05 Aug 10:30:44.190 # SIGTERM received but errors trying to shut down the
server, check the logs for more information
28422:M 05 Aug 10:35:23.454 * Slave 192.168.0.143:6379 asks for synchronization
28422:M 05 Aug 10:35:23.454 * Full resync requested by slave 192.168.0.143:6379
28422:M 05 Aug 10:35:23.454 * Starting BGSAVE for SYNC with target: disk
28422:M 05 Aug 10:35:23.454 * Background saving started by pid 18101
18101:C 05 Aug 10:35:23.454 # Failed opening .rdb for saving: No such file or dire
ctory
28422:M 05 Aug 10:35:23.525 # Background saving error
28422:M 05 Aug 10:35:23.525 # Connection with slave 192.168.0.143:6379 lost.
28422:M 05 Aug 10:35:23.525 # SYNC failed. BGSAVE child returned an error

#現在正常了
[root@node-1 ~]# /usr/local/redis3/bin/redis-cli -p 6379 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.143,port=6379,state=online,offset=85,lag=0
slave1:ip=192.168.0.144,port=6379,state=online,offset=85,lag=0
master_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84

配置sentinel

1、搭建主從複製
1.1修改主配置檔案

/usr/local/redis3/conf/redis_6379.conf

slave-read-only yes    #slave只允許讀,預設是開啟的 ,檢查一下

1.2修改從配置檔案

/usr/local/redis3/conf/redis_6379.conf

新增下面的一項:

slaveof 192.168.0.142(masterIP) 6379

1.3啟動Redis(三個節點均啟動)

/usr/local/redis3/bin/redis-server /usr/local/redis3/conf/redis_6379.conf  &

1.4驗證主從

主庫:/usr/local/redis/bin/redis-cli 

127.0.0.1:6379> info replication

2、配置Sentinel
2.1編輯Sentinel配置檔案

vim /usr/local/redis3/conf/sentinel.conf

port 26379
daemonize yes
dir /database
logfile "/var/log/redis/sentinel.log"                            
sentinel monitor mymaster 192.168.0.142 6379 2  #監控主節點名稱  主節點ip  主節點埠號  票數
sentinel down-after-milliseconds mymaster 6000   # 超時時間,判定將主節點標記為主觀下線的時間
sentinel failover-timeout mymaster 30000              #最大故障轉移時間

注:三個節點均新增如上的配置

2.2啟動Sentinel(三個節點均開啟)

 ./redis-server /usr/local/redis3/conf/sentinel.conf  --sentinel  &

檢驗是否啟動:ps -ef |grep redis

錯誤

sentinel啟動失敗

1.大意了 配置寫重複了
[root@node-1 redis-3.0.7]# /usr/local/redis3/bin/redis-sentinel  /usr/local/redis3/conf/sentinel.conf 

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 218
>>> 'logfile "var/log/redis/sentinel.log"'
Can't open the log file: No such file or directory

2.配置的位置也要放對,monitor 要在上面
port 26379
daemonize yes
dir /database
logfile "/var/log/redis/sentinel.log"                            
sentinel monitor mymaster 192.168.0.142 6379 2  #監控主節點名稱  主節點ip  主節點埠號  票數
sentinel down-after-milliseconds mymaster 6000   # 超時時間,判定將主節點標記為主觀下線的時間
sentinel failover-timeout mymaster 30000              #最大故障轉移時間

# sentinel monitor <master-name> <ip> <redis-port> <quorum>
#
# Tells Sentinel to monitor this master, and to consider it in O_DOWN
# (Objectively Down) state only if at least <quorum> sentinels agree.
#
# Note that whatever is the ODOWN quorum, a Sentinel will require to

3.不要有註釋
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 5
>>> 'sentinel monitor mymaster 192.168.0.142 6379 2  #監控主節點名稱  主節點ip  主節點埠號  票數'
Unrecognized sentinel configuration statement.

sentinel 手動強行故障轉移

[root@node-1 redis-3.0.7]# /usr/local/redis3/bin/redis-cli -p 26379 
127.0.0.1:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.0.142"
2) "6379"
127.0.0.1:26379> sentinel ckquorum mymaster
OK 3 usable Sentinels. Quorum and failover authorization can be reached
127.0.0.1:26379> sentinel failover mymaster
OK
127.0.0.1:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.0.143"
2) "637


#對應日誌
2496:X 05 Aug 14:37:18.266 # Executing user requested FAILOVER of 'mymaster'
2496:X 05 Aug 14:37:18.266 # +new-epoch 10
2496:X 05 Aug 14:37:18.266 # +try-failover master mymaster 192.168.0.142 6379
2496:X 05 Aug 14:37:18.314 # +vote-for-leader 4d465de44a83ff175322c6de7767977c70f35d66 10
2496:X 05 Aug 14:37:18.314 # +elected-leader master mymaster 192.168.0.142 6379
2496:X 05 Aug 14:37:18.314 # +failover-state-select-slave master mymaster 192.168.0.142 6379
2496:X 05 Aug 14:37:18.372 # +selected-slave slave 192.168.0.143:6379 192.168.0.143 6379 @ mymaster 192.168.0.142 6379
2496:X 05 Aug 14:37:18.372 * +failover-state-send-slaveof-noone slave 192.168.0.143:6379 192.168.0.143 6379 @ mymaster 192.168.0.14
2 6379
2496:X 05 Aug 14:37:18.430 * +failover-state-wait-promotion slave 192.168.0.143:6379 192.168.0.143 6379 @ mymaster 192.168.0.142 63
79
2496:X 05 Aug 14:37:19.372 # +promoted-slave slave 192.168.0.143:6379 192.168.0.143 6379 @ mymaster 192.168.0.142 6379
2496:X 05 Aug 14:37:19.372 # +failover-state-reconf-slaves master mymaster 192.168.0.142 6379
2496:X 05 Aug 14:37:19.403 * +slave-reconf-sent slave 192.168.0.144:6379 192.168.0.144 6379 @ mymaster 192.168.0.142 6379
2496:X 05 Aug 14:37:20.121 * +slave-reconf-inprog slave 192.168.0.144:6379 192.168.0.144 6379 @ mymaster 192.168.0.142 6379
2496:X 05 Aug 14:37:20.121 * +slave-reconf-done slave 192.168.0.144:6379 192.168.0.144 6379 @ mymaster 192.168.0.142 6379
2496:X 05 Aug 14:37:20.222 # +failover-end master mymaster 192.168.0.142 6379
2496:X 05 Aug 14:37:20.222 # +switch-master mymaster 192.168.0.142 6379 192.168.0.143 6379
2496:X 05 Aug 14:37:20.222 * +slave slave 192.168.0.144:6379 192.168.0.144 6379 @ mymaster 192.168.0.143 6379
2496:X 05 Aug 14:37:20.222 * +slave slave 192.168.0.142:6379 192.168.0.142 6379 @ mymaster 192.168.0.143 6379

錯誤

127.0.0.1:26379> sentinel failover mymaster
(error) NOGOODSLAVE No suitable slave to promote

#日誌錯誤   
879:X 05 Aug 13:10:12.746 # +new-epoch 8
879:X 05 Aug 13:10:12.774 # +vote-for-leader 31ea2825253abac5afa241f349c19e92552df809 8
879:X 05 Aug 13:10:12.774 # Next failover delay: I will not start a failover before Wed Aug  5 13:11:13 2020
879:X 05 Aug 13:11:12.936 # +new-epoch 9
879:X 05 Aug 13:11:12.962 # +vote-for-leader fe4ad23023c3cd87afb9b4c04eaf4e5be4cbc2fe 9
879:X 05 Aug 13:11:12.963 # Next failover delay: I will not start a failover before Wed Aug  5 13:12:13 2020

1.看部落格作者說網上有人說是down-after-milliseconds引數值設定得太小了,但是redis版本預設是三十秒,我這也是新搭建的redis,裡面幾乎沒有資料,故障轉移的時間感覺夠用了。 之前我設定的3000 後來改成6000 。failover 還是30000,感覺跟這個沒關係,以前設定低都沒問題
2.看另一個方法是將從節點的 bind 127.0.0.1 去掉 ,我將1和2 都修改了,最後執行命令沒問題了

參考連結 :https://blog.csdn.net/u012062455/article/details/86749198

kill master 故障轉移過程

2496:X 05 Aug 15:04:17.391 # +sdown master mymaster 192.168.0.143 6379
2496:X 05 Aug 15:04:17.449 # +odown master mymaster 192.168.0.143 6379 #quorum 3/2
2496:X 05 Aug 15:04:17.449 # +new-epoch 11
2496:X 05 Aug 15:04:17.449 # +try-failover master mymaster 192.168.0.143 6379
2496:X 05 Aug 15:04:17.509 # +vote-for-leader 4d465de44a83ff175322c6de7767977c70f35d66 11
2496:X 05 Aug 15:04:17.509 # 192.168.0.144:26379 voted for 460ac1d714a5fbefdeb56a14a0c8399ea3488ad8 11
2496:X 05 Aug 15:04:17.560 # 192.168.0.143:26379 voted for 460ac1d714a5fbefdeb56a14a0c8399ea3488ad8 11
2496:X 05 Aug 15:04:18.725 # +config-update-from sentinel 192.168.0.144:26379 192.168.0.144 26379 @ mymaster 192.168.0.143 6379
2496:X 05 Aug 15:04:18.725 # +switch-master mymaster 192.168.0.143 6379 192.168.0.142 6379
2496:X 05 Aug 15:04:18.725 * +slave slave 192.168.0.144:6379 192.168.0.144 6379 @ mymaster 192.168.0.142 6379
2496:X 05 Aug 15:04:18.725 * +slave slave 192.168.0.143:6379 192.168.0.143 6379 @ mymaster 192.168.0.142 6379
2496:X 05 Aug 15:04:24.729 # +sdown slave 192.168.0.143:6379 192.168.0.143 6379 @ mymaster 192.168.0.142 6379

#起舊的master
2496:X 05 Aug 15:10:30.044 # -sdown slave 192.168.0.143:6379 192.168.0.143 6379 @ mymaster 192.168.0.142 6379

127.0.0.1:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.0.142"
2) "6379"

詳細參考連結:https://www.cnblogs.com/guolianyu/p/10249687.html

手動新增刪除從節點

1.新建節點

1.1 建立例項資料儲存目錄

[root@node-3 redis-3.0.7]# mkdir -p /database/redis/redis_6379

1.2 redis單機配置檔案

[root@node-3 redis-3.0.7]#cp redis.conf /usr/local/redis3/conf/redis_6380.conf

1.3修改配置

daemonize  	yes
pidfile	/var/run/redis_6380.pid	
port  	6380
logfile  	"/var/log/redis/redis_6380.log"
dbfilename      dump.rdb
dir	/database/redis/redis_6380/
appendonly  	yes

1.4 啟動

/usr/local/redis3/bin/redis-server /usr/local/redis3/conf/redis_6380.conf

2.新增從節點

2.1從節點執行,新增

[root@node-3 redis-3.0.7]# /usr/local/redis3/bin/redis-cli  -h 192.168.0.144 -p 6380
192.168.0.144:6380> slaveof 192.168.0.142 6379
OK

2.2主節點執行 ,驗證

[root@node-1 redis-3.0.7]# /usr/local/redis3/bin/redis-cli -p 6379 info replication 
# Replication
role:master
connected_slaves:3
slave0:ip=192.168.0.144,port=6379,state=online,offset=1188902,lag=1
slave1:ip=192.168.0.143,port=6379,state=online,offset=1188902,lag=1
slave2:ip=192.168.0.144,port=6380,state=online,offset=1189045,lag=0
master_repl_offset:1189045
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:140470
repl_backlog_histlen:1048576

3.刪除節點

3.1 從庫已經脫離叢集情況

直接 進入sentinel(每個sentinel都要操作,但需要一個一個操作,間隔30s以上,不要所有節點同時操作)

  • 本次以其中一臺為例,其他sentinel都要執行
[root@node-1 redis-3.0.7]# /usr/local/redis3/bin/redis-cli -p 26379
執行:

127.0.0.1:26379> sentinel reset *(傳送此命令給所有的sentinel,它們將會更新列表裡存在的master和slave資訊。)

檢查各sentinel資訊是否一致:

127.0.0.1:26379> sentinel master mymaster
29) "num-slaves"
30) "2"
31) "num-other-sentinels"
32) "2"

3.2從庫還在叢集內的情況

3.2.1 先停掉想要剔除的從節點redis服務

ps -ef | grep redis

kill  + redis程序號

3.2.2 再將配置中的資訊刪除

# Generated by CONFIG REWRITE
slaveof 192.168.0.142 6379  <--刪掉

3.3.3 進入每個sentinel 中,清除從節點資訊,就是更新sentinel配置

本次以其中一臺sentinel為例,其他sentinel都要執行

[root@node-1 redis-3.0.7]# /usr/local/redis3/bin/redis-cli -p 26379

#更新哨兵配置
127.0.0.1:26379> sentinel reset *  
(integer) 1
命令註釋:傳送此命令給所有的sentinel,它們將會更新列表裡存在的master和slave資訊。

#檢查資訊
127.0.0.1:26379> sentinel master mymaster 
29) "num-slaves"
30) "2"
31) "num-other-sentinels"
32) "2"

手動新增,刪除sentinel 節點

1.新增sentinel節點

1.1準備sentinel配置檔案

[root@node-3 redis-3.0.7]#  mv sentinel.conf   /usr/local/redis3/conf/ sentinel_26380.conf 

1.2編輯sentinel配置

[root@node-3 redis-3.0.7]#  mv sentinel.conf   /usr/local/redis3/conf/ sentinel_26380.conf 

vim /usr/local/redis3/conf/sentinel_26380.conf

port 26380
daemonize yes
dir "/database/sentinel_26380"
logfile "/var/log/redis/sentinel_26380.log"
sentinel monitor mymaster 192.168.0.142 6379 2   #主節點名稱  主節點ip  主節點埠號  票數
sentinel down-after-milliseconds mymaster 6000    #判斷將主節點標記為主觀下線的時間
sentinel failover-timeout mymaster 30000               #最大故障轉移時間

[root@node-3 redis-3.0.7]#  mkdir -p  /database/sentinel_26380

1.3啟動sentinel,其它sentinel節點即可自動識別

[root@node-3 redis-3.0.7]# /usr/local/redis3/bin/redis-sentinel /usr/local/redis3/conf/sentinel_26380.conf 

1.4檢查sentinel叢集狀態

[root@node-1 redis-3.0.7]# /usr/local/redis3/bin/redis-cli -p 26379 
127.0.0.1:26379> sentinel get-master-addr-by-name mymaster
29) "num-slaves"
30) "2"
31) "num-other-sentinels"
32) "3"  
#3個 sentinel  新增成功

2.刪除sentinel 節點

注:因為sentinel永遠不會刪除一個已經存在過的sentinel,即使它已經與組織失去聯絡很久了

2.1 停止要刪除的sentinel

ps -ef |grep redis 
kill  [要刪除sentinel的pid]

2.2所有sentinel 執行更新配置命令

本次以其中一臺為例,其他sentinel都要執行

[root@node-1 redis-3.0.7]# /usr/local/redis3/bin/redis-cli -p 26379 
127.0.0.1:26379> sentinel reset *
(integer) 1

2.3 檢查sentinel叢集資訊

127.0.0.1:26379> sentinel master mymaster 
...
29) "num-slaves"
30) "2"
31) "num-other-sentinels"
32) "2"
...
#2個sentinel 刪除成功