Redis高可用方案(主從復制,哨兵模式,分片分區)


   Redis 支持持久化保證了即使在服務器重啟的情況下也不會丟失(或少量丟失)數據,但是由於數據是存儲在一台服務器上的,如果這台服務器出現故障,比如硬盤壞了,也會導致數據丟失。為了避免單點故障,我們需要將數據復制多份部署在多台不同的服務器上,即使有一台服務器出現故障其他服務器依然可以繼續提供服務。這就要求當一台服務器上的數據更新后,自動將更新的數據同步到其他服務器上,那該怎么實現呢?

 

一: 主從復制

   Redis 提供了復制(replication)功能來自動實現多台 redis 服務器的數據同步(每天19 點新聞聯播,基本從 cctv1-8,各大衛視都會播放)。我們可以通過部署多台 redis,並在配置文件中指定這幾台 redis 之間的主從關系,主負責寫入數據,同時把寫入的數據實時同步到從機器,這種模式叫做主從復制,即master/slave,並且 redis 默認 master 用於寫,slave 用於讀,向 slave 寫數據會導致錯誤。

 

   方式 1:修改配置文件,啟動時,服務器讀取配置文件,並自動成為指定服務器的從服務器,從而構成主從復制的關系。

   方式 2: ./redis-server --slaveof <master-ip><master-port>,在啟動 redis 時指定當前服務成為某個主 Redis 服務的從 Slave。(不常用)

   方式一操作步驟:

   復制三份Redis.conf  

 

   

    編輯 Master 的配置文件 redis6380.conf(另外兩個類似) : 在空文件加入如下內容
    include /路徑/redis-版本/redis.conf
    daemonize yes
    port 6380
    pidfile /var/run/redis_6380.pid
    logfile 6380.log
    dbfilename dump6380.rdb


    配置項說明:
    include :包含原來的配置文件內容。/路徑/redis-版本/redis.conf  按照自己的目錄設置。
    daemonize:yes 后台啟動應用,相當於 ./redis-server & , &的作用。
    port : 自定義的端口號
    pidfile : 自定義的文件,表示當前程序的 pid ,進程 id。
    logfile:日志文件名
    dbfilename:持久化的 rdb 文件名


    啟動三個Redis服務:
    ./redis-server ../redis6380.conf
    ./redis-server ../redis6381.conf
    ./redis-server ../redis6382.conf

    查看他們的復制關系:info replication

   redis3680:   

  redis6381 :   

 

   容災處理
   當 Master 服務出現故障,需手動將 slave 中的一個提升為 master,剩下的 slave 掛至新的
   master 上(冷處理:機器掛掉了,再處理)
   手動容災:
   ①:slaveof no one,將一台 slave 服務器提升為 Master (提升某 slave 為 master)
   ②:slaveof 127.0.0.1 6381 (將 slave 掛至新的 master 上)

 

二: 高可用 Sentinel 哨兵

   

   Sentinel 哨兵是 redis 官方提供的高可用方案,可以用它來監控多個 Redis 服務實例的運行情況。Redis Sentinel 是一個運行在特殊模式下的 Redis 服務器。Redis Sentinel 是在多個Sentinel 進程環境下互相協作工作的。Sentinel 系統有三個主要任務:

   監控:Sentinel 不斷的檢查主服務和從服務器是否按照預期正常工作。

   提醒:被監控的 Redis 出現問題時,Sentinel 會通知管理員或其他應用程序。

   自動故障轉移:監控的主 Redis 不能正常工作,Sentinel 會開始進行故障遷移操作。將一個從服務器升級新的主服務器。讓其他從服務器掛到新的主服務器。同時向客戶端提供新的主服務器地址。

 

   復制三分Sentinel.conf 配置文件: 執行復制命令 cp sentinel.conf xxx.conf    

   1、修改 port 26380、 port 26381、 port 26382
   2、修改 sentinel monitor mymaster 127.0.0.1 6380 2
   格式:Sentinel monitor <name><masterIP><masterPort><Quorum 投票數>
   啟動 Sentinel
   執行以下三條命令,將創建三個監視主服務器的Sentinel實例:
   ./redis-sentinel ../sentinel26380.conf
   ./redis-sentinel ../sentinel26381.conf
   ./redis-sentinel ../sentinel26382.conf

    主 Redis 不能工作,讓 Master 的 Redis 停止服務,執行 shutdown
    先執行 info replication 確認 Master 的 Redis,再執行 shutdown(6380)
    重新啟動6380:./redis-server ../redis6380.conf
    Sentinel日志: 

    總結:主從復制,解決了讀請求的分擔,從節點下線,會使得讀請求能力有所下降,Master 下
線,寫請求無法執行,Sentinel 會在 Master 下線后自動執行故障轉移操作,提升一台 Slave 為 Master,並讓其它Slave 成為新 Master 的 Slave。

   

    Redis部署了主從復制和監控哨兵就萬事大吉?當然不是,當redis內存不夠怎么辦,幾台redis內存大小有差別,還容易形成木桶效應,這時候就需要考慮到Redis的分片問題,市面上提供了一些redis的分片技術,比如redis官方推薦的Redis Cluster,豌豆莢開源的codis,Twitter 開發的Twemproxy ,還有自定義客戶端分片等。  

   分區實現方案:

  • 客戶端分區就是在客戶端就已經決定數據會被存儲到哪個redis節點或者從哪個redis節點讀取。大多數客戶端已經實現了客戶端分區。
  • 代理分區 意味着客戶端將請求發送給代理,然后代理決定去哪個節點寫數據或者讀數據。代理根據分區規則決定請求哪些Redis實例,然后根據Redis的響應結果返回給客戶端。(Twemproxy)
  • 查詢路由(Query routing) 的意思是客戶端隨機地請求任意一個redis實例,然后由Redis將請求轉發給正確的Redis節點。Redis Cluster實現了一種混合形式的查詢路由,但並不是直接將請求從一個redis節點轉發到另一個redis節點,而是在客戶端的幫助下直接redirected到正確的redis節點。(Redis Cluster)

                                                                                                                                                     

三:Redis安全設置

 1.密碼設置

    訪問 Redis 默認是沒有密碼的,這樣不安全,任意用戶都可以訪問。可以啟用使用密碼才能訪問 Redis。設置 Redis 的訪問密碼,修改 redis.conf 中這行 requirepass 密碼。密碼要比較復雜,不容易破解,而且需要定期修改。因為 redis 速度相當快,所以在一台比較好的服務器下,一個外部的用戶可以在一秒鍾進行 150K 次的密碼嘗試,需要指定非常非常強大的密碼來防止暴力破解。修改 redis.conf , 使用 vim 命令。找到 requirepass 行去掉注釋,requirepass 空格后就是密碼。

 2.綁定 ip

    修改 redis.conf 文件,把# bind 127.0.0.1 前面的注釋#號去掉,然后把 127.0.0.1 改成允許訪問你 redis 服務器的 ip 地址,表示只允許該 ip 進行訪問。多個 ip 使用空格分隔。例如 bindIP地址 ip地址。

 

一致性hash和hash slat:https://www.cnblogs.com/qcblog/p/8886360.html


免責聲明!

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



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