随着越来越多的企业认识到分布式系统的重要性,对于如何编排和管理这些分布式系统已经提出了更高的要求,大多企业花费大量精力来管理部署和维护复杂而敏捷的分布式系统。在本文中,我们将探索如何使用基于Redis的集群编排模板完成一个分布式系统的部署。
我们需要加载所有的集群编排模板,采用如下的Json格式来存储:
{units:[{"name": “test1-redis-1”,"image": “image_registry/test1_redis_1:v1.0”,"replicas": 2},{"name": “test1-redis-2”,"image": “image_registry/test1_redis_2:v1.0”,"replicas": 2}],services: [{"name": “test1-redis-cluster”,"image": “image_registry/test1_redis_cluster:v1.0”,"replicas": 2}]}
接下来,我们可以开始定义一个用于部署Redis集群的配置模板,存储在一个叫做redis.yml的配置文件中。
内容如下:
apiVersion: apps/v1beta2
kind: StatefulSet
name: test-redis-cluster

replicas: 2
matchLabels:
app: {{.Name}}
app: {{.Name}}
-name: redis
image: {{.Image}}
-contnerPort: 6379
apiVersion: v1
kind: Service
app: {{.Name}}
name: {{.Name}}
type: ClusterIP
– port: 6379
name: redis
clusterIP: None
app: {{.Name}}
我们可以使用Kubernetes支持的模板处理库Helm来渲染redis.yml,并使用kubectl来部署到Kubernetes集群中:
helm template redis.yml \
–name=test-redis-cluster \
–namespace=default \
–values=values.yml \
–output-dir=./ \
| kubectl apply -f –
模板渲染完成后,我们就得到了可供Kubernetes部署的配置文件,部署后,我们的分布式Redis集群就完成了。基于Redis的集群编排模板利用最新的模板处理技术,充分利用了已有的资源,帮助用户轻松地部署复杂的分布式系统,使用户省去了很多维护负担。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
Redis怎么做集群
为什么集群?
通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。 Redis是一个很好的Cache工具。 大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在这种情况下,如何正确架构Redis呢?
首先,无论我们是使用自己的物理主机,还是使用云服务主机,内存资源往往是有限制的,scale up不是一个好办法,我们需要scale out横向可伸缩扩展,这需要由多台主机协同提供服务,即分布式多个Redis实例协同运行。
其次,目前硬件资源成本降低,多核CPU,几十G内存的主机很普遍,对于主进程是单线程工作的Redis,只运行一个实例就显得有些浪费。 同时,管理一个巨大内存不如管理相对较小的内存高效。 因此,实际使用中,通常一台机器上同时跑多个Redis实例。
方案
官方集群方案 Redis Cluster
Redis Cluster是一种服务器Sharding技术,3.0版本开始正式提供。
Redis Cluster中,Sharding采用slot(槽)的概念,一共分成个槽,这有点儿类pre sharding思路。 对于每个进入Redis的键值对,根据key进行散列,分配到这个slot中的某一个中。 使用的hash算法也比较简单,就是CRC16后取模。
Redis集群中的每个node(节点)负责分摊这个slot中的一部分,也就是说,每个slot都对应一个node负责处理。 当动态添加或减少node节点时,需要将个槽做个再分配,槽中的键值也要迁移。 当然,这一过程,在目前实现中,还处于半自动状态,需要人工介入。
Redis集群,要保证个槽对应的node都正常工作,如果某个node发生故障,那它负责的slots也就失效,整个集群将不能工作。
为了增加集群的可访问性,官方推荐的方案是将node配置成主从结构,即一个master主节点,挂n个slave从节点。 这时,如果主节点失效,Redis Cluster会根据选举算法从slave节点中选择一个上升为主节点,整个集群继续对外提供服务。 这非常类似前篇文章提到的Redis Sharding场景下服务器节点通过Sentinel监控架构成主从结构,只是Redis Cluster本身提供了故障转移容错的能力。
Redis Cluster的新节点识别能力、故障判断及故障转移能力是通过集群中的每个node都在和其它nodes进行通信,这被称为集群总线(cluster bus)。 它们使用特殊的端口号,即对外服务端口号加。 例如如果某个node的端口号是6379,那么它与其它nodes通信的端口号是。 nodes之间的通信采用特殊的二进制协议。
对客户端来说,整个cluster被看做是一个整体,客户端可以连接任意一个node进行操作,就像操作单一Redis实例一样,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的node,这有点儿像浏览器页面的302 redirect跳转。
Redis Cluster是Redis 3.0以后才正式推出,时间较晚,目前能证明在大规模生产环境下成功的案例还不是很多,需要时间检验。
Sharding集群
Redis 3正式推出了官方集群技术,解决了多Redis实例协同服务问题。 Redis Cluster可以说是服务端Sharding分片技术的体现,即将键值按照一定算法合理分配到各个实例分片上,同时各个实例节点协调沟通,共同对外承担一致服务。
多Redis实例服务,比单Redis实例要复杂的多,这涉及到定位、协同、容错、扩容等技术难题。 这里,我们介绍一种轻量级的客户端Redis Sharding技术。
Redis Sharding可以说是Redis Cluster出来之前,业界普遍使用的多Redis实例集群方法。 其主要思想是采用哈希算法将Redis数据的key进行散列,通过hash函数,特定的key会映射到特定的Redis节点上。 这样,客户端就知道该向哪个Redis节点操作数据。
庆幸的是,java redis客户端驱动jedis,已支持Redis Sharding功能,即ShardedJedis以及结合缓存池的ShardedJedisPool。
Jedis的Redis Sharding实现具有如下特点:
1.采用一致性哈希算法(consistent hashing),将key和节点name同时hashing,然后进行映射匹配,采用的算法是MURMUR_HASH。 采用一致性哈希而不是采用简单类似哈希求模映射的主要原因是当增加或减少节点时,不会产生由于重新匹配造成的rehashing。 一致性哈希只影响相邻节点key分配,影响量小。
2.为了避免一致性哈希只影响相邻节点造成节点分配压力,ShardedJedis会对每个Redis节点根据名字(没有,Jedis会赋予缺省名字)会虚拟化出160个虚拟节点进行散列。 根据权重weight,也可虚拟化出160倍数的虚拟节点。 用虚拟节点做映射匹配,可以在增加或减少Redis节点时,key在各Redis节点移动再分配更均匀,而不是只有相邻节点受影响。
支持keyTagPattern模式,即抽取key的一部分keyTag做sharding,这样通过合理命名key,可以将一组相关联的key放入同一个Redis节点,这在避免跨节点访问相关数据时很重要。
Redis集群架构剖析(3):集群处理redis-cli指令
Redis集群处理rediscli指令的基本逻辑如下:
总结:Redis集群处理rediscli指令的核心步骤是确定键的槽位归属,并根据槽位决定命令的处理节点。 如果槽位不由当前节点负责,节点会返回MOVED错误,客户端根据错误信息进行重定向。 此外,集群节点在数据库使用上与单机模式有所不同,只使用0号数据库。
在 KubeSphere 中部署高可用 Redis 集群
在 KubeSphere 中部署高可用 Redis 集群的步骤如下:
通过以上步骤,可以在 KubeSphere 中成功部署一个高可用的 Redis 集群。
发表评论