Redis單個分片高可用&哨兵集群


前面的多個redis節點,都是一個節點存儲一個分片的信息,如果單個節點宕機,會導致這個分片的數據未命中,這就需要實現單個分片的高可用,通過配置多個從節點來backup主節點。另外主從節點之間是沒有一個監聽者的,主節點宕機后,從節點不會知道自己有上位的機會,redis提供的哨兵就是一個監聽者的角色,它可以實現主從的故障轉移。

單個分片高可用

實現單個分片高可用,需要實現主從復制,即配置一個主節點,多個從節點,主節點上的數據可以復制到從節點上。redis有一主多從,和多級主從的結構,主從結構不宜復雜,這樣會讓數據同步的路徑更多,會有不穩定的風險。

一主多從,企業常用,一般配置1主6從。

 

多級主從結構示意。

下面在單台centos服務器中,配置一主兩從的結構,實現主從復制。

(1)准備3個redis.conf文件,啟動時加載用,里面修改端口號為6382、6383和6384,其他配置參考https://www.cnblogs.com/youngchaolin/p/11983705.html

# 三個文件以端口號來區分,啟動加載時不容易出錯
-rw-r--r--. 1 root root 46750 Dec 8 05:05 redis6382.conf -rw-r--r--. 1 root root 46750 Dec 8 05:06 redis6383.conf -rw-r--r--. 1 root root 46750 Dec 8 05:06 redis6384.conf

(2)redis-server redisXXXX.conf來啟動三個redis節點,使用info命令選一個來查看信息,發現都是默認自己就是master主節點,並且從節點數為0。

啟動redis-server。

[root@node01 /home/software/redis-3.2.11]# redis-server redis6382.conf
[root@node01 /home/software/redis-3.2.11]# redis-server redis6383.conf
[root@node01 /home/software/redis-3.2.11]# redis-server redis6384.conf
[root@node01 /home/software/redis-3.2.11]# ps -ef|grep redis
root      8828     1  0 05:09 ?        00:00:00 redis-server *:6382
root      8832     1  0 05:09 ?        00:00:00 redis-server *:6383
root      8836     1  0 05:09 ?        00:00:00 redis-server *:6384
root      8869  5351  0 05:11 pts/1    00:00:00 grep redis
You have new mail in /var/spool/mail/root

info replication命令查看節點信息。

# 參考了文末博文
127.0
.0.1:6382> info replication # Replication role:master #角色主節點,slave就是從節點 connected_slaves:0 #連接的從節點數為0 master_repl_offset:0 # 主節點復制偏移量 repl_backlog_active:0 #復制積壓緩沖區是否開啟 repl_backlog_size:1048576 #復制積壓緩沖區大小 repl_backlog_first_byte_offset:0 #復制積壓緩沖區偏移量大小 repl_backlog_histlen:0 #等於master_repl_offset - repl_backlog_first_byte_offset,該值不會超過repl_backlog_size的大小

(3)將6383和6384的從節點掛接到6382主節點,有兩種方式來實現,分為臨時和永久兩種方式,重啟服務后臨時方式的主從關系將消失,永久方式的主從啟動后就會存在。

a.臨時掛接,需要登錄到6383和6384的客戶端,使用slaveof master的IP master的端口來實現,完成后登錄6382來使用info replication繼續查看信息。

[root@node01 /home/software/redis-3.2.11]# redis-cli -p 6383
# 臨時掛接使用127.0.0.1 127.0.0.1:6383> slaveof 127.0.0.1 6382 OK 127.0.0.1:6383> quit [root@node01 /home/software/redis-3.2.11]# redis-cli -p 6384
# 掛接 127.0.0.1:6384> slaveof 127.0.0.1 6382 OK 127.0.0.1:6384> quit [root@node01 /home/software/redis-3.2.11]# redis-cli -p 6382
# 查看信息,發現發生了變化 127.0.0.1:6382> info replication # Replication role:master # 角色依然為主 connected_slaves:2 # 有兩個從節點,下面就是從節點信息 slave0:ip=127.0.0.1,port=6383,state=online,offset=43,lag=0 slave1:ip=127.0.0.1,port=6384,state=online,offset=43,lag=0 master_repl_offset:43 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:42

查看從節點信息,其中slave_repl_offset偏移量在主節點宕機后,會作為一個判斷的依據,偏移量越大代表從節點上的數據越新,越有可能成為新的主節點。

