Redis 集群之Redis+Twemproxy方案

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Twemproxy 是 Twtter 开源的一个 Redis 和 Memcache 代理服务器,主要用于管理 Redis 和 Memcached 集群,减少与Cache 服务器直接连接的数量。

【转载请注明出处】:https://www.jianshu.com/p/d94728fc8a91

1、下载Redis安装包

Redis的官网下载地址是https://redis.io/download,上面有各个发行版本,我选择的是当前的最新稳定版5.0.4,下载到安装目录并编译出安装包。

wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -zxvf redis-5.0.4.tar.gz
cd redis-5.0.4
make
make test

测试执行没有问题之后显示
image.png

2、验证Redis

启动服务

./src/redis-server

客户端连接验证

./src/redis-cli
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> exit

3、配置Redis集群环境

创建redis-cluster目录,然后在redis-cluster下分别创建7001 7002 7003 7004 7005 7006目录

mkdir redis-cluster
cd redis-cluster
mkdir 7001 7002 7003 7004 7005 7006
cd ..

编辑7001的配置文件

./redis-cluster/7001/redis.conf

配置文件内容如下

bind 127.0.0.1
port 7001
daemonize no
pidfile /var/run/redis_7001.pid
logfile "./redis-cluster/7001/redis.log"
save 900 1
save 300 10
save 60 10000
dir ./redis-cluster/7001/
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
appendfsync always

这些配置的含义及例子都可以在根目录redis.conf文件中找到,具体含义可以阅读此文件。将编辑好的配置文件复制到其他节点,修改相应节点的配置

cp ./redis-cluster/7001/redis.conf ./redis-cluster/7002/
cp ./redis-cluster/7001/redis.conf ./redis-cluster/7003/
cp ./redis-cluster/7001/redis.conf ./redis-cluster/7004/
cp ./redis-cluster/7001/redis.conf ./redis-cluster/7005/
cp ./redis-cluster/7001/redis.conf ./redis-cluster/7006/
grep 7001 -rl ./redis-cluster/7002 | xargs -t sed -i ".bak" "s/7001/7002/g"
#将7002目录下的文件备份为xxx.bak,并将文件中的7001替换成7002
# -t是回显命令 ,-i是直接修改文件内容,“.bak”是备份文件的后缀
#产生的备份文件如果不想要可以用下面任何一个命令删除 
# find ./redis-cluster -name "*.bak" | xargs rm -f ;
# find ./redis-cluster -name "*.bak" -exec rm {} \;
grep 7001 -rl ./redis-cluster/7003 | xargs -t sed -i ".bak" "s/7001/7003/g"
grep 7001 -rl ./redis-cluster/7004 | xargs -t sed -i ".bak" "s/7001/7004/g"
grep 7001 -rl ./redis-cluster/7005 | xargs -t sed -i ".bak" "s/7001/7005/g"
grep 7001 -rl ./redis-cluster/7006 | xargs -t sed -i ".bak" "s/7001/7006/g"

分别启动五个实例

./src/redis-server ./redis-cluster/7001/redis.conf &
./src/redis-server ./redis-cluster/7002/redis.conf &
./src/redis-server ./redis-cluster/7003/redis.conf &
./src/redis-server ./redis-cluster/7004/redis.conf &
./src/redis-server ./redis-cluster/7005/redis.conf &
./src/redis-server ./redis-cluster/7006/redis.conf &

创建redis集群

./src/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

为了后续操作方便,可以编写一个启动与停止的脚本:
启动脚本 start.sh

#!/bin/sh
./src/redis-server ./redis-cluster/7001/redis.conf &
./src/redis-server ./redis-cluster/7002/redis.conf &
./src/redis-server ./redis-cluster/7003/redis.conf &
./src/redis-server ./redis-cluster/7004/redis.conf &
./src/redis-server ./redis-cluster/7005/redis.conf &
./src/redis-server ./redis-cluster/7006/redis.conf &

停止脚本 stop.sh

#!/bin/sh
./src/redis-cli -p 7001 shutdown 
./src/redis-cli -p 7002 shutdown 
./src/redis-cli -p 7003 shutdown 
./src/redis-cli -p 7004 shutdown 
./src/redis-cli -p 7005 shutdown
./src/redis-cli -p 7006 shutdown

给脚本添加执行权限

chmod +x start.sh 
chmod +x stop.sh 

通过随便一个客户端查看节点信息

./src/redis-cli -p 7001 cluster nodes

image.png

4、Twemproxy介绍

Twemproxy 也叫 nutcraker。是 Twtter 开源的一个 Redis 和 Memcache 代理服务器,主要用于管理 Redis 和 Memcached 集群,减少与Cache 服务器直接连接的数量。

