Redis集群方案应该怎么做

作者&投稿:歹呢 (若有异议请与网页底部的电邮联系)
Redis集群方案应该怎么做~

通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。Redis是一个很好的Cache工具。大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在这种情况下,如何正确架构Redis呢?
首先,无论我们是使用自己的物理主机,还是使用云服务主机,内存资源往往是有限制的,scale up不是一个好办法,我们需要scale out横向可伸缩扩展,这需要由多台主机协同提供服务,即分布式多个Redis实例协同运行。
其次,目前硬件资源成本降低,多核CPU,几十G内存的主机很普遍,对于主进程是单线程工作的Redis,只运行一个实例就显得有些浪费。同时,管理一个巨大内存不如管理相对较小的内存高效。因此,实际使用中,通常一台机器上同时跑多个Redis实例。
方案
1.Redis官方集群方案 Redis Cluster

Redis Cluster是一种服务器Sharding技术,3.0版本开始正式提供。
Redis
Cluster中,Sharding采用slot(槽)的概念,一共分成16384个槽,这有点儿类似前面讲的pre
sharding思路。对于每个进入Redis的键值对,根据key进行散列,分配到这16384个slot中的某一个中。使用的hash算法也比较简
单,就是CRC16后16384取模。
Redis集群中的每个node(节点)负责分摊这16384个slot中的一部分,也就是说,每个
slot都对应一个node负责处理。当动态添加或减少node节点时,需要将16384个槽做个再分配,槽中的键值也要迁移。当然,这一过程,在目前实
现中,还处于半自动状态,需要人工介入。
Redis集群,要保证16384个槽对应的node都正常工作,如果某个node发生故障,那它负责的slots也就失效,整个集群将不能工作。

了增加集群的可访问性,官方推荐的方案是将node配置成主从结构,即一个master主节点,挂n个slave从节点。这时,如果主节点失
效,Redis Cluster会根据选举算法从slave节点中选择一个上升为主节点,整个集群继续对外提供服务。这非常类似前篇文章提到的Redis
Sharding场景下服务器节点通过Sentinel监控架构成主从结构,只是Redis Cluster本身提供了故障转移容错的能力。
Redis
Cluster的新节点识别能力、故障判断及故障转移能力是通过集群中的每个node都在和其它nodes进行通信,这被称为集群总线(cluster

bus)。它们使用特殊的端口号,即对外服务端口号加10000。例如如果某个node的端口号是6379,那么它与其它nodes通信的端口号是
16379。nodes之间的通信采用特殊的二进制协议。
对客户端来说,整个cluster被看做是一个整体,客户端可以连接任意一个
node进行操作,就像操作单一Redis实例一样,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的node,这
有点儿像浏览器页面的302 redirect跳转。
Redis Cluster是Redis 3.0以后才正式推出,时间较晚,目前能证明在大规模生产环境下成功的案例还不是很多,需要时间检验。

2.Redis Sharding集群


Redis 3正式推出了官方集群技术,解决了多Redis实例协同服务问题。Redis Cluster可以说是服务端Sharding分片技术的体现,即将键值按照一定算法合理分配到各个实例分片上,同时各个实例节点协调沟通,共同对外承担一致服务。
多Redis实例服务,比单Redis实例要复杂的多,这涉及到定位、协同、容错、扩容等技术难题。这里,我们介绍一种轻量级的客户端Redis Sharding技术。
Redis
Sharding可以说是Redis
Cluster出来之前,业界普遍使用的多Redis实例集群方法。其主要思想是采用哈希算法将Redis数据的key进行散列,通过hash函数,特定
的key会映射到特定的Redis节点上。这样,客户端就知道该向哪个Redis节点操作数据。Sharding架构如图:
庆幸的是,java redis客户端驱动jedis,已支持Redis Sharding功能,即ShardedJedis以及结合缓存池的ShardedJedisPool。
Jedis的Redis Sharding实现具有如下特点:

用一致性哈希算法(consistent
hashing),将key和节点name同时hashing,然后进行映射匹配,采用的算法是MURMUR_HASH。采用一致性哈希而不是采用简单类
似哈希求模映射的主要原因是当增加或减少节点时,不会产生由于重新匹配造成的rehashing。一致性哈希只影响相邻节点key分配,影响量小。
2.
为了避免一致性哈希只影响相邻节点造成节点分配压力,ShardedJedis会对每个Redis节点根据名字(没有,Jedis会赋予缺省名字)会虚拟
化出160个虚拟节点进行散列。根据权重weight,也可虚拟化出160倍数的虚拟节点。用虚拟节点做映射匹配,可以在增加或减少Redis节点
时,key在各Redis节点移动再分配更均匀,而不是只有相邻节点受影响。
3.ShardedJedis支持keyTagPattern模式,即抽取key的一部分keyTag做sharding,这样通过合理命名key,可以将一组相关联的key放入同一个Redis节点,这在避免跨节点访问相关数据时很重要。



