您好,登錄后才能下訂單哦!
Twemproxy 測試架構
1、twemproxy是twitter開發的一個redis代理proxy。通過Twemproxy可以使用多臺服務器來水平擴張redis服務,可以有效的避免redis單點故障問題。
使用Twemproxy 對硬件資源配置較高;在redis性能有一定的損失(twitter測試約20%)用于提高整個系統的HA;
2、twemproxy部署簡單快捷;可以直接在proxy進行讀寫、并轉發請求給后端的redis;但是不適合超大流量系統。做的時候把應用分開、使用LVS集群:實現twemproxy的負載均衡,提高proxy的可用性和可擴張能力;
優點:
輕量級的Redis和memcached代理。使用它可以減少緩存服務器的連接數,并且利用它來作分片,性能損耗不會多于20%。其實是因為用了pipeline.首先redis是支持使用pipeline批處理的。
twemproxy與每個redis服務器都會建立一個連接,每個連接實現了兩個FIFO的隊列,通過這兩個隊列實現對redis的pipeline訪問。將多個客戶端的訪問合并到一個連接,這樣既減少了redis服務器的連接數,又提高了訪問性能。
缺點:
雖然可以動態移除節點,但該移除節點的數據就丟失了。redis集群動態增加節點的時候,twemproxy不會對已有數據做重分布.maillist里面作者說這個需要自己寫個腳本實現性能上的損耗.
twemproxy- nutcracker:
ip:10.207.101.101
ip:10.207.101.102
VIP:10.207.101.100
HA- keepalived
ip:10.207.101.101
ip:10.207.101.102
VIP:10.207.101.100
Redis
IP: 10.207.101.101
Port:6001/6002/6003
IP: 10.207.101.102
Port:6001/6002/6003
3、部署
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
wget https://codeload.github.com/twitter/twemproxy/zip/master
yum install gcc gcc-c++ tcl ruby -y
tar -xf autoconf-2.69.tar.gz
cd autoconf-2.69/
./configure
make &&make install
unzip unzip master.zip
cd twemproxy-master
autoreconf -fvi
./configure --enable-debug=full
make
make install
4、配置示例:
# vim /etc/nutcracker.yml
alpha:
listen: 0.0.0.0:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers: --兩臺redis服務器的地址和端口
- 10.207.101.101:6001:1
- 10.207.101.102:6001:1
#配置都是redis master地址
注意:
.yml 配置文件中每個參數值對分隔符”:”后需要有一個空格
不同層次的參數需要縮進區分,最好使用tab鍵縮進,否則nutcracker進程不能啟動。
在auto_eject_hosts: true的時候,關閉一個redis實例后,寫入數據還是提示“(error) ERR Connection refused”。這個與server_retry_timeout參數設置太小有關,默認值30000msec是一個很好的選擇。
5、啟動Twemproxy服務
nutcracker -t nutcracker.yml
檢測配置語法真確會顯示OK .
# nutcracker -t twemproxy/conf/nutcracker.yml
nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok
web界面運行啟動服務的http://ip:22222查看;
可以使用nc命令查看 Twemproxy 狀態語句:
# nc 10.207.101.101 22222|python -mjson.tool
6、設置啟動:
# cat start.sh
nutcracker -d -c /opt/twemproxy-master/conf/nutcracker.yml -p /opt/twemproxy-master/run/redisproxy.pid -o /opt/twemproxy-master/run/redisproxy.log
nutcracker 用法與命令選項
Options:
-h, –help : 查看幫助文檔,顯示命令選項
-V, –version : 查看nutcracker版本
-t, –test-conf : 測試配置腳本的正確性
-d, –daemonize : 以守護進程運行
-D, –describe-stats : 打印狀態描述
-v, –verbosity=N : 設置日志級別 (default: 5, min: 0, max: 11)
-o, –output=S : 設置日志輸出路徑,默認為標準錯誤輸出 (default: stderr)
-c, –conf-file=S : 指定配置文件路徑 (default: conf/nutcracker.yml)
-s, –stats-port=N : 設置狀態監控端口,默認22222 (default: 22222)
-a, –stats-addr=S : 設置狀態監控IP,默認0.0.0.0 (default: 0.0.0.0)
-i, –stats-interval=N : 設置狀態聚合間隔 (default: 30000 msec)
-p, –pid-file=S : 指定進程pid文件路徑,默認關閉 (default: off)
-m, –mbuf-size=N : 設置mbuf塊大小,以bytes單位 (default: 16384 bytes)
# cat stop.sh
ps -ef | grep redis | grep -v grep | awk '{print $2}' | sed -e "s/^/kill -9 /g" | sh -
7、檢測進程
ps -ef | grep nutcracker | grep -v grep
8、keepalived 部署 HA 靜態路由單點故障;
yum install keepalived -y
# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_twem {
# script "killall -0 redis"
script "/etc/keepalived/check_twem.sh"
interval 2
weight -3
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.27.101.100/24 dev eth0 label eth0:1
}
track_script {
check_twem
}
}
virtual_server 172.27.101.100 22121 {
delay_loop 6
protocol TCP
real_server 172.27.101.101 22121 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
real_server 172.27.101.102 22121 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
9、nutcracker 進程檢測 - 腳本check_twem.sh
# cat /etc/keepalived/check_twem.sh
#!/bin/bash
twem=$(ps -C nutcracker --no-heading|wc -l)
if [ "${twem}" = "0" ]; then
sh /opt/twemproxy-master/start.sh
sleep 2
twem=$(ps -C nutcracker --no-heading|wc -l)
if [ "${twem}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
10、Set測試:
通過twemproxy測試:
# redis-cli -h 172.27.101.100 -p 22121 -c 11 -t set -d 11 -l –q
SET: 38167.94 requests per second
直接對后端redis測試:
# redis-cli -h 172.27.101.101 -p 6001 -c 11 -t set -d 11 -l –q
直接對后端redis測試:
# redis-cli -h 172.27.101.102 -p 6001 -c 11 -t set -d 11 -l –q
SET: 53191.49 requests per second
11、Get測試:
通過twemproxy測試:
# redis-cli -h 172.27.101.100 -p 22121 -c 11 -t get -d 11 -l -q
GET: 37453.18 requests per second
直接對后端redis測試:
# redis-cli -h 172.27.101.101 -p 22121 -c 11 -t get -d 11 -l -q
GET: 62111.80 requests per second
查看鍵值分布:
# redis-cli info|grep db0
db0:keys=51483,expires=0,avg_ttl=0
# redis-cli info|grep db0
db0:keys=48525,expires=0,avg_ttl=0
12、redis-cli 基本操作;
Redis 模糊搜索
keys *
select 2
刪除所有以user開頭的key 可以這樣實現:
# redis-cli keys "user*"
1) "user1"
2) "user2"
# redis-cli keys "user*" | xargs redis-cli del
(integer) 2
# 刪除成功
# 批量刪除匹配通配符的key用到了Linux中的管道和xargs參數:
redis-cli keys "s*" | xargs redis-cli del
# 如果需要制定數據庫,需要用到 -n 數據庫編號 參數,下面是刪除2數據庫中s開頭的鍵:
redis-cli -n 2 keys "s*" | xargs redis-cli -n 2 del
redis-cli keys "*" | xargs redis-cli del
# 如果redis-cli沒有設置成系統變量,需要指定redis-cli的完整路徑
# 如:/opt/redis/redis-cli keys "*" | xargs /opt/redis/redis-cli del
# 刪除當前數據庫中的所有Key
flushdb
# 刪除所有數據庫中的key
flushall
13、測試問題
read, writev and mbuf
所有的請求和響應都在mbuf里面,mbuf默認大小是16K(512b-16M),可以使用-m or -mbuf-size=N來配置,每一個連接都會獲得至少一個mbuf,這意味著nutcracker支持的并發的連接數依賴于mbuf的大小,小的mbuf可以控制更多的連接,大的mbuf可以讓我們讀或者寫更多的數據導socker buffer。如果并發量很大的場景,推薦使用比較小的mbuf(512 or 1K)
mbuf-size=N
每一個客戶端連接最好需要一個mbuf,一個服務請求最少是兩個連接(client->proxy、proxy->server)所以最少需要兩個mbufs 1000個客戶端連接的場景計算:1000*2*mbuf=32M,如果每個連接有10個操作,這個值將會是320M,假設連接是10000,那么將會消耗3.2G內存!這種場景下最好調mbuf值比如512b,1000*2*512*10=10M 這個就是當并發量高的場景下使用小的mbuf的原因
key長度:
memcached的長度上限是250, redis沒有類似限制,但是nutcracker需要key存儲在連續的內存里面,而因為所有的請求和響應都在mbuf中,所以redis key的長度將會受限制于mbuf,也就是說如果你的redis實例如果要操作超長的key,你必須把mbuf調大。
14、簡單刪除
# 測試數據
redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"
# 移除單個元素
redis> ZREM page_rank google.com
(integer) 1
redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
# 移除多個元素
redis> ZREM page_rank baidu.com bing.com
(integer) 2
redis> ZRANGE page_rank 0 -1 WITHSCORES
(empty list or set)
# 移除不存在元素
redis> ZREM page_rank non-exists-element
(integer) 0
14、命令參考
http://doc.redisfans.com/
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。