转:http://www.cb.com.cn/index.php?m=content&c=index&a=show&catid=32&id=1053606&all
本人作为京东云擎(JAE)的架构师,在从事云平台特别是PASS平台的架构、开发多年,有一些体会以及一些解决方案。下面,我想对开源 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升级改造的一点看法。
二、NATS集群化方案设计
为了提高京东云擎的可靠性,京东云擎团队基于GO语言版本的NATS设计并实现了NATS的集群化方案,这个方案在预发布环境运行了一个月,现在也正式上线,表现都非常稳定。下面就对我们的NATS集群化方案和实现进行阐述。
首先看看NATS集群化方案的架构图,如下:
通过上面的架构图可以知道,NATS服务器各个节点采用了zookeeper进行心跳存活的管理,这样可以保证所有NATS客户端获取到的NATS服务器节点都是存活的;NATS服务器各个节点直接也会相互通信,主要是保证订阅信息的同步。
这个NATS集群化方案有如下优点:
(1)方便的横向扩展,随时上线下线NATS服务器节点;
(2)通过zookeeper管理NATS服务器节点的存活,保证了客户端得到的NATS服务器实例都是可用的;
(3)通过最多两次的消息转发,极大的提高了消息转发的性能。
三、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集群化,本次架构升级还做了其他很多改进,本次架构升级主要目的是让京东云擎具有高可靠。下面在简单介绍本次架构升级其他方面的改进:
(1)使用分布式文件系统替换原来的单磁盘存放droplet,解决了由于用户猛增导致droplet存储空间受限的问题;
(2)用户控制台界面dashboard的改变;
(3)Router对后端多实例包括CloudController的容错;
(4)独立域名绑定支持;
(5)应用打包部署流程优化;
(6)同组件的不同实例分别部署到不同物理机的云主机上;
(7)其他组件功能优化。
五、总结
云擎是京东给个人开发者、微小中型企业提供的一站式应用免费托管平台,所以保证云擎高可靠性就是保证所有个人开发者和微小中型的应用的可靠性。
通过对核心CF的组件进行多实例或者集群化容错处理来保证和提供云擎的可靠性,尤其在对消息中间件这个核心组件,云擎团队设计和实现了自己的集群化方 案,保证了消息通信的可靠性,并且通过GO语言进行开发扩展了单机NATS的消息通信的性能。我们设计的NATS集群化方案具有方便横向扩展的能力,由此 京东云擎团队解决了消息中间通信的瓶颈。
云擎团队后面考虑对NATS集群化方案进行服务提供给京东云擎的用户使用,让用户也能够通过消息中间件开发分布式的应用。
最后,自己也不忘给京东云擎打个小广告:免费得应用托管平台,稳定、可靠,服务态度好,欢迎访问云擎官网:http://jae.jd.com。
相关推荐
在本文中,我们将深入探讨京东架构师“强娃”针对CloudFoundry中的NATS单节点问题进行的架构优化,以提升整体系统的高可用性和可靠性。 NATS是CloudFoundry中的一个关键组件,它作为消息传递系统,负责连接和协调CF...
串流分屏 - 两台笔记本电脑屏幕共享
tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl
基于java的银行业务管理系统答辩PPT.pptx
TA_lib库(whl轮子),直接pip install安装即可,下载即用,非常方便,各个python版本对应的都有。 使用方法: 1、下载下来解压; 2、确保有python环境,命令行进入终端,cd到whl存放的目录,直接输入pip install TA_lib-xxxx.whl就可以安装,等待安装成功,即可使用! 优点:无需C++环境编译,下载即用,方便
"Turkish Law Dataset for LLM Finetuning" 是一个专为法律领域预训练的大型语言模型(LLM)微调而设计的数据集。这个数据集包含了大量的土耳其法律文本,旨在帮助语言模型更好地理解和处理土耳其法律相关的查询和文档。 该数据集的特点包括: 专业领域:专注于土耳其法律领域,提供了大量的法律文本和案例,使模型能够深入学习法律语言和术语。 大规模:数据集规模庞大,包含了超过1000万页的法律文档,总计约135.7GB的数据,这为模型提供了丰富的学习材料。 高质量:数据经过清洗和处理,去除了噪声和非句子文本,提高了数据质量,使得模型训练更加高效。 预训练与微调:数据集支持预训练和微调两个阶段,预训练阶段使用了大量的土耳其语网页数据,微调阶段则专注于法律领域,以提高模型在特定任务上的表现。 多任务应用:微调后的模型可以应用于多种法律相关的NLP任务,如法律文本摘要、标题生成、文本释义、问题回答和问题生成等。 总的来说,这个数据集为土耳其法律领域的自然语言处理研究提供了宝贵的资源,有助于推动土耳其语法律技术的发展,并为法律专业人士提供更精准的技术支持。通过微调,
农业信息化服务平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
tornado-6.1b2-cp36-cp36m-manylinux2010_i686.whl
计算机NLP_预训练模型文件
随心淘网管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
计算机汇编杂谈-理解其中的原理
基于java的藏区特产销售平台答辩PPT.pptx
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
安装包
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
Windows x64 操作系统上安装 Python 3.11 版本对应的dlib库,操作简单,无需pip在下载,再也不怕网络超时等其他不确定错误 使用方法: 1、确保windows x64系统上安装了python,可以用anaconda自带的python 2、确认python版本为3.11版本 3、下载资源解压为dlib-19.24.1-cp311-cp311-win_amd64.whl到本地,cd到对应目录,终端直接输入命令pip install dlib-19.24.1-cp311-cp311-win_amd64.whl 等待安装成功提示就可以用了,非常方便,有使用问题欢迎私信哟!
Jira插件安装包
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse