(轉)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
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 |
---|
啟動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 的主觀下線狀態就會被移除。
轉自https://www.cnblogs.com/jaycekon/p/6237562.html
原文出處:jaycekong