[root@node01 /home/software/redis-3.2.11]# redis-cli -p 6383
127.0.0.1:6383> info replication
# Replication
role:slave # 從節點
master_host:127.0.0.1 # master ip
master_port:6382 # master 端口
master_link_status:up # 與master的同步狀態,up代表連接,down代表斷開
master_last_io_seconds_ago:9 # 主節點多少秒沒發送數據到從節點
master_sync_in_progress:0 # 主節點是否和從節點在同步
slave_repl_offset:323 # 從節點復制偏移量
slave_priority:100 # 從節點的優先級,默認100,可以修改
slave_read_only:1 # 從節點是否只讀,1代表只讀,代表只能查看不能刪除修改數據
connected_slaves:0 # 連接的從節點個數
master_repl_offset:0 # 主節點復制偏移量
repl_backlog_active:0 # 同上
repl_backlog_size:1048576 # 同上
repl_backlog_first_byte_offset:0 # 同上
repl_backlog_histlen:0 # 同上

b.永久掛接,需要修改從節點redis.conf配置文件,啟動服務后,使用上面命令查看,啟動redis服務后就是主從關系,重啟后依然是主從關系。

# 添加永久配置,這里使用實際的ip,當前centos6.5的ip為192.168.200.140
# slaveof <masterip> <masterport> slaveof 192.168.200.140 6382

(4)主節點寫入數據,查看從節點,發現成功的同步了主節點的數據。

# 主節點添加一個hash類型數據
127.0
.0.1:6382> hmset messi score 11 assist 10 shoot 5 OK 127.0.0.1:6382> hmget messi score assist shoot 1) "11" 2) "10" 3) "5" 127.0.0.1:6382> quit You have new mail in /var/spool/mail/root
# 6383從節點有復制到數據 [root@node01
/home/software/redis-3.2.11]# redis-cli -p 6383 127.0.0.1:6383> keys * 1) "messi" 127.0.0.1:6383> hmget messi score assist shoot 1) "11" 2) "10" 3) "5" 127.0.0.1:6383> quit
# 6384從節點也有復制到數據 [root@node01
/home/software/redis-3.2.11]# redis-cli -p 6384 127.0.0.1:6384> keys * 1) "messi"

另外從節點默認配置是只讀的,想刪除上面的數據會報錯提示只讀,只能從主節點來刪除數據。

127.0.0.1:6384> flushdb
(error) READONLY You can't write against a read only slave.

從redis2.6開始,配置文件里從節點默認是只讀。

哨兵集群故障轉移

在上面配置了主從關系后,如果將6382主節點宕機掉,查看從節點信息,發現依然顯示是從節點。這樣只實現了主從復制,不能實現主從故障轉移和替換,即不能實現主節點掛掉,從節點頂上去提供服務的功能,如果使用SharedJedisPool來連接,還需要修改連接的ip和端口,這樣會很麻煩。

127.0.0.1:6383> info replication
# Replication
role:slave # 依然是從節點
master_host:127.0.0.1
master_port:6382
master_link_status:down # 主節點宕機了,從節點依然是從節點
...省略

這樣就需要一個監聽者來管理這些節點,redis提供了這樣的角色,就是哨兵sentinal,啟動哨兵進程后,就可以實現監聽管理,以下是它的原理圖。

(1)master和slave之間實現主從復制。

(2)哨兵啟動后,會連接master,通過10秒一次的頻率,會通過向master發送INFO命令來獲取master和slave的信息,保存到內存后持久化到sentinal配置文件中。

(3)哨兵(這里只有一個)監聽所有的master和slave,會通過每秒一次的PING命令,確認master和slave是否還正常"活着"。

     

(4)當一個哨兵檢測到master宕機后,會被認為是sdown,即subjective down(主觀宕機),當哨兵集群中的大多數(過半)認為master down,才會認為是odown,即objective down(客觀宕機,真的宕機),這個時候就需要投票選舉新的master了。

(5)當某個master被判定為主觀宕機后,接下來哨兵集群內部會進行選舉,也是通過過半機制選舉出一個領頭哨兵,並由這個領頭哨兵來進行主節點的故障轉移。

(6)哨兵選舉出來后,接下來會從從slave中選取出一個合格的節點來作為新的master,並且其他的slave改為和這個新的master進行復制,原master節點會被設置為新master的slave,當它恢復后會作為slave掛接到新的master上。

