文档章节

redis(10)、redis集群twemproxy

haoran_10
 haoran_10
发布于 2016/07/15 16:37
字数 1051
阅读 49
收藏 1

 

twemproxy is a fast, light-weight proxy for memcached and redis。是一个代理redis程序,redis cluster是无中心的基于哈希槽的方案,而twemporxy是自身启动一个代理程序,代理程序为中心,基于一致性哈希算法的方案。

 

官网是 https://github.com/twitter/twemproxy,很多公司用这个方案实现了redis集群,在没有redis cluster方案之前,redis作者也推荐使用twemproxy方案。

主要的优点有:

  • 速度快

  • 轻量级

  • 维护持久的服务器连接

  • 在后台低消耗缓存redis数据库的连接数

  • 启用请求和响应的管道

  • 支持代理到多个服务器

  • 同时支持多个服务器池

  • 多个服务器自动分享数据

  • 实现了完整的 memcached ascii 和 redis 协议.

  • 服务器池配置简单,通过一个 YAML 文件即可

  • 支持多个哈希模式,包括一致的哈希和分布

  • 可配置在失败时禁用某个节点

  • 通过统计监测端口的可观察性

  • 支持 Linux, *BSD, OS X and Solaris (SmartOS)

 

 

一、配置实现

(1)、twemproxy下载编译

wget https://github.com/twitter/twemproxy/archive/master.zip
unzip master.zip
cd twemproxy
autoreconf -fvi
./configure
make
make install

 

注:需要autoconf2.6.9以上版本 autoconf下载地址:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz

 

(2)、单机redis启动

启动三个redis节点

9001、9002、9003

 

(3)、配置twemproxy nutcracker.yml

redis1:  
  listen: 127.0.0.1:8000                  #监听的端口
  redis: true                             #是否是Redis的proxy 
  hash: fnv1a_64                          #支持的hash算法
  distribution: ketama                    #具体的算法
  auto_eject_hosts: true                  #是否在结点无法响应的时候临时摘除结点 
  timeout: 4000                           #超时时间(毫秒) 
  server_retry_timeout: 2000              #重试的时间(毫秒)
  server_failure_limit: 3                 #结点故障多少次就算摘除掉 
  servers:                                #下面表示所有的Redis节点(IP:端口号:权重) 
   - 127.0.0.1:9001:1  
   - 127.0.0.1:9002:1  
   - 127.0.0.1:9003:1

 

 

(4)、启动twemproxy

 

src/nutcracker -d conf/nutcracker.yml

 

 

 

(5)、使用redis-cli测试

测试时发现,查看9001,9002,9003的aof文件时,不同的数据会分配到端口redis上,这个也正是基于一致性哈希算法,数据会分配到不同的节点中。也正是实现了数据分片。

 

 

二、nutcracker用法与命令选项

Options:
-h, –help                        : 查看帮助文档,显示命令选项
-V, –version                   : 查看nutcracker版本
-t, –test-conf                  : 测试配置脚本的正确性
-d, –daemonize              : 以守护进程运行
-D, –describe-stats         : 打印状态描述
-v, –verbosity=N            : 设置日志级别 (default: 5, min: 0, max: 11)
-o, –output=S                 : 设置日志输出路径,默认为标准错误输出 (default: stderr)
-c, –conf-file=S               : 指定配置文件路径 (default: conf/nutcracker.yml)
-s, –stats-port=N            : 设置状态监控端口,默认22222 (default: 22222)
-a, –stats-addr=S            : 设置状态监控IP,默认0.0.0.0 (default: 0.0.0.0)
-i, –stats-interval=N       : 设置状态聚合间隔 (default: 30000 msec)
-p, –pid-file=S                 : 指定进程pid文件路径,默认关闭 (default: off)
-m, –mbuf-size=N          : 设置mbuf块大小,以bytes单位 (default: 16384 bytes)

 

配置yml文件之后

nutcracker -t nutcracker.yml  可以检测配置文件是否正确

 

 

