twemproxy架構分析——剖析twemproxy代碼前編

来源:http://www.cnblogs.com/onlyac/archive/2017/01/09/6262096.html
-Advertisement-
Play Games

twemproxy背景 在業務量劇增的今天,單台高速緩存伺服器已經無法滿足業務的需求, 而相較於大容量SSD數據存儲方案,緩存具備速度和成本優勢,但也存在數據安全性的挑戰。為此搭建一個高速緩存伺服器集群來進行分散式存儲是十分必要的。 目前主流的高速緩存伺服器是redis和memchache。而twe ...


twemproxy背景

 

在業務量劇增的今天,單台高速緩存伺服器已經無法滿足業務的需求, 而相較於大容量SSD數據存儲方案,緩存具備速度和成本優勢,但也存在數據安全性的挑戰。為此搭建一個高速緩存伺服器集群來進行分散式存儲是十分必要的。

目前主流的高速緩存伺服器是redis和memchache。而twemproxy是支持memcached和redis協議的輕量級代理中間件,能用於高速緩存伺服器集群的搭建。為此,twemproxy是高速緩存伺服器集群的核心組件之一,也是業界較為成熟的高速緩存伺服器集群解決方案之一。

 

twemproxy概述 

 

twemproxy是搭建分散式緩存集群的重要組件之一。他能將來自客戶端的redis包通過key分片發送到不同的redis伺服器,而不是發到單個redis伺服器上。因此,可以使本來集中到一個redis上的信息被分流到多個redis上,這就使得 twemproxy能支持redis集群。

不難想到,因為twemproxy的分片功能,可以輕鬆地對redis集群進行水平擴展(簡單地理解成在一個業務中加入更多的redis伺服器),同時對於代碼稍加改造,我們就可以得到能讀寫分離的redis集群,這大大將提高了redis集群的性能。這使得各大公司如豌豆莢、阿裡、百度等都對於這份代碼進行了修改,能使其滿足分散式緩存集群的要求。當然,twemproxy並不負責數據一致性的工作。

源碼下載地址:https://github.com/twitter/twemproxy/ 

 

twemproxy架構 

 

為了能更好地瞭解twemproxy的代碼結構,我們就需要瞭解twemproxy的架構,明白與它交互的組件。下麵就是一般twemproxy的架構圖

圖1 twemproxy架構圖

圖1中,client是客戶端,這裡的客戶端可以是很多應用,如網頁,也可以是一些需要redis支持的伺服器。LVS是Linux虛擬伺服器,它主要用於負載均衡以及數據冗餘,當然這一個層的負載均衡以及數據冗餘也可以通過其他手段完成,如HAproxy等,當然也可以不需要這一層,可以讓客戶端直連twemproxy。memchache和redis是twemproxy目前支持的兩種高速緩存伺服器,但是考慮到高可用性和具體功能,一般會選用redis伺服器。

我們可以看到在這種架構下,由於所有的通信都是用redis或者memchache協議完成。為此,client根本不知道和它通信的是高速緩存伺服器還是twemproxy,高速緩存伺服器memchache或redis也不知道和它聯繫的的是client還是twemproxy。

這樣業務量一旦提升,我們只需要添加適量的高速緩存伺服器和twemproxy伺服器就可以滿足業務需求。在這期間,幾乎不需要對原先的client端的代碼或者原先的高速緩存伺服器的配置做任何修改,就可以完成業務上的水平擴容,這樣就大大提高了高速緩存伺服器的可用性。同時,由於不用修改client端的代碼,我們可以進行平滑升級,即用戶根本感知不到我們對業務進行了擴容,線上的client端不會因為我們的擴容而停止服務。同樣地,我們可以對業務進行縮容處理。因此在業務量急劇變化的時候,這種架構的靈活性可用性是原先單一的高速緩存伺服器集群不能比擬的。

從這幅架構圖上,我們也能開始逐一說明twemproxy的特性,閱讀源碼文件夾下的《README.md》的features,至於他是如何實現的,就需要我們去解讀代碼,這不是這一章要完成的任務。

                                  圖2 twemproxy特性

1.Fast,即快速,據測試,直連twenproxy和直連redis相比幾乎沒有性能損失,這已經很逆天了,最重要的是他還沒有進行讀寫分離就能達到這樣的效果,確實fast

2.Lightweight,即輕量級,就我個人而言,它代碼量就是輕量級的,解壓後僅僅1.8MB!!!!因為透明連接池,記憶體零拷貝以及epoll模型的使用,使得它足夠快速和輕量級。

3.Enables pipelining of requests and responses,Keeps connection count on the backend caching servers low,即保持前端的連接數,減少後端的連接數,這裡主要得益於透明連接池的使用,前端主要指的是client和lvs,後端指的是redis和memchache,這個好處特別明顯,既可以減少了redis的連接負載,又保持了保持了前端的功能。

4.Enables pipelining of requests and responses,即將請求和回覆管道化,這裡我的理解是他將請求包和回覆包一一對應起來後,使得它的請求和回覆更明確。

5.Supports multiple server pools simultaneously,Shard data automatically across multiple servers,即它可以支持多個高速緩存伺服器,以及能對高速緩存伺服器的數據進行共用,這是通過我在前面講到過twemproxy的分片功能來實現的。