Redis Sharding采用客户端Sharding方式,服务端Redis还是一个个相对独立的Redis实例节点,没有做任何变动。同时,我们也不需要增加额外的中间处理组件,这是一种非常轻量、灵活的Redis多实例集群方法。
当然,Redis Sharding这种轻量灵活方式必然在集群其它能力方面做出妥协。比如扩容,当想要增加Redis节点时,尽管采用一致性哈希,毕竟还是会有key匹配不到而丢失,这时需要键值迁移。
作为轻量级客户端sharding,处理Redis键值迁移是不现实的,这就要求应用层面允许Redis中数据丢失或从后端数据库重新加载数据。但有些时候,击穿缓存层,直接访问数据库层,会对系统访问造成很大压力。有没有其它手段改善这种情况?
Redis
作者给出了一个比较讨巧的办法--presharding,即预先根据系统规模尽量部署好多个Redis实例,这些实例占用系统资源很小,一台物理机可部
署多个,让他们都参与sharding,当需要扩容时,选中一个实例作为主节点,新加入的Redis节点作为从节点进行数据复制。数据同步后,修改
sharding配置,让指向原实例的Shard指向新机器上扩容后的Redis节点,同时调整新Redis节点为主节点,原实例可不再使用。
presharding
是预先分配好足够的分片,扩容时只是将属于某一分片的原Redis实例替换成新的容量更大的Redis实例。参与sharding的分片没有改变,所以也
就不存在key值从一个区转移到另一个分片区的现象,只是将属于同分片区的键值从原Redis实例同步到新Redis实例。

并不是只有增
删Redis节点引起键值丢失问题,更大的障碍来自Redis节点突然宕机。在《Redis持久化》一文中已提到,为不影响Redis性能,尽量不开启
AOF和RDB文件保存功能,可架构Redis主备模式,主Redis宕机,数据不会丢失,备Redis留有备份。
这样,我们的架构模式变
成一个Redis节点切片包含一个主Redis和一个备Redis。在主Redis宕机时,备Redis接管过来,上升为主Redis,继续提供服务。主
备共同组成一个Redis节点,通过自动故障转移,保证了节点的高可用性。则Sharding架构演变成:

Redis Sentinel提供了主备模式下Redis监控、故障转移功能达到系统的高可用性。

高访问量下,即使采用Sharding分片,一个单独节点还是承担了很大的访问压力,这时我们还需要进一步分解。通常情况下,应用访问Redis读操作量和写操作量差异很大,读常常是写的数倍,这时我们可以将读写分离,而且读提供更多的实例数。
可以利用主从模式实现读写分离,主负责写,从负责只读,同时一主挂多个从。在Sentinel监控下,还可以保障节点故障的自动监测。

3.利用代理中间件实现大规模Redis集群
上面分别介绍了多Redis服务器集群的两种方式,它们是基于客户端sharding的Redis Sharding和基于服务端sharding的Redis Cluster。

客户端sharding技术其优势在于服务端的Redis实例彼此独立,相互无关联,每个Redis实例像单服务器一样运行,非常容易线性扩展,系统的灵活性很强。其不足之处在于:
由于sharding处理放到客户端,规模进步扩大时给运维带来挑战。
服务端Redis实例群拓扑结构有变化时,每个客户端都需要更新调整。
连接不能共享,当应用规模增大时,资源浪费制约优化。
服务端sharding的Redis Cluster其优势在于服务端Redis集群拓扑结构变化时,客户端不需要感知,客户端像使用单Redis服务器一样使用Redis集群,运维管理也比较方便。
不过Redis Cluster正式版推出时间不长,系统稳定性、性能等都需要时间检验,尤其在大规模使用场合。
能不能结合二者优势?即能使服务端各实例彼此独立,支持线性可伸缩,同时sharding又能集中处理,方便统一管理?本篇介绍的Redis代理中间件twemproxy就是这样一种利用中间件做sharding的技术。
twemproxy处于客户端和服务器的中间,将客户端发来的请求,进行一定的处理后(如sharding),再转发给后端真正的Redis服务器。也就是说,客户端不直接访问Redis服务器,而是通过twemproxy代理中间件间接访问。
参照Redis Sharding架构,增加代理中间件的Redis集群架构如下:

twemproxy中间件的内部处理是无状态的,它本身可以很轻松地集群,这样可避免单点压力或故障。
twemproxy又叫nutcracker,起源于twitter系统中redis/memcached集群开发实践,运行效果良好,后代码奉献给开源社区。其轻量高效,采用C语言开发,工程网址是:GitHub - twitter/twemproxy: A fast, light-weight proxy for memcached and redis
twemproxy后端不仅支持redis,同时也支持memcached,这是twitter系统具体环境造成的。
由于使用了中间件,twemproxy可以通过共享与后端系统的连接,降低客户端直接连接后端服务器的连接数量。同时,它也提供sharding功能,支持后端服务器集群水平扩展。统一运维管理也带来了方便。
当然,也是由于使用了中间件代理,相比客户端直连服务器方式,性能上会有所损耗,实测结果大约降低了20%左右。

1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护nodeslotvalue。

5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。

以Java语言为例,简单说一下,除了一些公司自主开发的集群外。常用的解决高并发问题的集群一般有三种:

  1. 使用redis-trib.rb,这个是安装redis时就自带的一种集群,采用了服务端分片的方式,支持主备,此集群既解决了高并发的问题,也解决了高可用的问题。Jedis使用JedisCluster类来访问。

  2. 使用Jedis带的客户端分片ShardedJedisPool类。

  3. 使用代理进行分片twemproxy,连接代理可以使用Jedis类(单链接)和JedisPool类(多链接)。

通过Redis的sentinel机制还可以配置高可用集群,一主多从,主down掉后,sentinel负责选拔一个从机作为新的主机。

如果有什么疑问,可以留言。




redis集群命令-readonly、readwrite
readonly         redis集群在默认情况下,slaves服务器不为客户端提供读服务,可以通过设置readonly命令,允许客户端直接读取slaves服务器节点的读服务 如下一个集群中的一个主、从节点 redis 10.3.253.212:8386> role 1) "master"2) (integer) 6724358244 3) 1) 1) ...

技术面试会问很多技术问题吗
其次在是考虑应用服务了,对外服务我会采用成熟的开源方案LVS+Keepalived或者Nginx+Keepalived,缓存层可以考虑redis集群及Mongodb集群,中间件等其它服务可以用kafka、zookeeper,图片存储可以用fastDFS或MFS,如果数据量大、又非常多,那么可采用hadoop这一套方案。后端数据库可采用 “主从+MHA”。这样一套环境下来是绝对满足...

宝塔搭建redis集群
单台服务器创建集群,多台也是一样操作,使用集群端口6380,6381,6382,6383,6384,6385 1、宝塔安装redis,路径一般是 \/www\/server\/redis ,使用命令 ln -s \/www\/server\/redis\/src\/redis-server \/usr\/bin\/redis-server 将redis-server加入环境变量;2、创建集群文件目录,如 \/home\/redis\/cluster,从...

redis那个命令可以统计key的数量?
可以使用命令:redis-cli -p端口 -hIP地址 keys "*" |wc -l 如果是集群:redis-cli -c -p端口 -hIP地址 keys "*" |wc -l(多了个-c)注意keys 命令只能列出当前的节点的key的数量

「故障演练」 Redis Cluster集群,当master宕机,主从切换
Redis Cluster 集群已经完成了切换。但是 Spring Boot 客户端 没有动态感知到 Redis Cluster 的最新集群信息 原因分析:SpringBoot 2.X 版本, Redis默认的连接池采用 Lettuce 当Redis 集群节点发生变化后,Letture默认是不会刷新节点拓扑 解决方案:将 Letture 二方包仲裁掉 然后,引入 ...

redis集群模式缓存数据量最大多少?
20G。服务端有1000多个Redis实例,100+集群,每个实例的内存控制在20G以下。控制在20G。Redis集群解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。

搭建Redis集群遇到的问题:Waiting for the cluster to join..._百度...
搭建Redis集群的过程中,执行到cluster create <ip>:<port> ... 的时候,发现程序在阻塞,显示:Waiting for the cluster to join 的字样,然后就无休无尽的等待...根据字样的提示,在等待集群的创建。嗯?这是什么原因?大部分情况下这是因为集群通信的端口没有开放!先说下解决方案:开放Redis服务...

