Redis 是一個開源的使用 ANSI C 語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value 資料庫,並提供多種語言的 API。
如今,網路業務的資料正以更快的速度在成長,資料類型越來越豐富,這對資料處理的速度和能力提出了更高要求。 Redis 是一種開源的記憶體非關係型資料庫,帶給開發人員的體驗是顛覆性的。在自始至終的設計過程中,都充分考慮高效能,這使得 Redis 成為當今速度最快的 NoSQL 資料庫。
考慮高性能的同時,高可用也是很重要的考慮因素。網路 7×24 無間斷服務,在故障期間以最快的速度 Failover,能為企業帶來最小的損失。
那麼,在實際應用中,有哪些高可用架構呢?架構之間有何優劣?我們該怎麼取捨?有哪些最佳實務?
在講解 Redis 高可用方案之前,我們先來看看 Redis Sentinel 原理是怎麼樣的。
1 到 3 是自動發現機制:
4 是偵測機制,5 和 6 是 failover 機制,7 是更新設定機制。 [1]
講解完 Redis Sentinel 原理之後,接下來講解常用的 Redis 高可用架構。
接下來配合圖逐一講解。
上圖是已經在線上環境應用的方案。底層是 Redis Sentinel 集群,代理 Redis 主從,Web 端連接內部網路 DNS 提供服務。內網DNS 依照一定的規則分配,例如 xxxx.redis.cache/queue.port.xxx.xxx,第一個段表示業務簡寫,第二個段表示這是Redis 內網域名,第三個段表示Redis 類型,cache 表示緩存,queue 表示隊列,第四個段表示Redis 端口,第五、第六個段表示內網主域名。
當主節點發生故障,例如機器故障、Redis 節點故障或網路不可達,Sentinel 叢集會呼叫 client-reconfig-script 設定的腳本,修改對應連接埠的內網網域名稱。對應連接埠的內網域名指向新的 Redis 主節點。
優點:
缺點:
此方案和上一個方案相比,略有不同。第一個方案使用了內部網路 DNS,第二個方案把內部網路 DNS 換成了虛擬 IP。底層是 Redis Sentinel 集群,代理著 Redis 主從,Web 端透過 VIP 提供服務。在部署 Redis 主從的時候,需要將虛擬 IP 綁定到目前的 Redis 主節點。當主節點發生故障,例如機器故障、Redis 節點故障或網路不可達,Sentinel 叢集會呼叫 client-reconfig-script 配置的腳本,將 VIP 漂移到新的主節點上。
優點:
缺點:
部分業務只能透過外網存取 Redis,上述兩種方案皆不可用,於是衍生出了這種方案。 Web 使用客戶端連接其中一台 Redis Sentinel 叢集中的一台機器的某個端口,然後透過這個端口獲取到當前的主節點,然後再連接到真實的 Redis 主節點進行相應的業務員操作。需要注意的是,Redis Sentinel 連接埠和 Redis 主節點都需要開放存取權限。如果前端業務使用 Java,有 JedisSentinelPool 可以重複使用;如果前端業務使用 PHP,可以在 phpredis 的基礎上做二次封裝。
優點:
缺點:
底層是 Redis Sentinel 集群,代理 Redis 主從,Web 端透過 VIP 提供服務。當主節點發生故障,例如機器故障、Redis 節點故障或網路不可達,Redis 之間的切換透過 Redis Sentinel 內部機制保障,VIP 切換透過 Keepalived 保障。
優點:
缺點:
此方案沒有使用到 Redis Sentinel。此方案使用了原生的主從和 Keepalived,VIP 切換透過 Keepalived 保障,Redis 主從之間的切換需要自訂腳本實現。
優點:
缺點:
From: http://intro2libsys.com/focused-redis-topics/day-one/intro-redis-cluster
Redis 3.0.0 在 2015 年 4 月 2 日正式發布,距今已有兩年多的時間。 Redis 集群採用 P2P 模式,無中心化。把 key 分成 16384 個 slot,每個實例負責一部分 slot。客戶端請求對應的數據,若該實例 slot 沒有對應的數據,則該實例會轉送給對應的實例。另外,Redis 叢集透過 Gossip 協定同步節點資訊。
優點:
缺點:
From: http://engineering.bloomreach.com/the-evolution-of-fault-tolerant-redis-cluster
多個同構 Twemproxy(配置相同)同時工作,接受客戶端的請求,根據 hash 演算法,轉發給對應的 Redis。
Twemproxy 方案比較成熟了,之前我們團隊長期使用此方案,但是效果並不是很理想。一方面是定位問題比較困難,另一方面是它對自動剔除節點的支援不是很友善。
優點:
缺點:
From: https://github.com/CodisLabs/codis
Codis 是由豌豆莢開源的產品,涉及元件眾多,其中ZooKeeper 存放路由表和代理節點元資料、分發Codis-Config 的命令;Codis-Config 是整合管理工具,有Web 介面供使用;Codis- Proxy 是相容於Redis 協定的無狀態代理;Codis-Redis 基於Redis 2.8 版本二次開發,加入slot 支持,方便遷移資料。
優點:
缺點:
所謂的最佳實踐,都是最適合具體場景的實踐。
主推以下方案:
以下是實戰過程中總結出的最佳實踐:
此次活動分享了Redis 高可用的必要性、Sentinel 原理、Redis 高可用常用架構和實戰過程中總結出的最佳實踐,希望對讀者有所幫助,如果有需要後續交流的,可以添加我的微信(Wentasy),或寄email到:dbarobinwen@gmail.com
附 PPT 下載:https://github.com/dbarobin/slides
視訊回放:Redis 高可用架構最佳實踐
感謝聽雲和維運幫的精心組織,感謝大家冒著大雨前來參加此次活動。這次分享由 IT 大咖說出全程錄影,感謝 IT 大咖說的技術支援。
[1] jyzhou (2016-06-12). Redis 複製、Sentinel 的搭建和原理說明. Retrieved from http://www.cnblogs.com/zhoujinyi/p/5570024.html.
以上是Redis 高可用性實踐的詳細內容。更多資訊請關注PHP中文網其他相關文章!