آپاچی کافکا یک پلتفرم event streaming به صورت توزیع شده است که توسط هزاران شرکت برای pipelines های داده با عملکرد بالا، تجزیه و تحلیل به صورت streaming، یکپارچه سازی داده ها و برنامه های کاربردی حیاتی یا mission-critical applications استفاده می شود.
مفهوم KRaft یا Kafka Raft، پروتکل اجماعی یا consensus protocol است که در Kafka برای حذف وابستگی به ZooKeeper برای مدیریت metadata معرفی شده است. این تغییر باعث سادهسازی معماری Kafka شده و مسئولیت مدیریت metadata را به خود Kafka میسپارد.
در این مقاله قصد دارم به نحوه استقرار و اجرا آن با استفاده از Docker بپردازم.
جهت بررسی آن به دنبال فایلی برای Docker Compose میگشتم که به من امکان اجرای Kafka در حالت Kraft را بدهد. اما متاسفانه، تمام دستورالعملهایی که پیدا کردم شامل انجام چندین مرحله بودند، از جمله ایجاد یک cluster ID، فرمت کردن log ها، و در نهایت راهاندازی container ها.
آیا امکان اجرای Kafka در حالت Kraft با تنها یکبار اجرای Docker Compose وجود دارد؟
زمانی که Kafka را بدون Zookeeper اجرا میکنیم، باید موارد زیر را مشخص کنیم:
process.roles
- میتواند broker يا controller یا هر دو باشد.controller.quorum.voters
- آدرسهایی به فرمت nodeid@servername:port
است که جهت اجماع (consensus) رأی میدهند. این تنظیم جایگزین تنظیم قدیمیzookeeper.connect
میشود.node.id
- همان node ID مرتبط با role هایی است که process ایفا میکند.قبل از شروع، clusterId
باید تولید شود و storage باید با یک ابزار خاص فرمت شود.
برای تولید uuid می توانیم از اسکریپت زیر استفاده کنیم:
kafka-storage.sh random-uuid
و command جهت format کردن به صورت زیر است:
kafka-storage.sh format
شناسه خوشه یا cluster ID باید فقط یک بار تولید شود و بین همه container ها به اشتراک گذاشته شود. علاوه بر این، از همان cluster ID باید برای format کردن log ها استفاده شود.
لذا Docker Compose ما شامل چهار container خواهد بود که سه container اول به عنوان broker های Kafka عمل می کنند. هر یک از این broker ها دو نقش broker و controller را به طور همزمان بر عهده خواهند گرفت. container چهارم، cluster ID را در یک فایل تولید می کند و سپس خارج می شود.
این container برای broker به شکل زیر است:
kafka1:
image: confluentinc/cp-kafka:7.3.3
hostname: kafka1
container_name: kafka1
ports:
- "39092:39092"
environment:
KAFKA_LISTENERS: BROKER://kafka1:19092,EXTERNAL://kafka1:39092,CONTROLLER://kafka1:9093
KAFKA_ADVERTISED_LISTENERS: BROKER://kafka1:19092,EXTERNAL://kafka1:39092
KAFKA_INTER_BROKER_LISTENER_NAME: BROKER
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,BROKER:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_PROCESS_ROLES: 'controller,broker'
KAFKA_NODE_ID: 1
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka1:9093,2@kafka2:9093,3@kafka3:9093'
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
volumes:
- ./scripts/update_run.sh:/tmp/update_run.sh
- ./clusterID:/tmp/clusterID
command: "bash -c '/tmp/update_run.sh && /etc/confluent/docker/run'"
این container دارای دو volume است:
اول: clusterID - این همان دایرکتوری است که clusterID در آن تولید می شود.
دوم: update_run.sh - اسکریپتی است که منتظر می ماند تا clusterID در دسترس باشد و سپس فرآیند format کردن را اجرا می کند.
در قسمت زير conainer برای تولید id مشخص شده است:
kafka-gen:
image: confluentinc/cp-kafka:7.3.3
hostname: kafka-gen
container_name: kafka-gen
volumes:
- ./scripts/create_cluster_id.sh:/tmp/create_cluster_id.sh
- ./clusterID:/tmp/clusterID
command: "bash -c '/tmp/create_cluster_id.sh'"
این conainer به سادگی بررسی می کند که آیا cluster ID از قبل موجود است یا خیر. اگر موجود نباشد، یک مورد جدید ایجاد می کند.
فایل compose نهایی را می توانید از اینجا ببینید.
یکی از ساده ترین راه های آن استفاده از docker.arvancloud.ir است. می توانید آن را پشت هر آدرس image قرار دهید تا با سرعت بالا image ها را دریافت نمایید.
یعنی:
image: docker.arvancloud.ir/confluentinc/cp-kafka:7.3.3
برای اتصال تنها کافی است در تنظيمات kafka برای EXTERNAL در KAFKA_ADVERTISED_LISTENERS مقدار localhost را قرار دهید.
به عنوان مثال برای container کافکا اولی:
KAFKA_ADVERTISED_LISTENERS: BROKER://kafka1:19092,EXTERNAL://localhost:39092
باتشکر از
https://kafka.apache.org/
https://docs.confluent.io/platform/current/kafka-metadata/kraft.html
https://github.com/katyagorshkova/kafka-kraft
https://medium.com/@katyagorshkova/docker-compose-for-running-kafka-in-kraft-mode-20c535c48b1a
https://www.arvancloud.ir/fa/dev/docker
https://www.kafkatool.com/index.html