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).
三种方式对比
扩容
- 客户端分片和代理分片方式需要运维介入例如实例从10到20,需要数据迁移
- 代理分片方式客户端感知不到,像单机一样使用Redis,有点类似于ngnix的负载均衡,只ngnix上配置或修改负载节点,客户端是不知道的。
- cluster方式,扩容上,对于客户端是透明的。
- 使用分片的集群可以使用预分片技术解决部分扩容麻烦的问题
Since Redis is extremely small footprint and lightweight (a spare instance uses 1 MB of memory), a simple approach to this problem is to start with a lot of instances since the start.
- Redis可能是当作cache,也可能当作存储使用,如果是当作cache,那么使用hash分片的方式可以很容易的scale和down掉节点,cache没命中在去加载么。但是如果是使用的存储,就需要需要rebalance keys between nodes,分片的方式就有点费劲,但是使用Redis cluster能实现这功能。
效率
- 代理方式由于有单点集中问题,效率有损耗
- 客户端分片与cluster方式都是客户端直连Redis实例,近似线性扩展
优化空间
- 客户端分片方式,如果客户端很多,那么都直连Redis连接无法共享(cluster也是)
- 代理分片方式能够连接共享,优化空间较大
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