热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Redis集群的三种方式

1.Why集群?当前各家互联网公司为了提高站点响应速度,使用缓存工具将热点数据保存在内存中,避免直接从后端数据库读取查询,降低后端压力。其中常见的cache工具有mem

1.Why 集群?

当前各家互联网公司为了提高站点响应速度,使用缓存工具将热点数据保存在内存中,避免直接从后端数据库读取查询,降低后端压力。其中常见的cache工具有memcache和redis,相较于memcache,redis有着许多优势,这里不再赘述。
在大型站点应用中,热点数据几十上百G也很普遍,而无论是物理机、云主机(虚拟机),内存资源往往是有限的,虽然目前硬件成本降低,几十G几十核的主机也很常见,但是对于redis这种工作进程为单线程模式的工具来说,一台主机只运行一个实例就有些浪费,且出现单点故障时影响范围很大。同时,redis管理大内存时不如管理相对较小的内存高效,据第三方测试,redis单进程内存分配达到20G后性能急剧下降,因此普遍使用的方式为单进程分配8G内存,单主机开启多个redis instance.

2.How 集群?

⑴.Redis官方集群方案 Redis Cluster(服务端sharding)
Redis cluster是一种在服务端sharding(分片)的技术,在redis3.0版本开始正式提供。
Redis cluster的服务端sharding引入了slot(槽)的概念,一共分为16384(2^14)个slot,集群中的每个node节点负责分摊这些slot,每个进入redis的键值对,根据key进行hash运算,除以16384取模,匹配相应的slot,再分配进相应的node中的实例中。在redis cluster方案中,数据储存的粒度由原来的instance再次精细为slot。
Redis cluster提供一种叫做cluster bus(集群总线)的功能特性,采用特殊的二进制协议,通信及响应速度极快。它提供节点故障检测、故障转移、新节点识别等节点管理功能,该功能的进程间通信端口号为服务端口号值+10000,例如redis对外提供服务的端口号为6555,则cluster bus的端口号则为16555。
值得注意的是:redis cluster是官方在3.0以后的版本才正式推出的,虽然目前社区内比较活跃,但是成熟的生产案例还不多,需要时间考验。

优势:
在于服务端Redis集群拓扑结构变化时,客户端不需要感知,客户端像使用单Redis服务器一样使用Redis集群,运维管理也比较方便。

不过Redis Cluster正式版推出时间不长,系统稳定性、性能等都需要时间检验,尤其在大规模使用场合。

⑵.redis sharding 集群(客户端sharding)
Redis 3.0服务端sharding推出之前,采用的较普遍的client端集群方式,工作逻辑为:将键值对中的key使用hash算法散列,特定的key映射至特定的redis 实例上,然后由client端主动向该node set/get数据,server端则工作在被动模式。
目前java redis的客户端驱动jedis已经支持redis sharding的功能。

但是Redis sharding面临的问题:扩容。在client端sharding模式下,数据控制完全由client端掌控,redis集群各node间彼此独立,因此在扩容(或缩容)时,数据无法直接从原node转向新node,这时会造成缓存无法命中的问题,查询/写入请求会透过缓存层直接访问后端DB,给后端带来较大的压力,为了避免这个问题,官方给出了比较讨巧的解决方案:presharding。

优势:
服务端的Redis实例彼此独立,相互无关联,每个Redis实例像单服务器一样运行,非常容易线性扩展,系统的灵活性很强。

缺点:
由于sharding处理放到客户端,规模进步扩大时给运维带来挑战。
服务端Redis实例群拓扑结构有变化时,每个客户端都需要更新调整。
连接不能共享,当应用规模增大时,资源浪费制约优化。

⑶.代理中间件sharding

上面分别介绍了多Redis服务器集群的两种方式,它们是基于客户端sharding的Redis Sharding和基于服务端sharding的Redis Cluster。

twemproxy处于客户端和服务器的中间,将客户端发来的请求,进行一定的处理后(如sharding),再转发给后端真正的Redis服务器。也就是说,客户端不直接访问Redis服务器,而是通过twemproxy代理中间件间接访问。twemproxy中间件的内部处理是无状态的,它本身可以很轻松地做LB/HA集群,这样可避免单点压力或故障。twemproxy又叫nutcracker,起源于twitter系统中redis/memcached集群开发实践,运行效果良好,后代码奉献给开源社区。其轻量高效,采用C语言开发。

