آپاچی کافکا

رام کردن جریان داده های انبوه با Apache Kafka

دی ۱۹, ۱۳۹۵

برچسب‌ها, , , , ,

آیا تا به حال در تولید یک محصول نرم افزاری با انبوهی از داده ها که بی وقفه در حال ارسال هستند و شما فرصت کافی برای پردازش و ذخیره سازی آنها نداشته باشید، مواجه شده اید؟ به احتمال زیاد اولین چیزی که به ذهن تان خواهد رسید ذخیره سازی موقت اطلاعات می باشد. ولی این ذخیره سازی موقت تا چه میزان از داده ها را جوابگو خواهد بود و یا حتی چقدر در ذخیره سازی قابل اعتماد می باشد؟ اگر به فکر فرو رفته اید باید بگویم که خوشبختانه جواب همه این سوال ها توسط گروهی از مهندسین شرکت لینکدین در ژانویه سال ۲۰۱۱ با معرفی تکنولوژی جدیدی به نام کافکا (Kafka) داده شد. این تکنولوژی در حال حاضر به عنوان یک پروژه متن باز توسط بنیاد آپاچی توسعه داده می شود.

کافکا چطور کار می کند؟

تکنولوژی کافکا به طور مشخص برای پردازش جریان داده ها (Stream Processing) و کارگزار ارسال و دریافت پیام (Message Broker) مورد استفاده قرار می گیرد. برای درک بهتر موضوع بهتر است ابتدا به نحوه ذخیره سازی داده ها در کافکا بپردازیم. فرض کنید که بر روی یک سرور عملیاتی کافکا نصب گردیده است. اولین قدم برای استفاده از آن ایجاد یک Topic می باشد. از این به بعد می توان از طریق ارتباط TCP پیام های جدید را جهت ذخیره سازی در Topic جدید ارسال نمود. این کار به سادگی از طریق Client های پیاده سازی شده که به زبان ها و برای پلتفرم های مختلف طراحی شده اند قابل انجام است.

سپس این پیام ها باید در جایی ذخیره گردد. کافکا این پیام ها را در فایل هایی با نام Log ذخیره سازی می نماید. داده های جدید به انتهای فایل های Log افزوده می گردند. کافکا این توانایی را دارد که پیام های ارسالی را بر روی مجموعه ای از سرورهای کافکا که با یکدیگر کلاستر(Cluster) شده اند، ذخیره سازی نماید. اگر به طور مثال تعداد n سرور کافکا در یک کلاستر وجود داشته باشند، داده های مرتبط با هر پیام ارسالی پس از ذخیره سازی بر روی سرور لیدر، بر روی تمامی سرور های پشتیبانی نیز کپی خواهد گردید. با این وصف، حتی اگر n-1 عدد از سرورها از سرویس خارج شوند، داده های Topic مورد نظر کماکان در دسترس و قابل استفاده خواهند بود. از این رو تحمل پذیری در برابر خطا به خوبی در کافکا دیده شده است.

خواندن اطلاعات ذخیره شده بر روی کافکا(Kafka) نیز از طریق همان Client هایی که برای ارسال پیام ها مورد استفاده بودند قابل انجام است.  کلاینت مصرف کننده پیام که به اصطلاح Consumer نامیده می شود، جهت خواندن پیام ها باید خود را Subscribe یک Topic مشخص نماید. از این پس با اجرای متد Poll داده ها به سمت مصرف کننده سرازیر می شوند. در هنکام تعریف Topic جدید این امکان وجود دارد که داده های مرتبط با آن در چند پارتیشن ذخیره شوند. پارتیشن ها به سادگی جداسازی فیزیکی داده ها بر روی دیسک را انجام می دهند. در واقع کافکا تمامی پیام های ارسالی به یک Topic را در تمامی پارتیشن ها به همان ترتیبی که ارسال شده اند به صورت توزیع شده ذخیره می کند.

در این مدل ذخیره سازی، هر پارتیشن بر روی یک سرور ذخیره شده و سایر سرور های حاضر در Cluster نسخه پشتیبان آن پارتیشن را کپی خواهند کرد. این ویژگی کافکا به مصرف کننده پیام این امکان را می دهد که به صورت موازی اطلاعات را دریافت نماید. روش کار به این شکل است که به تعداد پارتیشن های موجود یک Topic باید Consumer جدید تعریف شود و همگی آنها عضو یک گروه شوند. این کار به سادگی با انتخاب مشخصه group.id یکسان برای همه آنها قابل انجام است و پس از آن می توان شروع به خواندن پیام ها نمود. تمام هماهنگی های مورد نیاز جهت تخصیص هر پارتیشن به یک مصرف کننده توسط کافکا(Kafka) انجام خواهد پذیرفت. در صورتی که تعداد مصرف کننده بیشتر از پارتیشن ها باشد یکی از آنها در عمل استفاده نخواهد شد ولی اگر تعداد پارتیشن ها بیشتر از تعداد مصرف کننده ها باشد به هر مصرف کننده بیش از یک پارتیشن جهت خواندن پیام ها اختصاص داده خواهد شد. با تغییر در تعداد مصرف کننده ها، کافکا گروه مصرف کننده رو دوباره تنظیم یا به اصطلاح Rebalance می نماید.