6.Implements the complete memcached ascii and redis protocol,它支持memchache和redis這兩個協議,當然現在只支持其中大部分的協議而不是全部,這個會在後面開章節專門說明。

7.Supports multiple hashing modes including consistent hashing and distribution.就是它支持很多哈希演算法來哈希key,如crc32,crc16,MD5等等。

8.Easy configuration of server pools through a YAML file.它的配置文件是通過YAML文件來配置的,YAML文件好處是簡單易懂,容易學習配置。

9.Can be configured to disable nodes on failures. 它會自動指出連接失敗的節點並報警,就是一旦某個高速緩存伺服器發生故障,它能感知到並報警。

10.Observability via stats exposed on the stats monitoring port.這是他的監控功能,一般比較少用,但是它提示的信息卻有統計的價值,如統計發送了多少讀寫命令。

 

通過上述的功能分析,我們可以理出一個我們值得關註的實現上的功能列表:

1.記憶體管理,這是導致特性1和4的關鍵之一,他通過一些方法,如記憶體用完後不立即釋放將其放入記憶體隊列里以備它用,記憶體零拷貝等手段使記憶體使用效率大幅提高。對應源碼中的nc_mbuf 文件。

2.透明連接池,這是導致特性1,3的關鍵之一,當然連接池內的連接同樣的是使用完後不立即釋放將其放入連接隊列里以備它用。對應源碼中的nc_connection 文件。

3.分片,這是導致特性5,6的關鍵,也是twenproxy的核心功能。當然後面的7,8也導致了分片能得以進行。對應源碼中的proto文件夾、hashkit文件夾。

4.配置文件,這影響了特性8,同時這份代碼在配置上的代碼風格非常簡約,對應源碼中的nc_conf 文件。

5.監控,不是特別瞭解但是它完成了9,10特性,對應源碼中的nc_proxy 、nc_stats 文件。

這些將是我們未來閱讀剖析代碼的一些重要關註點。

 

twemproxyLinux下安裝

 通過上述的描述,大家是否心動了,想要玩一下twemproxy,那麼請大家與我一起安裝twemproxy,當然安裝twemproxy對於我們閱讀twemproxy源碼也會有所幫助。

1.首先安裝autoconf2.69,這個請參考我的博文http://www.cnblogs.com/onlyac/p/5408420.html

2.進入源碼目錄

cd twemproxy

3.使用autoconf進行編譯準備

autoreconf -fvi

./configure CFLAGS="-g -gstabs -O3 -fno-strict-aliasing" --enable-debug=full

4.編譯以及安裝

make && make install

這樣編譯以及安裝完的程式nutcracker已在src目錄下生成了。

未來我們也可以採用通過gdb來進行邊走流程邊看代碼的一種閱讀代碼方式。

 

總結

在這篇文章中,我們首先概述了twemproxy,接著通過架構圖展示,我們分析了該架構的優點,提取了會成為我們閱讀源碼的一些重要關註點和twemproxy的工作環境,最後闡述瞭如何安裝twemproxy。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 雙擊pkg文件安裝 一路向下,記得保存最後彈出框中的密碼(它是你mysql root賬號的密碼) 正常情況下,安裝成功。 此時只是安裝成功,但還需要額外的配置: (1) 進入系統偏好設置 (2) 點擊mysql 開啟mysql服務 此時我們在命令行輸入mysql -uroot -p命令會提示沒有co ...
  • 記憶體分配機制Slab Allocation 本文參考博客:https://my.oschina.net/bieber/blog/505458 Memcached的記憶體分配是以slabs為單位的,會根據初始chunk大小、增長因數、存儲數據的大小實際劃分出多個不同的slabs class,slab c ...
  • 大綱簡介 安裝前,先簡單介紹一下memcached。 memcached是一個免費、開源、高性能的分散式緩存。設計memcached的初衷是為了加快web應用程式,減少DB負載。 安裝要求:支持大多數linux和基於BSD的系統,官方沒有給出windows版本,但是網上有memcached for ...
  • 本篇將去探索twemproxy源碼的主幹流程,想來對於想要開始啃這份優秀源碼生肉的童鞋會有不小的幫助。這裡我們首先要找到 twemproxy正確的打開方式——twemproxy的文件結構,接著介紹twemproxy程式代碼框架,最後介紹twemproxy程式的主幹流程。主幹流程是本章節的重中之重。這 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/6262800.html 在考慮重編譯T-SQL(或者存儲過程)的時候,有兩種方式可以實現強制重編譯(前提是忽略導致重編譯的其他因素的情況下,比如重建索引,更新統計信息等等), 一是基於WITH RECOMPILE的存儲過程級別 ...
  • 寫在前面 在QQ群,微信群,論壇中經常幫助使用SQL Server資料庫的朋友解決問題,但是有一些最常見最基本的問題,每天都有人問,回答多了也不想再解答了,索性把這些問題整理一下,再有人問到直接發鏈接。 一時想法而寫這篇文章,問題可能不全面,後續會一直更新。 基礎問題收集 資源下載 描述:XX版本數 ...
  • 一、HBase的特點是什麼 1.HBase一個分散式的基於列式存儲的資料庫,基於hadoop的hdfs存儲,zookeeper進行管理。 2.HBase適合存儲半結構化或非結構化數據,對於數據結構欄位不夠確定或者雜亂無章很難按一個概念去抽取的數據。 3.HBase為null的記錄不會被存儲. 4.基 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...