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。