ما تا الان نحوه کار کافکا، دمویی از اون و نصبش و جزییات بیشتری از کافکا رو با هم مشاهده کردیم. در این نوشتار میخوایم موارد پیشرفته ی دیگه ای مانند نحوه ساخت کلاستر کافکا و zookeeper رو با هم ببینیم. این جزییات برای ایجاد کلاستر در عملیات ضروری هستن.
حداقل تعداد نود هایی که در یک cluster فعال باشند و بتوانند با یکدیگر ارتباط داشته باشند، quorums نامیده میشود. از دو منظر میتوان این تعداد حداقل نودها را به دست آورد. اول از طریق اینکه حداقل تعداد نود در دسترس برای کلاستر که بتوانند با هم کار کنند. روش دیگر براساس یافتن حدلقل تعداد نود برای داشتن failure مورد نظر. با روش اول حداقل تعداد نود برابر است با n/2 +1 (نصف تعداد نودها به اضافه 1) بنابراین quorum در کلاستری با 5 نود برابر با 3 است. یعنی اگر این کلاستر به دو بخش بشکند با تعداد 3 نود مانند پیش میتواند کار کند. با روش دوم میگویند با از بین رفتن (n-1)/2 از نودها، همچنان کلاستر کار خود را انجام میدهد یعنی اگر کلاستر zookeeper ما 5 نود داشته باشد به از دست دادن 2 نود همچنان مقاوم است.
استفاده از Zookeeper در کافکا memory intensive نیست و در حد 8 گیگ مموری براش کافیه و با کمتر هم اوکیه. دیسک ولی براش خیلی اهمیت داره و برای اینکه latency کم باشد، از ssd ها استفاده بشود بهتر است.(برعکس کافکا که نحوه نوشتن و خواندنش sequential است و ssd بودن برایش فایده ای نخواهد داشت.)
ارتباط با zookeeper از کافکا با نتورک هستش بنابراین network timeout برای بالا رفتن سرعت در اینجا اهمیت زیادی دارد.
برای اینکه کلاستر راه بندازیم لازم داریم zookeeper هامون هم چند نود داشته باشند چون یک نود تنها در مقابل fault tolerance مقاوم نیست. من در اینجا 3 تا نود zookeeper بالا میارم. Zookeeper خودش cluster friendly نیست و لازم داره ما id های unique برای هر نود داخل کلاستر تعریف کنیم. اینکار با متغیر ZOO_MY_ID انجام میشه و port ای مخصوص هر نود تخصیص بدیم و تمامی سرورهای داخل کلاستر zookeeper را برای آن تعریف کنیم. فایل dicker compose برای ساخت این کلاستر zookeeper در ادامه آمده است. ما باید در فضای zoo_servers باید هر مقداری که به ZOO_MY_ID نسبت دادیم رفرنس بدیم بنابراین اعداد رو حتما لازمه دستی خودمون تعیین کنیم(بعضی image ها اجازه ی تولید رندم id رو دارند که برای کلاستر شدن مناسب نیست.) در فایل docker-compose زیر اعداد به صورت bold آمده است.
میتونیم ZOO_SERVERS رو در فایل zoo.conf هم تعریف کنیم ولی وقتی به عنوان environment variable در اینجا قرار بدیم دم دستمونه و راحت میتونیم تغییرش بدیم و نیاز نیست حتما این فایل conf رو در هنگام عملیاتی شدن هم دست بزنیم. (در اینجا سرور اول همه مقادیرش دیفالته، برای بعدی یک واحد بیشتر کردم و سومی هم همینطور)
باید حواسمون باشه حتمنی که وقتی داریم هر سروری رو کانفیگ میکنیم در بخش ZOO_SERVERS آدرس IP ش باید با 0.0.0.0 تنظیم بشه و کانفیگ های دیفالت بذاریم جون از داخل میخواد باهاش صحبت بشه (طوری آدرس میدیم که از داخل بتوان به آن وصل شد.) و بقیه با IP سیستمی که داکر روی اون بالا میاد(طوری آدرس میدیم که از بیرون بتوان به آن وصل شد.) در اینجا ip سیستمم 192.168.165.93 هستش. (من چون روی یک سیستم دارم بالا میارم هر سه port ها رو به مقادیر مختلفی expose کردم.)
خود Zookeeper از چند پورت مختلف استفاده میکند، 2888 برای ارتباط بین لیدر و سایر نودهای quorum ، 3888 برای انتخاب لیدر در quorum، 2181 برای ارتباط client به zookeeper (بروکر های کافکا از طریق این پورت متصل میشوند.)
version: "3.9" services: zk1: hostname: zk1 image: zookeeper:3.9.2 ports: - 2181:2181 - 3888:3888 - 2888:2888 environment: - ZOO_MY_ID=1 - ZOO_SERVERS=server.1=0.0.0.0:2888:3888 server.2=192.168.160.93:2882:3882 server.3=192.168.160.93:2883:3883 zk2: hostname: zk2 image: zookeeper:3.9.2 ports: - 2182:2181 - 3882:3888 - 2882:2888 environment: - ZOO_MY_ID=2 - ZOO_SERVERS=server.1=192.168.160.93:2888:3888 server.2=0.0.0.0:2888:3888 server.3=192.168.160.93:2883:3883 zk3: hostname: zk3 image: zookeeper:3.9.2 ports: - 2183:2181 - 3883:3888 - 2883:2888 environment: - ZOO_MY_ID=3 - ZOO_SERVERS=server.1=192.168.160.93:2888:3888 server.2=192.168.160.93:2882:3882 server.3=0.0.0.0:2888:3888
تا اینجا کلاستر zookeeper ساختیم، لازمه دست کم یک broker کافکا به این کلاستر اضافه کنیم.
وابستگی کافکا تنها به zookeeper است. بهتر است کافکا روی سیستمی بالا بیاید که cpu quad-core 24GB دارد. در صورتی که compression و ssl را فعال داشته باشیم میزان مصرف cpu بسیار زیاد میشود. اما اگر نیاز به امنیت و compression نداریم میتوان مقدار cpu را کم کرد. RAM مورد نیاز به صورت optimal مقدار 6GB است ولی اگر محیطهای production با بار زیاد، حدودا 32GB رم مورد نیاز است. در سطح سیستم عامل بهتر است بر روی سیستم عامل هایی که linux base هستند بالا بیاید. File system های XFS برای کافکا performance بهتری دارد و ssd ها در اینجا مفید نخواهد بود چون کافکا به صورت sequential میخواند و ssd اصلا نمیتواند بهبودی حاصل کند.
کانفیگ های نرم افزاری کافکا، در سطح سیستم عامل، file descriptor limits، max socket buffer و max number of memory map مهم است.(این ها فارغ از بحث container است.) در سمت producer لازم است کانفیگ های acks، compression و batch size در نظر گرفته شود. در سمت consumer نیز بحث fetch size مهم است.
تا اینجا کلاستر zookeeper ساختیم، لازمه دست کم یک broker کافکا به این کلاستر اضافه کنیم. قبلتر نحوه بالا آوردن کافکا رو دیده بودیم که چون zookeeper ها کلاستر شدن، باید آدرس همه نودهاشو به بروکر کافکا در غالب متغیر KAFKA_ZOOKEEPER_CONNECT معرفی کنیم.( کاما separate و بدون هیچ space ای میذاریم)
kafka1: image: confluentinc/cp-kafka restart: always depends_on: - zk1 - zk2 - zk3 ports: - 9092:9092 environment: - KAFKA_ZOOKEEPER_CONNECT=192.168.160.93:2181, 192.168.160.93:2182, 192.168.160.93:2183 - KAFKA_LISTENERS=PLAINTEXT://:9092 - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.160.93:9092
ما وقتی چند تا بروکر کافکا داریم در کافکا client تنها آدرس یکی را بگوییم کفایت میکند چون از طریق bootstrap server بقیه را میشناسد ولی در مورد zookeeper لازم است حتما آدرس همه نود ها را داشته باشیم.
لازمه فایل بالا اومدن بروکر های کافکا رو مجزا از نودهای zookeeper قرار بدید که ابتدا zookeeper رو کانفیگ کرده و در حد 2 3 دقیقه زمان بدیم که zookeeper ها به هم متصل بشن بعدش بروکرهای کافکا رو بالا بیاریم.
در این پست به موارد و جزییات بیشتری از نحوه کلاستر شدن zookeeper و kafka و نیازمندی های سخت افزاری و نرم افزاری اشاره کردیم.
از اینکه وقت خود را در اختیار من قرار دادین بسیار سپاس گذارم. امیدوارم این مطالب برای شما موثر و مفید باشد. من تلاش کردم مطلب رو به ساده ترین حالت بیان کنم. در صورتی که پیشنهاد یا انتقادی در مورد نحوه ی نگارش و مطالب دارین خوشحال میشم با من در میان بذارین و هر سوال و ابهامی در مورد کافکا داشتین رو در کامنت ها بذارین که بتونم کمک کنم.