一、背景

最近中间件开发组对twemproxy的发现注册机制做了改造,之前没有接触过twemproxy,借这次测试的机会,初步学习了一下twemproxy相关的知识;下面用“测试语言“来做一次梳理(站在测试的角度,掌握哪些技能可以顺利开展测试)。

二、TwemProxy是什么

twemproxy是一种代理分片机制,由Twitter开源。twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免单点故障问题。虽然使用twemproxy需要更多的硬件资源和在redis性能有一定的损失(twitter测试约20%),但是能够提高整个系统的HA也是相当划算的。当然,twemproxy本身也是单点,需要用Keepalived做高可用方案。

其实twemproxy不光实现了redis协议,还实现了memcached协议,换句话说,twemproxy不光可以代理redis,还可以代理memcached(同样作为缓存服务器,memcached越来越被更少的应用,redis越来越成为更普遍的选择)。

Twemproxy单点架构:

通常会结合keepalived来实现twemproxy的高可用。架构图如下:

上面的架构通常只有一台twemproxy在工作,另外一台处于备机,当一台挂掉以后,vip自动漂移,备机接替工作。

即便我们通过keepalived实现了twemproxy的高可用,也不难发现在整个的redis集群里面,如果用户要想访问redis集群必须通过twemproxy,于是这个时候就有可能造成一种问题:

  1,后面的redis集群一定速度暴快,因为一堆的数据库服务

  2,所有的性能都卡在了代理上

为了解决上面两个问题,很自然的想到在设计架构时,在twemproxy前面需要一个负载均衡的机制,由此haproxy作为一个千万级高并发负载均衡软件被引入到架构中。

Haproxy的特点:

  1,一个开源的

  2,高性能的(千万级)

  3,基于TCP第四层和http第七层

Haproxy优点:

  1,最高可以同时维护40000-50000个并发连接。单位时间内处理最大的请求数为20000.最大数据处理能力可达10GBPS

  2,支持多余8种负载均衡算法,同时也支持session保持

  3,支持虚拟主机功能

  4,拥有服务器性能监控工具

三、TwemProxy能做什么

Antirez(redis作者)写过一篇对twemproxy的介绍,他认为twemproxy是目前Redis 分片管理的最好方案,虽然Antirez的Redis cluster正在实现并且对其给予厚望,但从现有的cluster实现上还是认为cluster除了增加redis复杂度,对于集群的管理没有twemproxy来的轻量和有效。

谈到集群管理不得不又说到数据的分片管理(shard),为了满足数据的日益增长和扩展性,数据存储系统一般都需要进行一定的分片,如传统的MySQL进行横向分表和纵向分表,然后应用程序访问正确的位置就需要找的正确的表。这时候,这个数据定向工作一般有三个位置可以放:

  1,数据存储系统本身支持,Redis cluster就是典型的试图在数据存储系统上支持分片

  2,客户端支持,memcached的客户端对分片的支持就是客户端层面的

  3,代理支持,twemproxy就是试图在服务器端和客户端中间建代理支持

Twemproxy的特性:

    • 支持失败节点自动删除

      • 可以设置重新连接该节点的时间
      • 可以设置连接多少次之后删除该节点
    • 支持设置HashTag 
      • 通过HashTag可以自己设定将两个key哈希到同一个实例上去
    • 减少与redis的直接连接数 
      • 保持与redis的长连接
      • 减少了客户端直接与服务器连接的链接数量
    • 自动分片到后端多个redis实例上 
      • 多种hash算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins
      • 多种分片算法:ketama(一致性hash算法的一种实现)、modular、random
      • 可以设置后端实例的权重
    • 避免单节点问题 
      • 可以平行部署多个代理层,通过HAProxy做负载均衡,将redis的读写分散到多个twemproxy上
    • 支持状态监控 
      • 可设置状态监控IP和端口,访问IP和端口可以得到一个json格式的状态信息串
      • 可设置监控信息刷新间隔时间
    • 使用pipelining处理请求和响应 
      • 连接复用,内存服用
      • 将多个连接请求,组成redis pipelining统一redis请求
    • 并不是支持所有redis命令 
      • 不支持redis的事务操作
      • 使用SIDFF,SDIFFSTORE,SINTER,SINTERSTORE,SMOVE,SUNION and SUNIONSTORE 命令需要保证key都在同一个分片上

最主要功能:用户不再直接操作真正的Redis,而且支持高性能的数据访问,而且支持分片处理,可以操作Redis集群。

四、TwemProxy怎么用

Twemproxy通过配置文件nutcracker.yml来实现对redis集群实现管理。

nutcracker.yml的结构如下:

eshop-detail-test:
listen: 127.0.0.1:1111
hash: fnv1a_64
distribution: ketama
timeout:1000
redis: true
servers:
- 127.0.0.1:6379:1 test-redis-01
- 127.0.0.1:6380:1 test-redis-02
auto_eject_hosts: true
server_retry_timeout: 30000
server_failure_limit: 2

注解:

eshop-detail-test: redis集群的逻辑名称

listen:twemproxy监听的端口号

