1 、題記 php
Redis 是一個開源的使用 ANSI C 語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value 數據庫,並提供多種語言的 API。 前端
現在,互聯網業務的數據正以更快的速度在增加,數據類型愈來愈豐富,這對數據處理的速度和能力提出了更高要求。Redis 是一種開源的內存非關係型數據庫,給開發人員帶來的體驗是顛覆性的。在自始至終的設計過程當中,都充分考慮高性能,這使得 Redis 成爲當今速度最快的 NoSQL 數據庫。git
考慮高性能的同時,高可用也是很重要的考慮因素。互聯網 7x24 無間斷服務,在故障期間以最快的速度 Failover,能給企業帶來最小的損失。github
那麼,在實際應用中,都有哪些高可用架構呢?架構之間有何優劣?咱們應該怎麼取捨?有哪些最佳實踐?redis
2、Sentinel (哨兵)原理算法
在講解 Redis 高可用方案以前,咱們先來看看 Redis Sentinel 原理(https://redis.io/topics/senti...。數據庫
1 到 3 是自動發現機制:後端
4 是檢測機制,5 和 6 是 failover 機制,7 是更新配置機制。[1]緩存
3、Redis 高可用架構安全
講解完 Redis Sentinel 原理以後,接下來說解經常使用的 Redis 高可用架構。
接下來配合圖文逐個講解。
一、Redis Sentinel 集羣 + 內網 DNS + 自定義腳本
Redis Sentinel 集羣 + 內網 DNS + 自定義腳本
上圖是已經在線上環境應用的方案。底層是 Redis Sentinel 集羣,代理着 Redis 主從,Web 端鏈接內網 DNS 提供服務。內網 DNS 按照必定的規則分配,好比 xxxx.redis.cache/queue.port.xxx.xxx,第一個段表示業務簡寫,第二個段表示這是 Redis 內網域名,第三個段表示 Redis 類型,cache 表示緩存,queue 表示隊列,第四個段表示 Redis 端口,第5、第六個段表示內網主域名。
當主節點發生故障,好比機器故障、Redis 節點故障或者網絡不可達,Sentinel 集羣會調用 client-reconfig-script 配置的腳本,修改對應端口的內網域名。對應端口的內網域名指向新的 Redis 主節點。
優勢:
秒級切換,在 10s 內完成整個切換操做
腳本自定義,架構可控
對應用透明,前端不用擔憂後端發生什麼變化
缺點:
維護成本略高,Redis Sentinel 集羣建議投入 3 臺機器以上
依賴 DNS,存在解析延時
Sentinel 模式存在短期的服務不可用
服務經過外網訪問不可採用此方案
二、Redis Sentinel 集羣 + VIP + 自定義腳本
Redis Sentinel 集羣 + VIP + 自定義腳本
此方案和上一個方案相比,略有不一樣。第一個方案使用了內網 DNS,第二個方案把內網 DNS 換成了虛擬 IP。底層是 Redis Sentinel 集羣,代理着 Redis 主從,Web 端經過 VIP 提供服務。在部署 Redis 主從的時候,須要將虛擬 IP 綁定到當前的 Redis 主節點。當主節點發生故障,好比機器故障、Redis 節點故障或者網絡不可達,Sentinel 集羣會調用 client-reconfig-script 配置的腳本,將 VIP 漂移到新的主節點上。
優勢:
缺點:
三、封裝客戶端直連 Redis Sentinel 端口
部分業務只能經過外網訪問 Redis,上述兩種方案均不可用,因而衍生出了這種方案。Web 使用客戶端鏈接其中一臺 Redis Sentinel 集羣中的一臺機器的某個端口,而後經過這個端口獲取到當前的主節點,而後再鏈接到真實的 Redis 主節點進行相應的業務員操做。須要注意的是,Redis Sentinel 端口和 Redis 主節點均須要開放訪問權限。若是前端業務使用 Java,有 JedisSentinelPool 能夠複用;若是前端業務使用 PHP,能夠在 phpredis 的基礎上作二次封裝。
優勢:
缺點:
四、Redis Sentinel 集羣 + Keepalived/Haproxy
Redis Sentinel 集羣 + Keepalived/Haproxy
底層是 Redis Sentinel 集羣,代理着 Redis 主從,Web 端經過 VIP 提供服務。當主節點發生故障,好比機器故障、Redis 節點故障或者網絡不可達,Redis 之間的切換經過 Redis Sentinel 內部機制保障,VIP 切換經過 Keepalived 保障。
優勢:
缺點:
五、Redis M/S + Keepalived
Redis M/S + Keepalived
此方案沒有使用到 Redis Sentinel。此方案使用了原生的主從和 Keepalived,VIP 切換經過 Keepalived 保障,Redis 主從之間的切換須要自定義腳本實現。
優勢:
缺點:
六、Redis Cluster
Redis Cluster
From: http://intro2libsys.com/focus...
Redis 3.0.0 在 2015 年 4 月 2 日正式發佈,距今已有兩年多的時間。Redis 集羣採用 P2P 模式,無中心化。把 key 分紅 16384 個 slot,每一個實例負責一部分 slot。客戶端請求對應的數據,若該實例 slot 沒有對應的數據,該實例會轉發給對應的實例。另外,Redis 集羣經過 Gossip 協議同步節點信息。
優勢:
缺點:
七、Twemproxy
Twemproxy
From: http://engineering.bloomreach...
多個同構 Twemproxy(配置相同)同時工做,接受客戶端的請求,根據 hash 算法,轉發給對應的 Redis。
Twemproxy 方案比較成熟了,以前咱們團隊長期使用此方案,可是效果並非很理想。一方面是定位問題比較困難,另外一方面是它對自動剔除節點的支持不是很友好。
優勢:
缺點:
八、Codis
Codis
From: https://github.com/CodisLabs/...
Codis 是由豌豆莢開源的產品,涉及組件衆多,其中 ZooKeeper 存放路由表和代理節點元數據、分發 Codis-Config 的命令;Codis-Config 是集成管理工具,有 Web 界面供使用;Codis-Proxy 是一個兼容 Redis 協議的無狀態代理;Codis-Redis 基於 Redis 2.8 版本二次開發,加入 slot 支持,方便遷移數據。
優勢:
缺點:
4、最佳實踐
所謂的最佳實踐,都是最適合具體場景的實踐。
主推如下方案:
如下是實戰過程當中總結出的最佳實踐:
做者:溫國兵,曾任職於酷狗音樂,現爲三七互娛 DBA。目前主要關注領域:數據庫自動化運維、高可用架構設計、數據庫安全、海量數據解決方案、以及開源技術在互聯網中的應用