如何利用Redis扩展数据服务、实现分片及高可用?

  • 时间:
  • 浏览:2
  • 来源:uu快3教程_uu快3代理_手机版

要都都还可以 监控Redis的生存状况。什儿 点实现起来很简单,定期的PING Redis实例即可。时需的信息以及做出客观下线和主观下线的判断辦法 都还可以 都还可以 直接照搬sentinel实现。

先简单介绍一下Redis sentinel是怎么还可以做到高可用的。同時 监控同一组主从的sentinel还可以 都还可以 有多个,master挂掉的并且 ,那先 sentinel会根据Redis被委托人实现的什儿 raft算法选举出leader,算法流程也也有一阵一阵繁复,要花费比paxos简单多了。所有sentinel也有follower,判断出master客观下线的sentinel会升级成candidate同時 向什儿 follower拉票,所有follower同一epoch内还可以 都还可以 投给第并且 向被委托人拉票的candidate。在具体表现中,通常并且 epoch就能保证形成多数派,选出leader。有了leader,中间再对Redis做SLAVEOF的并且 就容易多了。

不同分片中的数据一定是严格隔离的,比如是不同组服的数据,原应分析是完全不相干的数据。要想实现跨分片的数据交互,时需依赖更上层的协调机制保证,数据服务层面不做任何承诺。并且 并且 一来,原应分析想给应用层提供协调机制,我希望在每个分片上部署单实例简易锁机制即可,简单明了。

第什儿 方案,什儿 人实在还可以 都还可以 直接pass掉了。原应分析什么我儿 方案更适合私有云的情景,开发数据服务的部门有原应分析和业务部门相去甚远,并且 时需统一的转发代理服务。并且 对于什儿 简单的应用开发情景,数据服务逻辑服务也有他们写的,没那先 增加额外中间层的必要。

怎么还可以让数据服务高可用?在讨论什儿 问题报告 并且 ,什儿 人首先看Redis怎么还可以实现「可用性」。

不过目前的方案还可以 都还可以 算不算满足了应用对数据服务的基本需求。

怎么还可以实现分片?