Twemproxy特性:

  • 支持失败节点自动删除
    – 可以设置重新连接该节点的时间

– 可以设置连接多少次之后删除该节点

  • 支持设置HashTag
    – 通过HashTag可以自己设定将两个key哈希到同一个实例上去减少与redis的直接连接数

– 保持与redis的长连接
– 减少了客户端直接与服务器连接的连接数量

  • 自动分片到后端多个redis实例上
    – 多种hash算法:md5、crc16、crc32 、crc32a、fnv1_64、fnv1a_64、fnv1_32、fnv1a_32、hsieh、murmur、jenkins

– 多种分片算法:ketama(一致性hash算法的一种实现)、modula、random
– 可以设置后端实例的权重

  • 避免单点问题
    – 可以平行部署多个代理层,通过HAProxy做负载均衡,将redis的读写分散到多个twemproxy上。
  • 支持状态监控
    – 可设置状态监控ip和端口,访问ip和端口可以得到一个json格式的状态信息串

– 可设置监控信息刷新间隔时间

  • 使用 pipelining 处理请求和响应
    – 连接复用,内存复用

– 将多个连接请求,组成reids pipelining统一向redis请求

  • 并不是支持所有redis命令
    – 不支持redis的事务操作

– 使用SIDFF, SDIFFSTORE, SINTER, SINTERSTORE, SMOVE, SUNION and SUNIONSTORE命令需要保证key都在同一个分片上。

5、Twemproxy安装

Twemproxy官网地址是https://github.com/twitter/twemproxy,在安装twemproxy 前,需要安装autoconf,automake,libtool 软件包,此处不再说明。
Twemproxy的发布版本在 https://github.com/twitter/twemproxy/releases
下载最新版本0.4.1

wget https://github.com/twitter/twemproxy/archive/v0.4.1.tar.gz
tar -zxvf v0.4.1.tar.gz
cd twemproxy-0.4.1/
autoreconf -fvi
./configure --prefix=/usr/local/twemproxy
make
sudo make install

编辑配置文件nutcracker.yml

cd /usr/local/twemproxy/
mkdir conf run
vim ./conf/nutcracker.yml

这里只配置了三个master节点作为测试,具体根据业务需要配置,具体的参数含义在官网有说明https://github.com/twitter/twemproxy

beta:
  listen: 127.0.0.1:22122
  hash: fnv1a_64
  hash_tag: "{}"
  distribution: ketama
  auto_eject_hosts: false
  timeout: 400
  redis: true
  servers:
   - 127.0.0.1:7004:1 7004
   - 127.0.0.1:7005:1 7005
   - 127.0.0.1:7006:1 7006

启动twemproxy

./sbin/nutcracker -t
#测试配置文件是否正确
./sbin/nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log
#指定配置文件路径、pid路径、日志路径

连接twemproxy进行测试

./src/redis-cli -h 127.0.0.1 -p 22122 -c
127.0.0.1:22122> set foo bar
-> Redirected to slot [1044] located at 127.0.0.1:7005
OK
127.0.0.1:7005> get foo
"bar"

表示成功了,可以进行读取,应用代码中就可以直接连接22122端口使用redis了。

配置启动/重启/停止脚本方便操作

启动脚本 start.sh

#!/bin/sh
./sbin/nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log

停止脚本stop.sh

#!/bin/sh
sudo killall nutcracker

或者复制twemproxy-0.4.1/scripts/nutcracker.init文件到/usr/local/twemproxy/sbin下,并修改脚本即可。

6、Twemproxy的缺点

  • 虽然可以动态移除节点,但该移除节点的数据就丢失了。
  • redis集群动态增加节点的时候,twemproxy不会对已有数据做重分布
  • 性能上损耗

【转载请注明出处】:https://www.jianshu.com/p/d94728fc8a91

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
14天前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
25 5
|
4月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
153 0
|
2月前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
39 3
|
2月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
56 0
|
5月前
|
存储 NoSQL 算法
Redis 集群模式搭建
Redis 集群模式搭建
100 5
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】当使用Azure Redis 集群服务时候,发生了Moved的几点分析
【Azure Redis 缓存】当使用Azure Redis 集群服务时候,发生了Moved的几点分析
|
4月前
|
NoSQL Redis
Redis——单机迁移cluster集群如何快速迁移
Redis——单机迁移cluster集群如何快速迁移
151 0
|
4月前
|
NoSQL Linux Redis
使用docker-compose搭建redis-cluster集群
使用docker-compose搭建redis-cluster集群
592 0