(7)領頭哨兵選舉新的master會經歷重重篩選,它會先所有的slave的信息保存到一個列表中。

(8)剔除列表中下線或斷線的的slave,保存剩下的salve都是"活的"。

(9)剔除列表中最近5s都沒有回復領頭哨兵INFO命令的slave,保存剩下的slave都是最近能正常通信的。

(10)剔除和原master斷開連接超過down-after-milliseconds*10毫秒的slave,這個值默認是30s,這樣剔除的作用的是保證剩下的slave都是最近和原master有連接的,相比很早斷開連接的salve,這些slave上的數據會更具有時效性。

# 這個時間配置在sentinel.conf文件中
# sentinel down-after-milliseconds <master-name> <milliseconds> # # Number of milliseconds the master (or any attached slave or sentinel) should # be unreachable (as in, not acceptable reply to PING, continuously, for the # specified period) in order to consider it in S_DOWN state (Subjectively # Down). # # Default is 30 seconds.

(11)通過優先級的大小對剩下的slave進行排序,優先級最高的slave獲取到繼續選舉的權利。

(12)如果剩下的slave優先級相同的有多個,會繼續比較slave_repl_offset,即復制偏移量,會選出復制偏移量最大的slave,偏移量越大代表從原master復制到的數據更具時效性。

(13)如果剩下的slave優先級最高,復制偏移量最大的有多個,會繼續比較運行ID,選出運行ID最小的slave作為新的master。

(14)當新的master選舉出來后,領頭哨兵會給它發送SLAVEOF no one命令,即不會讓它成為任何一個節點的slave。並按照每秒1次的高頻率來給它發送INFO命令,如果返回的role信息為master,則領頭哨兵才會放心的認為已經選舉出新的master了。

配置哨兵集群

下面在上面主從復制功能的基礎上,添加哨兵集群、實現對一個分片的高可用 。

(1)准備sentinal.conf文件,修改端口號,保護模式設置為no,並設置監聽的主節點。

# 先准備三份配置文件
[root@node01 /home/software/redis-3.2.11]# cp sentinel.conf sentinel26379.conf [root@node01 /home/software/redis-3.2.11]# cp sentinel.conf sentinel26380.conf [root@node01 /home/software/redis-3.2.11]# cp sentinel.conf sentinel26381.conf

以26379的哨兵為例,除了修改保護模式為no,端口號修改為對應端口號外,還需要配置監聽主節點邏輯,其中監聽主節點配置各個字段的解釋:

sentinal monitor:代表這個參數的key;

mymaster:代表master的代號;

ip:master的ip;

redis-port:master的端口號,這里的初始主節點是6382;

quorum:主觀投票下限次數,如果是3個哨兵集群,則是2,如果是5個哨兵集群,則是3,采取過半機制

# 保護模式設置為no
protected-mode no # 端口號,三個文件分別修改為26379、26380、26381 # port <sentinel-port> # The port that this sentinel instance will run on port 26379 # 配置監聽主節點 # sentinel monitor <master-name> <ip> <redis-port> <quorum>
# ip寫主機的實際ip,寫127.0.0.1后面使用api會連不上 sentinel monitor mymaster 192.168.200.140 6382 2

(2)在master和slave都啟動的情況下,啟動一個哨兵,觀察控制台情況。發現哨兵啟動后,就通過master,獲取到了兩個salve的信息,這是因為調用了info命令。

[root@node01 /home/software/redis-3.2.11]# redis-sentinel sentinel26379.conf
1680:X 09 Dec 13:10:11.322 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.11 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 1680
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

1680:X 09 Dec 13:10:11.324 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
# 生成的myid會持久化到配置文件中
1680:X 09 Dec 13:10:11.326 # Sentinel ID is 6d9373993f231a33686485a7e3baf205ff98d7b7
# 監聽6382的節點
1680:X 09 Dec 13:10:11.326 # +monitor master mymaster 192.168.200.140 6382 quorum 2
# 通過6382 master主節點調用info命令獲取到slave節點的信息 1680:X 09 Dec 13:10:11.326 * +slave slave 192.168.200.140:6383 192.168.200.140 6383 @ mymaster 192.168.200.140 6382 1680:X 09 Dec 13:10:11.329 * +slave slave 192.168.200.140:6384 192.168.200.140 6384 @ mymaster 192.168.200.140 6382

配置文件中新增myid

