中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何開發一個高性能的redis cluster proxy

發布時間:2021-10-12 11:47:43 來源:億速云 閱讀:233 作者:柒染 欄目:云計算

本篇文章為大家展示了如何開發一個高性能的redis cluster proxy,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

背    景

redis cluster簡介

Redis cluster是redis官方提供集群方案,設計上采用非中心化的架構,節點之間通過gossip協議交換互相的狀態,redis cluster使用數據分片的方式來構建集群,集群內置了16384個哈希槽,每個key都屬于這16384這個哈希槽中的一個,通過crc16算法計算哈希值,再取余可得每個key歸屬的哈希槽;redis cluster支持動態加入新節點,動態遷移slot,自動的故障轉移等。

Redis cluster的架構要求客戶端需要直接與redis集群中的每個節點建立連接,并且當出現新增節點加入、節點宕機failover、slot遷移等事件時,客戶端需要能夠通過redis cluster協議去更新本地的slot映射表,并且能處理ASK/MOVE語義,因此,我們一般稱實現了redis cluster協議的客戶端為smart redis client

Redis cluster最多可以構建超過100個主節點的集群(超過之后gossip協議開銷過大,且可能引起集群不穩定),按照單節點10G容量(單實例內存過大可能導致性能下降),單集群最多可以支撐1T左右的容量。

問    題

Redis cluster有很多優點(比如可以構建大容量集群,性能好,擴縮容靈活),但是當一些項目工程期望從redis遷移到redis cluster時,客戶端卻面臨著大量的改造工作,與此同時帶來的是需要大量的測試工作以及引入的新風險,這對于一些穩定運行的線上工程代價無疑是巨大的。

需    求

為了更方便的將業務遷移到redis cluster,最期望的是客戶端SDK的API完全兼容redis/redis-cluster,spring提供的RedisTemplate是一個很好實現,但是對于沒有使用SpringRedisTemplate的項目,很多客戶端實現的redis和redis-cluster訪問API是不一致的(比如Java中流行的Jedis),這無形中提高了遷移工作的工作量和復雜性,此時redis cluster proxy是不錯的選擇,有了proxy,就可以像操作單實例redis一樣操作redis cluster,客戶端程序就不需要做任何的修改。 

當然,增加一層proxy,必然會導致性能有一定程度的下降,但是proxy作為無狀態的服務,理論上可以水平擴展,并且由于proxy層的存在減少了后端redis server的連接數,在某些極限場景下甚至能提高redis集群整體的吞吐量。此外,基于proxy,我們還可以做很多額外的事情:

  • 比如可以在proxy層做分片邏輯,這樣當單集群的redis cluster不滿足需求(內存/QPS)時,就可以通過proxy層實現透明的同時訪問多個redis cluster集群。

  • 再比如可以在proxy層做雙寫邏輯,這樣在遷移或者拆分緩存類型的redis時,就不需要使用redis-migrate-tool之類的工具進行全量遷移,而只需要按需雙寫,即可完成遷移。

  • 此外因為proxy實現了redis協議,因此可以在proxy層利用其它存儲介質實現redis相關命令,從而可以模擬成redis對外服務。一個典型的場景就是冷熱分離存儲。

    功    能

介于上述各種原因和需求,我們基于netty開發了camellia-redis-proxy這樣一個中間件,支持如下特性

  • 支持設置密碼

  • 支持代理到普通redis,也支持代理到redis cluster

  • 支持配置自定義的分片邏輯(可以代理到多個redis/redis-cluster集群)

  • 支持配置自定義的雙寫邏輯(服務器會識別命令的讀寫屬性,配置雙寫之后寫命令會同時發往多個后端)

  • 支持外部插件,從而可以復用協議解析模塊(當前包括camellia-redis-proxy-hbase插件,實現了zset命令的冷熱分離存儲)

  • 支持在線變更配置(需引入camellia-dashboard)

  • 支持多個業務邏輯共享一套proxy集群,如:A業務配置轉發規則1,B業務配置轉發規則2(需要在建立redis連接時通過client命令設置業務類型)

  • 對外提供了一個spring-boot-starter,3行代碼即可快速搭建一個proxy集群

如何開發一個高性能的redis cluster proxy

當然,還有另外一個方案,可以將proxy節點注冊到zk/Eureka/Consul等注冊中心,客戶端通過拉取和監聽proxy的列表,然后再向訪問單節點redis一樣訪問每個proxy即可。以Jedis為例,僅需將JedisPool替換為封裝了注冊發現邏輯的RedisProxyJedisPool,即可像訪問普通redis一樣使用proxy了,此時,部署架構圖如下

如何開發一個高性能的redis cluster proxy

應用場景

  • 需要從redis遷移到redis-cluster,但是客戶端代碼不方便修改

  • 客戶端直連redis-cluster,導致cluster服務器連接過多,導致服務器性能下降

  • 單個redis/redis-cluster集群容量/QPS不滿足業務需求,使用camellia-redis-proxy的分片功能

  • 緩存類redis/redis-cluster集群拆分遷移,使用camellia-redis-proxy的雙寫功能

  • 使用雙寫功能進行redis/redis-cluster的災備

  • 混合使用分片和雙寫功能的一些業務場景

  • 基于camellia-redis-proxy的插件功能,開發自定義插件

Redis cluster作為官方推薦的集群方案,越來越多的項目已經或正在遷移到redis cluster,camellia-redis-proxy正是在這樣的背景下誕生的;特別的,如果你是一個Java開發者,camellia還提供了CamelliaRedisTemplate這樣的方案,CamelliaRedisTemplate擁有和普通Jedis一致的API,提供了mget/mset/pipeline等原生JedisCluster不支持的特性,且提供了和camellia-redis-proxy功能一致的分片/雙寫等特性。

上述內容就是如何開發一個高性能的redis cluster proxy,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節
推薦閱讀:
  1. redis集群
  2. redis群集

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黔西| 福建省| 吴旗县| 连城县| 新郑市| 黔江区| 米易县| 普安县| 黄山市| 兰坪| 九龙县| 兖州市| 祁阳县| 新昌县| 温宿县| 芜湖县| 民乐县| 临安市| 蓬溪县| 东丽区| 彭泽县| 汕头市| 许昌市| 三亚市| 榆树市| 鸡泽县| 富裕县| 虎林市| 依兰县| 凌源市| 乌拉特前旗| 克山县| 博乐市| 左贡县| 福州市| 锡林浩特市| 闸北区| 新源县| 南丰县| 棋牌| 河池市|