Redis-Redis哨兵集羣(簡介學習)

1、Sentinel 哨兵


Sentinel(哨兵)是Redis 的高可用性解決方案:由一個或多個Sentinel 實例組成的,Sentinel 系統可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,並在被監視的主服務器進入下線狀態時,自動將下線主服務器屬下的某個從服務器升級爲新的主服務器。

例如:

在Server1 掉線後:

升級Server2 爲新的主服務器:

2.Redis主從分離


在講解Sentinel 哨兵集羣之前,我們先來搭建一個簡單的主從分離(讀寫分離)。

首先,我們默認大家都已經安裝了redis,然後我們將 redis.conf 拷貝多份,並且創建多個目錄,用於區分多個redis 服務:

這裏面,每個目錄中都有自己的redis.conf 配置文件,接下來,我們先設置主服務器的配置文件。

一、配置Master

1、修改端口

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6380

redis 的默認端口是6379,這裏我們把主服務器的端口設置爲6380

2、修改pidfile

# If a pid file is specified, Redis writes it where specified at startup
# and removes it at exit.
#
# When the server runs non daemonized, no pid file is created if none is
# specified in the configuration. When the server is daemonized, the pid file
# is used even if not specified, defaulting to "/var/run/redis.pid".
#
# Creating a pid file is best effort: if Redis is not able to create it
# nothing bad happens, the server will start and run normally.
pidfile /var/run/redis_6380.pid

pidfile 是我們啓動redis 的時候,linux 爲我們分配的一個pid 進程號,如果這裏不作修改,會影響後面redis服務的啓動

3、啓動 redis

啓動redis,我們可以看到,redis已經佔領了6380 端口

進入客戶端

redis-cli -p 6380
127.0.0.1:6380> info
...
# Replication
role:master
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
...

我們可以看到,redis 現在的角色是一個master 啓動的服務。

二、配置Slave

和上面配置 master一樣,我們需要修改端口號和pid 文件,在修改完之後,我們有兩種方法配置從服務

1、在配置文件中配置從服務

################################# REPLICATION #################################

# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
#
# 1) Redis replication is asynchronous, but you can configure a master to
#    stop accepting writes if it appears to be not connected with at least
#    a given number of slaves.
# 2) Redis slaves are able to perform a partial resynchronization with the
#    master if the replication link is lost for a relatively small amount of
#    time. You may want to configure the replication backlog size (see the next
#    sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
#    network partition slaves automatically try to reconnect to masters
#    and resynchronize with them.
#
# slaveof <masterip> <masterport>
slaveof 127.0.0.1 6380

我們可以在配置文件中直接修改 slaveof 屬性,我們直接配置主服務器的ip 地址,和端口號,如果這裏主服務器有配置密碼

可以通過配置masterauth 來設置鏈接密碼

# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
# masterauth <master-password>

啓動redis 服務:

我們可以看到,現在有兩個現在在運行,我們進入6381的客戶端,看一下他的狀態

# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:71
slave_priority:100
slave_read_only: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

我們可以看到,現在的redis 是一個從服務的角色,連接着6380的服務。

2、在服務啓動後設置

我們修改6382端口的服務器配置文件之後,啓動服務

進入客戶端,查看當前服務器的狀態:

# Replication
role:master
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

我們可以看到,當前服務器的狀態時作爲一個主服務的角色在運行,我們接下來修改他的狀態:

127.0.0.1:6382> slaveof 127.0.0.1 6380

//修改後狀態
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:617
slave_priority:100
slave_read_only: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

3、總結

我們先看一下目前master 的狀態:

# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=785,lag=0
slave1:ip=127.0.0.1,port=6382,state=online,offset=785,lag=0
master_repl_offset:785
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:784

我們可以可以看到,兩個從服務已經在連着主服務器,上面兩種配置的區別在於,當salve 斷線重連之後,

如果我們是修改類配置文件,重連之後會自己鏈接上去master,並且同步master 上面的數據,

