redis+twemproxy实现redis集群
Redis+TwemProxy(nutcracker)集群方案部署记录
转自: http://www.cnblogs.com/kevingrace/p/5685401.html
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" |
redis+twemproxy实现redis集群的更多相关文章
- Redis(十)集群:Redis Cluster
一.数据分布 1.数据分布理论 2.Redis数据分区 Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot=CRC16(key)&16 ...
- Redis 中常见的集群部署方案
Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...
- Redis 3.0 Cluster集群配置
Redis 3.0 Cluster集群配置 安装环境依赖 安装gcc:yum install gcc 安装zlib:yum install zib 安装ruby:yum install ruby 安装 ...
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- redis + 主从 + 持久化 + 分片 + 集群 + spring集成
Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型.所以得到很多开发者的青睐.加之 ...
- 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- Redis 3.0.2集群搭建以及相关问题汇总
Redis3 正式支持了 cluster,是为了解决构建redis集群时的诸多不便 (1)像操作单个redis一样操作key,不用操心key在哪个节点上(2)在线动态添加.删除redis节点,不用停止 ...
- Redis核心解读:集群管理工具(Redis-sentinel)
Redis核心解读:集群管理工具(Redis-sentinel) - Redis - TechTarget数据库 Redis核心解读:集群管理工具(Redis-sentinel)
- 项目实战11—企业级nosql数据库应用与实战-redis的主从和集群
企业级nosql数据库应用与实战-redis 环境背景:随着互联网2.0时代的发展,越来越多的公司更加注重用户体验和互动,这些公司的平台上会出现越来越多方便用户操作和选择的新功能,如优惠券发放.抢红包 ...
- redis客户端可以连接集群,但JedisCluster连接redis集群一直报Could not get a resource from the pool
一,问题描述: (如题目)通过jedis连接redis单机成功,使用JedisCluster连接redis集群一直报Could not get a resource from the pool 但是使 ...
随机推荐
- m2eclipse Error:ArtifactTransferException: Failure to transfer org.apache.felix:org.apache.felix.res
Issue: When you create and compile a project with pom.xml using m2eclipse, it may report some error ...
- python安装MySQLdb:在windows下或linux下(以及eclipse中pydev使用msqldb的配置方法)
写的非常好,可以解决问题: windows下:http://blog.csdn.net/wklken/article/details/7253245 linux下:http://blog.csdn.n ...
- [GitHub]第一讲:浏览器中使用GitHub
文章转载自http://blog.csdn.net/loadsong/article/details/51591407 看到一篇关于GitHub的文章,感觉不错,因此转载来以备推敲学习. 不会用 Gi ...
- volatile适用场合
volatile适用场合 要在多线程中安全的适用volatitle变量,必须同时满足: 1.对变量的写入操作不依赖其当前值 不满足:number++.count = count * 5等 ...
- cocos2d-js(一)引擎的工作原理和文件的调用顺序
Cocos2d-js可以实现在网页上运行高性能的2D游戏,实现原理是通过HTML5的canvas标签,该引擎采用Javascript编写,并且有自己的一些语法,因为没有成熟的IDE,一般建立工程是通过 ...
- C++ Primer 有感(异常处理)(三)
先看下面的代码: [cpp] view plaincopy int main() { int *i=new int(10); /* 这中间的代码出现异常 */ delete i; return 0; ...
- 学习pthreads,管理线程的栈
进程的地址空间分成代码段,静态数据段,堆和栈段.线程栈的位置和大小是从它所属的进程的栈中切分出来的.每个栈必须足够大,以容纳所有对等线程的函数的执行以及它们将会调用的例程链.或许你会问为什么要进行线程 ...
- wing带你玩转自定义view系列(1) 仿360内存清理效果
本篇是接自 手把手带你做自定义view系列 宗旨都是一样,带大家一起来研究自定义view的实现,与其不同的是本系列省去了简单的坐标之类的讲解,重点在实现思路,用简洁明了的文章,来与大家一同一步步学习. ...
- 极光推送iOS SDK教程
iOS SDK 调试指南 iOS 调试思维导图 2 确认证书 请到"应用详情页面"确认证书可用性: 3 开发环境测试 在对 JPush iOS 开发环境进行测试前,请确保 3 个 ...
- XWork容器的存储结构
我们可以看到,在Container的默认实现,ContainerImpl中有两个实例变量.factoris和factoryNamesByType. 对象制造工厂 class ContainerImpl ...