انواع Message Broker ها

Message Broker ها به طور سنتی به دو شکل Queuing ویا Publish-Subscribe عمل می کنند. در روش اول داده ها در یک صف قرار می گیرند و می توان آنها را با ترتیب وارد شده به صف خواند. مزیت این روش این است که می توان خواندن و پردازش را به صورت موازی انجام داد ولی با مصرف شدن هر پیام، به طور کامل از صف حذف می گردد. این ایراد در روش دوم به دلیل ارسال یک پیام به تمامی Subscriber ها وجود ندارد ولی در عوض تقسیم بار کاری بی معنی می باشد. استفاده از کافکا مزیت هر دو روش را در اختیار می گذارد.

پارتیشن ها پیام ها را به ترتیب ورود ذخیره می کنند و مصرف کننده نیز به همان ترتیب پیام را دریافت می دارد. با تخصیص هر مصرف کننده به یک پارتیشن، دریافت اطلاعات به صورت موازی انجام می گیرد. در عین حال محدودیتی در تعداد گروه های مصرف کننده یک Topicوجود ندارد و offset خوانده شده هر گروه جدا از گروه های دیگر نگهداری می گردد.  Offset به نقطه ای از پارتیشن که در فرمان Poll بعدی داده ها باید از آنجا خوانده شود اشاره دارد که می تواند به صورت خودکار توسط مصرف کننده بعد از خواندن داده ها کامیت شود و یا به صورت دستی توسط برنامه نویس بعد از پرداش اطلاعات کامیت گردد.

نحوه نگهداری اطلاعات پیکربندی

هر سرور کافکا دارای شناسه ای می باشد که در کلاستر منحصر یه فرد است و به آن broker.id می گویند. هر Broker دارای Topic های مربوط به خود است و هر Topic از مجموعه ای از پارتیشن ها تشکیل شده است. و در نهایت هر پارتیشن به ازای هر گروه مصرف کننده offset جداگانه نیاز خواهد داشت. این اطلاعات پیکربندی توسط Apache Zookeeper نگهداری می شود و کافکا برای اجرا نیاز به این سرویس دارد. Zookeeper اطلاعات مربوط به Topic های یک Broker را در ساختار درختی ذخیره می کند:

این اطلاعات که در یک ساختار فایل سیستم مانند و به صورت Key,Value ذخیره می شوند در سرتاسر کلاستر در دسترس هستند. پیش از راه اندازی کافکا سرویس Zookeeper باید راه اندازی شده باشد و در پیکربندی کافکا نحوه اتصال به آن مشخص می گردد.

همینطور کافکا این ویژگی را دارد که جریان داده های ورودی به یک Topic را پس از عبور دادن از یک پردازش کننده و تغییر حالت داده ها، در Topic/های جدید ذخیره نماید که این عمل به صورت بلادرنگ انجام می گیرد. به طور خلاصه کافکا ذخیره سازی داده ها بر روی کلاستر، خواندن اطلاعات به صورت Publish-Subscribe و البته موازی جهت تقسیم بار کاری و پردازش همزمان جریان داده ها را در اختیار سیستم هایی می گذارد که دغدغه پردازش داده های انبوه را دارند.

این نوشته بر اساس جمع بندی شخصی نویسنده از تجربه کار با  Apache Kafka نوشته شده است. در صورتی که ایرادی در آن می بینید و یا اگر پیشنهادی در خصوص بهبود آن دارید لطفا کامنت بگذارید.

امیر حاجی زاده

از ۱۷ سالگی وارد دنیای برنامه نویسی شدم و همیشه از خلق محصول و یا سرویس نرم افزاری که باعث رضایت کاربر میشه لذت برده ام. علاقه مند به تکنولوژی های جدید و تعامل با افراد شاغل در حوزه تولید نرم افزار.

More Posts

Follow Me:
LinkedIn

0 پسند

آدرس ایمیل شما منتشر نخواهد شد.