基于Redis的開源分布式服務Codis

Redis在豌豆莢的使用歷程——單實例==》多實例,業務代碼中做sharding==》單個Twemproxy==》多個Twemproxy==》Codis,豌豆莢自己開發的分布式Redis服務。在大規模的Redis使用過程中,他們發現Redis受限于多個方面:單機內存有限、帶寬壓力、單點問題、不能動態擴容以及磁盤損壞時的數據搶救。

基于Redis的開源分布式服務Codis

Redis通常有3個使用途徑:客戶端靜態分片,一致性哈希;通過Proxy分片,即Twemproxy;還有就是官方的Redis Cluster,但至今無一個新版本。隨后劉奇更詳細的分析了為什么不使用Twemproxy和Redis Cluster:

Twemproxy:最大的痛點是無法平滑的擴容或者縮容,甚至修改配置都需要重啟服務;其次,不可運維,甚至沒有Dashboard。

Redis Cluster(官方):無中心化設計,程序難以編寫;代碼有點嚇人,clusterProcessPacket函數有426行,人腦難以處理所有的狀態切換;遲遲沒有正式版本,等了4年之久;目前還缺乏最佳實踐,沒有人編寫Redis Cluster的若干條注意事項;整個系統高度耦合,升級困難。

雖然我們有眾多的選擇,比如Tair、Couchbase等,但是如果你需要更復雜和優秀的數據結構,Redis可稱為不二之選。基于這個原因,在Redis之上,豌豆莢設計了Codis,并將之開源。

Codis

既然重新設計,那么Codis首先必須滿足自動擴容和縮容的需求,其次則是必須避免單點故障和單點帶寬不足,做一個高可用的系統。在這之后,基于原有的遺留系統,還必須可以輕松地將數據從Twemproxy遷移到Codis,并實現良好的運維和監控?;谶@些,Codis的設計躍然紙面:

基于Redis的開源分布式服務Codis

然而,一個新系統的開發并不是件容易的事情,特別是一個復雜的分布式系統。劉奇表示,雖然當時團隊只有3個人,但是他們幾乎考量了可以考量的各種細節:

  • 盡量拆分,簡化每個模塊,同時易于升級
  • 每個組件只負責自己的事情
  • Redis只作為存儲引擎
  • Proxy的狀態
  • Redis故障判定是否放到外部,因為分布式系統存活的判定異常復雜
  • 提供API讓外部調用,當Redis Master丟失時,提升SlaveMaster
  • 圖形化監控一切:slot狀態、Proxy狀態、group狀態、lock、action等等

而在考量了一切事情后,另一個爭論擺在了眼前——Proxy或者是Smart ClientProxy擁有更好的監控和控制,同時其后端信息亦不易暴露,易于升級;而Smart Client擁有更好的性能,及更低的延時,但是升級起來卻比較麻煩。對比種種優劣,他們最終選擇了Proxy,無獨有偶,在codis開源后,twitter的一個分享提到他們也是基于proxy的設計。

基于Redis的開源分布式服務Codis

Codis主要包含Codis Proxycodis-proxy)、Codis Managercodis-config)、Codis Rediscodis-server)和ZooKeeper四大組件,每個部分都可動態擴容。

codis-proxy 。客戶端連接的Redis代理服務,本身實現了Redis協議,表現很像原生的Redis (就像 Twemproxy)。一個業務可以部署多個 codis-proxy,其本身是無狀態的。

codis-config。Codis 的管理工具,支持添加/刪除Redis節點、添加/刪除Proxy節點、發起數據遷移等操作。codis-config自帶了一個http server,會啟動一個dashboard,用戶可以在瀏覽器上觀察 Codis 集群的運行狀態。

codis-server。Codis 項目維護的一個Redis分支,加入了slot的支持和原子的數據遷移指令。

ZooKeeper。Codis依賴ZooKeeper來存放數據路由表和codis-proxy節點的元信息,codis-config發起的命令會通過 ZooKeeper同步到各個存活的codis-proxy

基于Redis的開源分布式服務Codis

最后,劉奇還介紹詳細的了CodisMigration、lock (rwlock)等操作的實現過程和原理,以及從Twemproxy遷移到Codis的詳細操作。更多Codis詳情可移步Clodis開源頁 GitHub


原文鏈接:http://www.cnblogs.com/shanyou/p/4268896.html

原創文章,作者:追馬,如若轉載,請注明出處:http://www.www58058.com/509

(0)
追馬追馬
上一篇 2015-02-22
下一篇 2015-02-25

相關推薦

  • Linux之網絡管理

    Linux之網絡管理     在學習linux的過程中,Linux網絡的管理和配置中是很重要的,幾乎學習的后期都離不開網絡的概念和配置,如集群中的使用,學習好Linux網絡至關重要。     Linux網絡IP地址有兩種配置方式:靜態指定和動態分配 動態分配就是利用DHCP服務器,動態的給linux主機分配IP地址。靜…

    Linux干貨 2016-09-05
  • Linux系統啟動流程與內管管理(上)

    在講linux系統啟動流程之前,來講講linux的組成,這樣能能幫助我們深入了解系統的啟動流程,廢話不多說直接上系統啟動流程圖 linux組成 linux:kernel+rootfs kenrel的作用:進程管理、內存管理、網絡管理、驅動程序、文件系統、安全管理等   rootfs:程序和glibc 庫:函數結合,function,調用接口(頭文件…

    系統運維 2016-09-14
  • 第六周作業

    請詳細總結vim編輯器的使用并完成以下練習題 基本模式:     編輯模式,命令模式     輸入模式     末行模式         內置的命令行接口 打開…

    Linux干貨 2017-02-14
  • Linux程序包管理(二)YUM使用

    YUM Linux程序包管理(二) 說完了程序包管理以及rpm的相關使用,接下來說說rpm的前端管理工具 YUM YUM是什么?    前面提到,yum是rpm程序包管理器的前端管理工具,那么yum到底是什么?又能做什么呢? YUM:yellow dog,Yellowdog Update Mod…

    Linux干貨 2016-06-01
  • 任務計劃使用方法

    概述     任務計劃其實就是針對未來的某一刻或者是某一周期內設置要執行的工作;     任務計劃分為兩種:         1、一次性任務:在指定的未來的某個時間點僅執行一次任務;  &n…

    Linux干貨 2015-03-26
  • LVM2

    LVM2:         LVM: Logical Volume Manger, Version:2        dm: device mapper, 將一個或多個底層塊設備組織 成一個邏輯設備的模塊;           &…

    Linux干貨 2016-12-30
欧美性久久久久