Redis(二)集群方式

为什么要集群

Redis主要是吃内存,集群不一定意味着多台物理机,现在机器配置都比较高首先内存很多上百G,核心也多,Redis又是单线程的,为了充分利用机器很多情况下需要在一台机器上开多个节点组成小规模的集群。对于单一Redis而言,管理小的内存会更加高效(10~20G)。

实现方式

主要有三种方式:客户端分片(Jedis)、代理分片(Twemproxy、Codis)、两者结合(Redis cluster)。至于这结合什么意思直接使用官网的原话

Redis Cluster is a mix between query routing and client side partitioning. means that you can send your query to a random instance, and the instance will make sure to forward your query to the right node. Redis Cluster implements an hybrid form of query routing, with the help of the client (the request is not directly forwarded from a Redis instance to another, but the client gets redirected to the right node).

三种方式对比

扩容

效率

优化空间

Redis Sentinel

Sentinel,中文为哨兵,听名字就是监控作用的,有以下几个作用:

监控(Monitoring):Sentinel不断的去检查你的主从实例是否按照预期在工作。 通知(Notification):Sentinel可以通过一个api来通知系统管理员或者另外的应用程序,被监控的Redis实例有一些问题。 自动故障转移(Automatic failover):如果一个主节点没有按照预期工作,Sentinel会开始故障转移过程,把一个从节点提升为主节点,并重新配置其他的从节点使用新的主节点,使用Redis服务的应用程序在连接的时候也被通知新的地址。 配置提供者(Configuration provider):Sentinel给客户端的服务发现提供来源:对于一个给定的服务,客户端连接到Sentinels来寻找当前主节点的地址。当故障转移发生的时候,Sentinels将报告新的地址。

sentinel没有提上面的分片,只是把Redis变成了高可用的,这也是sentinel的初衷。没有“集群”的功能,但是有这样的开源的sentinel客户端加了分片的功能,从而实现了Redis的高可用的集群。

代理分片的方式,Twemproxy、Codis都使用了sentinel,Codis还是用zk在一定的场景下性能比Twemproxy要高。

Redis cluster

官方提供的一种集群方式,比较重,目前好像不是很稳定,没有查到大公司线上使用的场景。当然最大的特点就是智能和超大规模,复杂度不输给ceph。去中心的实现,很多节点直接两两交换数据,与ceph也很像。

performance

High performance and linear scalability up to 1000 nodes.

能够线性扩展性能,主要是客户端也能感知集群,稳定状态下,客户端直接与集群中的服务节点进行通信,所以才有线性扩展的效果。

Availability

Thanks to a Redis Cluster feature called replicas migration the Cluster availability is improved in many real world scenarios by the fact that replicas migrate to orphaned masters (masters no longer having replicas).

如果一个master没有slave了,那么会从有多个slave的master拿过来一个变成自己的slave,功能有点高级了。可用的一个条件是,如果有部分master不可达到,那么这些master至少有个slave是可用,也就是说不能一个master和他的所有slave全都挂掉了,这个时候就部分不可用了。

Why merge operations are avoided

Transferring and merging these kind of values can be a major bottleneck and/or may require the non-trivial involvement of application-side logic

主要是出于性能考虑,需要客户端自己逻辑实现不提供高层接口,但用户可以定制自己的效率更高的合并操作接口。反正在做也支持不上事务的特性,但是这个批量操作特性其实用的满频繁的。

参考

Partitioning: how to split data among multiple Redis instance twemproxy集群生产总结 Redis集群方案应该怎么做 Redis Sentinel

Table of Contents