redis集群如何选取主节点
1、首先,当一个集群中主节点失效或不可用时,集群中的节点会感知到,并开始进行节点选举。选举过程中,每个节点都会向节点发送自己的选票,选票中包含了该节点的ID、当前的配置纪元和自身的优先级等信息。2、其次,节点接收到选票后,会根据选票中的信息以及自身的状态进行投票。投票的原则是优先选择配置...

redis集群如何解决重启不了的问题
redis-server \/usr\/local\/src\/redis-3.2.4\/redis_cluster\/7003\/redis.conf redis-server \/usr\/local\/src\/redis-3.2.4\/redis_cluster\/7004\/redis.conf redis-server \/usr\/local\/src\/redis-3.2.4\/redis_cluster\/7005\/redis.conf 创建redis集群 redis-trib.rb create --replicas 1 xxx:7000 xxx...

Redis集群设置密码和查看密码方法
Redis集群的安全设置中,尽管未内置访问控制,但可以通过配置实现密码验证。以下是关键步骤:1. 启用Redis密码:在redis.conf配置文件中,通过requirepass参数设置密码,例如:`requirepass test123`。为了使更改生效,需要重启Redis,且注意密码强度,尽量选择复杂密码以防止暴力破解(建议DBA不需记忆密码)。2....

延庆县15077524374: Redis集群方案应该怎么做 -
於些亮睛: 我们最近搞了一上Redis集群代理,比twemproxy更好用,性能几乎和单台缓存服务器差不多!搜索Redis集群代理即可下载.

延庆县15077524374: 如何部署高可用的Redis集群架构 -
於些亮睛: 1、准备redis镜像Redis官方已经提供了Redis 3.2和3.3的镜像,都可以用来作为Redis集群的镜像,3.2是稳定版本.目前官方推出了alpine版本的Redis镜像,alpine镜像的优势是体积小.此次分享是采用官方的redis:3.2-alpine的镜像来做集群.2、准备初始化脚本的执行环境redis官方提供了一个ruby的脚本redis-trib.rb,这个脚本可以用来初始化集群、resharding集群、rebalance集群等.

延庆县15077524374: 如何搭建一个 Redis 集群 -
於些亮睛: Redis 因具有丰富的数据结构和超高的性能以及简单的协议,使其能够很好的作为数据库的上游缓存层.但在大规模的 Redis 使用过程中,会受限于多个方面:单机内存有限、带宽压力、单点问题、不能动态扩容等.

延庆县15077524374: redis 集群时jedis该怎么配置 -
於些亮睛: 简单说一下,除了一些公司自主开发的集群外.常用的一般有三种:1. 使用redis-trib.rb,这个是安装redis时就自带的一种集群,采用了服务端分片的方式.Jedis使用JedisCluster类来访问.2. 使用Jedis带的客户端分片ShardedJedisPool类.3. ...

延庆县15077524374: 如何使用 redis 集群来实现分布式储存 -
於些亮睛: 一 : redis cluster 介绍篇1:redis cluster 的现状目前 redis 支持的 cluster 特性 ( 已亲测 ): 1): 节点自动发现2):slave->master 选举 , 集群容错3):Hot resharding: 在线分片4): 进群管理 :cluster xxx 5): 基于配置 (nodes-port.conf...

延庆县15077524374: redis 集群负载均衡怎么做的 -
於些亮睛: 用户访问业务数据时,查询缓存,如果没有值,则从数据库载入Redis,并设置过期时间(基于时间过期的更新策略).• 针对每一个模块,仅有一块内容的情况:存储k/v一条记录;• 针对每一个模块,有多块不同内容的情况:每块内容存储一...

延庆县15077524374: redis怎么做集群,几种方式,为什么持久化消息比非持久化消息用的时间长 -
於些亮睛: Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能.所以Redis也可以被看成是一个数据结构服务器.

延庆县15077524374: 目前成熟的Redis集群方案,有哪些 -
於些亮睛: Redis-Sentinel,master挂了可以用slave顶上,备用master再挂了,仍然能自动用slave顶上,就是有个问题,master的地址一致在变的说,客户端会很困惑的.twemproxy对redis性能影响有些大了,接近20%~~~

延庆县15077524374: redis怎么实现分布式 -
於些亮睛: 为什么集群?通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在这种情况下,如何正确架构...

延庆县15077524374: 搭建redis集群为什么要安装ruby环境 -
於些亮睛: 安装redis集群需要版本号在3.0以上 redis-cluster安装前需要安装ruby环境 搭建集群需要使用到官方提供的ruby脚本.需要安装ruby的环境.yum -y install ruby yum -y install rubygems redis集群管理工具redis-trib.rb [root@bogon ~]# cd redis-3.0.0 ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网