CentOS 部署双机房redis主从集群及部署twemproxy中间件

编写日期:2018-07-12

编写作者:mtsbv110

邮    箱:[email protected]

 

 

主机规划:      192.168.9.140

Redis版本:        redis-3.0.0-rc5.tar.gz

Twemproxy版本:twemproxy-0.4.0.tar.gz

 

主机规划:          192.168.9.141

Redis版本:        redis-3.0.0-rc5.tar.gz

Twemproxy版本:twemproxy-0.4.0.tar.gz

 

CentOS 部署双机房redis主从集群及部署twemproxy中间件

 

一、redis cluster如何选择

1、redis cluster的问题

twemproxy+redis去做集群,redis部署多个主实例,每个主实例可以挂载一些redis从实例,如果将不同的数据分片,写入不同的redis主实例中,twemproxy这么一个缓存集群的中间件

 

redis cluster

(1)不好做读写分离,读写请求全部落到主实例上的,如果要扩展写QPS,或者是扩展读QPS,都是需要扩展主实例的数量,从实例就是一个用做热备+高可用

(2)不好跟nginx+lua直接整合,lua->redis的client api,但是不太支持redis cluster,中间就要走一个中转的java服务

(3)不好做树状集群结构,比如redis主集群一主三从双机房架构,redis cluster不太好做成那种树状结构

(4)方便,相当于是上下线节点,集群扩容,运维工作,高可用自动切换,比较方便

 

2、twemproxy+redis

(1)上线下线节点,有一些手工维护集群的成本

(2)支持redis集群+读写分离,就是最基本的多个redis主实例,twemproxy这个中间件来决定的,java/nginx+lua客户端,是连接twemproxy中间件的。每个redis主实例就挂载了多个redis从实例,高可用->哨兵,redis cluster读写都要落到主实例的限制,你自己可以决定写主,读从,等等

(3)支持redis cli协议,可以直接跟nginx+lua整合

(4)可以搭建树状集群结构

 

3、如何选择?

(1)看你是否一定需要那3点了,如果不需要,那么用redis cluster也ok,大多数情况下,很多应用用redis就是比较简单的,做一个缓存

(2)如果你的架构里很需要那3点,那么用twemproxy比较好,商品详情页系统的整套架构

 

4、相关软件及常用配置解释

[[email protected] redis-3.0.0-rc5]# pwd

/usr/local/redis-test/redis-3.0.0-rc5

 

 

[[email protected] src]# nohup /usr/local/redis-test/redis-3.0.0-rc5/src/redis-server /usr/local/redis-test/redis-3.0.0-rc5/redis.conf &

 

[[email protected] redis-3.0.0-rc5]# /usr/local/redis-test/redis-3.0.0-rc5/src/redis-cli -p 6379

twemproxy部署

[[email protected] twemproxy-test]# ls

twemproxy-0.4.0.tar.gz

 

[[email protected] twemproxy-0.4.0]# autoreconf -fvi

CentOS 部署双机房redis主从集群及部署twemproxy中间件

[[email protected] twemproxy-0.4.0]# ./configure && make

CentOS 部署双机房redis主从集群及部署twemproxy中间件

 

[[email protected] twemproxy-0.4.0]

# vi /usr/local/twemproxy-test/twemproxy-0.4.0/conf/nutcracker.yml

 

[[email protected] twemproxy-0.4.0]

# /usr/local/twemproxy-test/twemproxy-0.4.0/src/nutcracker -d -c

 /usr/local/twemproxy-test/twemproxy-0.4.0/conf/nutcracker.yml

 

-d:后台启动

-c:指定配置文件

 

[[email protected]tsen-detail-01 ~]# ps -aux | grep nutcracker

root     29170  0.0  0.0  18000   876 ?        Sl   6月25   0:00 /usr/local/twemproxy-test/twemproxy-0.4.0/src/nutcracker -d -c /usr/local/twemproxy-test/twemproxy-0.4.0/conf/nutcracker.yml

root     32633  0.0  0.0 112720   980 pts/0    S+   14:06   0:00 grep --color=auto nutcracke

 

[[email protected] ~]# /usr/local/redis-test/redis-3.0.0-rc5/src/redis-cli -p 1111

 

twemproxy讲解

 

eshop-detail-test: 

  listen: 127.0.0.1:1111 

  hash: fnv1a_64 

  distribution: ketama 

  timeout:1000 

  redis: true 

  servers: 

   - 127.0.0.1:6379:1 test-redis-01

   - 127.0.0.1:6380:1 test-redis-02

 

eshop-detail-test: redis集群的逻辑名称

listen:twemproxy监听的端口号

hash:hash散列算法

distribution:分片算法,一致性hash,取模,等等

timeout:跟redis连接的超时时长