如果我們是手動連接上去的主服務器,重連之後,從服務器會讀取自己本地的 rdb 回覆數據,而不會去自動鏈接主服務

 

我們如果需要設置讀寫分離,只需要在主服務器中設置:

# Note: read only slaves are not designed to be exposed to untrusted clients
# on the internet. It's just a protection layer against misuse of the instance.
# Still a read only slave exports by default all the administrative commands
# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve
# security of read only slaves using 'rename-command' to shadow all the
# administrative / dangerous commands.
slave-read-only yes

 

3、Sentinel 哨兵


1、配置端口

在sentinel.conf 配置文件中, 我們可以找到port 屬性,這裏是用來設置sentinel 的端口,一般情況下,至少會需要三個哨兵對redis 進行監控,我們可以通過修改端口啓動多個sentinel 服務。

# port <sentinel-port>
# The port that this sentinel instance will run on
port 26379

2、配置主服務器的ip 和端口

我們把監聽的端口修改成6380,並且加上權值爲2,這裏的權值,是用來計算我們需要將哪一臺服務器升級升主服務器

# 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
# be elected by the majority of the known Sentinels in order to
# start a failover, so no failover can be performed in minority.
#
# Slaves are auto-discovered, so you don't need to specify slaves in
# any way. Sentinel itself will rewrite this configuration file adding
# the slaves using additional configuration options.
# Also note that the configuration file is rewritten when a
# slave is promoted to master.
#
# Note: master name should not include special characters or spaces.
# The valid charset is A-z 0-9 and the three characters ".-_".
sentinel monitor mymaster 127.0.0.1 6380 2

3、啓動Sentinel

/sentinel$ redis-sentinel sentinel.conf

sentinel 啓動之後,就會監視到現在有一個主服務器,兩個從服務器

當我們把其中一個從服務器器關閉之後,我們可以看到日誌:

10894:X 30 Dec 16:27:03.670 # +sdown slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380

日誌表示,6381這個從服務器已經從主服務器中脫離了出來,我們重新把6381 接回去。

10894:X 30 Dec 16:28:43.288 * +reboot slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
10894:X 30 Dec 16:28:43.365 # -sdown slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380

4、關閉Master 

我們手動關閉Master 之後,sentinel 在監聽master 確實是斷線了之後,將會開始計算權值,然後重新分配主服務器

我們可以看到,6380主服務器斷了之後,sentinel 幫我們選了6382作爲新的主服務器

我們進到6382的客戶端,查看他的狀態:

# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=13751,lag=0
master_repl_offset:13751
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:13750

我們可以看到 6382,重slave 榮升爲master

127.0.0.1:6382> set name jaycekon
OK

原本的沒有權限寫,也得到了相應的權限

5、重連Master

大家可能會好奇,如果master 重連之後,會不會搶回屬於他的位置,答案是否定的,就比如你被一個小弟搶了你老大的位置,他肯給回你這個位置嗎。因此當master 回來之後,他也只能當個小弟

 

4、Sentinel 總結


、Sentinel的作用:

A、Master 狀態監測

B、如果Master 異常,則會進行Master-slave 轉換,將其中一個Slave作爲Master,將之前的Master作爲Slave 

C、Master-Slave切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換

 

、Sentinel的工作方式:

  1. 每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實例發送一個 PING 命令 
  2. 如果一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被 Sentinel 標記爲主觀下線。
  3. 如果一個Master被標記爲主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態。
  4. 當有足夠數量的 Sentinel(大於等於配置文件指定的值)在指定的時間範圍內確認Master的確進入了主觀下線狀態, 則Master會被標記爲客觀下線 
  5. 在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令 
  6. 當Master被 Sentinel 標記爲客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發送 INFO 命令的頻率會從 10 秒一次改爲每秒一次 
  7. 若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除。 
    若 Master 重新向 Sentinel 的 PING 命令返回有效回覆, Master 的主觀下線狀態就會被移除。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章