Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis+TwemProxy(nutcracker)集群方案部署记录

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

作者头像
洗尽了浮华
发布于 2018-01-22 07:18:57
发布于 2018-01-22 07:18:57
2.8K00
代码可运行
举报
文章被收录于专栏:散尽浮华散尽浮华
运行总次数:0
代码可运行

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

Twemproxy的特性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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都在同一个分片上。

举个小例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
你可以把公司前台的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数据更新到数据集中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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"
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-07-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 twemproxy 构建 Redis 集群
twemproxy 简介 twemproxy(又称 nutcracker)是 Twtter 贡献的一个 轻量级 高性能 的 redis/memcached 代理 client --> twemproxy --> redis/memcached ... twemproxy 的主要目的是减少与后端缓存服务器的连接数,并通过流水线化的协议与分片功能,方便我们构建可水平扩展的分布式缓存架构 特点 快、轻量 维护持久连接,使缓存服务器的连接数很低 命令请求与响应的流水线化,提升性能 跨服务器自动分片 配置简单 支持一
dys
2018/04/04
8360
使用 twemproxy 构建 Redis 集群
Redis 集群之Redis+Twemproxy方案
【转载请注明出处】:https://cloud.tencent.com/developer/article/1637716
后端老鸟
2020/06/02
1.4K0
Redis+Twemproxy分片存储实现
Redis的安装这里不再多讲,相关步骤可从官网或其它渠道得到。为安装redis多实例,这里简单提前创建完相关文件夹。其中redis存放应用程序,redis1/redis2/redis3仅存储配置文件。
MavenTalker
2019/07/19
7580
Redis学习笔记
    (*)前身:Memcached     (*)区别:支持持久化,RDB、AOF                 支持丰富的数据类型
