MSK Serverless

在第一节我们讲MSK的扩容时增加了broker节点的数量,但是目前MSK尚不支持减少broker的数量。假设业务迎来了流量高峰,我们增加了多个broker,但流量高峰过后却不缩回来节点数量(当然可以通过mirrormaker来迁移到小的集群,或者垂直缩小到小机型)就很蛋疼。所以引出了本节的MSK Serverless

背景

很多业务场景的流量都是会波动的, 例如电商或银行业务,在每天某个时间段访问人数最多,半夜几乎没有访问量:

image-20220620210453486

另外有些业务流量完全是不可预估的:

image-20220620210604438

针对这些场景,需要调节kafka集群能力,让它能够迎接最大流量高峰,但不可避免的,在流量低峰时会有计算资源的浪费。

MSK Serverless就是可以让运维不再担心集群配置问题,自动适配流量的高峰与低峰,它的计费模式如下:

image-20220620210717078

值得注意的是,MSK Serverless的磁盘也是按需收费,这块也能带来成本的节省。

比如我们的日志只需要保留一天,假如在1天需要1TB的磁盘,后面29天流量减少了十倍,此时我们需要100GB的磁盘足矣,那么后面29天我们都浪费了90%的磁盘空间。

如果使用MSK Serverless,则平均下来,每天使用了(100 * 29 + 1000)/30 = 130GB, 相比于上面的场景,带来巨大的成本节约。

小结

  1. MSK Serverless适用于流量峰值差异大的负载,带来成本的节约,并且可以降低运维成本(如partition的平衡)。什么场景该使用MSK呢,经验来说一般峰值流量大于正常业务流量10-15倍以上时,可以考虑使用MSK Serverless使用MSK Serverless和普通MSK的成本差异,是完全可以预估出来的
  2. 目前MSK最多支持200MB/s的写操作和400MB/s的读操作,要注意它的性能上限
  3. 扩容速度快,秒级完成

创建MSK Serverless

在msk控制台创建新的MSK集群,选择Custom create,并为集群命名:

image-20220620214732509

集群类型选择Serverless,并进入下一步:

image-20220620214743213

选择集群部署的VPC和子网:

image-20220620214807974

为集群配置安全组(安全组要放开连接客户端的9098端口),进入下一步:

image-20220620214839135

目前MSK Serverless只支持IAM认证。点击进入下一步:

image-20220620214848977

MSK Serveless自动帮我们配置好了Consumer Topic和Consumer Group级别的监控:

image-20220620214909713

进入下一步,点击创建。通常5min左右创建完成。

连接测试

创建集群完成后,首先获取它的连接方式:

image-20220620221812938

将bootstrap server的URL复制下来:

image-20220620221825240


登录到cloud9(由于cloud 9是Administrator权限,所以不需要再单独绑定role到上面。如果想细粒度控制权限,参考: https://docs.aws.amazon.com/msk/latest/developerguide/create-iam-role.html )

IAM认证的过程,需要下载JAR文件来实现:

cd /home/ec2-user/environment/
wget https://github.com/aws/aws-msk-iam-auth/releases/download/v1.1.3/aws-msk-iam-auth-1.1.3-all.jar

在同一目录下创建 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.IAMClientCallbackHandle

在运行Kafka CLI前,需要导出CLASSPATH以包含MSK IAM库,也可以将这个jar文件复制到kafka的libs目录:

export CLASSPATH=/home/ec2-user/environment/aws-msk-iam-auth-1.1.3-all.jar

创建topic:

kongpingfan:~/environment $ kafka-topics --bootstrap-server boot-icwmx79a.c3.kafka-serverless.ap-southeast-1.amazonaws.com:9098 --create --replication-factor 3 --partitions 3 --topic my-serverless-topic --command-config client.properties
Created topic my-serverless-topic.

列出创建的topic:

kongpingfan:~/environment $ kafka-topics --bootstrap-server  boot-icwmx79a.c3.kafka-serverless.ap-southeast-1.amazonaws.com:9098  --list --command-config client.properties
my-serverless-topic

image-20220620223201729

当然使用producer发送数据,以及consumer接收数据肯定也是没问题的,这里就不再演示。