虽然大量用户使用Redis节点的大型农场,但从项目本身来看,Redis主要是单实例业务。

我有很大的计划与项目一起分发,在某种程度上我不再评估Redis的任何线程版本:对我来说,从Redis的角度看,核心就像一台计算机,因此可以扩展多核或者在一组计算机上的概念是相同的。多个实例是无共享架构。一切都有意义,因为我们有一个*可信的方式*去碎片:-)

这就是为什么Redis Cluster将成为2013年Redis的主要焦点,最后,现在Redis 2.6已经出现并且显示出非常稳定和成熟,现在是专注于Redis Cluster,Redis Sentinel和其他产品的合适时机。期待已久的复制领域的改进(部分重新同步)。

但实际情况是,Redis Cluster尚未准备就绪,需要数月的工作。我们的用户仍然需要对多个实例上的数据进行分片以分配负载,特别是为了使用许多计算机来为数据准备大量的RAM。

到目前为止唯一的选择是客户端分片。客户端分片具有优势,因为客户端和节点之间没有中间层,也没有请求路由,因此它是一种非常可扩展的设置(基本上是线性可扩展的)。但是,要可靠地实现它需要一些调整,一种使客户端配置同步的方法,以及具有一致散列支持或其他分区算法的可靠客户端的可用性。

显然,这方面有一个重大新闻,并且与Twitter有关,其中部署的最大的Redis农场之一恰好为用户提供服务时间表。因此,我在博客文章中谈到的项目来自Twitter开源部门并不奇怪。

Twemproxy
--- Twemproxy是一个支持Memcached ASCII协议的快速单线程代理,最近是Redis协议: https://github.com/twitter/twemproxy 它完全用C语言编写,并根据Apache 2.0许可证授权。
该项目适用于Linux,AFAIK无法在OSX上编译,因为它依赖于epoll API。 我使用我的Ubuntu 12.04桌面进行了测试。 但是,我仍然没有说任何有用的东西。实际上是什么twemproxy?(注意:我将专注于Redis部分,但项目也能够为memcached做同样的事情)。 1)它作为客户端和许多Redis实例之间的代理。
2)它能够在配置的Redis实例之间自动分片数据。
3)它支持具有不同策略和散列函数的一致散列。 Twemproxy的优点是它可以配置为在发生故障时禁用节点,并在一段时间后重试,或者坚持指定的键 - >服务器映射。这意味着当Redis用作数据存储(禁用节点弹出)时,以及当Redis用作缓存时,它既适用于分割Redis数据集,也适用于廉价的节点弹出(如简单,不如质量差)高可用性。 这里的底线是:如果启用节点弹出,当节点出现故障时,数据可能会终止到其他节点,因此无法保证一致性。另一方面,如果禁用节点弹出,则需要设置每个实例的高可用性设置,例如使用Redis Sentinel自动故障转移。 安装
--- 在深入了解项目功能之前,我有一个好消息,在Linux上构建它是微不足道的。好吧,不像Redis那么微不足道,但是......你只需要遵循这些简单的步骤: apt-get install automake
apt-get install libtool
git clone git://github.com/twitter/twemproxy.git
cd twemproxy
autoreconf -fvi
./configure --enable-debug = log
使
src / nutcracker -h 配置也非常简单,项目github页面中有足够的文档可以获得顺畅的初体验。例如,我使用了以下配置: redis1:
听:0.0.0.0:9999
redis:是的
hash:fnv1a_64
分布:ketama
auto_eject_hosts:true
超时:400
server_retry_timeout:2000
server_failure_limit:1
服务器:
- 127.0.0.1:6379:1
- 127.0.0.1:6380:1
- 127.0.0.1:6381:1
- 127.0.0.1:6382:1 redis2:
听:0.0.0.0:10000
redis:是的
hash:fnv1a_64
分布:ketama
auto_eject_hosts:false
超时:400
服务器:
- 127.0.0.1:6379:1
- 127.0.0.1:6380:1
- 127.0.0.1:6381:1
- 127.0.0.1:6382:1 基本上,第一个集群配置了节点弹出,第二个集群配置为配置实例中的静态映射。 最棒的是,您可以同时拥有多个可能涉及相同主机的设置。但是对于生产,我发现更适合使用多个实例来使用多个核心。 单点故障?
--- 另一个非常有趣的事实是,实际上,使用此设置并不意味着您只有一个故障点,因为您可以运行多个twemproxy实例并让您的客户端连接到第一个可用的实例。 基本上你用twemproxy做的是将分片逻辑与你的客户端分开。此时,基本客户端将执行该操作,分片将由代理处理。 分区恕我直言是一种简单但安全的方法。 目前,Redis群集不可用,我想说,对于今天想要一群Redis实例的大多数用户来说,这是一种方法。但是要先阅读有关限制的内容,以免太兴奋;) 限制
--- 我认为twemproxy做得对,不支持多个键命令和事务。目前,AFAIK比Redis Cluster更严格,如果所有命令都是相同的密钥,则允许使用MULTI / EXEC块。 但恕我直言,这是可行的方式,分发您可以有效分发的子集,并尽早将其作为设计挑战,而不是将大量资源投入到试图聚合来自多个实例的数据的“正常工作”实现中但是,一旦你开始出现严重负荷,由于太大的恒定时间来移动数据,这几乎不会足够快。 但是,对具有多个键的命令有一些支持。MGET和DEL处理正确。有趣的是,MGET将在不同服务器之间拆分请求,并将回复作为单个实体返回。即使我没有使用此功能获得正确的性能数字,这也很酷(见下文)。 无论如何,不​​支持多键命令和事务这意味着twemproxy不适合所有人,就像Redis Cluster本身一样。特别是因为显然不支持EVAL(我认为它们应该支持它!它是微不足道的,EVAL被设计为在代理中工作,因为键名是明确的)。 可以改进的事情
--- 错误报告并不总是很好。发送不受支持的命令会关闭连接。同样,从redis-cli发送一个“GET”并不会报告有关参数数量错误的任何错误,但会永久挂起连接。 但是,服务器的其他错误会正确传递给客户端: redis metal:10000>获取清单
(错误)WRONGTYPE对持有错误值的键的操作 我希望看到的另一件事是支持自动故障转移。有很多选择: 1)twemproxy已经能够监视实例错误,计算错误数量,并在检测到足够的错误时弹出节点。好吧,遗憾的是它无法将从属节点作为替代方案,而不是弹出节点在发送SLAVE OF NOONE命令后立即使用备用节点。这也将把它变成HA解决方案。 2)或者,如果能够与Redis Sentinel协同工作,我会很高兴,如果发生故障转移,请定期检查Sentinel配置以升级服务器表。 3)另一种方法是提供一种热配置twemproxy的方法,以便在故障转移时Sentinel可以尽快切换代理的配置。 有很多选择,但基本上,对HA的一些支持可能很大。 表演
--- 这件事很快。真的很快,几乎与直接与Redis交谈一样快。我会说你最差的表现会减掉20%。 我唯一的表演问题是,当命令在实例之间分配时,恕我直言MGET可以使用一些改进。 毕竟,如果代理在它和所有Redis实例之间有相似的延迟(很可能),如果同时发送MGET,则回复可能会同时到达代理。因此,当我针对单个实例运行MGET时,我期望看到与MGET几乎相同的数字,但我每秒只获得50%的操作。也许现在是重建答复的时候了,我不确定。 结论
--- 这是一个很棒的项目,由于Redis Cluster尚未出现,我强烈建议Redis用户试一试。 就个人而言,我要将它链接到Redis项目网站的某个可见位置。我认为这里的Twitter人员通过他们的项目为Redis本身提供了一些真正的价值,所以...... 奖励!

