扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:强娃 来源:CSDN 2014年4月11日
关键字: 架构 京东 CloudFoundry
编者按:NATS是由Cloud Foundry开发的一个基于事件驱动的、轻量级的消息系统。它基于EventMachine实现,第一版本CloudFoundry被人诟病的一个问题就是NATS服务器是单节点的,让人不大放心。集群版本则被反映不够稳定,都没有在生产环境使用。本文作者为京东云擎(JAE)的架构师强娃,从事云平台特别是PaaS平台的架构、开发多年。作者对开源PaaS框架CloudFoundry进行了优化,解决了NATS单节点问题,大大减小了NATS单节点的风险问题。目前京东云擎就是基于这种方案来实现的,避免了单个NATS节点挂掉导致整个云擎无法运行的情况。以下为原文:
我们基于CloudFoundry(后文统一使用CF作为简称)开源系统进行二次开发,利用CF开源系统的基本框架,然后整合了京东自己的各个云服务产品,并且根据需求开发了智能路由、弹性伸缩、智能启动和资源隔离等扩展功能。
CF开源系统作为一个通用的PaaS平台解决方案,很好的满足了大部分基本需求,但是要打造一个高可靠的PaaS平台,还需要做很多架构容错和改进。
CF由很多组件构成,有一些核心组件是必不可少的,还有很多可选组件可以根据需求选择性使用。其中NATS、Router和Cloudontroller三个组件更是整个CF的最关键的组件,其中任何一个组件不可用都会导致整个PaaS平台不可用,所以这三个组件的容错显得更加重要。 Router的容错可以VIP实现,Cloudontroller本身通过Router的软域名映射进行容错。NATS作为整个CF各个组件的连接枢纽,一旦不可用所有CF组件都出问题,所以NATS的重要性不言而喻,但是目前业界普遍使用单实例。虽然NATS的稳定性不容置疑,但是不能解决由于网络、服务器硬件故障和操作系统故障导致的不可用,特别是由于服务器不可用导致的故障,恢复成本很高,时间也是很长的。开源的NATS组件也有集群版本,但是普遍反映不够稳定,都没有在生产环境使用。本人表达一下对NATS升级改造的一点看法。
为了提高京东云擎的可靠性,京东云擎团队基于GO语言版本的NATS设计并实现了NATS的集群化方案,这个方案在预发布环境运行了一个月,现在也正式上线,表现都非常稳定。下面就对我们的NATS集群化方案和实现进行阐述。
首先看看NATS集群化方案的架构图,如下:
通过上面的架构图可以知道,NATS服务器各个节点采用了zookeeper进行心跳存活的管理,这样可以保证所有NATS客户端获取到的NATS服务器节点都是存活的;NATS服务器各个节点直接也会相互通信,主要是保证订阅信息的同步。
这个NATS集群化方案有如下优点:
NATS集群化实现的难点主要在于怎样保证消息的订阅与发布能够在各个NATS节点之间进行同步。下面分别从NATS服务器节点启动、订阅消息、发布消息和NATS客户端改进等方面说明NATS集群化方案的实现。
1. NATS服务器节点启动
为了保证各个NATS服务器节点订阅信息的同步,启动一个NATS服务器节点的时候需要判断是否已存在其他NATS服务器节点,如果存在那么需要连接其他NATS服务器节点进行订阅消息的同步。NATS服务器节点的各个功能或者服务初始化完毕以后将自己的地址以临时节点的方式注册到zookeeper集群中,这样就可以开始对外提供服务了。
2. 消息订阅
集群化版本的NATS对于NATS客户端发布订阅消息是透明的,即不管NATS客户端选择的哪一个NATS服务器节点都只需要向这一台进行消息订阅与发布。
NATS服务器节点收到订阅消息以后,首先加入自己的消息订阅队列,然后广播到其他NATS服务器节点,在广播的时候做了一点点优化,就是看这个主题的消息订阅是否已经被广播过了,那么就不需要重复广播,防止订阅信息过多,并且这些都是不需要的垃圾订阅消息。
最后如果某一个客户端取消订阅消息,同样需要广播取消订阅消息。
3. 消息发布
NATS服务器节点接收到NATS客户端发布的消息以后,还是首先根据消息订阅列表进行转发,和单机NATS不同的是,这次转发可能会转发到其他NATS服务器节点,只要其他NATS服务器节点也有同样的消息主题订阅,那么这种情况就存在一次中间转发的过程,但是也最多只存在一次中间转发过程,所以性能基本上不受什么影响。
4. NATS客户端改进
NATS客户端的改进主要是支持从zookeeper集群上获取NATS服务器的节点地址,并且能够兼容以前老的直接配置某一个NATS服务器节点地址。当客户端第一次连接NATS服务器节点时,需要从zookeeper集群获取所有可用的NATS服务器节点地址并且缓存到本地,然后随机选择一个NATS服务器节点建立连接并且进行消息订阅与发布。缓存所有NATS服务器节点地址主要是防止zookeeper不可用的时候并且NATS服务器节点有挂掉的情况不影响客户端切换NATS服务器节点,在切换的时候需要把NATS客户端以前订阅的消息全部重新订阅一次。
本次针对NATS单点问题进行整个京东云擎的架构升级,完成升级以后整体运行很稳定。不过除了NATS集群化,本次架构升级还做了其他很多改进,本次架构升级主要目的是让京东云擎具有高可靠。下面在简单介绍本次架构升级其他方面的改进:
云擎是京东给个人开发者、微小中型企业提供的一站式应用免费托管平台,所以保证云擎高可靠性就是保证所有个人开发者和微小中型的应用的可靠性。
通过对核心CF的组件进行多实例或者集群化容错处理来保证和提供云擎的可靠性,尤其在对消息中间件这个核心组件,云擎团队设计和实现了自己的集群化方案,保证了消息通信的可靠性,并且通过GO语言进行开发扩展了单机NATS的消息通信的性能。我们设计的NATS集群化方案具有方便横向扩展的能力,由此京东云擎团队解决了消息中间通信的瓶颈。
云擎团队后面考虑对NATS集群化方案进行服务提供给京东云擎的用户使用,让用户也能够通过消息中间件开发分布式的应用。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者