Redis主從、哨兵模式的搭建


 壹、Redis主從分離

    准備三個redis配置文件(redis.conf),分別修改為redis6380.conf、redis6381.conf、redis6382.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服務的啟動

 

二、配置Slave

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

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

     先修改6381的配置

################################# REPLICATION #################################
#
# 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 服務:

    

     可以看到,現在有兩個現在在運行,分別進入6380、6381的客戶端,看一下狀態

    

    可看到主從的信息,6381是個從服務的角色,連着主服務6380

 2、在服務啟動后設置

    修改6382端口的服務器配置文件之后,啟動服務

         

        進入6382客戶端,查看當前服務狀態

       

      可以看到,當前服務器的狀態時作為一個主服務的角色在運行,我們接下來修改他的狀態,在其客戶端使用命令 :slaveof 127.0.0.1 6380

      修改后,查看其狀態,其作為6380的一個從服務

      

      接下來,查看目前master(6380)服務的狀態,其從服務變為6381和6382

        

 

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

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

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

 

      在master上插入鍵值數據后在slave上可以獲取到,主從同步正常,slave上只能查看,不能進行寫操作,以免破壞數據的一致性 

        

     

三、總結

      如果在主從復制架構中出現宕機的情況,需要分情況看:

     1、 從Redis宕機

          這個相對而言比較簡單,在Redis中從庫重新啟動后會自動加入到主從架構中,自動完成同步數據;

     2、 主Redis宕機

        a) 這個相對而言就會復雜一些,需要以下2步才能完成

             i.   第一步,在從數據庫中執行SLAVEOF NO ONE命令,斷開主從關系並且提升為主庫繼續服務;

             ii.   第二步,將主庫重新啟動后,執行SLAVEOF命令,將其設置為其他庫的從庫,這時數據就能更新回來;

        b)  這個手動完成恢復(人工介入)的過程其實是比較麻煩的並且容易出錯,有沒有好辦法解決呢?當前有的,Redis提供的哨兵(sentinel)的功能。

貳、Sentinel 哨兵

  redis的哨兵機制是redis2.8開始支持,而集群模式是redis3.0開始支持。

  redis的sentinel系統用於管理多個redis服務器,該系統主要執行三個任務:監控、提醒、自動故障轉移。

  1、監控(Monitoring): Redis Sentinel實時監控主服務器和從服務器運行狀態,並且實現自動切換。

  2、提醒(Notification):當被監控的某個 Redis 服務器出現問題時, Redis Sentinel 可以向系統管理員發送通知, 也可以通過 API 向其他程序發送通知。

  3、自動故障轉移(Automatic failover): 當一個主服務器不能正常工作時,Redis Sentinel 可以將一個從服務器升級為主服務器, 並對其他從服務器進行配置,讓它們使用新的主服務器。當應用程序連接Redis 服務器時, Redis Sentinel會告之新的主服務器地址和端口。

1、配置端口

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

       3個sentinel節點(sentinel-26380.conf、sentinel-26381.conf、sentinel-26382.conf)的部署方法完全是一致的(端口不同),下面以sentinel-26380.conf節點的部署為例子

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

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

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

       

  監控mymaster主服務器,服務器ip和端口,將這個主服務器判斷為下線失效至少需要2個Sentinel同意,如果多數Sentinel同意才會執行故障轉移,Sentinel會根據Master的配置
  自動發現Master的Slaves
 

3、啟動Sentinel

     啟動redis-sentinel 程序, 可以用redis提供的命令來啟動:./redis-sentinel sentinel-26380.conf &

   

   可進入redis的各自客戶端使用命令info replication 查看服務狀態

4、關閉Master 

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

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

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

    

   可以看到 6382,從slave 榮升為master 

    

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

5、重連Master

  如果master 重連之后,會不會搶回屬於他的位置,答案是否定的,因此當master 回來之后,他也只能當個從服務

    啟動原master 6380,查看其狀態,是作為6382的從服務的存在

    

6.Sentinel 總結

  一、Sentinel的作用:

   1)、Master 狀態監測
   2)、如果Master 異常,則會進行Master-slave 轉換,將其中一個Slave作為Master,將之前的Master作為Slave
   3)、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 的主觀下線狀態就會被移除。

 


免責聲明!

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



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