基于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的若干條注意事項;整個系統高度耦合,升級困難。

雖然我們有眾多的選擇,比如TairCouchbase等,但是如果你需要更復雜和優秀的數據結構,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-configCodis 的管理工具,支持添加/刪除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 17:32
下一篇 2015-02-25 10:38

相關推薦

  • LVM理論及實踐

    LVM綜述創建LV創建PV:pvcreate DEVICES創建VG:vgcreate VG_NAME PV_DEVICES創建lv格式化:mkfs.ext4 /dev/vg0/lv0掛載LVM的擴展擴展LV:lvextend擴展后檢查掛載文件夾大小,發現擴展前后沒有變化這是因為硬盤的修改需要同步:resize2fs /dev/vg0/lv0假設這時候VG的…

    Linux干貨 2016-09-19
  • sed大法好

    sed sed概念 (1)基本概念:sed是流編輯器(stream editor),A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline).作用就是對輸入的流(文件或者從一個管道輸入的流…

    Linux干貨 2016-12-02
  • N26-第四周

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其他用戶均沒有任何訪問權限。[root@localhost home]# cp -R /etc/skel/ /home/tuser1 && chmod -R g=,o= /home/tuser1 [root@localhost …

    Linux干貨 2017-03-07
  • 文件查找工具之——find

        前言:Linux一切皆文件,在linux的系統中如果我們需要找到所需的文件,除了一步一步慢慢找,還有一種辦法就是要使用Linux中查找文件工具命令,能讓我們很快定位到我們所需的文件。所以我們必須要學好文件查找工具 一、首先我們先要了解文本搜索和文件查找的區別     文本…

    Linux干貨 2015-07-06
  • 03葵花寶典之linux用戶

    介紹了linux上有關用戶和組的相關命令及配置文件

    2018-03-16
  • OpenSSL 的使用

    OpenSSL 是一個開源項目,其組成主要包括一下三個組件:     openssl:多用途的命令行工具     libcrypto:加密算法庫     libssl:加密模塊應用庫,實現了ssl及tls openssl可以實現:秘鑰證書管…

    Linux干貨 2017-06-07
欧美性久久久久