Redis 生產(chǎn)架構(gòu)選型解決方案
在寫開源項目的時候,想到了要支持多種redis部署方式,于是對于這塊的生產(chǎn)環(huán)境的架構(gòu)選型展開調(diào)研
有幫助的話,請點一個關(guān)注,支持我的繼續(xù)撰稿,謝謝~
一 引擎版本
Redis 6.0新特性說明
模塊系統(tǒng)新增多個API。
支持SSL/TLS加密。
支持新的Redis協(xié)議:
RESP3。
服務(wù)端支持多模式的客戶端緩存。
支持多線程IO。
副本中支持無盤復(fù)制(diskless replication)。
Redis-benchmark新增了Redis集群模式。
支持重寫Systemd。
支持Disque模塊。
Redis 5.0新特性說明
云數(shù)據(jù)庫Redis 5.0版本大幅度優(yōu)化內(nèi)核,運行更加穩(wěn)定,同時新增Stream、賬號管理、審計日志等多種特性,滿足您更多場景下的使用需求。
新的數(shù)據(jù)類型:
流數(shù)據(jù)(Stream)。
詳細(xì)說明請參見Redis Streams。
新增賬號管理功能。
新增日志管理功能,支持審計日志、運行日志和慢日志,您可以通過日志管理查詢讀寫操作、敏感操作(如KEYS、FLUSHALL)和管理類命令的使用記錄以及慢日志。
新增基于快照的緩存分析功能。
新的定時器(Timers)、集群( Cluster)和字典(Dictionary)模塊的API。
RDB中增加LFU和LRU信息。
集群管理器從Ruby (redis-trib.rb)移植到了redis-cli中的C語言代碼。
新增有序集合(Sorted Set)命令ZPOPMIN、ZPOPMAX、BZPOPMIN和BZPOPMAX。
升級Active Defragmentation至v2版本。
增強(qiáng)HyperLogLog的實現(xiàn)。
優(yōu)化內(nèi)存統(tǒng)計報告。
為許多有子命令的命令增加了HELP子命令。
提高了客戶端頻繁連接和斷開連接時的性能表現(xiàn)。
升級Jemalloc至5.1版本。
新增命令CLIENT ID和CLIENT UNBLOCK。
新增了為藝術(shù)而生的LOLWUT命令。
棄用slave術(shù)語(需要API向后兼容的情況例外)。
對網(wǎng)絡(luò)層進(jìn)行了多處優(yōu)化。
進(jìn)行了一些Lua相關(guān)的改進(jìn)。
新增動態(tài)HZ(Dynamic HZ)以平衡空閑CPU使用率和響應(yīng)性。
對Redis核心代碼進(jìn)行了重構(gòu)并在許多方面進(jìn)行了改進(jìn)。
二 架構(gòu)
您需要根據(jù)業(yè)務(wù)需求選擇:
集群架構(gòu)可輕松突破Redis自身單線程瓶頸,滿足大容量、高性能的業(yè)務(wù)需求。
主從架構(gòu),提供高性能的緩存服務(wù)和數(shù)據(jù)高可靠。
讀寫分離架構(gòu)提供高可用、高性能、高靈活的讀寫分離服務(wù),解決熱點數(shù)據(jù)集中及高并發(fā)讀取的業(yè)務(wù)需求,最大化地節(jié)約用戶運維成本。
2.1 主從架構(gòu)-雙副本
采用主從(master-replica)模式搭建。主節(jié)點提供日常服務(wù)訪問,備節(jié)點提供HA高可用,當(dāng)主節(jié)點發(fā)生故障,系統(tǒng)會自動在30秒內(nèi)切換至備節(jié)點,保證業(yè)務(wù)平穩(wěn)運行。
可靠性
服務(wù)可靠采用雙機(jī)主從(master-replica)架構(gòu),主從節(jié)點位于不同物理機(jī)。
主節(jié)點對外提供訪問,用戶可通過Redis命令行和通用客戶端進(jìn)行數(shù)據(jù)的增刪改查操作。
當(dāng)主節(jié)點出現(xiàn)故障,HA系統(tǒng)會自動進(jìn)行主從切換,保證業(yè)務(wù)平穩(wěn)運行。
數(shù)據(jù)可靠默認(rèn)開啟數(shù)據(jù)持久化功能,數(shù)據(jù)全部落盤。
支持?jǐn)?shù)據(jù)備份功能,用戶可以針對備份集回滾實例或者克隆實例,有效地解決數(shù)據(jù)誤操作等問題。
使用場景
Redis作為持久化數(shù)據(jù)存儲使用的業(yè)務(wù)標(biāo)準(zhǔn)版提供持久化機(jī)制及備份恢復(fù)機(jī)制,極大地保證數(shù)據(jù)可靠性。
單個Redis性能壓力可控的業(yè)務(wù)由于Redis原生采用單線程機(jī)制,性能在10萬QPS以下的業(yè)務(wù)建議使用。
如果需要更高的性能要求,請選用集群版本。
Redis命令相對簡單,排序、計算類命令較少的業(yè)務(wù)由于Redis的單線程機(jī)制,CPU會成為主要瓶頸。
如排序、計算類較多的業(yè)務(wù)建議選用集群版配置。
2.2 主從架構(gòu)-單副本
可以在沒有數(shù)據(jù)可靠性要求的純緩存場景充分發(fā)揮性能優(yōu)勢。
使用場景
純緩存類業(yè)務(wù)場景
單個Redis性能壓力可控
Redis命令相對簡單,排序、計算類命令較少
2.3 集群版-雙副本
可輕松突破Redis自身單線程瓶頸,滿足大容量、高性能的業(yè)務(wù)需求。雙副本集群版實例采用集群架構(gòu),每個分片服務(wù)器采用主從(master-replica)雙副本模式。集群版支持代理和直連兩種連接模式,您可以根據(jù)本章節(jié)的說明,選擇適合業(yè)務(wù)需求的連接模式。
代理模式
集群架構(gòu)的本地盤實例默認(rèn)采用代理(proxy)模式,支持通過一個統(tǒng)一的連接地址(域名)訪問Redis集群,客戶端的請求通過代理服務(wù)器轉(zhuǎn)發(fā)到各數(shù)據(jù)分片,代理服務(wù)器、數(shù)據(jù)分片和配置服務(wù)器均不提供單獨的連接地址,降低了應(yīng)用開發(fā)難度和代碼復(fù)雜度。代理模式的服務(wù)架構(gòu)圖和組件說明如下。