GitHub link:
(https://github.com/twitter/twemproxy)

twemproxy后端不仅支持redis,同时也支持memcached,这是twitter系统具体环境造成的。由于使用了中间件,twemproxy可以通过共享与后端系统的连接,降低客户端直接连接后端服务器的连接数量。同时,它也提供sharding功能,支持后端服务器集群水平扩展。统一运维管理也带来了方便。当然,也是由于使用了中间件代理,相比客户端直连服务器方式,性能上会有所损耗,Twitter官方实测结果大约降低了20%左右,不过性能的部分损耗可以依靠增加集群节点数量来弥补。

结构图:

Redis 集群的三种方式
image.png

3.Twemproxy

Twemproxy介绍

Twemproxy 也叫 nutcraker。是 Twtter 开源的一个 Redis 和 Memcache 代理服务器,主要用于管理 Redis 和 Memcached 集群,减少与Cache 服务器直接连接的数量。

Twemproxy特性:

轻量级、快速

保持长连接

减少了直接与缓存服务器连接的连接数量

使用 pipelining 处理请求和响应

支持代理到多台服务器上

同时支持多个服务器池

自动分片数据到多个服务器上

实现完整的 memcached 的 ASCII 和再分配协议

通过 yaml 文件配置服务器池

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

能够配置删除故障节点

可以通过端口监控状态

支持 linux, *bsd,os x 和 solaris

Twemproxy安装配置参考官网: https://github.com/twitter/twemproxy 或

主要解决问题和缺点

其功能:

通过代理的方式减少缓存服务器的连接数。

自动在多台缓存服务器间共享数据。

通过不同的策略与散列函数支持一致性散列。

通过配置的方式禁用失败的结点。

运行在多个实例上,客户端可以连接到首个可用的代理服务器。

支持请求的流式与批处理,因而能够降低来回的消耗。

其缺点:

不支持针对多个值的操作,比如取sets的子交并补等。

不支持Redis的事务操作。

错误消息、日志信息匮乏,排查问题困难。

测试结论

功能

前端使用 Twemproxy 做代理,后端的 Redis 数据能基本上根据 key 来进行比较均衡的分布。

后端一台 Redis 挂掉后,Twemproxy 能够自动摘除。恢复后,Twemproxy 能够自动识别、恢复并重新加入到 Redis 组中重新使用。

Redis 挂掉后,后端数据是否丢失依据 Redis 本身的策略配置,与 Twemproxy 基本无关。

如果要新增加一台 Redis,Twemproxy 需要重启才能生效;并且数据不会自动重新 Reblance,需要人工单独写脚本来实现。

如同时部署多个 Twemproxy,配置文件一致(测试配置为 distribution :ketama,modula),则可以从任意一个读取,都可以正确读取 key对应的值。

多台 Twemproxy 配置一样,客户端分别连接多台 Twemproxy可以在一定条件下提高性能。根据 Server 数量,提高比例在 110-150%之间。

如原来已经有 2 个节点 Redis,后续有增加 2 个 Redis,则数据分布计算与原来的 Redis 分布无关,现有数据如果需要分布均匀的话,需要人工单独处理。

如果 Twemproxy 的后端节点数量发生变化,Twemproxy 相同算法的前提下, 原来的数据必须重新处理分布,否则会存在找不到key值的情况 。

性能

不管 Twemproxy 后端有几台 Redis,前端的单个 Twemproxy 的性能最大也只能和单台 Redis 性能差不多。

总的来说,Twemproxy能实现Redis集群的分片和主备,性能还和单机差不多;

参考
https://blog.csdn.net/ywq935/article/details/77720441
https://www.jianshu.com/p/453205bc2d62


推荐阅读
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • C1、缓存的意义说到分布式系统基本上就离不开缓存,在高并发,大流量的场景下缓存更是扮演着重要的角色。所以作为一个分布式系统的开发人员是必须熟练掌握缓存的使用与设计。下面是一张简单的 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了理解Redis-关于string的更多命令(SETEX,SETNX,INCR,DECR,MSET)相关的知识,希望对你有 ... [详细]
  • 下图|通用型_企业用户如何选择合适的云服务器配置?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了企业用户如何选择合适的云服务器配置?相关的知识,希望对你有一定的参考价值。随着网络飞速发展,企业上云已成为 ... [详细]
  • yii框架目录结构详细分析说明
    php教程|php手册yii,目录结构php教程-php手册yii框架目录结构详细分析说明猫狗大战源码,华为云电脑ubuntu,梦见放走很多爬虫,parttmpphp,seo页面描 ... [详细]
  • nosql数据库的基本要求Nosql全称是NotOnlySQL,是一种不同于关系型数据库的数据库管理系统设计方式。对NoSQL最普遍的解释是“非关系型的”,强调Key-ValueS ... [详细]
  • 一、NoSQL数据库简介Web1.0的时代,数据访问量很有限,用一夫当关的高性能的单点服务器可以解决大部分问题。随着Web2.0的时代的到来,用户访问量大幅度提升,同时产生了大量的 ... [详细]
  • 前言这篇文章是个人对后端工程师的面试复习点总结,不求面面俱到,只求发挥实效。你也可将你面试时遇到的值得记录下来的问题发给我,丰富这篇文章& ... [详细]
  • 首先讲一下Memcache和Memcached。为什么会有Memcache和Memcached两种名称呢?其实Memcache是这个项目的名称,而Memcached是它服务器端的主 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
author-avatar
瞄瞄摩卡李流
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有