با افزایش تولید و مصرف دادهها نیاز به سیستمهایی که بتوانند این حجم از دادهها و اطلاعات را ذخیره، مدیریت و پردازش کنند، بیش از پیش احساس میشود. Apache Kafka یکی از قدرتمندترین سیستمهای پیغام رسانی و تبادل داده است که برای پاسخ به این نیازها توسط لینکدین طراحی و به آپاچی اهدا شده است. در واقع این پلتفرم قابلیت انتقال دادهها در زمان واقعی را دارد و این امکان را برای برنامهها فراهم میآورد که به صورت یکپارچه با یکدیگر ارتباط برقرار کنند.
آپاچی کافکا چیست؟
Apache Kafka یک مخزن داده توزیع شدهی منبع باز است که به منظور مدیریت دادههای جریان (stream) بهینه سازی شده است. دادههای جریان به دادههایی اطلاق میشوند که به طور مدام و پیوسته توسط هزاران منبع تولید میشوند. برای مثال، در یک فروشگاه آنلاین، Kafka میتواند دادههای فعالیت کاربران را در لحظه جمعآوری و ذخیره کند، سپس پردازشگرهای مختلف این دادهها را تحلیل کنند تا الگوهای رفتاری، تراکنشهای مشکوک و نظرات مشتریان را شناسایی کنند. کلاستر کافکا بسیار مقیاس پذیر و مقام در برابر خطا است و بازدهی بسیار بالاتری نسبت به پیامرسانهای دیگر مانند ActiveMQ و RabbitMQ دارد. در واقع، کافکا برای مدیریت جریانهای داده از چندین منبع و ارائه آنها به مصرف کنندگان متعدد طراحی شده است. به طور خلاصه، حجم عظیمی از داده را نه فقط از نقطه A به B، بلکه از نقطه A به Z و هر جای دیگری که نیاز دارید، به طور همزمان منتقل می کند.
عملکرد اصلی Kafka
کافکا یک پلتفرم توزیع شده برای انتقال دادهها است که اصلیترین عملکرد آن ارائه سیستمی برای پخش و استفاده از دادهها در زمان واقعی میباشد. در واقع کافکا ارتباطی موثر بین دادههای جریانی و برنامههای کاربردی برقرار میکند تا دادهها را در لحظه از یک سیستم به سیستم دیگر منتقل کند. سرویس کافکا قابلیت انتقال میلیون ها پیام را در ثانیه را دارد و به عنوان یک نقطه مرکزی برای ارسال دادهها عمل میکند. به این ترتیب میتوان گفت کافکا به عنوان یک لایه ارتباطی میان ابزارهای تحلیلی مانند آنالیتیکس، سرچ کنسول و … عمل میکند. به عنوان مثال، با استفاده از سرویس کافکا در یک فروشگاه اینترنتی میتوانید از لاگهای فعالیت کاربران اطلاعات مفیدی درباره میزان بازدید، تاثیر تبلیغات انجام شده، الگوی خرید آنها، نحوه استفاده از وبسایت توسط مشتریان و… را استخراج کنید. وبسایتهایی همچون arget، Microsoft،AirBnB و Netflix برای ارائه تجربیات مبتنی بر داده در زمان واقعی به مشتریان خود، به سرویس کافکا متکی هستند.
کاربرد کافکا
Kafka برای دو نوع برنامه کاربرد دارد:
انتقال دادههای بلادرنگ
سیستم کافکا برای انتقال میلیونها رکورد داده یا رویداد در مقیاس بزرگ و در لحظه بین سیستمهای مختلف در یک سازمان طراحی شده است و دادهها را به صورت قابل اعتماد، بدون خرابی و… منتقل میکند. این قابلیت در مواقعی که باید حجم بالایی از دادها با سرعت بالا منتقل شوند، حائز اهمیت است.
برنامههای بلادرنگ
عملکرد Kafka با استفاده از جریان داده است و در طول روز نیز جریان جدیدی ایجاد میکنند. به عنوان مثال، سایتهای خردهفروشی که بهطور مداوم تعداد موجودی یک محصول را در فروشگاههای مختلف بهروزرسانی میکنند. و یا وبسایتهایی که بر اساس تحلیل رفتار کاربران، توصیهها یا تبلیغات شخصیسازی شده نمایش میدهند. این برنامه به دلیل پردازش در لحظه، امکان ارائه اطلاعات به روز و دقیق را فراهم میکند.
موارد استفاده از Apache Kafka
Apache Kafka به عنوان یک ابزار بسیار قوی برای مدیریت و پردازش دادهها در زمان واقعی شناخته میشود و مناسب برای برنامههایی است که نیاز به :
- توانایی پارتیشنبندی بارهای کاری پیامرسانی با تغییر نیازهای برنامه
- تبادل داده قابل اعتماد بین اجزای مختلف
- استریم بلادرنگ برای پردازش دادهها
- پشتیبانی بومی از بازپخش داده/پیام
پیش نیازهای نصب آپاچی کافکا در اوبونتو
برای نصب Apache Kafka در Ubuntu به موارد زیر نیاز دارید تا نصب کافکا را شروع کنید.
- یک سرور مجازی اوبونتو با حداقل 4 گیگابایت حافظه RAM و یک کاربر non-root با دسترسی sudo
توجه داشته باشید : نصب Kafka در سرورهایی با حافظه کمتر از 4 گیگابایت ممکن است باعث بروز مشکلات و خطاها در سرویس Kafka شود.
- نصب OpenJDK 11 در سرور ابری زیرا Kafka با زبان جاوا نوشته شده است، بنابراین نیاز به JVM دارد.
ایجاد کاربر برای کافکا
اولین قدم برای نصب آپاچی کافکا در اوبونتو ایجاد یک کاربر اختصاصی برای این سرویس است تا از این طریق بتواند درخواستها را از طریق شبکه انجام دهد. این عمل، در صورتی که شخصی سرور کافکا را مورد حمله قرار دهد، حداقل آسیب را به سیستم شما میرساند.
برای ایجاد کاربر اختصاصی کافکا، ابتدا، به عنوان کاربر sudo غیر روت وارد سرور خود شوید و با وارد کردن دستور زیر، کاربری به نام کافکا ایجاد کنید:
sudo adduser kafka
برای تنظیم رمز عبور و ایجاد کاربر کافکا، دستورات را دنبال کنید.
سپس کاربر kafka را با استفاده از دستور adduser به گروه sudo اضافه کنید. این دسترسیها به شما امکان نصب وابستگیهای Kafka را فراهم میکند.
sudo adduser kafka sudo
کاربر کافکا شما آماده است. اکنون میتوانید با استفاده از su وارد حساب کافکا شوید:
su -l kafka
حال که یک کاربر اختصاصی برای کافکا ایجاد کردهاید، میتوانید باینریهای کافکا را استخراج و دانلود کنید.
دانلود و استخراج باینریهای کافکا
در این بخش با اجرای دستورات میتوانید باینریهای کافکا را دانلود و پوشههای اختصاصی در فهرست اصلی کاربر را کافکا استخراج کنید
برای شروع، با اجرای دستور زیر یک دایرکتوری در /home/kafka به نام Downloads ایجاد کنید تا دانلودهای شما ذخیره شود.
mkdir ~/Downloads
برای دانلود باینریهای کافکا از دستور curl استفاده کنید:
curl "https://downloads.apache.org/kafka/2.8.2/kafka_2.13-2.8.2.tgz" -o ~/Downloads/kafka.tgz
با اجرای دستور زیر یک دایرکتوری به نام کافکا ایجاد کنید و به این دایرکتوری بروید. میتوانید از این دایرکتوری به عنوان دایرکتوری پایه برای نصب کافکا استفاده کنید:
mkdir ~/kafka && cd ~/kafka
اکنون با اجرای دستور tar، بایگانی دانلود شده استخراج کنید:
tar -xvzf ~/Downloads/kafka.tgz --strip 1
نحوه پیکربندی سرور کافکا
در کافکا Topic یک دسته و گروهی است که به پیامها اختصاص داده میشود و مشخص میکند که پیامهای ارسالی به چه موضوعی تعلق دارند. با این حال، تنظیمات پیشفرض Kafka اجازه حذف یک موضوع را نمیدهد و لازم است برای اصلاح این مورد فایل پیکربندی را ویرایش کنید.
برای پیکربندی Kafka فایل server.properties را با استفاده از ویرایشگر nano یا ویرایشگر مورد علاقهتان باز کنید و دستور زیر را اجرا کنید.
nano ~/kafka/config/server.properties
اکنون با اجرای دستور زیر میتوانید تنظیماتی را اضافه کنید که به واسطه آن بتوانید Topic را حذف کنید. برای انجام این کار دستور زیر را به انتهای فایل خود اضافه کنید.
~/kafka/config/server.properties
delete.topic.enable = true
سپس با تغییر ویژگی log.dirs، میتوانید دایرکتوری را که لاگهای کافکا در آن ذخیره میشوند، تغییر دهید. برای انجام این کار، ویژگی log.dirs را پیدا کرده و مسیر فعلی آن را با مسیر مشخص شده تغییر دهید.
~/kafka/config/server.properties
log.dirs=/home/kafka/logs
پس از انجام تغییرات، ذخیره کنید و فایل را ببندید.
اکنون که Kafka را پیکربندی کردهاید، میتوانید فایلهای systemd را برای اجرا و فعالسازی سرور Kafka در زمان راهاندازی ایجاد کنید.
ایجاد فایلهای systemd و راه اندازی سرور کافکا
در این بخش، با اجرای دستورات میتوانید فایلهای systemd را برای سرویس کافکا ایجاد کنید. این فایلها به شما کمک میکنند تا عملیات رایج سرویس مانند راهاندازی، توقف، و راهاندازی مجدد کافکا را به روشی مطابق با سایر سرویسهای لینوکس انجام دهید.
کافکا از Zookeeper برای مدیریت وضعیت کلاستر و تنظیمات خود استفاده میکند. ZooKeeper یک سامانه متن باز برای مدیریت و سازماندهی سیستمهای توزیعشده است که از Apache Software Foundation پشتیبانی میکند و برای ایجاد و نگهداری اطلاعات پویا و هماهنگی بین اجزای مختلف یک سیستم توزیعشده مورد استفاده قرار میگیرد. با این فایلهای واحد میتوانید Zookeeper را به عنوان یک سرویس در نظر بگیرید. برای ایجاد فایل واحد برای zookeeper دستور زیر را اجرا کنید:
sudo nano /etc/systemd/system/zookeeper.service
تعریف unit زیر را در فایل وارد کنید:
/etc/systemd/system/zookeeper.service
[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target
[Service]
Type=simple
User=kafka
ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
بخش (Unit) مشخص میکند که Zookeeper نیازمند فعال بودن شبکه و فایلسیستم است تا بتواند شروع شود.
بخش (Service) مشخص میکند که systemd باید از فایلهای shell zookeeper-server-start.sh و zookeeper-server-stop.sh برای شروع و توقف سرویس استفاده کند. همچنین، مشخص میشود که در صورت خروج ناگهانی از Zookeeper، باید دوباره آن را راهاندازی کند.
بعد از اضافه کردن این محتوا، فایل را ذخیره کرده و ببندید.
سپس، فایل سرویس systemd برای kafka را ایجاد کنید.
sudo nano /etc/systemd/system/kafka.service
تعریف Unit زیر را در فایل وارد کنید:
/etc/systemd/system/kafka.service
[Unit]
Requires=zookeeper.service
After=zookeeper.service
[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties > /home/kafka/kafka/kafka.log 2>&1'
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
بخش (Unit) مشخص میکند که این فایل وابسته به سرویس zookeeper.service است، و با راهاندازی سرویس زوکیپر به صورت خودکار شروع خواهد شد.
بخش (Service) مشخص میکند که systemd برای شروع و توقف سرویس از فایلهای شل kafka-server-start.sh و kafka-server-stop.sh استفاده کند. همچنین، تعیین شده است که کافکا باید در صورت خروج ناگهانی دوباره راهاندازی شود.
پس از ذخیره و بستن فایل، با استفاده از دستور زیر کافکا را با دستور زیر راهاندازی کنید.
sudo systemctl start kafka
برای اطمینان از اینکه سرور با موفقیت راه اندازی شده است، لاگهای ژورنال مربوط به Unit کافکا را بررسی کنید. به این ترتیب، میتوانید مطمئن شوید که کافکا بهطور صحیح اجرا شده است و هیچ مشکلی در آن به وجود نیامده است.
sudo systemctl status kafka
خروجی را به صورت زیر دریافت خواهید کرد:
Output
● kafka.service
Loaded: loaded (/etc/systemd/system/kafka.service; disabled; vendor preset>
Active: active (running) since Wed 2023-02-01 23:44:12 UTC; 4s ago
Main PID: 17770 (sh)
Tasks: 69 (limit: 4677)
Memory: 321.9M
CGroup: /system.slice/kafka.service
├─17770 /bin/sh -c /home/kafka/kafka/bin/kafka-server-start.sh /ho>
└─17793 java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMill>
با مشاهده این خروجی میتوان فهمید شما یک سرور کافکا دارید که بر روی پورت 9092 اجرا میشود، این پورت، پورت پیش فرضی است که سرور کافکا از آن استفاده میکند.
شما سرویس کافکا را راهاندازی کردهاید، اما اگر سرور خود را مجدداً راهاندازی کنید، کافکا بهطور خودکار دوباره راهاندازی نمیشود. برای فعالسازی خودکار سرویس کافکا هنگام بوت سرور، دستور زیر را اجرا کنید:
sudo systemctl enable zookeeper
شما پاسخی دریافت خواهید کرد که یک symlink ایجاد شده است.
Output
Created symlink /etc/systemd/system/multi-user.target.wants/zookeeper.service → /etc/systemd/system/zookeeper.service
سپس این دستور را اجرا کنید:
sudo systemctl enable kafka
با اجرای این دستور شما پاسخی دریافت خواهید کرد که یک symlink ایجاد شده است.
Output
Created symlink /etc/systemd/system/multi-user.target.wants/kafka.service → /etc/systemd/system/kafka.service.
در این مرحله، به نصب و راهاندازی سرویسهای kafka و zookeeper پرداختیم. در مرحله بعدی، به بررسی مراحل نصب Kafka خواهیم پرداخت.
تست نصب کافکا
در این مرحله به تست و آزمایش نصب kafka خواهیم پرداخت. شما برای اطمینان از عملکرد صحیح سرور کافکا، یک پیام ساده به نام “Hello World” را به سرور کافکا ارسال کرده و سپس همان پیام را از سرور دریافت میکنید. این فرآیند به شما کمک میکند تا مطمئن شوید که سرور کافکا پیامها را به درستی ارسال و دریافت میکند.
برای ارسال و دریافت پیامها در کافکا، به دو بخش نیاز داریم:
- تولید کننده (Producer): این بخش امکان انتشار سوابق و داده ها را برای Topics فراهم میکند.
- مصرف کننده (Consumer): این پیامها و دادهها را از Topics دریافت میکند.
برای شروع، یک موضوع به نام TutorialTopic ایجاد کنید.
~/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TutorialTopic
میتوانید با استفاده از اسکریپت kafka-console-producer.sh یک تولیدکننده (Producer) برای کافکا ایجاد کنید. این اسکریپت به hostname سرور کافکا، پورت و موضوع (Topic) به عنوان ورودی نیاز دارد.
پس از اجرای این دستور، پاسخی دریافت خواهید کرد که نشان میدهد Topic با موفقیت ایجاد شده است.
Output
Created topic TutorialTopic
پیام “Hello, World” را به موضوع TutorialTopic در سیستم Kafka ارسال کنید.
echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null
سپس با استفاده از اسکریپت kafka-console-consumer.sh یک مصرف کننده کافکا ایجاد کنید. برای اجرای این اسکریپت، باید hostname و پورت سرور ZooKeeper را همراه با نام Topic به عنوان ورودی دهید. این دستور پیامها را از موضوع TutorialTopic مصرف میکند. توجه کنید که از فلگ –from-beginning استفاده میشود تا بتوان پیامهایی که قبل از شروع مصرفکننده منتشر شدهاند را نیز مصرف کرد.
~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TutorialTopic --from-beginning
اگر مشکلی در پیکربندی وجود نداشته باشد، پاسخ Hello, World را در خروجی ترمینال خود دریافت خواهید کرد.
Output
Hello, World
اکنون اسکریپت مصرفکننده Kafka در حالت اجرا منتظر انتشار پیامهای جدید بر روی موضوع میماند. برای آزمایش این ویژگی، باید یک پنجره ترمینال جدید باز کنید و به سرور خود وارد شوید. همچنین، به یاد داشته باشید که برای ورود به سرور، از حساب کاربری kafka استفاده کنید.
su -l kafka
در این ترمینال جدید، یک تولید کننده (producer ) را برای انتشار پیام دوم راه اندازی کنید.
echo "Hello World from Sammy at DigitalOcean!" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null
این پیام در خروجی مصرف کننده (consumer) در ترمینال اصلی شما بارگیری میشود.
Output
Hello, World
Hello World from Sammy at asiatech.cloud!
پس از اتمام آزمایش، CTRL+C را فشار دهید تا اسکریپت مصرف کننده (consumer) در ترمینال اصلی شما متوقف شود، زیرا نیازی به ادامه اجرای مصرف کننده ندارید. اکنون یک سرور کافکا در اوبونتو نصب و پیکربندی شده است. مراحل بعد را برای تقویت امنیت سرور کافکا انجام دهید.
افزایش امنیت سرور کافکا
با تکمیل نصب، میتوانید امتیازهای مدیریتی کاربر kafka را حذف و سرور Kafka را از نظر امنیتی تقویت کنید. قبل از انجام این کار، از حساب کاربری خود خارج شده و با حساب دیگری که دسترسی sudo دارد وارد سیستم شوید. اگر هنوز در همان session خط فرمانی که با آن این آموزش را شروع کردهاید، هستید، دستور exit را وارد کنید. کاربر kafka را از گروه sudo حذف کنید.
sudo deluser kafka sudo
برای بهبود امنیت سرور Kafka، میتوانید از دستور passwd استفاده کنید تا رمز عبور کاربر kafka را قفل کنید. این عمل تضمین می کند که هیچ کس نمی تواند مستقیماً با استفاده از این حساب وارد سرور شود.
sudo passwd kafka -l
فلگ -l فرمان تغییر رمز عبور کاربر (passwd) را قفل می کند.
در این مرحله، فقط کاربر root یا sudo می تواند با دستور زیر به عنوان کاربر kafka وارد شود.
sudo su - kafka
همچنین برای باز کردن قابلیت تغییر رمز عبور، از passwd با گزینه -u استفاده کنید.
sudo passwd kafka -u
اکنون Apache Kafka به صورت ایمن بر روی سرور ابری لینوکسی با توزیع Ubuntu در حال اجرا است. شما میتوانید Kafka را با استفاده از کلاینتهای Kafka به زبان برنامهنویسی مورد علاقه خود ادغام کنید. سازمانها با استقرار آپاچی کافکا در سرور ابری خود میتوانند به بهبود عملکرد سیستمهای خود و ایجاد بسترهای پردازش دادههای پیچیده و بزرگ بپردازند و در تصمیمگیریهای تجاری موثر باشد.
سوالات متداول
1- آیا Apache Kafka دیتابیس است؟
خیر، Apache Kafka یک سیستم پیامرسانی توزیعشده است و به عنوان یک پایگاه داده استفاده نمیشود.
2- آیا آپاچی کافکا از زبانهای برنامهنویسی مختلف پشتیبانی میکند؟
بله، این سیستم از کتابخانههای مختلفی برای زبانهای برنامهنویسی مختلف از جمله Java، Python، Go، و C++ پشتیبانی دارد.
3- آیا Apache Kafka برای استفاده در پروژههای کوچک مناسب است؟
بله، آپاچی کافکا برای پروژههای کوچک نیز مناسب است.