直連模式
因所有請求都要通過代理服務(wù)器轉(zhuǎn)發(fā),代理模式在降低業(yè)務(wù)開發(fā)難度的同時也會小幅度影響Redis服務(wù)的響應(yīng)速度。如果業(yè)務(wù)對響應(yīng)速度的要求非常高,您可以使用直連模式,繞過代理服務(wù)器直接連接后端數(shù)據(jù)分片,從而降低網(wǎng)絡(luò)開銷和服務(wù)響應(yīng)時間。直連模式的服務(wù)架構(gòu)和說明如下。

前提條件 使用Jedis、PhpRedis等支持Redis Cluster的客戶端。
使用不支持Redis Cluster的客戶端,可能因客戶端無法重定向請求到正確的分片而獲取不到需要的數(shù)據(jù)。
Jedis對于Redis Cluster的支持是基于JedisCluster這個類,詳細(xì)說明請參見Jedis文檔。
您可以在Redis官網(wǎng)的客戶端列表里查找更多支持Redis Cluster的客戶端。
使用自定義連接池的示例代碼
import redis.clients.jedis.*;import java.util.HashSet;import java.util.Set;public class main {private static final int DEFAULT_TIMEOUT = 2000;private static final int DEFAULT_REDIRECTIONS = 5;private static final JedisPoolConfig DEFAULT_CONFIG = new JedisPoolConfig();public static void main(String args[]){JedisPoolConfig config = new JedisPoolConfig();// 最大空閑連接數(shù), 根據(jù)業(yè)務(wù)需要設(shè)置,不能超過實例規(guī)格規(guī)定的最大的連接數(shù)config.setMaxIdle(200);// 最大連接數(shù), 根據(jù)業(yè)務(wù)需要設(shè)置,不能超過實例規(guī)格規(guī)定的最大的連接數(shù)config.setMaxTotal(300);config.setTestOnBorrow(false);config.setTestOnReturn(false);// 開通直連訪問時申請到的直連地址String host = "r-bp1xxxxxxxxxxxx.redis.rds.aliyuncs.com";int port = 6379;// 實例的密碼String password = "xxxxx";Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();jedisClusterNode.add(new HostAndPort(host, port));JedisCluster jc = new JedisCluster(jedisClusterNode, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT,DEFAULT_REDIRECTIONS,password, "clientName", config);}}
2.4 集群版-單副本


2.5 讀寫分離版
針對讀多寫少的業(yè)務(wù)場景,提供高可用、高性能、靈活的讀寫分離服務(wù),滿足熱點數(shù)據(jù)集中及高并發(fā)讀取的業(yè)務(wù)需求,最大化地節(jié)約運維成本。讀寫分離版主要由主備節(jié)點、只讀節(jié)點、Proxy(代理)節(jié)點和高可用系統(tǒng)組成。


特點
高可用
通過自研的高可用系統(tǒng)自動監(jiān)控所有數(shù)據(jù)節(jié)點的健康狀態(tài),為整個實例的可用性保駕護(hù)航。 主節(jié)點不可用時自動選擇新的主節(jié)點并重新搭建復(fù)制拓?fù)洹?/section> 某個只讀節(jié)點異常時,高可用系統(tǒng)能夠自動探知并重新啟動新節(jié)點完成數(shù)據(jù)同步,下線異常節(jié)點。 Proxy節(jié)點實時感知每個只讀實例的服務(wù)狀態(tài)。 在某個只讀實例異常期間,Proxy會自動降低該節(jié)點的服務(wù)權(quán)重,發(fā)現(xiàn)只讀節(jié)點連續(xù)失敗超過一定次數(shù)以后,會停止異常節(jié)點的服務(wù)權(quán)利,并具備繼續(xù)監(jiān)控后續(xù)重新啟動節(jié)點服務(wù)的能力。
高性能
讀寫分離版采取鏈?zhǔn)綇?fù)制架構(gòu),可以通過擴(kuò)展只讀實例個數(shù)使整體實例性能呈線性增長,同時基于源碼層面對Redis復(fù)制流程的定制優(yōu)化,可以最大程度地提升線性復(fù)制的系統(tǒng)穩(wěn)定性,充分利用每一個只讀節(jié)點的物理資源。
使用場景
讀取請求QPS(Queries Per Second)壓力較大
建議與使用須知
當(dāng)一個只讀節(jié)點發(fā)生故障時,請求會轉(zhuǎn)發(fā)到其他節(jié)點;如果所有只讀節(jié)點均不可用,請求會全部轉(zhuǎn)發(fā)到主節(jié)點。只讀節(jié)點異常可能導(dǎo)致主節(jié)點負(fù)載提高、響應(yīng)時間變長,因此在讀負(fù)載高的業(yè)務(wù)場景建議使用多個只讀節(jié)點。 某些場景會觸發(fā)只讀節(jié)點的全量同步,例如在主節(jié)點觸發(fā)高可用切換后。全量同步期間只讀節(jié)點不提供服務(wù)并返回-LOADING Redis is loading the dataset in memory\r\n信息。
作者:小熱愛
來源:https://juejin.cn/post/6955355807231770631
版權(quán)申明:內(nèi)容來源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無法確認(rèn),我們都會標(biāo)明作者及出處,如有侵權(quán)煩請告知,我們會立即刪除并表示歉意。謝謝!
END
順便給大家推薦一個GitHub項目,這個 GitHub 整理了上千本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,
GitHub地址:https://github.com/javadevbooks/books
Gitee地址:https://gitee.com/javadevbooks/books
電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點一個star,持續(xù)更新中..