(3)開啟另外兩個哨兵,發現啟動后,26379啟動的控制台里會添加提示獲取到其它兩台的哨兵的信息,其它兩台也是如此。

26379的關於哨兵的日志

# 發現了26380和26381
1931
:X 09 Dec 13:25:48.461 * +sentinel sentinel 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 192.168.200.140 26380 @ mymaster 192.168.200.140 6382 1931:X 09 Dec 13:25:55.809 * +sentinel sentinel 2b402bba6fde9ba010a8f7cd9b2106356aad17cc 192.168.200.140 26381 @ mymaster 192.168.200.140 6382

26380的部分日志

1934:X 09 Dec 13:25:46.323 # Sentinel ID is 931e5386f5d0e31a70cc14a5aa418d68fb46feb4
1934:X 09 Dec 13:25:46.323 # +monitor master mymaster 192.168.200.140 6382 quorum 2
1934:X 09 Dec 13:25:46.323 * +slave slave 192.168.200.140:6384 192.168.200.140 6384 @ mymaster 192.168.200.140 6382
1934:X 09 Dec 13:25:46.324 * +slave slave 192.168.200.140:6383 192.168.200.140 6383 @ mymaster 192.168.200.140 6382
# 發現26379和26381 1934:X 09 Dec 13:25:46.975 * +sentinel sentinel 6d9373993f231a33686485a7e3baf205ff98d7b7 192.168.200.140 26379 @ mymaster 192.168.200.140 6382 1934:X 09 Dec 13:25:55.809 * +sentinel sentinel 2b402bba6fde9ba010a8f7cd9b2106356aad17cc 192.168.200.140 26381 @ mymaster 192.168.200.140 6382

26381的部分日志

1937:X 09 Dec 13:25:53.763 # Sentinel ID is 2b402bba6fde9ba010a8f7cd9b2106356aad17cc
1937:X 09 Dec 13:25:53.763 # +monitor master mymaster 192.168.200.140 6382 quorum 2
1937:X 09 Dec 13:25:53.765 * +slave slave 192.168.200.140:6384 192.168.200.140 6384 @ mymaster 192.168.200.140 6382
1937:X 09 Dec 13:25:53.767 * +slave slave 192.168.200.140:6383 192.168.200.140 6383 @ mymaster 192.168.200.140 6382
# 發現26379和26380 1937:X 09 Dec 13:25:54.715 * +sentinel sentinel 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 192.168.200.140 26380 @ mymaster 192.168.200.140 6382 1937:X 09 Dec 13:25:55.159 * +sentinel sentinel 6d9373993f231a33686485a7e3baf205ff98d7b7 192.168.200.140 26379 @ mymaster 192.168.200.140 6382

可以看到哨兵通過連接主節點6382,獲取到了從節點的信息,並且還獲取到其它哨兵的信息,獲取到的信息會持久化到配置文件中,添加到文件尾部,以26379為例。

(4)將6382主節點宕機,觀察每個哨兵控制台情況。

26379的部分日志

# 26379判斷6382主觀宕機
1931
:X 09 Dec 13:32:56.471 # +sdown master mymaster 192.168.200.140 6382
# new-epoch 1,1代表邏輯時鍾值,類似zookeeper的epoch,是自增的整數,使用一個計數器來實現。 1931:X 09 Dec 13:32:56.595 # +new-epoch 1
# 選舉領頭哨兵,選舉了尾部為feb4的哨兵,即26380端口號的哨兵 1931:X 09 Dec 13:32:56.596 # +vote-for-leader 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 1 1931:X 09 Dec 13:32:56.934 # +config-update-from sentinel 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 192.168.200.140 26380 @ mymaster 192.168.200.140 6382
# 切換master,6382到6384,這個時候已經選舉出新的master 1931:X 09 Dec 13:32:56.934 # +switch-master mymaster 192.168.200.140 6382 192.168.200.140 6384
# 6382和6383變成slave,6384變成master 1931:X 09 Dec 13:32:56.934 * +slave slave 192.168.200.140:6383 192.168.200.140 6383 @ mymaster 192.168.200.140 6384 1931:X 09 Dec 13:32:56.934 * +slave slave 192.168.200.140:6382 192.168.200.140 6382 @ mymaster 192.168.200.140 6384
# 判斷6382主觀宕機 1931:X 09 Dec 13:33:26.983 # +sdown slave 192.168.200.140:6382 192.168.200.140 6382 @ mymaster 192.168.200.140 6384

26380的部分日志

# 判斷6382主觀宕機
1934
:X 09 Dec 13:32:56.490 # +sdown master mymaster 192.168.200.140 6382
# 有過半的哨兵判斷6382主觀宕機,狀態變成客觀宕機odown 1934:X 09 Dec 13:32:56.591 # +odown master mymaster 192.168.200.140 6382 #quorum 2/2
# 進入新的紀元 1934:X 09 Dec 13:32:56.591 # +new-epoch 1
# 嘗試故障轉移 1934:X 09 Dec 13:32:56.591 # +try-failover master mymaster 192.168.200.140 6382
# 選舉尾部為feb4的哨兵為領頭哨兵,即選舉自己 1934:X 09 Dec 13:32:56.593 # +vote-for-leader 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 1
# 有過半選舉26380的哨兵為領頭哨兵,則領頭哨兵開始進行master篩選。 1934:X 09 Dec 13:32:56.596 # 2b402bba6fde9ba010a8f7cd9b2106356aad17cc voted for 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 1 1934:X 09 Dec 13:32:56.596 # 6d9373993f231a33686485a7e3baf205ff98d7b7 voted for 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 1 1934:X 09 Dec 13:32:56.669 # +elected-leader master mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:56.669 # +failover-state-select-slave master mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:56.728 # +selected-slave slave 192.168.200.140:6384 192.168.200.140 6384 @ mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:56.728 * +failover-state-send-slaveof-noone slave 192.168.200.140:6384 192.168.200.140 6384 @ mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:56.787 * +failover-state-wait-promotion slave 192.168.200.140:6384 192.168.200.140 6384 @ mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:56.885 # +promoted-slave slave 192.168.200.140:6384 192.168.200.140 6384 @ mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:56.885 # +failover-state-reconf-slaves master mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:56.934 * +slave-reconf-sent slave 192.168.200.140:6383 192.168.200.140 6383 @ mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:57.739 # -odown master mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:57.951 * +slave-reconf-inprog slave 192.168.200.140:6383 192.168.200.140 6383 @ mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:57.951 * +slave-reconf-done slave 192.168.200.140:6383 192.168.200.140 6383 @ mymaster 192.168.200.140 6382 1934:X 09 Dec 13:32:58.042 # +failover-end master mymaster 192.168.200.140 6382
# 將6382成功切換為6384 1934:X 09 Dec 13:32:58.042 # +switch-master mymaster 192.168.200.140 6382 192.168.200.140 6384
# 將slave掛接到新的master上,並且將原master 6382變成了從節點slave 1934:X 09 Dec 13:32:58.042 * +slave slave 192.168.200.140:6383 192.168.200.140 6383 @ mymaster 192.168.200.140 6384 1934:X 09 Dec 13:32:58.042 * +slave slave 192.168.200.140:6382 192.168.200.140 6382 @ mymaster 192.168.200.140 6384
# 6382還沒有恢復,認定為主觀宕機
1934:X 09 Dec 13:33:28.092 # +sdown slave 192.168.200.140:6382 192.168.200.140 6382 @ mymaster 192.168.200.140 6384

26381的部分日志

1937:X 09 Dec 13:32:56.563 # +sdown master mymaster 192.168.200.140 6382
1937:X 09 Dec 13:32:56.595 # +new-epoch 1
# 選舉領頭哨兵,本次選舉三個哨兵都是選擇26380 1937:X 09 Dec 13:32:56.596 # +vote-for-leader 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 1
# 過半認為6382宕機,則判定原master6382客觀宕機 1937:X 09 Dec 13:32:56.639 # +odown master mymaster 192.168.200.140 6382 #quorum 3/2 1937:X 09 Dec 13:32:56.639 # Next failover delay: I will not start a failover before Mon Dec 9 13:38:56 2019 1937:X 09 Dec 13:32:56.935 # +config-update-from sentinel 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 192.168.200.140 26380 @ mymaster 192.168.200.140 6382 1937:X 09 Dec 13:32:56.935 # +switch-master mymaster 192.168.200.140 6382 192.168.200.140 6384 1937:X 09 Dec 13:32:56.935 * +slave slave 192.168.200.140:6383 192.168.200.140 6383 @ mymaster 192.168.200.140 6384 1937:X 09 Dec 13:32:56.935 * +slave slave 192.168.200.140:6382 192.168.200.140 6382 @ mymaster 192.168.200.140 6384 1937:X 09 Dec 13:33:26.968 # +sdown slave 192.168.200.140:6382 192.168.200.140 6382 @ mymaster 192.168.200.140 6384

