介绍:

  twemproxy是twitter开发的一个代理程序,支持memcached和redis,本文将介绍如果使用twemproxy实现redis数据分片搭建一套强大的redis集群。具体twemproxy的特性就百度吧,这里就不介绍了。

背景:

  本人在一家游戏公司工作,面对强大的玩家数据,单单的redis主从已经无法满足过大的数据,而且可扩展性不好,twemproxy代理redis服务器,可以把数据sharding到多台服务器的上每台服务器存储着整个数据集的一部分。因而,当某一台redis服务器宕机了,那么也就失去了一部分数据。如果借助于redis的master-slave replication,能保证在任何一台redis不能工作情况下,仍然能够保证能够存在一个整个的数据集。


1,安装

twemproxy安装需要先安装autoconf

autoconf下载地址:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
twemproxy下载地址:https://codeload.github.com/twitter/twemproxy/zip/master

安装autoconf

tar xvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure 
make && make install

安装twemproxy

unzip twemproxy-master.zip 
cd twemproxy-master
autoreconf -fvi
./configure
make && make install

安装redis(源码包去官网下载就行,这里用的2.8.3版本)

tar xvf redis-2.8.3.tar.gz 
cd cd redis-2.8.3
make && make install

2,配置

配置redis(我们这里配置两个redis实例)

实例一:端口6379  实例二:端口6380

在redis源码包里有个redis.conf 文件就是redis的配置文件 我们手动拷贝到/etc/redis/下

cp /root/redis-2.8.3/redis.conf /etc/redis/6379.conf 
cp /root/redis-2.8.3/redis.conf /etc/redis/6380.conf

修改配置文件里相应的配置

port 6379
logfile "/var/lib/redis/6379/redis.log"
dir /var/lib/redis/6379/

启动两个redis实例

redis-server /etc/redis/6379.conf &
redis-server /etc/redis/6380.conf &

配置twemproxy

配置文件路径:/etc/nutcracker/nutcracker.yml

cat /etc/nutcracker/nutcracker.yml
alpha:
  listen: 127.0.0.1:22121
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 127.0.0.1:6379:1 server1
   - 127.0.0.1:6380:1 server2

启动twemproxy

nutcracker -d -c /etc/nutcracker/nutcracker.yml

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)


测试twemproxy

使用redis自带的测试工具 redis-benchmark 

[root@test]# redis-benchmark -h 127.0.0.1 -q -t set,get,incr,lpush,lpop,sadd,spop,lpush,lrange -c 100 -p 22121
SET: 52631.58 requests per second
GET: 54644.81 requests per second
INCR: 53191.49 requests per second
LPUSH: 52631.58 requests per second
LPOP: 53475.93 requests per second
SADD: 52083.33 requests per second
SPOP: 52910.05 requests per second
LPUSH (needed to benchmark LRANGE): 51282.05 requests per second
LRANGE_100 (first 100 elements): 13037.81 requests per second
LRANGE_300 (first 300 elements): 8116.88 requests per second
LRANGE_500 (first 450 elements): 7042.25 requests per second
LRANGE_600 (first 600 elements): 4149.38 requests per second

登录2个实例查看数据

[root@test]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> KEYS *
1) "counter:__rand_int__"
127.0.0.1:6379> 
[root@test]# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> KEYS *
1) "mylist"
2) "key:__rand_int__"
127.0.0.1:6380>

发现我们的测试数据分片到了两个redis实例中。


本次实验是在一台机器上测试的,即twemproxy和两个redis实例都部署到了一起


而实际生产环境不是这样的

生产环境架构:

使用twemproxy部署redis集群_第1张图片

本文先到这里吧,欢迎各位拍砖~~~