Redis+TwemProxy(nutcracker)集群方案部署记录

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

 

Twemproxy 又称nutcracker ,是一个memcache、Redis协议的轻量级代理,一个用于sharding 的中间件。有了Twemproxy,客户端不直接访问Redis服务器,而是通过twemproxy 代理中间件间接访问。 Twemproxy 为 Twitter 开源产品,简单来说,Twemproxy是Twitter开发的一个redis代理proxy,类似于nginx的反向代理或者mysql的代理工具,如amoeba。Twemproxy通过引入一个代理层,可以将其后端的多台Redis或Memcached实例进行统一管理与分配,使应用程序只需要在Twemproxy上进行操作,而不用关心后面具体有多少个真实的Redis或Memcached存储。

Twemproxy的特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1)支持失败节点自动删除
    可以设置重新连接该节点的时间
    可以设置连接多少次之后删除该节点
2)支持设置HashTag
    通过HashTag可以自己设定将两个key哈希到同一个实例上去
3)减少与redis的直接连接数
    保持与redis的长连接
    减少了客户端直接与服务器连接的连接数量
4)自动分片到后端多个redis实例上
    多种 hash 算法:md5、crc16、crc32 、crc32a、fnv1_64、fnv1a_64、fnv1_32、fnv1a_32、hsieh、murmur、jenkins
    多种分片算法:ketama(一致性 hash 算法的一种实现)、modula、random
    可以设置后端实例的权重
5)避免单点问题
    可以平行部署多个代理层,通过HAProxy做负载均衡,将redis的读写分散到多个twemproxy上。
6)支持状态监控
    可设置状态监控ip和端口,访问ip和端口可以得到一个json格式的状态信息串
    可设置监控信息刷新间隔时间
7)使用 pipelining 处理请求和响应
    连接复用,内存复用
    将多个连接请求,组成reids pipelining统一向redis请求
8)并不是支持所有redis命令
    不支持redis的事务操作
    使用SIDFF, SDIFFSTORE, SINTER, SINTERSTORE, SMOVE, SUNION and SUNIONSTORE命令需要保证key都在同一个分片上。

举个小例子:

1
2
3
你可以把公司前台的MM看作一个proxy,你是个送快递的,你可以通过这个妹子替你代理把你要送达的包裹给公司内部的人,而你不用知道公司每个人座位在哪里。
Twemproxy可以把多台redis server当作一台使用,开发人员通过twemproxy访问这些redis servers 的时候不用关心到底去哪一台redis server读取
k- v 数据或者把k- v 数据更新到数据集中。

通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免单点故障问题。虽然使用Twemproxy需要更多的硬件资源和在redis性能有一定的损失(twitter测试约20%),但是能够提高整个系统的HA也是相当划算的。比如我所在的公司,只使用一台redis server进行读写,但是还有一台slave server一直在同步这台生产服务器的数据。这样做就是为了防止这台单一的生产服务器出现故障时能够有一个"备胎",可以把前端的redis数据读写请求切换到从服务器上,web程序因而不需要直接去访问mysql数据库。再借助于haproxy(又是proxy)或者VIP技术可以实现一个简单的HA方案,可以避免单点故障。但是这种简单的Master-Slave"备胎"方案不能扩张整个redis的容量(如果用系统内存大小衡量,且不考虑内存不足时把数据swap到磁盘上),最大容量由所有的redis servers中最小内存决定的【木桶的短板】。

Twemproxy可以把数据sharding(碎片,这里是分散的意思)到多台服务器的上,每台服务器存储着整个数据集的一部分。因而,当某一台redis服务器宕机了,那么也就失去了一部分数据。如果借助于redis的master-slave replication,能保证在任何一台redis不能工作情况下,仍然能够保证能够存在一个整个数据集的完全覆盖,那么整个redis group(或者称作cluster)仍然能够正常工作。

需要注意的是:
Twemproxy不会增加Redis的性能指标数据,据业界测算,使用twemproxy相比直接使用Redis会带来大约10%的性能下降。但是单个Redis进程的内存管理能力有限。据测算,单个Redis进程内存超过20G之后,效率会急剧下降。目前,建议单个Redis最好配置在8G以内;8G以上的Redis缓存需求,通过Twemproxy来提供支持

