WIUNIX ACADEMY
مصرفکنندهٔ Kafka عقب افتاده؛ علتیابی و تمرین امن تغییر offset
صفحهٔ 2 از 3؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من9 مقدار قابلتغییر
قدم بعدی
همهٔ مصرفکنندهها را از مسیر خود برنامه متوقف کنید
از رویهٔ توقف محیط آزمایشی استفاده کنید و autoscaler، scheduler و نمونههای آمادهبهکار را هم در نظر بگیرید. نباید در میانهٔ تغییر، نمونهای خودکار دوباره عضو گروه شود. برای همهٔ برنامهها نمیتوان یک دستور توقف یکسان داد؛ از روش توقف خود برنامه استفاده کنید.
پس از توقف، این دو نما را ببینید: گروه باید غیرفعال و بدون عضو باشد. همین بررسی را درست پیش از اعمال تغییر تکرار کنید؛ تصویر چند دقیقهٔ قبل، وضعیت لحظهٔ اجرا را ثابت نمیکند.
کلاینت دارای مجوز مدیریت Kafka
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --describe --members
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --describe --stateهیچ عضوی فعال نیست و بازگشت خودکار مصرفکنندهها در طول تمرین مهار شده است.
قدم بعدی
قدیمیترین و آخرین موقعیتِ در دسترس را بررسی کنید
موقعیت آغاز و پایان دادهٔ موجودِ همان partition را بخوانید. retention در حال حرکت است و ممکن است در طول تصمیمگیری دادهٔ قدیمی حذف شود؛ نزدیک اجرا دوباره بررسی کنید. offset پیش از قدیمیترین دادهٔ موجود، رکورد حذفشده را برنمیگرداند.
بعضی روشهای reset، درخواست خارج از بازه را به یک موقعیت موجود تغییر میدهند. خروجی پیشنهادی را ببینید و فرض نکنید همان عدد درخواستی اعمال میشود. انتخاب زمان نیز جای جستوجوی تراکنش کسبوکار را نمیگیرد.
کلاینت دارای مجوز مدیریت Kafka
'/opt/kafka/bin/kafka-get-offsets.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --topic 'academy_events' --partitions 0 --time -2
'/opt/kafka/bin/kafka-get-offsets.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --topic 'academy_events' --partitions 0 --time -1offset هدف هنوز در دادهٔ در دسترس است و انتخاب آن را با خروجی ابزار تطبیق دادهاید.
قدم بعدی
موقعیت قبلی همان partition را در فایل نگه دارید
زیر والد مجاز، پوشهٔ خصوصی و تازهای بسازید. دستور بعدی موقعیت فعلی همان topic و partition را به CSV میبرد و هنوز reset را اجرا نمیکند. فایل را بخوانید: نام، partition و offset عددی باید با مورد انتخابی شما بخوانند.
اگر گروه برای این partition موقعیت ثبتشده ندارد، متوقف شوید. این CSV فقط جای خواندن را نگه میدارد؛ بکاپ رکوردها یا روشی برای برگرداندن اثر پردازش در سرویسهای دیگر نیست.
کلاینت دارای مجوز مدیریت Kafka
test ! -e '/home/academy/kafka-offset-rehearsal-20261028' && test ! -L '/home/academy/kafka-offset-rehearsal-20261028' || exit 1
(umask 077; mkdir -- '/home/academy/kafka-offset-rehearsal-20261028') || exit 1
umask 077
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --reset-offsets --topic 'academy_events:0' --to-current --export > '/home/academy/kafka-offset-rehearsal-20261028/before.csv'
cat '/home/academy/kafka-offset-rehearsal-20261028/before.csv'فایل خصوصیِ وضعیت قبل، دقیقاً همان topic و partition و offset ثبتشده را دارد.
قدم بعدی
اول خروجی تغییر را بدون اعمال ببینید
dry-run موقعیت ثبتشدهٔ گروه را تغییر نمیدهد. گروه، topic، partition و عدد جدید را با تصمیم مجاز و دادهٔ در دسترس تطبیق دهید. فقط همان partition باید در پیشنهاد باشد.
عقبرفتن پس از شروع دوباره میتواند کار تکراری بسازد؛ جلو رفتن میتواند رکورد پردازشنشده را رد کند. هیچکدام درمان عمومی lag نیست. در این تمرین فقط یک تغییر روی گروه خاموشِ آزمایشی را میبینیم.
کلاینت دارای مجوز مدیریت Kafka
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --reset-offsets --topic 'academy_events:0' --to-offset 0 --dry-runپیشنهاد ابزار فقط همان partition و offset موردنظرِ بررسیشده را شامل میشود.
قدم بعدی
تغییر را فقط در گروه آزمایشیِ هنوز خاموش اعمال کنید
این مرحله عمداً وضعیت گروه را تغییر میدهد. بیدرنگ غیرفعالبودن و نبود عضو را دوباره بررسی کنید و تنها پس از پذیرفتن پیامد تغییر روی دادهٔ آزمایشی، execute را اجرا کنید.
بعد از آن مصرفکنندهها را روشن نکنید؛ در همین تمرین قرار است پیش از شروع پردازش به موقعیت قبلی برگردیم. اگر خطا یا عدد متفاوتی دیدید، خروجی را حفظ و علت را بررسی کنید؛ روی گروهی که وضعیتش عوض میشود کور تکرار نکنید.
کلاینت دارای مجوز مدیریت Kafka
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --describe --state
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --describe --members
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --reset-offsets --topic 'academy_events:0' --to-offset 0 --execute
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --describeموقعیت ثبتشده برابر هدف بررسیشده است و همهٔ مصرفکنندهها همچنان خاموشاند.
قدم بعدی
پیش از شروع دوباره، موقعیت تمرین را برگردانید
فقط تا وقتی هیچ مصرفکنندهای پس از تغییر روشن نشده و کاری انجام نداده، فایل قبل را پیشنمایش و سپس اعمال کنید. اگر پردازشی شروع شده، این مرحله را بهعنوان rollback کسبوکار اجرا نکنید؛ برگرداندن offset میتواند دوباره کار تکراری یا ردشده بسازد.
در روش from-file، topic و partition از CSV میآیند و پرچم topic جدا لازم نیست. خروجی پایان را با فایل قبل تطبیق دهید. سپس برنامه را از مسیر معمول خود راهاندازی کنید و علاوه بر lag، صحت نتیجه و سن دادهٔ خروجی را ببینید.
کلاینت دارای مجوز مدیریت Kafka
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --reset-offsets --from-file '/home/academy/kafka-offset-rehearsal-20261028/before.csv' --dry-run
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --reset-offsets --from-file '/home/academy/kafka-offset-rehearsal-20261028/before.csv' --execute
'/opt/kafka/bin/kafka-consumer-groups.sh' --bootstrap-server 'kafka.example.com:9093' --command-config '/etc/kafka/academy-client.properties' --group 'academy_replay' --describeگروه هنوز غیرفعال است و موقعیت آن، پیش از راهاندازی معمول، به مقدار ثبتشدهٔ قبل برگشته است.