CentOS 部署双机房redis主从集群及部署twemproxy中间件
编写日期:2018-07-12
编写作者:mtsbv110
主机规划: 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
一、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
[[email protected] twemproxy-0.4.0]# ./configure && make
[[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主集群
- 创建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”
- 创建redis配置文件,修改对应内容
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
二、在两台机器上分别启动从集群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 &
三、映射关系
- 配置从集群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
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
四、修改配置文件
[[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中间件
修改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
重新启动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