alpakka-kafka(5)-kafka集群配置与分布式应用部署
在进入具体的kafka应用设计之前我们先把kafka集群环境配置介绍一下。多节点kafka-cluster的安装、配置非常简单,所以应该不用太多篇幅就可以完成一个完整可用的kafka-cluster环境了:
1、安装Kafka之前需要安装zookeeper。无论zookeeper或者kafka,安装步骤都很简单,直接按照官方的安装指引一步步进行就行了,我们把注意力还是放在它们的具体配置上吧。
2、kafka的配置集中在server.properties文件里的几个设置上:
1)broker.id=2
本kafka实例在多节点集群中的唯一编号为2
2)listeners=PLAINTEXT://130.90.27.123:9092,130.90.27.233:9092
kafka实例监听端口
3)log.dirs=/usr/local/var/lib/kafka-logs
kafka日志文件路径
4)zookeeper.connect=130.90.27.123:2181,130.90.27.233:2181
zookeeper集群节点端口清单。kafka是自然集群模式的。只要配置文件中zookeeper.connect指向同一个zookeeper集群,代表所有kafka节点都属于同一个kafka集群
3、zookeeper主要的功能是对kafka集群成员的控制管理。为了实现系统的安全和高可用性,zookeeper是一个仲裁模式的集群体系,为了实现多数裁定,zookeeper集群的节点数目必须是单数的。3-5个节点比较正常。
zookeeper配置文件zookeeper.properties里设置举例如下:
假如server.1,server.2,server.3分别为同一个zookeeper-cluster里的节点
server.1
dataDir=/var/lib/zookeeper
clientPort=2181
maxClientCnxns=0
initLimit=5
syncLimit=2
tickTime=2000
# list of servers
server.1=0.0.0.0:2888:3888
server.2=<Ip of second server>:2888:3888
server.3=<ip of third server>:2888:3888
server.2
dataDir=/var/lib/zookeeper
clientPort=2181
maxClientCnxns=0
initLimit=5
syncLimit=2
tickTime=2000
# list of servers
server.1=<ip of first server>:3888
server.2=0.0.0.0:2888:3888
server.3=<ip of third server>:2888:3888
server.3
dataDir=/var/lib/zookeeper
clientPort=2181
maxClientCnxns=0
initLimit=5
syncLimit=2
tickTime=2000
# list of servers
server.1=<ip of first server>:3888
server.2=<ip of second server>:3888
server.3=0.0.0.0:2888:3888
kafka适合在大型集成应用系统中使用。一个分布式应用系统可能包括了多个底层集群系统,包括数据库、搜索引擎、分布式消息队列、数据流集群等等。如何通过有效部署实现这些集群系统的集成也是一个值得考虑的问题。讲到系统集成,首先想到的是http协议。http可以说是一种异类系统集成协议,是一种行业标准。拿一个大型应用软件操作做例子,前端一般负责两块功能:
1、连接后台业务逻辑系统进行业务互动。一般来讲后台业务决策是基于处理过的数据支持的
2、输入商品及交易数据,这实际上是一个数据采集、过滤、加工处理的全过程。举例:录入一条交易数据、写入数据库、写入搜索引擎索引、更新库存数等等 ... 整个过程涉及到上面提到的几个集群系统。如下图:
从上面这个图示可以看到:前端应用(app)主要是通过http分别与几个集群系统对接的。也就是说app需要逐个通过http调用各系统api来实现特定的数据录入。图示中的系统如下:
1、elastic-services: 搜索引擎服务平台
2、mongodb-services: 数据库服务平台
3、mongo-cluster: 数据库集群节点连接
4、kafka-services: 消息发布平台
5、kafka-backend: 消息消费及数据处理平台
6、kafka-cluster: 消息队列集群节点连接
7、distributed-backend: 应用系统业务互动平台
http方式系统集成的特点是目标系统之间耦合非常松散,实现了自由系统部署。最明显的是各系统的客户端可以分别部署,互不相关。假如上面这个app是个第三方软件,比如是一个与其它企业数据交换的前端系统,那么这种http方式就非常适用。任何第三方系统,只要遵照协定的方式和数据格式就可以成为系统的一个集成部分。
但是,从大型系统数据安全的角度考虑:对企业内部系统来说,http集成方式存在诸多短板和风险。从下面几个方面考虑:
1、负载均衡:http接入节点必须提供所有用户的服务请求。超载会造成数据遗失
2、数据安全:任何一个集群系统http接入节点出现故障都会造成整体数据的不完整
从数据录入来说,整个流程的完结在成功的写入数据库,也就是说:一旦数据存入数据库就代表该数据已经成功完成了所有相关处理,包括:写入搜索索引、完成数据处理如库存数更新等等。如果按http方式逐个调用api服务的话,任何环节出现问题都会造成数据的不完整。所以,更稳妥的做法应该是写入数据库和其它相关数据处理环节都在同一个节点完成。也就是说在一个包含数据库客户端的节点上应该部署所有相关集群系统的客户端。这样,只要节点运行正常,能写入数据库,就能保证完成相关数据处理的所有环节。从这个思路出发,可以得出下面的集群系统部署图示:
按图所示,整个数据录入流程只需要调用一个http服务。数据保存到数据处理等所有环节都包含在同一项服务里(在backend自动实现)。如此实现相关数据处理环节与数据库写入同步:能写入数据库代表节点运行正常,也就是说其它环节也同样能顺利完成。反之如节点系统发生异常,写入数据库及其它相关环节都同时无法完成,可以保证整体数据的完整性。