twemproxy架構分析

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

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


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伺服器。

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

                                  圖2 twemproxy特性

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

2.Lightweight,即輕量級,就我個人而言,它代碼量就是輕量級的,因為透明連接池,記憶體零拷貝以及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,支持這兩個協議,當然現在只支持其中大部分的協議而不是全部,這個會在後面專門說明。

7.Supports multiple hashing modes including consistent hashing and distribution.就是他支持很多哈希演算法來哈希key。

8.Easy configuration of server pools through a YAML file.他的配置文件是通過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下安裝

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目錄下生成了。

 

 

總結

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


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

-Advertisement-
Play Games
更多相關文章
  • 分享一下編寫設置和獲取顏色的插件,首先我將插件的名字命名為jquery.color.js。該插件用來實現以下兩個功能1.設置元素的顏色。2.獲取元素的顏色。 先在搭建好如下編寫插件的框架: 我這裡採用jQuery.fn.extend().這種方法來編寫,代碼如下: 這個方法可裡面有一個value.參 ...
  • 目前的多個項目中都用到分頁這個功能,為了提高可復用性,我特地分離出來寫了個分頁的指令。直接貼代碼,詳情如下: index.html index.js 指令模板 page.html 指令定義page.js 效果如圖所示: ...
  • JQuery極大的提高了我們編寫JavaScript的效率,讓我們可以愉快的編寫代碼,做出各種特效。大多數情況下,我們都是使用別人開發的JQuery插件,今天我們就來看看如何把我們常用的功能做出JQuery插件,然後像使用jQuery那樣來操作DOM. 一、jQuery插件開發快速上手 1、jQue ...
  • Vue有一核心就是數據驅動(Data Driven),允許我們採用簡潔的模板語法來聲明式的將數據渲染進DOM,且數據與DOM是綁定在一起的,這樣當我們改變Vue實例的數據時,對應的DOM元素也就會改變了。 今兒,我們就一起來模擬一下它吧。 ...
  • 目前幾乎所有的APP在用戶註冊時都會有設置頭像的需求,大致分為三種情況: (1)通過獲取本地相冊的圖片,經過裁剪後作為頭像。 (2)通過啟動手機相機,現拍圖片然後裁剪作為頭像。 (3)在APP中添加一些自帶的頭像資源,供用戶選擇(不夠人性化,目前很少使用)。 這次我們簡單介紹下通過獲取本地相冊以及相 ...
  • Navigation bar 的註意事項 Bar button item 使用 button 作為 custom view,初始化 isEnabled 為 false,註意順序 需要設置 bar button item 的 custom view 為 button,但一開始 isEnabled 要為 ...
  • 自增和自減運算 自增和自減運算 比較運算符與比較表達式 比較運算符與比較表達式 邏輯運算符與邏輯表達式 邏輯運算符與邏輯表達式 IF結構 IF結構 變數的作用域 變數的作用域 ...
  • 當應用伺服器受到攻擊,我們採取的措施大致分為以下幾個步驟: 1、伺服器隔離 檢查埠,禁掉網卡 2、修改賬號、密碼,防火牆策略等 3、殺毒 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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...