您的位置:首页 > 数据库 > Redis

基于Twemproxy的Redis集群方案

2015-08-10 22:15 363 查看

一、 目标

单台Redis内存有限,并且在大内存环境中,性能急剧下降。因此,为了减少Redis连接,并且能够更好的缓存数据,统一管理Redis实例,需要使用Redis集群来满足场景需求。我们采用TwemProxy来搭建Redis集群。

本文通过三台物理服务器来模拟搭建Redis集群,并记录操作步骤。后续搭建产品模式下Redis集群可参考本文。

二、 TwemProxy概述

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在产品模式下应用广泛,成熟度高。

 

三、 部署准备

3.1 服务器

3.1.1 TwemProxy服务器

IP::10.105.34.28(内)

CPU:8核

内存:16G

 

该服务器负责搭建TwemProxy实例,用来管理Redis实例节点。

 

3.1.2 Redis主服务器

IP::10.105.42.38 (内)

CPU:8核

内存:16G

 

该服务器会部署8个Redis实例,并作为Redis Master.

 

3.1.3 Redis从服务器

IP::10.105.41.100 (内)

CPU:8核

内存:16G

 

该服务器会部署8个Redis实例,并作为Redis Salve

 

命令:

       查看内存信息:free

       查看CPU信息:cat /proc/cpuinfo,查看cpu cores是否满足要求。

四、 安装Redis

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好使不好使

 

五、 安装TwemProxy

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

       查看是否有值(有值则成功)

以上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis