开始使用 Managed Streaming for Kafka (MSK) Serverless 版本

一、背景

MSK的Serverless版本简单易用,无须设置大量复杂参数,点击几下鼠标,五分钟内即可创建完毕,可快速开始使用。

MSK Serverless默认是2个可用区,使用IAM认证,并开启TLS认证。因此需要在Kafka的客户端做额外配置。本文讲解如何连接到MSK Serverless版本。

二、创建MSK Serverless集群

1、创建Kafka使用的安全规则组

MSK创建后不能修改安全规则组,如果一定要修改的话,要通过EC2服务的ENI网卡界面来修改,步骤繁琐。因此一开始要先创建好Kafka使用的安全规则组。

在要使用MSK的VPC内,创建一个新的安全组Kafka,放行如下规则:

  • TCP 9098,来源地址本VPC的CIDR,用于Serverless版本Bootstrap连接
  • TCP 9092,来源地址本VPC的CIDR,用于Bootstrap不加密
  • TCP 9084,来源地址本VPC的CIDR,用于Bootstrap加密连接
  • TCP 2181,来源地址本VPC的CIDR,用于Zookeeper不加密
  • TCP 2182,来源地址本VPC的CIDR,用于Zookeeper加密连接

创建完毕。

2、创建MSK集群

进入MSK服务,点击创建集群。如下截图。

选择Custom create,输入集群名称,然后选择类型是Serverless。如下截图。

选择MSK Serverless版本要落地的VPC子网。默认选择两个子网即可,即每个AZ选1个。如果需要三个AZ,可以选择三个子网。如下截图。

在安全规则组位置,选择MSK使用的安全规则组。注意:安全组创建后不能修改。因此本文第一步已经事先创建安全组。至于默认的安全组,可以删除掉。如下截图。

进入下一步向导,无须改动。继续下一步。如下截图。

进入下一步向导,无须改动。继续下一步。如下截图。

进入下一步向导,无须改动。继续下一步。如下截图。

创建完成。

三、从客户端登录

1、创建EC2环境

由于Kafka默认是针对Intel环境而非ARM环境,因此这里创建一台使用Intel处理器的EC2,机型选择建议为t3.medium。如果是生产环境,可选择c6.large等机型。

2、安装软件包

注意,以下命令主要是在AWS海外区域执行,AWS中国区运行时候可能下载Github上软件包会失败,请手工下载并上传。

以root身份执行如下命令:

yum -y install java-11
wget https://archive.apache.org/dist/kafka/2.8.1/kafka_2.12-2.8.1.tgz
tar xzf kafka_2.12-2.8.1.tgz
cd kafka_2.12-2.8.1/libs
wget https://github.com/aws/aws-msk-iam-auth/releases/download/v1.1.1/aws-msk-iam-auth-1.1.1-all.jar
cd ../bin 

编辑如下内容保存为client.properties配置文件。

security.protocol=SASL_SSL
sasl.mechanism=AWS_MSK_IAM
sasl.jaas.config=software.amazon.msk.auth.iam.IAMLoginModule required;
sasl.client.callback.handler.class=software.amazon.msk.auth.iam.IAMClientCallbackHandler

保存退出。

3、加载IAM身份验证

MSK Serverless默认采用IAM身份认证。其两种认证方式:

  • 在运行客户端的EC2或EKS的容器上加载IAM Role的,那么本机上的程序将具有连接到MSK的权限
  • 在运行客户端的EC2或EKS的容器上安装AWSCLI并配置AKSK密钥

以上两种方式都可工作。

用整个AWS账号的AdminAccess去访问MSK Serverless是可行的,但是不安全的。为了提升安全,需要获取满足MSK Serverless认证的最小权限。方法如下。

查看现有集群,在属性标签页下找到安全设置,点击配置IAM安全策略。如下截图。

点击复制规则。如下截图。

再获取到以上Policy后,可采用安装AWSCLI配置AKSK或者配置IAM Role的方式,二者请任选其一。相关操作请参考有关文档。

4、创建Topic

从AWS控制台上查看MSK Serverless版本对应的Broker Endpoint地址。不同于MSK普通版本,一般是3节点或者2节点,MSK Servrless版本的Broker地址只有1个。

查看MSK Serverless集群,点击右上角的查看客户端信息。如下截图。

将Broker地址复制下来,在Linux客户端上带入如下的命令,将其加载到环境变量。

export BS=boot-fd6kefki.c1.kafka-serverless.ap-southeast-1.amazonaws.com:9098

确认是在Kafka下载软件包的bin目录下,然后执行如下命令。

./kafka-topics.sh --bootstrap-server $BS --command-config client.properties --create --topic msk-serverless-01 --partitions 6

5、发送消息

确认是在Kafka下载软件包的bin目录下,然后执行如下命令。

./kafka-console-producer.sh --broker-list $BS --producer.config client.properties --topic msk-serverless-01

6、接受消息

注意:如果是一台全新的节点,或者本Linux上新的Shell进程,要重复下上文重新设置环境变量,加载$BS也就是Broker的Endpoint。

./kafka-console-consumer.sh --bootstrap-server $BS --consumer.config client.properties --topic msk-serverless-01

如果以上命令末尾加上--from-beginning则表示从第一条消息开始接收。

四、关于MSK Serverless版本计费

MSK普通集群(也就是Provisoned Cluster)是按照EC2节点数来收费的。而Serverless版本,是按照几个收费的角度来收费的:

  • 集群费用,每个集群每小时
  • 分区费用,按照每个Topic的分区数 * 每小时 * Topic数量
  • 存储费
  • 进出流量(消息产生、消费者的传入传出)

以如下场景为例,在新加坡Region创建了一个Serverless集群,有3个Topic,每个Topic 1个分区,数据存储约100GB。每天写入读取数据各约1GB。总费用是:

  • 集群费:$0.9375 * 24小时 * 30天 = $675
  • 分区费:$0.001875 * 3个Topic * 1个分区/每个Topic * 24小时 * 30天 = 0.001875 * 3 * 720 = $4.05
  • 存储费:$0.12 * 100GB = $12
  • 写入流量:$0.125 * 1GB * 30天 = $3.75
  • 读取流量:$0.0625 * 1GB * 30天 = $1.875

总费用:$675 + $4.05 + $12 + $3.75 + $1.875 = $696.675/月

由此可以看到,当Topic较少、分区较少、存储较少、流入流出数据量不大的时候,MSK Serverless的主要成本是来自集群费。在此情况下,可能选择三台低配的m5.large机型构建MSK集群的价格可能稍微低一些,但是Serverless版本简单易管理,按需收费,适合弹性缩放,所以还是有着较大技术优势值得考虑。

对于消息量较大、流量较大的场景,请对照MSK标准版本(Provisioned Instance)的机型列表另外测算价格。

五、参考文档

开始使用MSK Serverless

https://docs.aws.amazon.com/zh_cn/msk/latest/developerguide/serverless-getting-started.html

MSK Serverless 定价

https://aws.amazon.com/cn/msk/pricing/