回忆下前文《怎么还可以快速搭建数据服务》(https://mp.weixin.qq.com/s/Ime_GyDkAJMTird1nWRNUA)中什儿 人正确处理resharding问题报告 的思路:

并且 presharding的缺点也很明显,做还可以 动态增容减容,并且 无法高可用。不过实在我希望稍加改造,就足以满足需求了。

每个分片也有改成主从模式。

将presharding与client sharding结合起来后,现在什儿 人的成果是:数据服务是全局的,Redis还可以 都还可以 开多个实例,不相干的数据时需到不同的分片上存取,dbClient掌握什儿 映射关系。

什儿 人的分片方案无法在分片间做相似分布式存储系统的数据冗余机制,换言之,一份数据交叉指在多个分片中。

第什儿 机制是replication。通常的replication方案主要分为什儿 。

也统统 说把最结束了了英语 英语 的图,改成下面什儿 样子:

presharding,也统统 Sharding静态配置。

◆  ◆  ◆  ◆  ◆  

◆  ◆  ◆  ◆  ◆  

分片的Redis集群,实际上同時 组成了并且 有状况服务(stateful service)。设计有状况服务,什儿 人通常会从两点考虑:

采用什儿 比较简单的两段映射,第一段是静态的固定哈希,第二段是动态的可配置map。前者通过算法,后者通过map配置维护的辦法 ,都能最小化影响到的key集合。

一致性哈希。

说起来原应分析一阵一阵绕,换个说法,也统统 服务A借助服务B实现了高可用,没法服务B什儿 也时需高可用。

gossip protocol,实在统统 Redis cluster采用的方案。简单地说统统 集群中每个节点会原应分析网络分化、节点抖动等原应分析而具有不同的集群全局视图。节点之间通过gossip protocol进行节点信息共享。这是业界比较流行的去中心化的方案。

并且 ,Redis sentinel本质上是整个服务端的static parts(要向dbClient提供服务),并且 却依赖于Redis的启动,并也有一阵一阵优雅。被委托人面,dbClient要想问Redis sentinel要到当前连接信息,还可以 都还可以 依赖其内置的pub-sub机制。Redis的pub-sub统统 并且 简单的消息收集,没法消息持久化,并且 时需轮询式的请求连接信息模型。

正确处理那先 问题报告 ,watcher就兼具了扩展性、定制性,同時 还提供分片数据服务的帕累托图在线迁移机制。并且 ,什儿 人的数据服务也就更加健壮,可用程度更高。

看下最后的架构图:

从MySQL一路用过来的同学这时也有习惯性地水平拆分,Redis中也是相似的原理,将整体的数据进行切分,每一帕累托图是并且 分片(shard),不同的分片维护不同的key集合。

原应分析Redis sentinel负责主从切换,拿最自然的想法统统 让dbClient向sentinel请求当前节点主从连接信息。并且 Redis sentinel什儿 也是Redis实例,数量也是动态的,Redis sentinel的连接信息不仅在配置上成了并且 问题报告 ,动态更新时也会有各种问题报告 。

优化什儿 的方案是每个节点都关注比被委托人小并且 排位的节点。并且 原应分析id最小的节点挂掉并且 ,id次小的节点会收到通知并且 了解到被委托人成为了leader,正确处理了惊群效应。

并且 作为一名有操守的系统进程员,我选取继续扩展。

需求决定正确处理方案,我认为,对于游戏服务端以及大多数应用型后端情景,后两者的成本太高,会增加统统不选取的繁复性,并且 什儿 方案都也有要花费的选取。并且 ,大帕累托图服务通常是还可以 都还可以 在设计阶段选取每个分片的容量上限的,统统 时需太繁复的机制支持。

什儿 机制还可以 都还可以 正确处理节点数据冗余的问题报告 ,Redis要具有可用性就还得正确处理Redis实例挂掉让备胎自动顶上的问题报告 ,毕竟由人肉去监控master状况再人肉切换是不现实的。 并且 还时需第二种机制。

何谓分片?简单来说,统统 对单机Redis做水平扩展。

当然,做游戏的同学原应分析要问了,一服并且 Redis,为那先 时需水平扩展?什儿 话题什儿 人在并且 几篇文章中也有讨论,还可以 都还可以 看下面两篇文章,这里就不再赘述。

cluster membership,系统间各个节点,原应分析说各个分片的关系是怎么还可以的。



 

什儿 方案都还可以 都还可以 实现动态resharding,dbClient还可以 都还可以 动态更新:

要在发现master客观下线的并且 选出leader进行后续的故障转移流程。这帕累托图实现起来算不算最繁复的帕累托图,接下来会集中讨论。



 

接下来,什儿 人来看数据服务怎么还可以高可用。

数据服务具有可用性的本质是那先 ?除了能实现Redis可用性的需求——Redis实例数据冗余、故障自动切换之外,还时需将切换的消息通知到每个dbClient。

◆  ◆  ◆  ◆  ◆  

什儿 问题报告 实际上是从另什儿 维度看分片,正确处理方案统统,并且 原应分析从对架构的影响上来看,要花费分为什儿 :

针对第并且 问题报告 ,正确处理方案通常有三:

◆  ◆  ◆  ◆  ◆  

https://mp.weixin.qq.com/s/Ime_GyDkAJMTird1nWRNUA

游戏行业中,大帕累托图采用Redis的团队,一般最终会选定什儿 方案作为被委托人的数据服务。后续的扩展实在对什儿 人来说也有还可以 还可以 做,并且 原应分析有维护上的繁复性与不选取性。

这帕累托图逻辑说白了统统 要在分布式系统中维护并且 一致状况,举个例子,还可以 都还可以 将「谁是leader」什儿 概念当作并且 状况量,由分布式系统中的身份相等的十几个 节点同時 维护,既然谁也有原应分析修改什儿 变量,那究竟谁的修改才奏效呢?

选出leader并且 将并且 最要花费的slave提升为master,并且 等老的master再上线了就把它降级为新master的slave。

现在的什儿 方案指在并且 问题报告 :

并且 简单的方案是让每个watcher都watch「/election」的所有子节点,并且 看被委托人的id算不算最小的,原应分析是统统 明被委托人是leader,并且 告诉应用层被委托人是leader,让应用层进行后续操作就行了。并且 并且 会产生惊群效应,原应分析并且 子节点删除,每个watcher也有收到通知,并且 至多并且 watcher会从follower变为leader。

zk正确处理了那先 问题报告 ?

对于Redis来说,可用性的本质是那先 ?实在统统 Redis实例挂掉并且 还可以 都还可以 有后备节点顶上。 

什儿 是proxy-based,基于额外的转发代理。例子有twemproxy/Codis。

相似watcher1每次申请节点都叫watcher1,第一次它申请成功的节点全名假设是watcher302(中间的是zk自动加的序列号),并且 下线,watcher302节点也有指在一段时间,原应分析这段时间内watcher1再上线,再尝试创建watcher1就会失败,并且 并且 的节点过一会儿就原应分析session超时而销毁,并且 就要花费什儿 watcher1消失了。

简单介绍下怎么还可以基于zk实现leader election。zk提供了并且 相似于os文件系统的目录形态学 ,目录形态学 上的每个节点也有类型的概念同時 还可以 都还可以 存储什儿 数据。zk还提供了一次性触发的watch机制。

没法,什儿 人算不算还可以 都还可以 以较低的成本定制什儿 服务,既能取代Redis sentinel,又能正确处理上述问题报告 ?

我在实践中发现,还有什儿 时需注意,临时顺序节点的临时性体现在一次session而也有一次连接的终止。

Redis基于这什儿 机制,原应分析都都还可以 实现一定程度的可用性。

首先,什儿 人要选取分片方案时需正确处理那先 问题报告 。

http://mp.weixin.qq.com/s__biz=MzIwNDU2MTI4NQ==&mid=2247483728&idx=1&sn=c2076dbc98de6fbd

40b87236f2033925&chksm=973f0fbaa04886ac83c975b7046885f7171be8d26695d23fcab974124ce054a65d

10caea3db5&scene=21#wechat_redirect

◆  ◆  ◆  ◆  ◆  

要做到自主服务发现,包括什儿 watcher的发现与所监控的master-slave组中的新节点的发现。在实现上,前者还可以 都还可以 基于消息队列的pub-sub功能,后者我希望向Redis实例定期INFO获取信息即可。

再梳理一下,什儿 人要实现的服务(下文简称为watcher),要花费要实现那先 需求:

◆  ◆  ◆  ◆  ◆  

本文来自云栖社区公司媒体合作 伙伴DBAplus

work distribution,组织组织结构请求应该怎么还可以、交由哪个节点正确处理,原应分析说用户(以下都简称dbClient)的一次读或写应该去找哪个分片。

第二种机制是Redis自带的都都还可以 自动化fail-over的Redis sentinel。reds sentinel实际上是什儿 特殊的Redis实例,其什儿 统统 什儿 高可用服务——还可以 都还可以 多开,还可以 都还可以 自动服务发现(基于Redis内置的pub-sub支持,sentinel并没法禁用掉pub-sub的command map),还可以 都还可以 自主leader election(基于raft算法实现,作为sentinel的并且 模块),并且 在发现master挂掉时由leader发起fail-over,并将掉线后再上线的master降为新master的slave。

没法,分片问题报告 的实质统统 怎么还可以基于多个Redis实例设计全局统一的数据服务。同時 ,并且 约束条件,那统统 什儿 人无法保证强一致性。

针对第并且 问题报告 ,正确处理辦法 跟proxy-based采用的正确处理辦法 没越多区别,原应分析目前的数据服务方案比较简单,采用一致性哈希即可。原应分析采用什儿 比较简单的两段映射,第一段是静态的固定哈希,第二段是动态的可配置map。前者通过算法,后者通过map配置维护的辦法 ,都能最小化影响到的key集合。

Redis通过什儿 机制支持什儿 点。

consensus system,什儿 方案跟上什儿 正相反,是依赖外帕累托图布式一致性设施,由其仲裁来决定集群中各节点的身份。

没法,看起来还可以 都还可以 选取第二种方案了。

什儿 是active-passive,也统统 active节点先修改自身状况,并且 写统一持久化log,并且 passive节点读log跟进状况。

另什儿 是active-active,写请求统一写到持久化log,并且 每个active节点自动同步log进度。

并且 ,什儿 人的分片方案并且 限制:

今天,什儿 人来聊聊怎么还可以扩展数据服务,怎么还可以实现分片(sharding)以及高可用(high availability)。

至于配置收集,就更简单了。配置变更时直接更新节点数据,就能借助zk通知到关注的dbClient,什儿 事件通知机制相比于轮询请求sentinel要配置数据的机制更加优雅。

分布式系统不指在完美的设计,处处都体现了trade off。

正确处理方案并且 ,还可以 都还可以 创建节点前先显式delete一次,都还可以不能 都还可以 通过什儿 机制保证每次创建节点的名字不同,比如guid。

并且 点按顺序来,先看分片。



什儿 基础设施统统 分布式系统的协调器组件(coordinator),老牌的有Zookeeper(基于对Paxos改进过的zab协议,下面都简称zk了),新什儿 的有etcd(什儿 什儿 人都清楚,基于raft协议)。什儿 组件通常没法重复开发的必要,像Paxos什儿 算法理解起来都得老半天,实现起来的细节数量级更是难以想象。并且 统统开源项目也有依赖这两者实现高可用的,比如codis一结束了了英语 英语 统统 用的zk。

第什儿 方案的缺点显而易见——在整个架构中增加了额外的间接层,流程中增加了一趟round-trip。原应分析是像twemproxy原应分析Codis什儿 支持高可用的还好,并且 github上随便一翻还能找到一阵一阵多的没法做到高可用的proxy-based方案,一个劲 多个单点,并且 就完全搞不明白sharding的意义何在了。

什儿 是client sharding,也统统 dbClient(每个对数据服务有需求的服务)维护sharding规则,自助式选取要去哪个Redis实例。Redis cluster本质上就属于什儿 ,dblient侧缓存了帕累托图sharding信息。

而对于第十几个 问题报告 ,正确处理方案统统 实现高可用。

Redis的replication方案采用的是什儿 一致性较弱的active-passive方案。也统统 master自身维护log,将log向什儿 slave同步,master挂掉有原应分析原应分析帕累托图log丢失,client写完master即可收到成功返回,是什儿 异步replication。

并且 一来,实在保证了Redis每个分片的master-slave组具有可用性,并且 原应分析什儿 人引入了新的服务,那就引入了新的不选取性——原应分析引入什儿 服务的同時 时需保证数据服务具有可用性,并且 们就还得保证什儿 服务什儿 是可用的。

原文发布时间为:2016-12-21

不过,在谈具体的改造辦法 并且 ,什儿 人先看并且 提出的分片方案要正确处理的第十几个 问题报告 ——work distribution。

原应分析想用watcher取代sentinel,最繁复的实现细节原应分析统统 这帕累托图逻辑了。

应用层要做leader election就还可以 都还可以 基于这几点概念实现。

zk的具体原理让人不再介绍了,有时间有精力还可以 都还可以 研究下paxos,看看lamport的paper,没时间没精力话语搜一下看看zk实现原理的博客就行了。

 

原应分析采用两段映射,没法什儿 人还可以 都还可以 动态收集第二段的配置数据。

假设有某个目录节点「/election」,watcher1启动的并且 在什儿 节点下面创建并且 子节点,节点类型是临时顺序节点,也统统 说什儿 节点会随创建者挂掉而挂掉,顺序的意思统统 会在节点的名字中间加个数字后缀,唯一标识什儿 节点在「/election」的子节点中的id。

 

第二种方案的缺点,我还可以 都还可以 想到的统统 集群状况指在变化的并且 没法即时通知到dbClient。

以通用的应用服务需求来说,zk还可以 都还可以 用来选leader,还还可以 都还可以 用来维护dbClient的配置数据——dbClient直接去找zk要数据就行了。

 

并且 什儿 人在结束了了英语 英语 正文前,时需选取后续的讨论原则,仍然以分布式系统设计中的CAP原则为例。原应分析主角是Redis,那性能表现肯定是最高设计目标,并且 讨论过程中的所有抉择,也有优先考虑CAP中的AP性质。

原应分析采用一致性哈希,没法什儿 人还可以 都还可以 动态收集分片的连接信息。

原应分析要实现服务级别的复用,没法数据服务的定位往往是全局服务。没法仅用单实例的Redis就难以应对多变的负载状况——毕竟Redis是单系统进程的。

幸好,针对什儿 常见的问题报告 情景,什儿 人有现成的基础设施抽象还可以 都还可以 正确处理。

也统统 说,数据服务进行分片扩展的前提是,不提供跨分片事务的保障。Redis cluster也没法提供相似支持,原应分析分布式事务并且 就跟Redis的定位是有冲突的。