`

Redis 集群方案

    博客分类:
  • java
 
阅读更多

根据一些测试整理出来的一份方案:

1. Redis 性能

对于redis 的一些简单测试,仅供参考:

测试环境:Redhat6.2 , Xeon E5520(4)*2/8G1000M网卡

Redis 版本:2.6.9

 

客户端机器使用redis-benchmark 简单GETSET操作:

1. 1单实例测试

1. Value大小:10Byte~1390Byte

处理速度: 7.5 w/s,速度受单线程处理能力限制

2. Value 大小:1400 左右

处理速度突降到5w/s 样子,网卡未能跑满;由于请求包大于MTU造成TCP分包,服务端中断处理请求加倍,造成业务急剧下降。

3. Value大小:>1.5 k

1000M网卡跑满,速度受网卡速度限制

处理速度与包大小大概关系如下:

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="image" href="http://images.cnitblog.com/blog/28886/201306/10164145-a7d6055272894bcc8e893a5eb977ade2.png" style='width:264pt;height:186pt' o:button="t"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.png" o:href="http://images.cnitblog.com/blog/28886/201306/10164146-f544bd50d4934946ba8bb80bdf9a9406.png"/> </v:shape><![endif]--><!--[if !vml]-->image<!--[endif]-->

1.2 多实例测试

前提是系统网卡软中断均衡到多CPU核心处理,测试机器网卡开启RSS,有16个队列:

操作:10字节Value SET,服务端开启8个实例,四台客户端服务器每台开启两个redis-benchmark,每个client 速度近4W/s,服务端总处理30w/s左右。

网卡流量:

<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" alt="image" href="http://images.cnitblog.com/blog/28886/201306/10164147-0e10d68fadf744a8a8b70b7f97c22ad6.png" style='width:391.5pt;height:42pt' o:button="t"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.png" o:href="http://images.cnitblog.com/blog/28886/201306/10164148-5bdac6a03a6c414490810a44bad16e1d.png"/> </v:shape><![endif]--><!--[if !vml]-->image<!--[endif]-->

其中8个单数核心CPU全部耗尽,像是超线程没有利用上,测试已经达到很好效果,就没有继续测试下去了。从单实例跑满一个核心7.5w/s8个实例跑满8个核心,30W/s来看,CPU使用和性能提升不成正比, RSS会造成redis-server线程基本每收到一个请求都切换一次CPU核心,软中断CPU占用太高。这种情况RPS/RFS功能也许就很合适了,RSS只需要映射1~2个核心,然后再讲软中断根据redis-server端口动态转发,保证redis进程都在一个核心上执行,减少进程不必要的切换。

 

开多实例可以充分利用系统CPU、网卡处理小包能力。具体看业务场景,考虑包平均大小、处理CPU消耗、业务量。如果多实例是为了提高处理能力,需要注意配置网卡软中断均衡,否则处理能力也无法提升。

 

2. Redis 持久化

测试策略:AOF + 定时rewriteaof

1. 准备数据量:

1亿,Key12 字节 Value15字节,存储为string,进程占用内存12G

2. Dump

文件大小2.8G,执行时间:95s,重启加载时间:112s

2. Bgrewriteaof

文件大小5.1G,执行时间:95s,重启加载时间:165s

3.开启AOF后性能影响(每秒fsync一次):

8K/s SET 操作时:cup 20% 增加到40%

4.修改1Kw数据:

文件大小:5.6G重启加载时间:194s

5.修改2K数据

文件大小:6.1G,重启加载时间:200s

另:Redis2.4 版本以后对fsync做了不少优化, bgrewriteaofbgsave 期间对redis对外提供服务完全无任何影响。

 

3. Redis 主从复制

因为目前版本没有mysql 主从那样的增量备份,对网路稳定性要求很高,如果频繁TCP连接断开会对服务器和网络带来很大负担。

就目前生产环境主从机器部署同一个机架下,几个月都不会又一次连接断开重连的情况的。

 

4. keepalived 简介

参考官方文档:http://keepalived.org/pdf/sery-lvs-cluster.pdf

Keepalived 是一个用c写的路由选择软件,配合IPVS 负载均衡实用,通过VRRP 协议提供高可用。目前最新版本1.2.7.Keepalived 机器之间实用VRRP路由协议切换VIP,切换速度秒级,且不存在脑裂问题。可以实现

可以实现一主多备,主挂后备自动选举,漂移VIP,切换速度秒级;切换时可通过运行指定脚本更改业务服务状态。

如两台主机AB,可以实现如下切换:

1A B 依次启动,A作为主、B为从

2 .A 挂掉,B接管业务,作为主

3.A 起来,作为从SLAVEOF B

4.B 挂掉,A 切回主

将一台全部作为主,即可实现主从,可做读写分离;也可以通过多个VIP,在一台机器上多个实例中一半主、一半从,实现互备份,两机同时负责部分业务,一台宕机后业务都集中在一台上

安装配置都比较简单:

  需要依赖包:openssl-develubuntu 中为 libssl-dev),popt-devel ubuntu中为libpopt-dev)。

  配置文件默认路径:/etc/keepalived/keepalived.conf 也可以手动指定路径,不过要注意的是手动指定需要使用绝对路径。主要要确保配置文件的正确性,keepalived 不会检查配置是否符合规则。

  使用keepalived -D 运行,即可启动3个守护进程:一个父进程,一个check健康检查,一个Vrrp-D将日志写入/var/log/message,可以通过日志查看切换状况。

注意问题:

1. VRRP 协议是组播协议,需要保证主、备、VIP 都在同一个VLAN

2. 不同的VIP 需要与不同的VRID 对应,一个VLAN VRID 不能和其他组冲突

3. keepalived 有两个角色:Master(一个)Backup(多个),如果设置一个为Master,但Master挂了后再起来,必然再次业务又一次切换,这对于有状态服务是不可接受的。解决方案就是两台机器都设置为Backup,而且优先级高的Backup设置为nopreemt 不抢占。

 

5. 通过keepalived实现的高可用方案

 

<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" alt="image" href="http://images.cnitblog.com/blog/28886/201306/10164149-517070bfdd8c4ecc832d3ad4e581f87c.png" style='width:436.5pt;height:272.25pt' o:button="t"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.png" o:href="http://images.cnitblog.com/blog/28886/201306/10164150-983fdb63f1f34b81947f384e4d819d35.png"/> </v:shape><![endif]--><!--[if !vml]-->image<!--[endif]-->

切换流程:

1. Master挂了后,VIP漂移到SlaveSlave keepalived 通知redis 执行:slaveof no one ,开始提供业务

2. Master起来后,VIP 地址不变,Masterkeepalived 通知redis 执行slaveof slave IP host ,开始作为从同步数据

3. 依次类推

主从同时Down机情况:

1. 非计划性,不做考虑,一般也不会存在这种问题

2. 、计划性重启,重启之前通过运维手段SAVE DUMP 主库数据;需要注意顺序:

1. 关闭其中一台机器上所有redis,是得master全部切到另外一台机器(多实例部署,单机上既有主又有从的情况);并关闭机器

2. 依次dump主上redis服务

3. 关闭主

4. 启动主,并等待数据load完毕

5. 启动从

删除DUMP 文件(避免重启加载慢)

 

6. 使用Twemproxy 实现集群方案

一个由twitter开源的c版本proxy,同时支持memcachedredis,目前最新版本为:0.2.4,持续开发中;https://github.com/twitter/twemproxy.twitter用它主要减少前端与缓存服务间网络连接数。

特点:快、轻量级、减少后端Cache Server连接数、易配置、支持ketamamodularandom、常用hash 分片算法。

<!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" alt="image" href="http://images.cnitblog.com/blog/28886/201306/10164151-f420e31e69844d859c32ea204976cb84.png" style='width:456.75pt;height:287.25pt' o:button="t"> <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image007.png" o:href="http://images.cnitblog.com/blog/28886/201306/10164153-10d5562feeb5478cb0dd3df29293937e.png"/> </v:shape><![endif]--><!--[if !vml]-->image<!--[endif]-->

这里使用keepalived实现高可用主备方案,解决proxy单点问题;

优点:

1. 对于客户端而言,redis集群是透明的,客户端简单,遍于动态扩容

2. Proxy为单点、处理一致性hash时,集群节点可用性检测不存在脑裂问题

3. 高性能,CPU密集型,而redis节点集群多CPU资源冗余,可部署在redis节点集群上,不需要额外设备

 

7 . 一致性hash

使用zookeeper 实现一致性hash

redis服务启动时,将自己的路由信息通过临时节点方式写入zk,客户端通过zk client读取可用的路由信息。

 

具体实现见我另外一篇:redis 一致性hash

 

8 . 监控工具

历史redis运行查询:CPU、内存、命中率、请求量、主从切换等

实时监控曲线

短信报警

使用基于开源Redis Live 修改工具,便于批量实例监控,基础功能都已实现,细节也将逐步完善。

源码地址如下:

https://github.com/LittlePeng/redis-monitor

 

分享到:
评论

相关推荐

    Redis集群方案.docx

    Redis 集群方案是为了应对单实例Redis在处理大规模数据时面临的存储瓶颈,尤其是在像新浪微博这样的大型应用中,单实例无法满足超过TB级...无论采用何种方案,确保数据一致性、高可用性和扩展性是设计Redis集群的关键。

    Redis集群方案.md

    redis集群配置方案,使用typora工具

    Redis集群下过期key监听的实现代码

    在使用redis集群时,发现过期key始终监听不到。网上也没有现成的解决方案。于是想,既然不能监听集群,那我可以建立多个redis连接,分别对每个redis的key过期进行监听。以上做法可能不尽人意,目前也没找到好的解决...

    spring + redis集群

    本文将深入探讨如何使用Spring Data Redis构建一个Redis集群,以及如何通过Spring框架来操作Redis集群,存储对象集合,并提供一个基于Maven的可运行项目示例。 首先,Spring Data Redis是Spring框架的一个模块,它...

    Redis集群测试

    Redis集群是一种分布式数据库解决方案,它允许用户将数据分散存储在多台服务器上,以提高系统的可扩展性和可用性。在“Redis集群测试”中,我们通常会关注以下几个关键知识点: 1. **集群架构**:Redis集群采用无...

    rancher2.3.6部署redis集群配置教程.pdf

    Redis集群指的是利用Redis数据库实现的高可用、高伸缩性的分布式存储解决方案。该文档提供了详细配置步骤,强调了其实践性和即插即用的特点。 描述中提到的“完整的配置”表明文档中会包含从零开始到部署完成所需的...

    Redis集群性能测试分析

    本次实验的目的主要是搭建Redis Cluster和TwemProxy Redis两种集群,分别对其进行性能测试,测试出集群性能的拐点,找出性能的瓶颈有哪些,并对两套集群进行比较,以便于在不同业务场景下择优选择。

    Redis集群_实际使用自己整理的版本.docx

    ### Redis集群方案详解 随着移动互联网的飞速发展,Redis作为一种高性能的键值数据库,在众多互联网企业中得到了广泛应用。然而,传统的单实例模式限制了Redis的扩展能力,尤其是在面对大规模数据处理需求时显得力...

    redis集群批处理一键搭建

    Redis集群是Redis提供的分布式解决方案,它将数据分散存储在多个节点上,通过一致性哈希算法实现数据的分片和负载均衡。每个节点都存储部分数据,同时负责处理一部分客户端请求。当需要扩展存储能力或处理能力时,...

    Redis集群演变过程&集群部署1

    其中,早期的Redis集群方案主要是基于Sentinel(哨兵)系统的。哨兵系统在Redis 3.0之前的版本中被广泛用于实现主从切换,以确保在主节点故障时能自动切换到备用节点,保证服务的连续性。然而,哨兵模式存在一些限制...

    Redis集群搭建工具及教程

    总之,这个资源包提供了一站式解决方案,帮助你在Windows环境下搭建和管理Redis集群,结合文档和工具,你可以深入了解和实践Redis集群的相关知识。通过实际操作,你将能更好地理解和掌握这一强大的分布式数据存储...

    nginx+lua+redis 集群 连接插件和脚本

    在这个“nginx+lua+redis集群”解决方案中,提供的连接插件可能是指Nginx与Redis之间的通信模块,例如lua-redis-pconnector,这个插件允许Nginx通过Lua脚本直接与Redis进行交互。而脚本部分可能包括了处理业务逻辑、...

    Linux系统中redis集群包和Windows环境中的redis集群资源

    Redis集群是一种分布式解决方案,通过在多个节点之间分发数据来提高可用性和可扩展性。在Linux环境下,我们通常会通过源码编译安装Redis,这涉及到下载源代码、配置、编译和安装等步骤。 描述中提到了“Windows环境...

    redis集群windows启动脚本

    Redis集群是Redis提供的分布式解决方案,它将数据分散存储在多个节点上,通过一致性哈希算法实现数据分片,提供高可用性和容错性。每个节点负责一部分数据,并且可以通过主从复制保持数据同步。 2. **Redis集群...

    redis集群 三主三从模式

    总的来说,"redis集群 三主三从模式"提供了一种健壮的分布式数据库解决方案,利用Docker和docker-compose简化了部署流程。熟悉并掌握这种配置方法,对于保障高可用性和数据安全性至关重要。在实际应用中,还应考虑...

    Redis集群和哨兵搭建文档.doc

    "Redis集群和哨兵搭建文档" 本文档详细介绍了在 Linux 系统中搭建 Redis 集群和哨兵的步骤。Redis 是一个高性能的 key-value 数据库,遵守 BSD 协议,完全开源免费。 一、Redis 概述 Redis 是一个开源的、基于...

    redis集群redis.rar

    这个名为"redis集群redis.rar"的压缩包文件显然包含了关于Redis集群搭建和使用的资源,特别是针对64位环境的Windows和Linux系统。让我们详细探讨一下其中的知识点。 首先,我们看到"Redis-x64-3.2.100.zip"和"Redis...

    Redis集群安装部署

    Redis集群是Redis的分布式解决方案,它通过将数据分布在不同的节点上,以保证数据的可用性。在Redis集群中至少需要三个主节点来提供故障转移和支持。Redis官方推荐集群的配置是三主三从,即六个节点。这样可以确保...

    Linux 下Redis集群部署

    然而,在面对更高级别的可用性和扩展性挑战时,Redis 集群成为了一种理想的解决方案。本文将详细介绍在 Linux 环境下部署 Redis 集群的具体步骤,并提供必要的技术支持。 #### 二、部署环境及准备 部署 Redis 集群...

    redis集群槽点.zip

    在“redis集群槽点.zip”文件中,可能包含了关于如何创建和管理Redis集群、槽点分配的步骤示意图,以及哨兵系统在集群维护中的作用等相关图解。这些图片有助于直观地理解集群的工作原理和操作流程,对于学习和部署...

Global site tag (gtag.js) - Google Analytics