三、twemproxy缺点

  • 虽然可以动态移除节点,但该移除节点的数据就丢失了。 
  • redis集群动态增加节点的时候,twemproxy不会对已有数据做重分布.maillist里面作者说这个需要自己写个脚本实现 
  • 性能上的损耗(其实作为代理  必定会有损耗, twemproxy损耗属于很小的级别了)
  • 不支持针对多个值的操作,比如取sets的子交并补等(MGET 和 DEL 除外) 
  • 不支持Redis的事务操作 
  • 出错提示还不够完善 

 

 

四、最佳实践

  • twemproxy缺点中,动态移除不可用的节点,但是该节点的数据丢失了,这个缺点是最致命的,造成了CAP中的A缺失,可用性丢失,最好每个节点后面跟一个从节点,使用Keepalived+VIP,可以故障漂移,从节点自动升级为主节点。保证了高可用性。
  • 性能会稍微有些丢失,既然是代理就是没办法避免的。
  • 不能动态增加节点、删除节点,这个还要运维自行实现了,重启集群,不过这种操作本身也最好需要重启,分配新的集群集群。

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
haoran_10
粉丝 25
博文 88
码字总数 80846
作品 0
杭州
程序员
Redis ​集群迁移工具--Redis-Migrate-Tool

Redis 集群迁移工具,基于redis复制,快速,稳定。 github链接:https://github.com/vipshop/redis-migrate-tool 特点: 快速。 多线程。 基于redis复制。 实时迁移。 迁移过程中,源集群不影...

d_e_e_p_
2016/04/06
8.4K
3
Redis+Twemproxy做代理部署集群

redis集群部署过程略。。。 部署Twemproxy 1. yum install autoconf automake libtool -y 2. wget https://github.com/twitter/twemproxy/archive/master.zip 3. unzip master.zip 4.cd twem......

小白的希望
06/28
0
0
Redis学习笔记(11)——Redis缓存集群方案

由于单台Redis服务器的内存管理能力有限,使用过大内存的Redis又会使得服务器的性能急剧下降,一旦服务器发生故障将会影响更大范围业务,而Redis 3.0 beta1支持的集群功能还不适合生产环境的...

IT特种兵
2015/03/02
0
0
架构设计:系统存储(18)——Redis集群方案:高性能

1、概述 通过上一篇文章(《架构设计:系统存储(17)——Redis集群方案:高可用》)的内容,Redis主从复制的基本功能和进行Redis高可用集群监控的Sentinel基本功能基本呈现给了读者。虽然本...

yinwenjie
2016/12/31
0
0
为什么Codis比较慢,但我们还要用它呢?

为什么 Codis 比 twemproxy 慢? Codis 追求简洁的实现,我们没有针对内存进行优化,所以会比 twemproxy 还要多一倍拷贝。 Go 虽然使用 epoll,但是 IO 都不是直接完成的,而是通过 IO threa...

抚琴煮酒
2017/02/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发备忘

不安全的“先检查后执行”,代码形式如下: if(条件满足){ //这里容易出现线程安全问题//doSomething}else{//doOther} 读取-修改-写入 原子操作:使用CAS技术,即首先从V中读取...

Funcy1122
今天
0
0
SpringBoot2.0 停机

最近新建了个SpringBoot2.0的项目,因为原来一直使用的是传统的Tomcat部署war包的形式,所以这次SpringBoot内置Tomcat部署jar包的时候遇到了很多问题。其中一个就是因为没有外置的Tomcat容器...

Canaan_
昨天
0
1
Confluence 6 外部参考

一个外部参考的意思是任何站点链接到你 Confluence 的实例。任何时候当 Confluence 的用户单击这个外部链接的时候,Confluence 可以记录这次单击为参考。 在默认的情况下,外部链接的参考链接...

honeymose
昨天
0
0
Android中的设计模式之抽象工厂模式

参考 《设计模式解析》 第十一章 Abstract Factory模式 《设计模式:可复用面向对象软件的基础 》3.1 Abstract Factory 抽象工厂 对象创建型模式 《Android源码设计模式解析与实战》第6章 创...

newtrek
昨天
0
0
Redis | 地理空间(GEO)的一个坑

Redis的地理空间(Geo)是个好东西,轻轻松松的就可以把地图描点的问题处理了, 最近却遇到一个坑...Redis采用的Msater-Slave模式, 运用GEORADIUS在salve读取对应的数据,新增了从节点但是从不返...

云迹
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部