Twemproxy:推ter 開源的 Redis 代理
在去年的 QCon London2012 大會上,推ter 發表了題為 《Timelines @ 推ter》的演講,里面提到以 Redis 作為其 timeline 的主要存儲,目前目測全球范圍內,推ter 可能是 Redis 的最大用戶了(或者是新浪微博?)。
而今天我們要說的這個 Twemproxy,是 推ter 開源出來的 Redis 和 Memcached 代理。
功能介紹
我們知道,無論是 Memcached 還是當前的 Redis,其本身都不具備分布式集群特性,當我們有大量 Redis 或 Memcached 的時候,通常只能通過客戶端的一些數據分配算法(比如一致性哈希),來實現集群存儲的特性。
而Twemproxy 通過引入一個代理層,可以將其后端的多臺 Redis 或 Memcached 實例進行統一管理與分配,使應用程序只需要在 Twemproxy 上進行操作,而不用關心后面具體有多少個真實的 Redis 或 Memcached 存儲。
在 Redis 的 Cluster 方案還沒有正式推出之前,通過 Proxy 的方式來實現存儲集群可能是最好的選擇了。更何況 Twemproxy 是通過 推ter 自身得到了充分檢驗的產品。
性能
根據 Redis 作者的測試結果,在大多數情況下,Twemproxy 的性能相當不錯,直接操作 Redis 相比,最多只有 20% 的性能損失。這對于它帶來的好處來說真的是微不足道了。唯一可能還有待改進的是其 MGET 操作的效率,其性能只有直接操作 Redis 的 50%。
安裝與配置
Twemproxy 的安裝有點小麻煩,主要命令如下:
apt-get install automake apt-get install libtool git clone git://github.com/推ter/twemproxy.git cd twemproxy autoreconf -fvi ./configure --enable-debug=log make src/nutcracker -h
通過上面的命令就算安裝好了,然后是具體的配置,下面是一個典型的配置
redis1: listen: 0.0.0.0:9999 #使用哪個端口啟動 Twemproxy redis: true #是否是 Redis 的 proxy hash: fnv1a_64 #指定具體的 hash 函數 distribution: ketama #具體的 hash 算法 auto_eject_hosts: true #是否在結點無法響應的時候臨時摘除結點 timeout: 400 #超時時間(毫秒) server_retry_timeout: 2000 #重試的時間(毫秒) server_failure_limit: 1 #結點故障多少次就算摘除掉 servers: #下面表示所有的 Redis 節點(IP:端口號:權重) - 127.0.0.1:6379:1 - 127.0.0.1:6380:1 - 127.0.0.1:6381:1 - 127.0.0.1:6382:1 redis2: listen: 0.0.0.0:10000 redis: true hash: fnv1a_64 distribution: ketama auto_eject_hosts: false timeout: 400 servers: - 127.0.0.1:6379:1 - 127.0.0.1:6380:1 - 127.0.0.1:6381:1 - 127.0.0.1:6382:1
你可以同時開啟多個 Twemproxy 實例,它們都可以進行讀寫,這樣你的應用程序就可以完全避免所謂的單點故障。
問題與不足
Twemproxy 由于其自身原理限制,有一些不足之處,如:
- 不支持針對多個值的操作,比如取 sets 的子交并補等(MGET 和 DEL 除外)
- 不支持 Redis 的事務操作
- 出錯提示還不夠完善
更多
關于 Twemproxy 的介紹可以看這里:http://antirez.com/news/44
Twemproxy 項目地址:https://github.com/推ter/twemproxy