-----------------------------------------------------------------------------------------------------------------------------------------------------
下面记录下Redis+Twemproxy(nutcracker)集群部署过程:

先简单看下集群架构

Twemproxy可以把多台redis server当作一台使用,扩大整个redis的容量,开发人员通过twemproxy访问这些redis servers 的时候不用关心到底去哪一台redis server读取k-v数据或者把k-v数据更新到数据集中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
1)集群环境
182.48.115.236    twemproxy-server    安装nutcracker
182.48.115.237    redis-server1       安装redis
182.48.115.238    redis-server2       安装redis
 
如果在线上使用的话:
中间代理层twemproxy需要2台,并且需要结合keepalived(心跳测试)实现高可用,客户端通过vip资源访问twemproxy。
另外,后面的redis节点也都要做主从复制环境。因为twemproxy会讲数据碎片到每个redis节点上,如果节点挂了,那部分数据就没了。所以最好对每个redis节点机做主从,防止数据丢失。
 
这里做测试,我只使用一台twemproxy+2个redis节点(不做主从)。
 
关闭三台机器的iptables防火墙和selinux
 
2)在两台redis机器上安装并启动redis
可以参考:http: //www .cnblogs.com /kevingrace/p/6265722 .html
 
3)在twemproxy-server机器上安装nutcracker
 
编译安装autoconf
[root@twemproxy-server ~] # wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
[root@twemproxy-server ~] # tar -zvxf autoconf-2.69.tar.gz
[root@twemproxy-server ~] # cd autoconf-2.69
[root@twemproxy-server autoconf-2.69] # ./configure && make && make install
 
编译安装automake
[root@twemproxy-server ~] # wget http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz
[root@twemproxy-server ~] # tar -zvxf automake-1.15.tar.gz
[root@twemproxy-server ~] # cd automake-1.15
[root@twemproxy-server automake-1.15] # ./configure && make && make install
 
编译安装libtool
[root@twemproxy-server ~] # wget https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz
[root@twemproxy-server ~] # tar -zvxf libtool-2.4.6.tar.gz
[root@twemproxy-server ~] # cd libtool-2.4.6
[root@twemproxy-server libtool-2.4.6] # ./configure && make && make install
 
编译安装twemproxy
[root@twemproxy-server ~] # wget https://github.com/twitter/twemproxy/archive/master.zip
[root@twemproxy-server ~] # unzip master.zip
[root@twemproxy-server ~] # cd twemproxy-master
[root@twemproxy-server twemproxy-master] # aclocal
[root@twemproxy-server twemproxy-master] # autoreconf -f -i -Wall,no-obsolete    //执行autoreconf 生成 configure文件等
[root@twemproxy-server twemproxy-master] # ./configure --prefix=/usr/local/twemproxy/
[root@twemproxy-server twemproxy-master] # make && make install
 
.................................................................................
注意:如果没有安装libtool 的话,autoreconf 的时候会报错,如下:
configure.ac:133: the  top  level
configure.ac:36: error: possibly undefined macro: AC_PROG_LIBTOOL
       If this token and others are legitimate, please use m4_pattern_allow.
       See the Autoconf documentation.
autoreconf:  /usr/local/bin/autoconf  failed with  exit  status: 1
.................................................................................
 
twemproxy配置:
[root@twemproxy-server ~] # cd /usr/local/twemproxy/
[root@twemproxy-server twemproxy] # ls
sbin  share
[root@twemproxy-server twemproxy] # cp -r /root/twemproxy-master/conf /usr/local/twemproxy/
[root@twemproxy-server twemproxy] # cd conf/
[root@twemproxy-server conf] # ls
nutcracker.leaf.yml  nutcracker.root.yml  nutcracker.yml
[root@twemproxy-server conf] # cp nutcracker.yml nutcracker.yml.bak
[root@twemproxy-server conf] # vim nutcracker.yml
alpha:                                        // 这个名称可以自己随意定义
   listen: 182.48.115.236:22121
   hash : fnv1a_64
   distribution: ketama
   auto_eject_hosts:  true
   redis:  true
   server_retry_timeout: 2000
   server_failure_limit: 1
   servers:                              // 这里配置了两个分片
    - 182.48.115.237:6379:1
    - 182.48.115.238:6379:1
 
