多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

使用 Terraform 与 Ansible 在 AWS 上部署 Apache Pulsar 集群

使用 Terraform 与 Ansible 在 AWS 上部署 Apache Pulsar 集群 消息队列后端流处理【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址https://gitcode.com/gh_mirrors/pulsar28/pulsar点击查看免费下载本篇技术指南以 Apache Pulsar 官方部署文档为主体完整讲解如何借助Terraform基础设施即代码工具与Ansible服务器自动化工具在 Amazon Web ServicesAWS上搭建一套生产可用的 Pulsar 集群从环境准备、SSH 密钥配置、Terraform 创建 EC2/VPC/负载均衡等云资源到磁盘初始化与 Ansible playbook 安装 Pulsar 组件再到获取连接地址并验证集群可用的完整流程。读完本文你将掌握这套开箱即用的 AWS 一键部署方案并理解底层各资源与配置文件的真实作用。若希望手动部署单个 Pulsar 集群而不借助 Terraform 与 Ansible可参考 Deploying a Pulsar cluster on bare metal手动部署多集群 Pulsar 实例的方法见 Deploying a Pulsar instance on bare metal。方案概览Terraform 建资源Ansible 装软件在 AWS 上运行一个 Pulsar 集群 的最省力方式之一就是组合使用两个工具Terraform负责创建运行 Pulsar 集群所需的全部云资源——EC2 实例、VPC 网络、安全组、路由表、子网、负载均衡器等Ansible负责在 Terraform 创建好的 EC2 实例上安装并启动 Pulsar包括 ZooKeeper、BookKeeper bookie、broker、proxy 四类组件。这套部署配置就位于仓库的deployment/terraform-ansible/目录下其中 AWS 相关的 Terraform 定义在 deployment/terraform-ansible/awsAnsible 主 playbook 为 deployment/terraform-ansible/deploy-pulsar.yaml各类服务模板文件zoo.cfg、bookkeeper.conf、broker.conf、proxy.conf、systemd 服务等位于 deployment/terraform-ansible/templates。环境准备与前置要求在开始部署之前需要准备以下内容一个 AWS 账号 以及 AWS 命令行工具awsPython 与 pipterraform-inventory工具它负责把 Terraform 生成的基础设施状态暴露给 Ansible使 Ansible 能直接使用 Terraform 的产物实例清单作为动态 inventory。同时要确保当前已通过aws工具登录 AWS 账号$ aws configureaws configure会引导你输入 Access Key ID、Secret Access Key、默认区域如us-west-2和输出格式配置信息将保存在本机的~/.aws/credentials与~/.aws/config中供后续 Terraform 的 AWS provider 读取使用。安装 Ansible、Terraform 并获取部署配置安装 Ansible在 Linux 或 macOS 上可以通过 pip 直接安装 Ansible$ pip install ansible安装 TerraformTerraform 需要按其官方安装指引进行安装下载二进制包并加入 PATH 即可安装完成后可用terraform version验证。获取 Pulsar 的 Terraform 与 Ansible 配置Pulsar 的 Terraform 与 Ansible 配置已经包含在本仓库中位于deployment/terraform-ansible/aws目录。若从零开始可通过 Git 获取整个 Pulsar 仓库后进入该目录$ git clone https://github.com/apache/pulsar $ cd pulsar/deployment/terraform-ansible/aws当前目录下的核心文件包括文件作用provider.tf声明 AWS provider 及 Terraform 版本要求variables.tf定义全部可配置变量的说明与默认值terraform.tfvars实际生效的变量赋值按需修改instances.tf定义 zookeeper / bookie / broker / proxy 四组 EC2 实例network.tf定义 VPC、子网、路由表、NAT/Internet 网关与 ELBsecurity.tf定义安全组与 SSH 密钥对keys.tf创建 AWS key pair基于本地公钥output.tf输出集群的连接地址service URL 等setup-disk.yaml初始化 bookie 节点磁盘的 Ansible playbookansible.cfgAnsible 默认配置私钥路径、提权方式等SSH 密钥设置为了让 Terraform 创建的 EC2 实例可以被 Ansible 登录管理需要先生成 SSH 密钥。生成新的 SSH 密钥在本地执行$ ssh-keygen -t rsa注意不要输入 passphrase提示时直接按Enter跳过。随后验证密钥已生成$ ls ~/.ssh id_rsa id_rsa.pub生成的~/.ssh/id_rsa私钥与~/.ssh/id_rsa.pub公钥将分别被 Ansible 和 Terraform 使用。复用已有 SSH 密钥如果已有 SSH 密钥可以跳过生成步骤只需在两处配置中指向已有密钥在ansible.cfg中更新private_key_fileprivate_key_file~/.ssh/pulsar_aws在terraform.tfvars中更新public_key_pathpublic_key_path~/.ssh/pulsar_aws.pub例如已有私钥位于~/.ssh/pulsar_aws、公钥位于~/.ssh/pulsar_aws.pub就按上述两个配置项对应填写。当前仓库的 ansible.cfg 与 terraform.tfvars 默认值恰好就是~/.ssh/pulsar_aws与~/.ssh/pulsar_aws.pub可作为参照。使用 Terraform 创建 AWS 资源初始化并应用 Terraform 配置进入deployment/terraform-ansible/aws目录后先初始化所有 Terraform 依赖$ terraform init # 这会在当前目录下创建一个 .terraform 文件夹terraform init会下载 AWS provider 插件并初始化后端。之后应用默认配置$ terraform applyTerraform 会打印将要执行的动作清单并出现如下确认提示Do you want to perform these actions? Terraform will perform the actions described above. Only yes will be accepted to approve. Enter a value:输入yes并回车。应用配置通常需要数分钟创建 EC2 实例、VPC 等资源。完成后会看到Apply complete!及创建的资源数量统计。自定义集群规模与机型terraform.tfvars 变量说明如果不想使用默认配置直接修改 terraform.tfvars 中的变量值即可。可用的变量如下默认值以当前仓库 variables.tf 与terraform.tfvars实际内容为准变量名描述默认值public_key_path已生成公钥的路径~/.ssh/pulsar_aws.pubregionPulsar 集群运行所在的 AWS 区域us-west-2availability_zonePulsar 集群运行所在的可用区us-west-2aaws_ami集群使用的 Amazon Machine ImageAMIami-9fa343e7num_zookeeper_nodesZooKeeper 集群中的节点数3num_bookie_nodes集群中运行的 bookie 数量3num_broker_nodes集群中运行的 Pulsar broker 数量2num_proxy_nodes集群中运行的 Pulsar proxy 数量1base_cidr_block集群网络资产使用的根 CIDR 段10.0.0.0/16instance_typesEC2 实例类型。这是一个 map包含zookeeper、bookie、broker、proxy四个键ZooKeeper 为t3.small、BookKeeper 为i3.4xlarge、Brokers/Proxies 为c5.2xlarge说明官方 2.3.0 文档记录的默认机型为t2.smallZooKeeper、i3.xlargeBookKeeper、c5.2xlargeBroker/Proxy当前仓库的 terraform.tfvars 已更新为t3.small、i3.4xlarge、c5.2xlarge实际部署时以仓库当前配置为准并可根据业务负载调整。从 instances.tf 可以看到四类组件分别由独立的aws_instance资源定义实例数量即由上述num_*_nodes变量控制resource aws_instance zookeeper { ami var.aws_ami instance_type var.instance_types[zookeeper] key_name aws_key_pair.default.id subnet_id aws_subnet.default.id vpc_security_group_ids [aws_security_group.default.id] count var.num_zookeeper_nodes ... }bookie、broker、proxy三组资源的定义模式与之相同仅instance_type与count取值不同实例命名依次为zookeeper-N、bookie-N、broker-N、proxy-N。部署后实际创建的 AWS 资源执行 Ansible playbook 之前Terraform 会创建以下 AWS 资源依据 instances.tf、network.tf 与 security.tf 的源码定义总共 9 台 Elastic Compute CloudEC2实例使用ami-9fa343e7这个运行 Red Hat Enterprise Linux (RHEL) 7.4 的 AMI默认分布为3 台小型 VM 运行 ZooKeepert2.small当前仓库为t3.small3 台较大型 VM 运行 BookKeeper bookiei3.xlarge当前仓库为i3.4xlarge该系列实例自带本地 NVMe SSD2 台较大型 VM 运行 Pulsar brokerc5.2xlarge1 台较大型 VM 运行 Pulsar proxyc5.2xlarge一个 EC2 安全组开放集群内部与对外访问端口一个用于安全隔离的 virtual private cloudVPC一个供外部连接的 API Gateway实际为面向公网的入口网关一个 Pulsar 集群 VPC 的路由表一个 VPC 的子网。从 network.tf 的源码可以看到更完整的网络拓扑VPCaws_vpc、子网aws_subnet启用公网 IP 自动分配、路由表与0.0.0.0/0公网路由、Internet 网关aws_internet_gateway、NAT 网关aws_nat_gateway绑定一个弹性 IP以及经典负载均衡器aws_elb。ELB 将流量分发到proxy实例组并监听两个端口8080HTTPPulsar Web 服务端口6650TCPPulsar 二进制协议服务端口。集群的所有 EC2 实例默认都运行在us-west-2区域。获取 Pulsar 连接地址Service URL执行terraform apply后Terraform 会输出pulsar_service_url其值形如pulsar://pulsar-elb-1800761694.us-west-2.elb.amazonaws.com:6650这个地址就是客户端连接集群的入口ELB 的 DNS 名 6650 端口。任何时刻都可以用以下两种方式重新获取该值$ terraform output pulsar_service_url或者解析terraform.tfstate状态文件虽然是 JSON 格式但文件名没有体现$ cat terraform.tfstate | jq .modules[0].outputs.pulsar_service_url.value根据 output.tf 的定义Terraform 一共输出了 4 个值除pulsar_service_url外还包括dns_nameELB 的 DNS 名、pulsar_web_urlhttp://dns:8080供管理界面/Admin API 使用以及pulsar_ssh_hostproxy 实例的公网 IP用于 SSH 调试。销毁集群在任何时候都可以用 Terraform 的destroy命令销毁与该集群关联的所有 AWS 资源EC2、VPC、安全组、ELB 等避免持续计费$ terraform destroy同样会要求输入yes确认执行完毕后集群资源即被清理。初始化 Bookie 磁盘Setup Disks在运行 Pulsar playbook 之前需要先在 bookie 节点上把磁盘挂载到正确目录。由于不同机型的磁盘布局不同如果修改了 Terraform 配置中的instance_types也要相应更新 setup-disk.yaml 中定义的磁盘任务设备名与挂载点。执行磁盘初始化inventory 直接使用terraform-inventory命令的输出$ ansible-playbook \ --userec2-user \ --inventorywhich terraform-inventory \ setup-disk.yaml该命令只能执行一次。如果在运行过 Pulsar playbook 之后再次执行磁盘可能被重新格式化抹掉数据导致 bookie 无法启动。从 setup-disk.yaml 的源码可以看到它实际做了三件事- name: Set performance profile command: tuned-adm profile latency-performance - name: Format disks filesystem: fstype: xfs dev: {{ item }} with_items: - /dev/nvme0n1 - /dev/nvme1n1 - name: Mount disks mount: path: {{ item.path }} src: {{ item.src }} fstype: xfs opts: defaults,noatime,nodiscard state: mounted with_items: - { path: /mnt/journal, src: /dev/nvme0n1 } - { path: /mnt/storage, src: /dev/nvme1n1 }即切换到latency-performance性能调优 profile把两块 NVMe 盘/dev/nvme0n1、/dev/nvme1n1格式化为 xfs 文件系统分别挂载为journal 盘/mnt/journal对应 BookKeeper 写前日志和ledger 盘/mnt/storage对应 ledger 数据存储挂载参数为defaults,noatime,nodiscard。这也解释了为什么默认选择i3系列实例——其本地 NVMe SSD 恰好对应两个独立磁盘设备满足 BookKeeper 将 journal 与 ledger 分盘、减少随机 I/O 与顺序写竞争的最佳实践。运行 Pulsar playbook 安装集群Terraform 资源创建完成后就可以用 Ansible 在 EC2 实例上安装并启动 Pulsar 了。可选如果希望使用内置 IO 连接器如 Kafka、ElasticSearch、Redis 等可以编辑 deploy-pulsar.yaml 中的Download Pulsar IO packages任务取消注释想使用的连接器。当前仓库的 playbook 默认只启用了kafka连接器其余aerospike、canal、cassandra、debezium-、elastic-search、hdfs2/3、jdbc-、kinesis、mongo、rabbitmq、redis、solr、twitter 等均以注释形式列出按需取消注释即可让 playbook 自动下载对应.nar包到/opt/pulsar/connectors/。执行部署 playbook$ ansible-playbook \ --userec2-user \ --inventorywhich terraform-inventory \ ../deploy-pulsar.yaml如果私钥不在默认位置~/.ssh/id_rsa可以用--private-key参数显式指定$ ansible-playbook \ --userec2-user \ --inventorywhich terraform-inventory \ --private-key~/.ssh/some-non-default-key \ ../deploy-pulsar.yamlplaybook 内部做了什么从源码看部署流水线阅读 deploy-pulsar.yaml 的源码可以还原这套 playbook 的完整执行流水线共分为五个 playPulsar setup所有主机创建/opt/pulsar目录用yum安装wget、java、sysstat、vim通过set_fact把 ZooKeeper 节点列表拼接为host:2181逗号分隔的连接串zookeeper_servers并注入pulsar_service_url、pulsar_web_url从archive.apache.org下载 Pulsar 二进制发行包当前仓库固定版本为2.8.1解压到/opt/pulsar下发 pulsar_env.sh 作为 JVM 内存与 GC 配置模板默认-Xms12g -Xmx12g -XX:MaxDirectMemorySize12g使用 G1GC 并附带 Netty 相关调优参数。Set up ZooKeeperzookeeper 组按 inventory 序号生成myid创建data/zookeeper目录下发 zoo.cfg 为conf/zookeeper.conf、下发myid模板注册zookeeper.servicesystemd 服务并重启在第一个 ZooKeeper 节点上执行集群元数据初始化bin/pulsar initialize-cluster-metadata \ --cluster {{ cluster_name }} \ --zookeeper localhost:2181 \ --configuration-store localhost:2181 \ --web-service-url {{ http_url }} \ --broker-service-url {{ service_url }}该命令在 ZooKeeper 中写入集群元数据cluster、namespace、ledger 根路径等是后续 broker/bookie 启动的前提。 3.Set up bookiesbookie 组下发 bookkeeper.conf 与bookkeeper.service重启 systemd 服务。模板中zkServers{{ zookeeper_servers }}动态注入 ZooKeeper 连接串journal 目录指向data/bookkeeper/journal、ledger 目录指向data/bookkeeper/ledgers对应上一步挂载的/mnt/journal与/mnt/storage并启用autoRecoveryDaemonEnabled、只读模式等生产参数。 4.Set up brokersbroker 组创建connectors目录并下载启用的 IO 连接器下发 broker.conf模板中zookeeperServers、configurationStoreServers注入 ZooKeeper 连接串advertisedAddress注入实例私网 IPclusterName注入集群名下发functions_worker.yml与pulsar.broker.service并重启 broker 服务。 5.Set up Pulsar Proxyproxy 组下发 proxy.conf 与pulsar.proxy.service并重启代理对外提供 6650/8080 端口接入。 6.Hosts addresseslocalhost通过debug任务打印各组实例地址方便核对。可见Ansible 负责的不仅是下载解压还包含 ZooKeeper 元数据初始化、systemd 服务托管与配置模板化渲染——这正是这套方案能够一键拉起整套集群的原因。验证并访问集群部署完成后就可以使用前面获得的 Pulsar 连接 URL 访问集群了。作为快速演示这里使用 Pulsar 官方 Python 客户端配合 Python shell 完成一次消息收发。首先安装 Pulsar Python 模块$ pip install pulsar-client进入 Python shell$ python在 shell 中依次执行 import pulsar client pulsar.Client(pulsar://pulsar-elb-1800761694.us-west-2.elb.amazonaws.com:6650) # 请务必替换为你自己的连接 URL producer client.create_producer(persistent://public/default/test-topic) producer.send(Hello world) client.close()如果上述命令全部执行成功说明 Pulsar 集群对外可用任何兼容的 Pulsar 客户端Java、C、Go、Python 等都可以接入使用。日常管理还可通过pulsar_web_urlhttp://dns:8080调用 Pulsar Admin API 或接入管理界面。总结通过 Terraform Ansible 的组合Pulsar 在 AWS 上的部署被抽象为一条命令建资源、一条命令装集群的标准化流程Terraform 负责 VPC/子网/安全组/ELB/EC2 等基础设施的声明式创建与销毁可随时通过terraform destroy回收Ansible 负责在实例上完成磁盘初始化、二进制分发、配置渲染、ZooKeeper 元数据初始化与 systemd 服务托管。实际使用时只需关注 terraform.tfvars集群规模与机型、setup-disk.yaml磁盘布局和 deploy-pulsar.yamlPulsar 版本与 IO 连接器三处配置即可快速获得一套可复现、可销毁的 Pulsar 集群。赞分享消息队列后端流处理【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址https://gitcode.com/gh_mirrors/pulsar28/pulsar点击查看免费下载相关推荐使用 Terraform 与 Ansible 在 AWS 上部署 Apache Pulsar 集群使用 Terraform 与 Ansible 在 AWS 上部署 Apache Pulsar 集群 本指南讲解如何借助基础设施即代码IaC工具 Terraf消息队列后端流处理使用 Terraform 与 Ansible 在 AWS 上部署 Apache Pulsar 集群使用 Terraform 与 Ansible 在 AWS 上部署 Apache Pulsar 集群 本文是一份基于 Apache Pulsar 官方仓库内 de消息队列后端流处理使用 Helm 在 Kubernetes 上部署 Apache Pulsar 集群使用 Helm 在 Kubernetes 上部署 Apache Pulsar 集群 本文是 Apache Pulsar 官方 Helm 部署指南的完整技术说明消息队列后端流处理上一篇iOS图像处理自动化部署Fastlane与GPUImage的TestFlight发布下一篇Darner性能优化指南如何充分发挥轻量级消息队列的潜力创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表