hash:hash散列算法

distribution:分片算法,一致性hash,取模,等等

timeout:跟redis连接的超时时长

redis:是否是redis,false的话是memcached

servers:redis实例列表,一定要加别名,否则默认使用ip:port:weight来计算分片,如果宕机后更换机器,那么分片就不一样了,因此加了别名后,可以确保分片一定是准确的

auto_eject_hosts: true,自动摘除故障节点

server_retry_timeout: 30000,每隔30秒判断故障节点是否正常,如果正常则放回一致性hash环

server_failure_limit: 2,多少次无响应,就从一致性hash环中摘除

业务方程序(如java/php)连接twemproxy写数据的时候,twemproxy负责将数据分片,写入不同的redis实例。

如果某个redis机器宕机,需要自动从一致性hash环上摘掉,等恢复后自动上线。

五、TwemProxy配合redis的主从模式和哨兵机制

主从模式

只要是进行高可用的架构部署,那么就必须保证多节点,前面提到的redis集群,对于每一个redis节点实际上都采用来主从模式。虽然redis提供了数据持久化的机制,AOF和RDB,但是两种模式解决的是数据容灾,即当redis服务器挂掉时,可以对历史数据进行恢复。AOF模式实际上是生成一个日志文件,当redis服务器重启时,通过读配置文件来恢复历史数据;RDB模式是从redis上实时同步数据到数据库如Myslq,显然两种模式都不能实时的提供历史数据的读,主从模式解决了这一问题。传统的主从模式是一个redis服务器作为master,只负责写入数据,其它几个redis服务器作为slave,只负责读数据,这样就做到了数据的读写分离,也起到了对数据备份的目的。

为什么用主从模式?

最大好处在于:可以自动对数据做备份

有缺点吗?

最大缺点在于:只能够做备份,而出现灾难之后无法立即恢复(还是要使用redis的持久化的机制,使用两者的目的不同,并不矛盾,需要配合使用)

哨兵机制

Redis里面使用了主从模式可以实现多节点配置,但是传统的主从模式的设计有一个缺陷:一旦Master主机出现了问题之后,两台Slave主机将无法提供正常的工作支持,例如:slave主机为只读主机,而且如果要想继续提供支持,那么至少应该通过剩余的几台slave里面去推选出一个新的master,并且最为重要的是,这个新的master还必须能够被用户的程序找到,由此催生了哨兵机制。

哨兵机制(Sentinel) 原理图:

不难看出哨兵机制带来的好处是提升了redis集群的HA(高可用),哨兵机制也是redis官方推荐的高可用解决方案之一。

哨兵机制(Sentinel) 的功能: 

  • 监控(Monitoring),sentinel时刻监控着redis master-slave 是否正常运行;
  • 通知(Notification),sentinel 可以通过api来通知管理员,被监控的 redis master-slave 出现了问题;
  • 自动故障转移(Automatic failover),当redis master出现故障不可用状态,sentinel 会开始一次故障转移,将其中一个slave 提升为新的 master ,将其他的 slave 将重新配置使用新的 master 同步,并使用redis 的服务器应用程序在连接时受到使用新的地址连接;
  • 配置提供者(Configuration provider),sentinel 作为在集群中的权威来源,客户端连接到 sentinel 来获取某个服务的当前 redis 主服务器的地址和其他信息。当前故障转移发生时,sentinel 会报告新地址。

六、本次测试的需求改动点和测试方法

先了解一下中间件开发组twemproxy的实现原理。

php语言实现架构图:

注解:

1,confd是一个客户端,安装在业务方的机器上,作用是从etcd集群中获取twemproxy机器的ip和端口号

2,etcd是一个分布式、可靠的 key-value 存储的分布式系统,当然,它不仅仅用于存储,还提供共享配置及服务发现(可以简单理解成提供服务发现功能的redis)

业务方获取 tw ip 流程:

  • Twemproxy 启动时向 etcd 集群注册一个(K,V) 对,key是特定的业务名称+twproxy ip , value 是 twproxy 的 ip:port ,并且每隔 2 秒向 etcd 集群续活
  • 业务方 API 机器启动 confd 去 etcd 集群拉取对应业务下所有key的value,并生成配置文件
  • 增加或者删除一个 twproxy 节点时,confd watch 到 etcd 集群相应的 key 发生变化,重新生成配置文件

高可用:

  • 每个业务最少提供两个 twemproxy 供业务方连接
  • redis 发生主从切换, twemproxy 会实时生成新的配置文件,并重启

提测的改动点:

安装在业务方机器上的confd软件实时与etcd通信,当twproxy与etcd之间网络中断,就会导致twproxy在etcd中的key过期被删除,进而etcd会及时通知confd来删除数据,直至twproxy整个集群的host全部被删除。因此对confd进行二次开发,当confd要求删除所有数据时,屏蔽此要求,并钉钉告警。综上,此次改造的目的是保证业务方至少可以使用1台twproxy服务器。

测试方法:

上面提到了业务方获取 twproxy ip 的流程,即业务方 API 机器启动 confd 去 etcd 集群拉取对应业务下所有key的value,并生成配置文件,然后业务方通过脚本读取配置文件来获取twproxy ip。那么测试思路就是对etcd执行删除的操作,当删除到最后一个(K,V) 对时,查看confd的日志,是否有重新生成配置文件的动作。

测试分解:

etcd执行删除操作:

查看confd的日志:

测试TwemProxy的应知应会的更多相关文章

  1. SpringMVC 应知应会

    springMVC 是表现层技术,可以用来代替 struts2,下面是简略图:主要是处理器和视图,只有这两个部分需要编写代码. springMVC 三大组件:处理器映射器,处理器适配器,视图解析器. ...

  2. 服务网格istio概念应知应会

    一.背景 最近架构组基于istio开发了服务网格(Service Mesh)平台,借此机会把相关的背景知识做一次学习和记录,方便回头查看. 初版的效果: 二.istio 官方手册:https://is ...

  3. Markdown的应知应会

    Markdown介绍 什么是Markdown Markdown是一种纯文本.轻量级的标记语言,常用作文本编辑器使用.和记事本.notepad++相比,Markdown可以进行排版:和Word相比,Ma ...

  4. Linux用户应知应会的7个‘ls’命令的独特技巧

    在前面我们系列报道的两篇文章中,我们已经涵盖了关于‘ls’命令的绝大多数内容.本文时‘ls命令’系列的最后一部分.如果你还没有读过该系列的其它两篇文章,你可以访问下面的链接. Linux中的15个基本 ...

  5. 【应知应会】15个常用的JavaScript字符串操作方法

    1 初始化 //常用初始化方法 var stringVal = "hello iFat3"; //构造函数创建方法 var stringObj = new String(" ...

  6. Hibernate 应知应会

    Hibernate 的关联关系的配置: 一对一外键约束: 举例子是一个丈夫和妻子:[一个丈夫只能有一位妻子] 表结构: CREATE TABLE `tbl_hus` ( `uuid` ) NOT NU ...

  7. Struts2 应知应会

    struts.xml 文件的 action 的配置: Struts2 中结果类型的配置来自于下面: 其中: dispatcher:转发技术,转发到一个 jsp 视图 redirect:重定向到一个 j ...

  8. .NET架构开发应知应会

    .NET程序是基于.NET framework..NET Core.Mono.UWP[.NET实现]开发和运行的 ,定义以上[.NET实现]的标准规范称为.NET Standard L1:.NET S ...

  9. Java 多线程应知应会

    请简单说说 synchronized 关键字的底层原理 java 说到多线程绝对绕不开 synchronized,很多 java 工程师对 synchronized 是又爱又恨.为什么呢?主要原因包括 ...

随机推荐

  1. Kafka 【的这些原理你知道吗】

    如果只是为了开发 Kafka 应用程序,或者只是在生产环境使用 Kafka,那么了解 Kafka 的内部工作原理不是必须的.不过,了解 Kafka 的内部工作原理有助于理解 Kafka 的行为,也利用 ...

  2. Oracle 11gR2

    OracleOraDb11g_home1TNSListener #其它客服端连接需要开启服务,如不开启,本机连接可以直接使用sqlplus OracleServiceORCL #实例SID服务  sq ...

  3. Solidity智能合约面向对象编程(一、类的创建)

    Solidity编写智能合约 1 pragma solidity ^0.4.4;//版本声明 ^代表向上兼容 pragma代表版本声明 solidity 代表开发语言 2 //定义类 3 contra ...

  4. Python练习题 002:奖金计算

    [Python练习题 002]企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成 ...

  5. Python self用法详解

    在定义类的过程中,无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将 self 参数作为方法的第一个参数.例如,定义一个 Person 类: class Person: def __init ...

  6. Java知识系统回顾整理01基础01第一个程序07Eclipse使用----找不到类如何解决?

    一.现象 有时候会碰到如图所示的问题,分明有Hello这个类,并且也有主方法,可是运行就会出现找不到或者无法加载类Hello,或者Class Not Found 异常. 出现这个状况,有多种原因造成, ...

  7. 【奇淫巧技】sqlmap绕过过滤的tamper脚本分类汇总

    sqlmap绕过过滤的tamper脚本分类汇总

  8. K-DTree入门

    \(K-D Tree\),一种用来维护\(K\)维数据的数据结构.常用于维护各种高维的数据,或者是邻近搜索等.从另一种意义上说,实际上就是高维的二叉搜索树.对于一些常见的问题,如\(k\)远点对.三位 ...

  9. Mac Idea你不知道的秘密

    导读 工欲善其事必先利其器,日常工作中,知道这些Idea技巧,可以极大提高日常开发效率. 技巧篇 以下内容不分先后顺序 显示类中的方法 搜索 搜索方法,按两下shift 文字搜索,control+sh ...

  10. antd pro table中的文件上传

    概述 示例代码 列表页面 form 页面 model.js service.js 总结 概述 项目中经常会遇到在表格中展示图片的需求(比如展示用户信息时, 有一列是用户的头像). antd pro t ...