来自Redis 作者的看法 —— Twemproxy的更多相关文章

  1. Redis作者谈Redis应用场景(转)

    毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象 ...

  2. Redis作者谈Redis应用场景

    Redis作者谈Redis应用场景 毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多 ...

  3. 转:Redis作者谈Redis应用场景

    毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象 ...

  4. redis学习研究--Redis作者谈Redis应用场景

    毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象 ...

  5. 【Redis学习之九】Redis集群:Twemproxy和HA

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-3.0.4 主从模式对写压力没有分担,解决思路就 ...

  6. [转]Redis作者:深度剖析Redis持久化

    From : http://www.iteye.com/news/24675 Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等 ...

  7. Redis作者谈Redis应用场景(转)

    add by zhj : 这是Redis的作者antirez在他的技术博客中写的一篇文章 英文原文:take-advantage-of-redis-adding-it-to-your-stack 译文 ...

  8. Redis作者:深度剖析Redis持久化

    Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis的作者在博客中写到, ...

  9. 关于华为否认HKSP来自官方的一点看法

    今天刷手机,无意看到一则消息: 华为否认提交给 Linux 内核的不安全补丁 HKSP 来自官方 这个消息吸引我的原因有几点: 华为被制裁刚满一年,现在由于新冠疫情影响,感觉又处于很敏感的时期: 华为 ...

随机推荐

  1. web14 validation.xml配置 登录验证文件配置

    电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...

  2. (2016.2.2)1001.A+B Format (20)解题思路

    https://github.com/UNWILL2LOSE/object-oriented 解题思路 目标: *首先运算要求实现输入2个数后,输出类似于银行的支票上的带分隔符规则的数字. 代码实现思 ...

  3. iOS 判断当前app版本,升级

    要获取当前app store上的最新的版本,有两种方法, 一.在某特定的服务器上,发布和存储app最新的版本信息,需要的时候向该服务器请求查询. 二.从app store上查询,可以获取到app的作者 ...

  4. sql server数据库中raiserror函数的用法

    server数据库中raiserror的作用就和asp.NET中的throw new Exception一样,用于抛出一个异常或错误.这个错误可以被程序捕捉到. raiserror的常用格式如下:ra ...

  5. jmeter 常用内置变量

    1. vars   API:http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html vars.get(& ...

  6. 反爬虫之JS反编译:PyExecJS

    PyExecJS是python运行JavaScript代码的包 安装: pip install  PyExecJS (或者easy_install PyExecJS) 依赖:  需要有执行JS的程序, ...

  7. css中对position的几种定位方式的最佳诠释

    关于元素的position定位的理解,牛客网的hardy给出了一个比较好的理解: 在html中网页可以看成一个立体的空间,一个完整的页面是由很多个页面堆积形成的,如上图所示   CSS中Positio ...

  8. 浅析Web数据存储-Cookie、UserData、SessionStorage、WebSqlDatabase

    Cookie 它是标准的客户端浏览器状态保存方式,可能在浏览器诞生不久就有Cookie了,为什么需要Cookie 这个东东?由于HTTP协议没有状态,所以需要一个标志/存储来记录客户浏览器当前的状态, ...

  9. python3+selenium 牛刀小试

    # coding:utf-8 # __author__ = 'Carry' import unittest from selenium import webdriver import time cla ...

  10. Java 继承和多态

                                                        Java  继承和多态 Java 继承 继承的概念 继承是java面向对象编程技术的一块基石,因 ...