单台Redis内存有限,并且在大内存环境中,性能急剧下降。因此,为了减少Redis连接,并且能够更好的缓存数据,统一管理Redis实例,需要使用Redis集群来满足场景需求。我们采用TwemProxy来搭建Redis集群。
本文通过三台物理服务器来模拟搭建Redis集群,并记录操作步骤。后续搭建产品模式下Redis集群可参考本文。
TwemProxy是Twtter开源的一个Redis以及Memcache代理服务器,支持大部分Redis以及Memcache ASCII协议,能够对后端多台Redis或Memcached实例进行统一管理分配,客户端只需针对TwemProxy进行操作,而无需关心TwemProxy之后的真实存储,因此,数据存储在哪个Redis或Memcached实例上,对于客户端来说,是完全透明的。
TwemProxy支持自动分片、失败节点摘除、一致性hash,优化Redis请求(批处理)等,同时TwemProxy也有一些不足之处,例如无法全面覆盖Redis命令(不支持事务,多值操作(如keys*))。扩展Redis实例时,无法自动将之前数据进行再分配(需要写脚本手动分配)。
不支持命令详见:
https://raw.githubusercontent.com/twitter/twemproxy/master/notes/redis.md
目前,TwemProxy在产品模式下应用广泛,成熟度高。
IP::10.105.34.28(内)
CPU:8核
内存:16G
该服务器负责搭建TwemProxy实例,用来管理Redis实例节点。
IP::10.105.42.38 (内)
CPU:8核
内存:16G
该服务器会部署8个Redis实例,并作为Redis Master.
IP::10.105.41.100 (内)
CPU:8核
内存:16G
该服务器会部署8个Redis实例,并作为Redis Salve
命令:
查看内存信息:free
查看CPU信息:cat /proc/cpuinfo,查看cpu cores是否满足要求。
1) 创建Redis目录
mkdir /usr/local/redis
2) 下载Redis源码到/usr/local/src目录中
cd /usr/local/src
wget http://download.redis.io/releases/redis-2.8.21.tar.gz
3) 解压,并建立一个软连接
tar xzf redis-2.8.21.tar.gz
ln -s redis-2.8.21 redis
4) Redis安装
cd redis
make PREFIX=/usr/local/redis install
这时,在/usr/local/redis/bin中,存在
redis-benchmark
redis-check-aof
redis-check-dump
redis-cli
redis-server
五个文件。
5) 复制Redis脚本到init.d目录下,并改名
cp /usr/local/src/redis/utils/redis_init_script/etc/rc.d/init.d/redis
6) 修改/etc/rc.d/init.d/redis文件。
vim /etc/rc.d/init.d/redis
内容如下:
#!/bin/sh
#chkconfig: 2345 80 90
# Simple Redis init.d script conceived to work on Linuxsystems
# as it does use of the /proc filesystem.
REDISPORT=$2
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/redis/${REDISPORT}/redis.conf"
case "$1" in
start)
if [ -f$PIDFILE ]
then
echo"$PIDFILE exists, process is already running or crashed"
else
echo"Starting Redis server..."
$EXEC$CONF &
fi
;;
stop)
if [ ! -f$PIDFILE ]
then
echo"$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo"Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while[ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo"Redis stopped"
fi
;;
*)
echo"Please use start or stop as first argument"
;;
esac
7) 新建Redis不同端口目录,并复制Redis配置至端口目录下。
a) 10.105.42.38 服务器
cd /usr/local/redis
mkdir 6379 6380 6381 6382 6383 6384 6385 6386
cp /usr/local/src/redis/redis.conf/usr/local/redis/6379/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/6380/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/6381/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/6382/redis.conf
cp /usr/local/src/redis/redis.conf /usr/local/redis/6383/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/6384/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/6385/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/6386/redis.conf
b) 10.105.41.100服务器
cd /usr/local/redis
mkdir 63791 63801 63811 63821 63831 63841 63851 63861
cp /usr/local/src/redis/redis.conf/usr/local/redis/63791/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/63801/redis.conf
cp /usr/local/src/redis/redis.conf /usr/local/redis/63811/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/63821/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/63831/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/63841/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/63851/redis.conf
cp /usr/local/src/redis/redis.conf/usr/local/redis/63861/redis.conf
8) 修改端口目录下Redis配置
vim /usr/local/redis/端口/redis.conf
找到以下KEY,并修改
daemonize 修改为 yes
pidfile 修改为 /var/run/redis_端口.pid
port 修改为对应的端口
dir 修改为/usr/local/redis/端口/
如6379目录下redis.conf上述KEY对应的值应该为:
daemonize yes
pidfile /var/run/redis_6379.pid
port 6379
dir /usr/local/redis/6379/
9) 增加redis服务
chkconfig --add redis
这样就可以使用以下命令:
Redis启动命令:service redis start端口,如service redis start 6379
Redis关闭命令:service redis stop端口,如service redis stop 6379
10) 将/usr/local/redis/bin添加至环境变量PATH中,使得命令行可以直接执行该目录下命令。
vi /etc/profile
最后一行增加:
export PATH="$PATH:/usr/local/redis/bin"
立即生效:
. /etc/profile
最后试试redis-cli好使不好使
1) 若没安装git,则先安装git
yum install git git-svn git-email git-gui gitk
2) 下载TwemProxy源码到/usr/local/src目录中
cd /usr/local/src
git clone https://github.com/twitter/twemproxy.git
3) 若没安装autoconf,则先安装autoconf
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar xzf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure
make & make install
sudo yum install automake
sudo yum install libtool
4) 安装TwemProxy
cd /usr/local/src/twemporxy
autoreconf -fvi
./configure --prefix=/usr/local/twemproxy
make -j 8
make install
cd /usr/local/twemproxy
mkdir run conf
这时,在/usr/local/twemproxy/sbin中,存在
nutcracker
文件
5) 拷贝配置文件至/usr/local/twemproxy/conf目录下,并修改配置文件。
cp /usr/local/src/twemproxy/conf/nutcracker.yml /usr/local/twemproxy/conf/nutcracker.yml
vim conf/nutcracker.yml
内容如下:
cluster1:
listen:10.105.34.28:10000
hash: fnv1a_64
distribution:ketama
auto_eject_hosts:true
redis: true
timeout: 400
server_retry_timeout:2000
server_failure_limit:1
servers:
-10.105.42.38:6379:1 master0
-10.105.42.38:6380:1 master1
-10.105.42.38:6381:1 master2
-10.105.42.38:6382:1 master3
-10.105.42.38:6383:1 master4
-10.105.42.38:6384:1 master5
-10.105.42.38:6385:1 master6
-10.105.42.38:6386:1 master7
cluster2:
listen:10.105.34.28:10001
hash: fnv1a_64
distribution:ketama
auto_eject_hosts:true
redis: true
timeout: 400
server_retry_timeout:2000
server_failure_limit:1
servers:
-10.105.42.38:6379:1 master0
-10.105.42.38:6380:1 master1
-10.105.42.38:6381:1 master2
-10.105.42.38:6382:1 master3
-10.105.42.38:6383:1 master4
- 10.105.42.38:6384:1master5
-10.105.42.38:6385:1 master6
-10.105.42.38:6386:1 master7
参数说明:
listen
twemproxy监听的端口。可以以ip:port或name:port的形式来书写。
hash
可以选择的key值的hash算法:
> one_at_a_time
> md5
> crc16
> crc32 (crc32 implementation compatible withlibmemcached)
> crc32a (correct crc32 implementation as per thespec)
> fnv1_64
> fnv1a_64
> fnv1_32
> fnv1a_32
> hsieh
> murmur
> jenkins
如果没选择,默认是fnv1a_64。
hash_tag
hash_tag允许根据key的一个部分来计算key的hash值。hash_tag由两个字符组成,一个是hash_tag的开始,另外一个是hash_tag的结束,在hash_tag的开始和结束之间,是将用于计算key的hash值的部分,计算的结果会用于选择服务器。
例如:如果hash_tag被定义为”{}”,那么key值为"user:{user1}:ids"和"user:{user1}:tweets"的hash值都是基于”user1”,最终会被映射到相同的服务器。而"user:user1:ids"将会使用整个key来计算hash,可能会被映射到不同的服务器。
distribution
存在ketama、modula和random3种可选的配置。其含义如下:
A. ketama
ketama一致性hash算法,会根据服务器构造出一个hashring,并为ring上的节点分配hash范围。ketama的优势在于单个节点添加、删除之后,会最大程度上保持整个群集中缓存的key值可以被重用。
B. modula
modula非常简单,就是根据key值的hash值取模,根据取模的结果选择对应的服务器。
C. random
random是无论key值的hash是什么,都随机的选择一个服务器作为key值操作的目标。
timeout
单位是毫秒,是连接到server的超时值。默认是永久等待。
backlog
监听TCP 的backlog(连接等待队列)的长度,默认是512。
preconnect
是一个boolean值,指示twemproxy是否应该预连接pool中的server。默认是false。
redis
是一个boolean值,用来识别到服务器的通讯协议是redis还是memcached。默认是false。
server_connections
每个server可以被打开的连接数。默认,每个服务器开一个连接。
auto_eject_hosts
是一个boolean值,用于控制twemproxy是否应该根据server的连接状态重建群集。这个连接状态是由server_failure_limit阀值来控制。
默认是false。
server_retry_timeout
单位是毫秒,控制服务器连接的时间间隔,在auto_eject_host被设置为true的时候产生作用。默认是30000毫秒。
server_failure_limit
控制连接服务器的次数,在auto_eject_host被设置为true的时候产生作用。默认是2。
servers
一个pool中的服务器的地址、端口和权重的列表,包括一个可选的服务器的名字,如果提供服务器的名字,将会使用它决定server的次序,从而提供对应的一致性hash的hashring。否则,将使用server被定义的次序,只需要写RedisMaster信息。
6) 测试配置是否合法
cd /usr/local/twemproxy
sbin/nutcracker –t
若返回syntax is ok 表明配置合法,否则请检查配置。
7) 启动TwemProxy
nutcracker参数:
-h 帮助
-V 版本
-t 测试配置文件是否合法
-d 守护启动
-D 描叙
-c 指定配置文件
守护启动:
/usr/local/twemproxy/sbin/nutcracker -d -c/usr/local/twemproxy/conf/nutcracker.yml
查看进程:
ps -ef|grep nutcracker
8) 测试
在10.105.42.38 服务器上,测试连接10.105.34.28:10000端口:
redis-cli –h10.105.34.28 -p 10000
可以连接,则设置值:
set c d
quit
连接10.105.34.28:10001端口:
redis-cli –h10.105.34.28 -p 10001
get c
查看是否有值(有值则成功)
以上。