redis:是否是redis,false的话是memcached

servers:redis实例列表,一定要加别名,否则默认使用ip:port:weight来计算分片,如果宕机后更换机器,那么分片就不一样了,因此加了别名后,可以确保分片一定是准确的

 

你的客户端,java/nginx+lua,连接twemproxy,写数据的时候,twemproxy负责将数据分片,写入不同的redis实例

  

如果某个redis机器宕机,需要自动从一致性hash环上摘掉,等恢复后自动上线

 

auto_eject_hosts: true,自动摘除故障节点

server_retry_timeout: 30000,每隔30秒判断故障节点是否正常,如果正常则放回一致性hash环

server_failure_limit: 2,多少次无响应,就从一致性hash环中摘除

 

二、部署双机房一主三从架构的redis主集群

  1. 创建Redis主实例目录

[[email protected] src]# cd /usr/local/redis

[[email protected] redis]# ls

3.0.0-rc5.tar.gz

2、编译redis

[[email protected] redis]# cd redis-3.0.0-rc5/

[[email protected] redis-3.0.0-rc5]# ls

00-RELEASENOTES  BUGS  CONTRIBUTING  COPYING  deps  INSTALL  Makefile  MANIFESTO  README  redis.conf  runtest  runtest-cluster  runtest-sentinel  sentinel.conf  src  tests  utils

[[email protected] redis-3.0.0-rc5]# make

cd src && make all

make[1]: 离开目录“/usr/local/redis/redis-3.0.0-rc5/src”

 

  1. 创建redis配置文件,修改对应内容

CentOS 部署双机房redis主从集群及部署twemproxy中间件

 

 

redis-master-01.conf  -->    port      6400

redis-master-02.conf  -->    port       6401

 

redis-slave-01.conf    -->    port      6402

redis-slave-02.conf    -->    port      6403

 

redis-slave-03.conf    -->    port      6404

redis-slave-04.conf    -->    port      6405

 

redis-slave-05.conf    -->    port      6406

redis-slave-06.conf    -->    port      6407

 

 

3、启动Redis的实例

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-master-01.conf &

 

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-master-02.conf &

 

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-slave-01.conf &

 

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-slave-02.conf &

 

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-slave-03.conf &

 

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-slave-04.conf &

 

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-slave-05.conf &

 

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-slave-06.conf &

 

 

4、设置Slaveof

[[email protected] src]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -p 6402

 

127.0.0.1:6402> slaveof 192.168.9.140 6400

127.0.0.1:6402> info replication

 

[[email protected] src]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -p 6403

127.0.0.1:6403> slaveof 192.168.9.140 6401

127.0.0.1:6403> info replication

 

[[email protected] redis-3.0.0-rc5]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -p 6404

127.0.0.1:6404> slaveof 192.168.9.140 6402

 

[[email protected] redis-3.0.0-rc5]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -p 6405

127.0.0.1:6405> slaveof 192.168.9.140 6403

 

 

[[email protected] redis-3.0.0-rc5]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -p 6406

127.0.0.1:6406> slaveof 192.168.9.141 6404

 

[[email protected] redis-3.0.0-rc5]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -p 6407

127.0.0.1:6407> slaveof 192.168.9.141 6405

 

5、验证

 

[[email protected] redis-3.0.0-rc5]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -p 6400

127.0.0.1:6400> set k1 v1

OK

127.0.0.1:6400> exit

[[email protected] redis-3.0.0-rc5]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -p 6402

127.0.0.1:6402> get k1

 

[[email protected] redis-3.0.0-rc5]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -h 192.168.9.141 -p 6404

 

[[email protected] redis-3.0.0-rc5]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli  -p 6406

127.0.0.1:6406> get k1

"v1"

 

 

 

三、每个机房部署一个redis从集群

一、端口规划

redis-slave-07.conf    -->    port      6408

redis-slave-08.conf    -->    port      6409

 

redis-slave-09.conf    -->    port      6410

redis-slave-10.conf    -->    port      6411

 

 

CentOS 部署双机房redis主从集群及部署twemproxy中间件

CentOS 部署双机房redis主从集群及部署twemproxy中间件

 

二、在两台机器上分别启动从集群redis实例

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-slave-07.conf &

 

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-slave-08.conf &

 

 

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-slave-09.conf &

 

[[email protected] redis-3.0.0-rc5]# nohup /usr/local/redis/redis-3.0.0-rc5/src/redis-server /usr/local/redis/redis-3.0.0-rc5/redis-slave-10.conf &

 

CentOS 部署双机房redis主从集群及部署twemproxy中间件

CentOS 部署双机房redis主从集群及部署twemproxy中间件

三、映射关系

CentOS 部署双机房redis主从集群及部署twemproxy中间件CentOS 部署双机房redis主从集群及部署twemproxy中间件

 

  • 配置从集群master-slave关系

