راهنمای نصب آپاچی کافکا (Apache Kafka) روی CentOS 7 – به زبان ساده
آپاچی کافکا یک کارگزار پیام (message broker) توزیع یافته است که برای مدیریت کارآمد حجمهای بالایی از دادههای همزمان طراحی شده است. یک کلاستر کافکا نه تنها مقیاسپذیری بالایی دارد و در برابر خطا بسیار مقاوم است؛ بلکه در مقایسه با دیگر کارگزاران پیام مانند ActiveMQ و RabbitMQ خروجی بسیار بالاتری نیز دارد. با این که از کافکا به طور عمده برای سیستم پیامرسانی انتشار/ثبت نام استفاده میشود؛ اما بسیاری از سازمانها از آن برای تجمیع log ها نیز استفاده میکنند، زیرا امکان ذخیرهسازی دائمی پیامهای انتشار یافته را فراهم میکند.
یک سیستم پیامرسانی انتشار/ثبت نام به یک یا چند تولیدکننده امکان انتشار پیامهایی را بدون در نظر گرفتن تعداد مصرفکنندگان یا این که پیامها را چگونه پردازش میکنند، میدهد. این سیستم نسبت به سیستمهایی که در آنها کلاینتها به طور دورهای بررسی میکنند، آیا پیام جدیدی وجود دارد یا نه، مقیاسپذیری بالاتری دارد. در این راهنما آپاچی کافکا نسخه 1.1.0 را روی سیستم عامل Centos 7 نصب خواهیم کرد.
پیشنیازها
در ادامه به موارد زیر نیاز خواهیم داشت:
- یک سرور سنتوس نسخه 7 و یک کاربر غیر root با دسترسیهای sudo.
- دست کم 4 گیگابایت RAM روی سرور باید وجود داشته باشد. نصب کافکا بدون وجود این مقدار از رم موجب از کار افتادن سرویس میشود و ماشین مجازی جاوا (JVM) خطای «Out of Memory» را در طی نصب اعلام میکند.
- OpenJDK 8 باید روی سرور نصب باشد. کافکا به زبان جاوا نوشته شده است و از این رو به JVM نیاز دارد. با این حال در شل اسکریپت برای راهاندازی اولیه، یک باگ شناخته شده وجود دارد که موجب عدم موفقیت آغاز به کار نسخههای JVM بالاتر از 8 میشود.
مرحله 1: ایجاد یک کاربر کافکا
از آنجا که کافکا میتواند بر روی یک شبکه به مدیریت درخواستها بپردازد، باید یک کاربر اختصاصی برای آن ایجاد کنیم. این وضعیت باعث میشود کمترین آسیب به سیستم سنتوس وارد شود. در این راهنما یک کاربر اختصاصی برای کافکا ایجاد میکنیم؛ اما شما باید یک کاربر غیر root متفاوت ایجاد کنید تا زمانی که کار راهاندازی کافکا به پایان رسید، وظایف دیگری را روی سرور اجرا نمایید.
وقتی با کاربری غیر root با مجوز sudo وارد سرور شده باشید، با دستور useradd میتوانید یک کاربر به نام kafka به سرور اضافه کنید:
sudo useradd kafka -m
فلگ m- تضمین میکند که دایرکتوری home برای این کاربر ایجاد خواهد شد. دایرکتوری home یعنی /home/kafka به عنوان دایرکتوری کاری برای اجرای دستورها در بخشهای بعدی عمل خواهد کرد. با استفاده از دستور passwd یک رمز عبور تخصیص دهید:
sudo passwd kafka
کاربر kafka را با دستور adduser به گروه wheel اضافه کنید تا مجوزهای لازم برای نصب وابستگیهای کافکا را داشته باشد:
sudo usermod -aG wheel kafka
کاربر kafka اینک آماده شده است. با استفاده از دستور su وارد حساب خود شوید:
su -l kafka
اینک که کاربر خاص کافکا را ایجاد کردیم، میتوانیم کار خود را ادامه داده و فایلهای باینری کافکا را دانلود و اجرا کنیم.
مرحله 2: دانلود و اجرای باینریهای کافکا
باینریهای کافکا را در پوشههای اختصاصی در دایرکتوری home کافکا دانلود میکنیم. برای شروع، یک دایرکتوری در مسیر home/kafka/ به نام Downloads ایجاد کنید تا فایلهای دانلود شده را در آن ذخیره کنید:
mkdir ~/Downloads
از curl برای دانلود باینریهای کافکا استفاده کنید:
curl "http://www-eu.apache.org/dist/kafka/1.1.0/kafka_2.12-1.1.0.tgz" -o ~/Downloads/kafka.tgz
یک دایرکتوری به نام kafka ایجاد کرده و این دایرکتوری را تغییر دهید. این همان دایرکتوری پایه نصب کافکا خواهد بود:
mkdir ~/kafka && cd ~/kafka
فایل آرشیو را که دانلود کردهاید با استفاده از دستور tar استخراج کنید:
tar -xvzf ~/Downloads/kafka.tgz --strip 1
فلگ strip 1-- را برای تضمین این که محتوای آرشیو در خود مسیر /kafka/~ استخراج شده است و نه در دایرکتوری دیگر (برای مثال /kafka/kafka_2.12-1.1.0/~) استفاده کنید.
اینک که باینریها را با موفقیت دانلود و استخراج کردیم، میتوانیم به پیکربندی کافکا برای ایجاد امکان حذف تاپیک بپردازیم.
مرحله 3: پیکربندی سرور کافکا
رفتار پیشفرض کافکا به ما امکان حذف یک تاپیک، دسته، گروه یا فید که پیامها در آن منتشر میشوند را نمیدهد. برای اصلاح این وضعیت باید فایل پیکربندی را ویرایش کنیم.
گزینههای پیکربندی کافکا در فایل server.properties تعیین شدهاند. این فایل را با دستور vi یا ویرایشگر متنی مورد نظر خودتان باز کنید:
vi ~/kafka/config/server.properties
یک مقدار به این فایل اضافه میکنیم تا امکان حذف تاپیک های کافکا را پیدا کنیم. دکمه i را برای درج متن میزنیم و خط زیر را به فایل اضافه میکنیم:
delete.topic.enable = true
وقتی که کار ویرایش تمام شد با زدن دکمه ESC میتوانیم از حالت درج خارج شویم و wq: امکان نوشتن تغییرات در فایل و خروج از آن را فراهم میکند. اینک که کافکا را پیکربندی کردیم، میتوانیم اقدام به ایجاد فایلهای واحد systemd کنیم تا امکان اجرای کافکا در زمان شروع به کار سرور ایجاد شود.
مرحله 4: ایجاد فایلهای واحد systemd و آغاز کردن سرور کافکا
در این بخش فایلهای واحد systemd را برای سرویس کافکا ایجاد میکنیم. این وضعیت به ما کمک میکند تا اقدامات رایج سرویس مانند آغاز به کار، متوقف کردن و راهاندازی مجدد را برای کافکا به همان ترتیبی که برای سرویسهای دیگر لینوکس انجام میدهیم، اجرا نماییم.
Zookeeper سرویسی است که کافکا برای مدیریت وضعیت کلاستر و پیکربندیهای آن استفاده میکند. این سرویس به طور رایج برای بسیاری از سیستمهای توزیع یافته به عنوان یک جزء یکپارچه مورد استفاده قرار میگیرد. اگر بخواهید در این مورد اطلاعات بیشتری کسب کنید، میتوانید به مستندات Zookeeper مراجعه کنید. در ادامه فایل واحد را برای Zookeeper ایجاد میکنیم:
sudo vi /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 باید از فایلهای پوسته zookeeper-server-start.sh و zookeeper-server-stop.sh برای آغاز و توقف سرویس استفاده کند. همچنین تعیین میکند زمانی که Zookeeper به طور نامعمولی متوقف شده، باید به طور خودکار مجدداً آغاز به کار کند. سپس فایل سرویس systemd را برای kafka ایجاد میکنیم:
sudo vi /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 وابسته است. این امر تضمین میکند که zookeeper وقتی سرویس kafka آغاز به کار کرد، به طور خودکار شروع میشود.
اینک که واحدها تعریف شدند میتوانیم kafka را با دستور زیر آغاز کنیم:
sudo systemctl start kafka
برای تضمین این که سرور با موفقیت آغاز به کار کرده یا نه میتوانیم لاگهای ژورنال را برای واحد kafka بررسی کنیم:
journalctl -u kafka
در این لحظه یک خروجی شبیه زیر خواهید داشت:
Output Jul 17 18:38:59 kafka-centos systemd[1]: Started kafka.service.
اینک مطمئن هستیم که سرور کافکا روی پورت 9092 مشغول گوش دادن است. با این که سرویس kafka آغاز به کار کرده است؛ اما اگر سرور خود را ریبوت کنیم، این سرویس به طور خودکار آغاز نخواهد شد. برای فعالسازی kafka در زمان بوت شدن سرور دستور زیر را اجرا کنید:
sudo systemctl enable kafka
اینک که سرویس را آغاز و فعال کردهایم میتوانیم به بررسی وضعیت نصب بپردازیم.
مرحله 5: تست کردن نصب
در این بخش یک پیام «Hello World» را انتشار داده و مصرف میکنیم تا مطمئن شویم که سرور کافکا به طور صحیحی عمل میکند. انتشار پیامها در کافکا نیازمند موارد زیر است:
- یک تولیدکننده (producer) که امکان انتشار رکوردها و دادهها را در تاپیک ها فراهم میسازد.
- یک مصرفکننده (consumer) که پیامها و دادهها را از تاپیکها میخواند.
ابتدا با استفاده از دستور زیر یک تاپیک با نام TutorialTopic ایجاد میکنیم:
~/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TutorialTopic
شما میتوانید در خط فرمان یک تولیدکننده با استفاده از اسکریپت kafka-console-producer.sh ایجاد کنید. این اسکریپت به نام میزبان کافکا، شماره پورت و یک نام تاپیک به عنوان آرگومان نیاز دارد. با وارد کردن دستور زیر پیام "Hello, World" را در تاپیک TutorialTopic منتشر میکنیم.
echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null
سپس میتوانید مصرفکننده کافکا را با استفاده از اسکریپت kafka-console-consumer.sh ایجاد کنید و این مصرفکننده نام میزبان سرور ZooKeeper، شماره پورت و نام تاپیک را به عنوان آرگومان میپذیرد. دستور زیر پیامها را از تاپیک TutorialTopic مصرف میکند. توجه کنید که استفاده از فلگ --from-beginning به ما امکان میدهد که پیامهایی را مصرف کنیم که پیش از مصرفکننده ارسال شدهاند:
~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TutorialTopic --from-beginning
اگر مشکلی در پیکربندی وجود نداشته باشد باید پیام Hello, World را در ترمینال ببینید:
Output Hello, World
این اسکریپت به اجرای خود ادامه میدهد و منتظر پیامهایی که در تاپیک منتشر میشوند، میماند. میتوانید یک ترمینال جدید باز کنید و با استفاده از تولیدکننده پیامهای بیشتری را منتشر کنید. میتوانید همه آنها را در خروجی مصرفکننده ببینید.
زمانی که کار تست خود را به پایان بردید دکمه CTRL+C را بزنید تا اسکریپت متوقف شود. اینک که نصب را تست کردیم میتوانیم به نصب KafkaT بپردازیم.
مرحله 6: نصب KafkaT (اختیاری)
KafkaT یک ابزار است که از سوی Airbnb منتشر شده تا مشاهده جزئیات در مورد کلاستر کافکا و اجرای وظایف مدیریتی خاص را در خط فرمان تسهیل کند. از آنجا که این بسته بر روی Ruby کار میکند برای استفاده از آن باید روبی را روی سیستم نصب داشته باشید. همچنین باید بستههای ruby-devel و بستههای مرتبط با build مانند make و gcc را نیز داشته باشید تا بتوانید بستههای دیگر که به آن وابسته است را بسازید. آنها را با استفاده از دستور yum نصب کنید:
sudo yum install ruby ruby-devel make gcc patch
اینک میتوانید KafkaT را با استفاده از دستور gem نصب کنید:
sudo gem install kafkat
KafkaT از kafkatcfg. به عنوان فایل پیکربندی برای تعیین دایرکتوریهای نصب و لاگ سرور کافکا استفاده میکند. همچنین این فایل باید مدخلی برای هدایت KafkaT به وهلههای ZooKeeper داشته باشد.
یک فایل جدید به نام kafkatcfg. ایجاد میکنیم:
vi ~/.kafkatcfg
خطوط زیر را به فایل اضافه کنید تا اطلاعات مورد نیاز در مورد سرور کافکا در وهله Zookeeper تعیین شوند:
{ "kafka_path": "~/kafka", "log_path": "/tmp/kafka-logs", "zk_path": "localhost:2181" }
اینک آماده هستید که از KafkaT استفاده کنید. برای شروع میتوانید به روش زیر از آن برای مشاهده جزییاتی در مورد همه پارتیشنهای کافکا استفاده کنید:
kafkat partitions
خروجی زیر را خواهید دید:
Output Topic Partition Leader Replicas ISRs TutorialTopic 0 0 [0] [0] __consumer_offsets 0 0 [0] [0] ... ...
در این جا TutorialTopic, و همچنین consumer_offsets__ را به عنوان تاپیک های داخلی مورد استفاده کافکا برای ذخیرهسازی اطلاعات مرتبط با کلاینت میبینید. میتوانید تعیین کنید که مواردی که با consumer_offsets__ آغاز میشوند، نادیده گرفته شوند. برای یادگیری بیشتر در مورد KafkaT میتوانید به ریپازیتوری گیتهاب آن مراجعه کنید.
مرحله 7: راهاندازی یک کلاستر چند گرهی (اختیاری)
اگر بخواهید یک کلاستر چند کارگزاری با استفاده از سرورهای سنتوس 7 ایجاد کنید، باید مرحله 1، مرحله 4 و مرحله 5 را برای هر سرور جدید تکرار کنید. به علاوه باید تغییرات زیر را برای هر کدام از سرورهای جدید در فایل server.properties تغییر دهید:
- مقدار مشخصه broker.id باید چنان تغییر یابد که در سراسر کلاستر منحصر به فرد باشد. این مشخصه به طور منحصر به فردی هر سرور را در کلاستر معرفی میکند و میتواند هر رشتهای را به عنوان مقدار داشته باشد. برای نمونه «server1»، «server2» و غیره.
- مقدار مشخصه zookeeper.connect باید چنان تغییر یابد که همه گرهها به یک وهله از همان ZooKeeper اشاره کنند و این مشخصه، آدرس وهله ZooKeeper را تعیین میکند و از فرمت <HOSTNAME/IP_ADDRESS>:<PORT> پیروی میکند. برای نمونه «203.0.113.0:2181»، «203.0.113.1:2181» و غیره.
اگر بخواهید وهلههای متعددی از ZooKeeper برای کلاستر خود داشته باشید، مقدار مشخصه zookeeper.connect روی هر گره باید یکسان باشد و رشتهای باشد که با کاما از هم جدا شده و فهرستی از آدرسهای IP و شماره پورتها برای همه وهلههای ZooKeeper ارائه میکند.
مرحله 8: محدودسازی کاربر کافکا
اینک که همه کارهای نصب پایان یافته است، میتوانید دسترسیهای مدیریتی کاربر کافکا را حذف کنید. پیش از انجام این کار باید از حساب کاربر خارج شوید و دوباره مانند هر کاربر sudo غیر root دیگر وارد آن شوید. اگر همچنان از همان جلسه shell استفاده میکنید که در آغاز این راهنما باز کردهاید، کافی است exit را تایپ کنید. سپس کاربر kafka را از گروه sudo حذف کنید:
sudo gpasswd -d kafka wheel
برای بهبود بیشتر امنیت سرور کافکا میتوانید رمز عبور kafka را با استفاده از دستور passwd قفل کنید. این امر تضمین میکند که هیچ کس نمیتواند با این حساب وارد سرور شود:
sudo passwd kafka -l
در این لحظه تنها کاربر root یا یک کاربر sudo میتوانند با وارد کرد دستور زیر به عنوان kafka وارد سرور شوند:
sudo su - kafka
در آینده اگر بخواهید این کاربر را از حالت قفل خارج کنید میتوانید از دستور passwd با گزینه u- استفاده کنید:
sudo passwd kafka -u
اینک کاربر kafka با موفقیت همه دسترسیهای مدیریت خود را از دست داده است.
نتیجهگیری
در این راهنما مراحل اجرای امن آپاچی کافکا بر روی یک سرور SentOS را با هم مرور کردیم. اینک میتوانید با ساخت تولیدکنندهها و مصرفکنندههایی با استفاده از کلاینتهای کافکا که در اغلب زبانهای برنامهنویسی وجود دارند، از آن در پروژههای خود استفاده کنید. برای مطالعه موارد بیشتر در مورد کافکا میتوانید به مستندات آن مراجعه کنید.
اگر این نوشته مورد توجه شما قرار گرفته است، پیشنهاد میکنیم موارد زیر را نیز ملاحظه کنید:
- چگونه میتوانیم یک محیط توسعه و سرور مجازی برای برنامه نویسی وب بسازیم؟
- مجموعه آموزش های طراحی و برنامه نویسی وب
- ابزارهای تحلیل کلان داده (Big data) — راهنمای کامل
- RCS به عنوان نسل آینده پیامک — هر آنچه باید در این مورد بدانید
- مجموعه آموزش های طراحی و برنامه نویسی وب
==