曼路
2018/10/18
6010
Redis+Twemproxy+HAProxy+Keepalived
https://blog.csdn.net/shmilychan/article/details/73433804 https://my.oschina.net/dchuang/blog/666827
丁D
2022/08/12
5210
Redis+Twemproxy+HAProxy+Keepalived
通过Twemproxy提升PHP/Redis的性能
Twemproxy 可以说是最古老的 Redis 代理软件了,一般来说,引入代理后性能会比没有引入代理时低一些,毕竟代理会导致一些额外的性能损耗,可是 Twemproxy 却会提升性能, 这主要得益于它的 Pipelining 功能可以实现打包请求,简单点说:当代理收到多个并发请求时,它会把这些请求打包成一个请求发送给后端服务器,从而减少不必要的 RTT。关于 Pipelining 本文不做过多讨论,实际上我想说的是它的另一个功能:连接池!下面看看如何通过 Twemproxy 提升 PHP/Redis 的性能。
LA0WAN9
2021/12/14
4610
Linux下Redis主从复制以及SSDB主主复制环境部署记录
前面的文章已经介绍了redis作为缓存数据库的说明,本文主要说下redis主从复制及集群管理配置的操作记录: Redis主从复制(目前redis仅支持主从复制模式,可以支持在线备份、读写分离等功能。) 1)Redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master),一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动 将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数
洗尽了浮华
2018/01/22
2.4K0
Linux下Redis主从复制以及SSDB主主复制环境部署记录
Mysql读写分离方案-MySQL Proxy环境部署记录
Mysql的读写分离可以使用MySQL Proxy和Amoeba实现,其实也可以使用MySQL-MMM实现读写分离的自动切换。MySQL Proxy有一项强大功能是实现"读写分离",基本原理是让主数据库处理写方面事务,让从库处理SELECT查询;Amoeba for MySQL是一款优秀的中间件软件,同样可以实现读写分离,负载均衡等功能。下面重点说下Mysql Proxy: MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断、改变并转发客户端和后端数据库之间的通信来实现其功能。代理服务
洗尽了浮华
2018/01/23
2K0
Mysql读写分离方案-MySQL Proxy环境部署记录
Linux下 redis fasdtdfs 基础命令
nohup /usr/local/mysql/bin/mysqld_safe --user=root > /dev/null 2>&1 &
爱明依
2019/03/12
1.5K0
Redis 代理服务Twemproxy
1、twemproxy explore 当我们有大量 Redis 或 Memcached 的时候,通常只能通过客户端的一些数据分配算法(比如一致性哈希),来实现集群存储的特性。虽然Redis 2.6版本已经发布Redis Cluster,但还不是很成熟适用正式生产环境。 Redis 的 Cluster 方案还没有正式推出之前,我们通过 Proxy 的方式来实现集群存储。 Twitter,世界最大的Redis集群之一部署在Twitter用于为用户提供时间轴数据。Twitter Open Sou
小小科
2018/05/02
2.2K0
Codis迁移至Redis实战
因为线上多机房,然后有一个机房历史原因使用了Codis,这样就导致开发、QA、线上环境在缓存软件这块有点差异,为了因为这种差异化的东西,导致开发出来的软件对接缓存应用导致不同表现情况的话,线上统一用一个版本的Redis版本避免此问题。
后场技术
2020/09/03
5330
Docker - 原生、redis-trib,2种方式搭建redis集群
由于业务需要,需要把之前的分布式架构调整成微服务,把老项目迁移到k8s的服务中,再开始编码之前,需要再本地环境里做相应的准备工作,使用docker搭建redis集群,下面介绍原生搭建集群和使用redis-trib.rb搭建集群的两种方式。
stark张宇
2023/03/02
7030
03 . Redis集群
Redis Cluster 集群模式通常具有 高可用、可扩展性、分布式、容错等特性。Redis分布式方案一般有两种
iginkgo18
2020/09/27
6800
03 . Redis集群
Redis集群方案怎么做?大牛给你介绍五种方案!
Redis数据量日益增大,而且使用的公司越来越多,不仅用于做缓存,同时趋向于存储这块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架构,大部分都是采用分片技术,解决单实例内存增大带来的一系列问题。
JKXQJ
2018/07/24
1.8K0
Redis集群方案怎么做?大牛给你介绍五种方案!
Redis集群方案怎么做?大牛给你介绍五种方案!
Redis集群方案 Redis数据量日益增大,而且使用的公司越来越多,不仅用于做缓存,同时趋向于存储这块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架构,大部分都是采用分片技术,解决单实例内存增大带来的一系列问题。 本篇文章简单介绍五种方案: 官方cluster方案 twemproxy代理方案 哨兵模式 codis 客户端分片 官方cluser方案 从redis 3.0版本开始支持redis-cluster集群,redis-cluster采用无中心结构,每个
美的让人心动
2018/06/14
8880
MySQL高可用架构-MHA环境部署记录
一、MHA介绍 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是日本的一位 MySQL专家采用Perl语言编写的一个脚本管理工具,该工具仅适用于MySQLReplication(二层)环境,目的在于维持Master主库的高可用性。是一套优秀的作为MySQL高可用性 环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成
洗尽了浮华
2018/01/22
3.6K1
MySQL高可用架构-MHA环境部署记录
网络入侵检测系统之Snort(二)--数据流图与环境搭建
所谓的嗅探器模式就是snort从网络上读出数据包然后显示在你的控制台上,snort -vd命令可以输出包头信息的同时显示包的数据信息:
于顾而言SASE
2024/03/20
3220
网络入侵检测系统之Snort(二)--数据流图与环境搭建
MySQL高可用架构-MMM环境部署记录
MMM介绍 MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,可以说是mysql主主复制管理器。虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个sla
洗尽了浮华
2018/01/22
2.5K0
MySQL高可用架构-MMM环境部署记录
Redis Cluster集群(二)
3.给新添加的主节点添加对用的从节点: [root@redis-cluster4 src]# ./redis-cli --cluster add-node 192.168.116.175:7007 192.168.116.175:7006 --cluster-slave --cluster-master-id 308320db4284c9b203aff1d3d9a145616856f681 #master的id >>> Adding node 192.168.116.175:7007 to clust
用户8639654
2021/08/18
2920
Mysql读写分离方案-Amoeba环境部署记录
Mysql的读写分离可以使用MySQL Proxy,也可以使用Amoeba。Amoeba(变形虫)项目是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目。其主要功能包括读写分离,垂直分库,水平分库等,经过测试,发现其功能和稳定性都非常的不错,如果需要构架分布式数据库环境,采用Amoeba是一个不错的方案。目前Amoeba一共包括For aladdin,For MySQL和For Oracle三个版本,以下介绍主要关注For MySQL版本的一个读写分离实现。
洗尽了浮华
2018/01/23
2.1K0
Mysql读写分离方案-Amoeba环境部署记录
相关推荐
使用 twemproxy 构建 Redis 集群
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验