[[email protected] redis-3.0.0-rc5]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -h 192.168.9.140 -p 6408

192.168.9.140:6408> slaveof 192.168.9.140 6400

192.168.9.140:6408> info replication

 

[[email protected] redis-3.0.0-rc5]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -h 192.168.9.140 -p 6409

192.168.9.140:6409> slaveof 192.168.9.140 6401

192.168.9.140:6409> info replication

 

[[email protected] redis-3.0.0-rc5]#  /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -h 192.168.9.141 -p 6410

192.168.9.141:6410> slaveof 192.168.9.140 6400

192.168.9.141:6410> info replication

 

[[email protected] redis-3.0.0-rc5]#  /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -h 192.168.9.141 -p 6411

192.168.9.141:6411> slaveof 192.168.9.141 6401

192.168.9.141:6411> info replication

 

 

四、redis主、从集群部署twemproxy中间件

  • 依赖环境

yum install -y autoconf automake libtool

CentOS 部署双机房redis主从集群及部署twemproxy中间件

yum remove -y autoconf --直接将autoconf和automake、libtool都删除掉了

 

wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz

tar -zxvf autoconf-2.69.tar.gz

cd autoconf-2.69

./configure --prefix=/usr

make && make install

 

wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz

tar -zxvf automake-1.14.tar.gz

cd automake-1.14

./bootstrap.sh

./configure --prefix=/usr

make && make install

 

wget http://ftpmirror.gnu.org/libtool/libtool-2.4.2.tar.gz

tar -zxvf libtool-2.4.2.tar.gz

cd libtool-2.4.2

./configure --prefix=/usr

make && make install

 

 

  • 目前规划

[[email protected] local]# mkdir twemproxy-master

jetsen-detail-01 twemproxy-master]# tar -zxvf twemproxy-0.4.0.tar.gz

三、编译安装

[[email protected] twemproxy-master]# cd twemproxy-0.4.0/

[[email protected] twemproxy-0.4.0]# autoreconf -fvi

[[email protected] twemproxy-0.4.0]# ./configure && make

CentOS 部署双机房redis主从集群及部署twemproxy中间件

四、修改配置文件

[[email protected] conf]# vi nutcracker.yml

redis-master:

  listen: 192.168.9.140:1111

  hash: fnv1a_64

  distribution: ketama

  redis: true

  servers:

   - 192.168.9.140:6400:1 redis01

   - 192.168.9.140:6401:1 redis02

五、启动twemproxy

[[email protected] conf]# /usr/local/twemproxy-master/twemproxy-0.4.0/src/nutcracker -d -c /usr/local/twemproxy-master/twemproxy-0.4.0/conf/nutcracker.yml

[[email protected] conf]# ps -aux | grep nutcracker

 

六、测试验证twemproxy连接

[[email protected] conf]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -h 192.168.9.140 -p 1111

 

 

 

 

 

为每个机房的redis从集群部署twemproxy中间件

CentOS 部署双机房redis主从集群及部署twemproxy中间件

修改twemproxy配置文件

redis-slave:

  listen: 192.168.9.140:1112

  hash: fnv1a_64

  distribution: ketama

  redis: true

  servers:

   - 192.168.9.140:6408:1 redis01

   - 192.168.9.140:6409:1 redis02

CentOS 部署双机房redis主从集群及部署twemproxy中间件

重新启动twemproxy

[[email protected] conf]# /usr/local/twemproxy-master/twemproxy-0.4.0/src/nutcracker -d -c /usr/local/twemproxy-master/twemproxy-0.4.0/conf/nutcracker.yml  

 

[[email protected] conf]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -h 192.168.9.140 -p 1112

192.168.9.140:1112> get k1

 

 

在另一从集群中配置

[[email protected] twemproxy]# pwd

/usr/local/twemproxy
 

[[email protected] twemproxy-0.4.0]# autoreconf -fvi

[[email protected] twemproxy-0.4.0]# ./configure && make

[[email protected] twemproxy-0.4.0]# vi conf/nutcracker.yml

redis-slave:

  listen: 192.168.9.141:1112

  hash: fnv1a_64

  distribution: ketama

  redis: true

  servers:

   - 192.168.9.141:6410:1 redis01

   - 192.168.9.141:6411:1 redis02

 

启动twemproxy

[[email protected] twemproxy-0.4.0]#

/usr/local/twemproxy/twemproxy-0.4.0/src/nutcracker -d -c

 /usr/local/twemproxy/twemproxy-0.4.0/conf/nutcracker.yml

 

 

[[email protected] twemproxy-0.4.0]# /usr/local/redis/redis-3.0.0-rc5/src/redis-cli -h 192.168.9.141 -p 1112