[root@twemproxy-server conf] # nohup /usr/local/twemproxy/sbin/nutcracker -c /usr/local/twemproxy/conf/nutcracker.yml &
 
[root@twemproxy-server conf] # ps -ef|grep nutcracker
root      6407 24314  0 23:26 pts /0     00:00:00  /usr/local/twemproxy/sbin/nutcracker  -c  /usr/local/twemproxy/conf/nutcracker .yml
root      6410 24314  0 23:26 pts /0     00:00:00  grep  nutcracker
[root@twemproxy-server conf] # lsof -i:22121
COMMAND    PID USER   FD   TYPE DEVICE SIZE /OFF  NODE NAME
nutcracke 6407 root    5u  IPv4 155109      0t0  TCP localhost:22121 (LISTEN)
 
4)测试 twemproxy  set /get  ,后端分片查看
 
[root@twemproxy-server ~] # redis-cli -h 182.48.115.236 -p 22121
182.48.115.236:22121>
 
测试短key - value
[root@twemproxy-server ~] # redis-cli -h 182.48.115.236 -p 22121
182.48.115.236:22121>  set  wangshibo 666666
OK
182.48.115.236:22121> get wangshibo
"666666"
 
测试长key - value
182.48.115.236:22121>  set  huihuihuihuihuihui  "hahahahahahahahhahahahahahahahhahahahahahah"
OK
182.48.115.236:22121> get huihuihuihuihuihui
"hahahahahahahahhahahahahahahahhahahahahahah"
 
登录两台redis节点上查看,发现已经有分片了
[root@redis-server1 ~] # redis-cli -h 182.48.115.237 -p 6379
182.48.115.237:6379> get wangshibo
"666666"
182.48.115.237:6379> get huihuihuihuihuihui
"hahahahahahahahhahahahahahahahhahahahahahah"
 
[root@redis-server2 ~] # redis-cli -h 182.48.115.238 -p 6379
182.48.115.238:6379> get wangshibo
"666666"
182.48.115.238:6379> get huihuihuihuihuihui
"hahahahahahahahhahahahahahahahhahahahahahah"
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************

本文转自散尽浮华博客园博客,原文链接:http://www.cnblogs.com/kevingrace/p/5685401.html ,如需转载请自行联系原作者
相关文章
|
4月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
328 2
kde
|
2月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
kde
649 7
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
350 5
|
3月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
8月前
|
存储 NoSQL 数据库
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
285 5
|
5月前
|
负载均衡 NoSQL Redis
【赵渝强老师】Redis的主从复制集群
Redis主从复制是指将一台Redis服务器的数据复制到其他Redis服务器,实现数据热备份、故障恢复、负载均衡及高可用架构的基础。主节点负责写操作,从节点同步数据并可提供读服务,提升并发处理能力。
149 5
|
4月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
4月前
|
监控 NoSQL 关系型数据库
保障Redis与MySQL数据一致性的强化方案
在设计时,需要充分考虑到业务场景和系统复杂度,避免为了追求一致性而过度牺牲系统性能。保持简洁但有效的策略往往比采取过于复杂的方案更加实际。同时,各种方案都需要在实际业务场景中经过慎重评估和充分测试才可以投入生产环境。
237 0
|
7月前
|
NoSQL 算法 安全
redis分布式锁在高并发场景下的方案设计与性能提升
本文探讨了Redis分布式锁在主从架构下失效的问题及其解决方案。首先通过CAP理论分析,Redis遵循AP原则,导致锁可能失效。针对此问题,提出两种解决方案:Zookeeper分布式锁(追求CP一致性)和Redlock算法(基于多个Redis实例提升可靠性)。文章还讨论了可能遇到的“坑”,如加从节点引发超卖问题、建议Redis节点数为奇数以及持久化策略对锁的影响。最后,从性能优化角度出发,介绍了减少锁粒度和分段锁的策略,并结合实际场景(如下单重复提交、支付与取消订单冲突)展示了分布式锁的应用方法。
518 3
|
8月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构