發現master從6382換成了6384,目前有6383一個從節點。

[root@node01 /home/software/redis-3.2.11]# redis-cli -p 6384
127.0.0.1:6384> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.200.140,port=6383,state=online,offset=26451,lag=0
master_repl_offset:26741
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:26740

(5)將6382節點恢復,發現它會作為從節點掛接到新的主節點6384上。

1931:X 09 Dec 13:36:10.239 * +convert-to-slave slave 192.168.200.140:6382 192.168.200.140 6382 @ mymaster 192.168.200.140 6384

繼續登錄6384,發現6382變成了salve。

[root@node01 /home/software/redis-3.2.11]# redis-cli -p 6384
127.0.0.1:6384> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.200.140,port=6383,state=online,offset=49089,lag=1
slave1:ip=192.168.200.140,port=6382,state=online,offset=49234,lag=0
master_repl_offset:49234
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:49233

哨兵API的操作

有了哨兵了,可以通過連接JedisSentinelPool,來連接哨兵集群,然后通過它來獲取到Jedis實例對象,這個對象就是對外提供服務的master節點。

package com.boe;

import java.util.HashSet;
import java.util.Set;

import org.junit.Test;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;

public class SentinelTest {
    @Test
    public void sentinel(){
        //多個哨兵之間沒有監控關系,順序遍歷,哪個能通就走哪個,不通,再檢查下一個哨兵
        Set<String> sentinels = new HashSet<String>();
        sentinels.add(new HostAndPort("192.168.200.140",26379).toString());
        sentinels.add(new HostAndPort("192.168.200.140",26380).toString());
        sentinels.add(new HostAndPort("192.168.200.140",26381).toString());
        
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);
        //這一句很有用,能獲取到是否有master節點宕機
        System.out.println("當前master:" + pool.getCurrentHostMaster());
        //通過哨兵獲取 jedis 連接的就是master
        Jedis jedis = pool.getResource();
        //jedis.auth("123456");
        jedis.set("name", "messi");
        System.out.println(jedis.get("name"));
    }
}

現在master節點是6384,它不宕機的情況下,是可以對外提供服務的。

 查看redis,數據三個節點均有。

127.0.0.1:6384> get name
"messi"

現在把6384給它宕機,繼續使用上述哨兵來連接 ,修改代碼,將set的key-value做修改,然后嘗試連接,發現master變成了6382。

哨兵日志

1931:X 09 Dec 13:40:21.218 # +sdown master mymaster 192.168.200.140 6384
# 6384宕機,又會新一輪的選舉,紀元為2 1931:X 09 Dec 13:40:21.302 # +new-epoch 2 1931:X 09 Dec 13:40:21.320 # +vote-for-leader 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 2 1931:X 09 Dec 13:40:21.948 # +config-update-from sentinel 931e5386f5d0e31a70cc14a5aa418d68fb46feb4 192.168.200.140 26380 @ mymaster 192.168.200.140 6384
# 6382成為新的master,6384又變成了slave
1931:X 09 Dec 13:40:21.948 # +switch-master mymaster 192.168.200.140 6384 192.168.200.140 6382 1931:X 09 Dec 13:40:21.948 * +slave slave 192.168.200.140:6383 192.168.200.140 6383 @ mymaster 192.168.200.140 6382 1931:X 09 Dec 13:40:21.948 * +slave slave 192.168.200.140:6384 192.168.200.140 6384 @ mymaster 192.168.200.140 6382 1931:X 09 Dec 13:40:52.013 # +sdown slave 192.168.200.140:6384 192.168.200.140 6384 @ mymaster 192.168.200.140 6382

以上是對分片高可用,以及哨兵集群及故障轉移的整理,記錄一下后續查看用,后面繼續補充redis-cluster的相關內容。

 

參考博文

(1)https://blog.csdn.net/mysqldba23/article/details/68066322 info replication詳解

(2)https://www.cnblogs.com/fu-yong/p/9252837.html 哨兵

(3)https://blog.csdn.net/u012240455/article/details/81843714 哨兵 

(4)《redis設計與實踐》主節點故障轉移


免責聲明!

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



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