etcd نسخه 3.7.0 منتشر شد — یک نسخهٔ مهم برای تیم‌های DevOps/SRE که چند تغییر کلیدی عملکردی و پاک‌سازی فنی بزرگ را شامل می‌شود. این نسخه ویژگی موردانتظار RangeStream را اضافه می‌کند، وابستگی‌های قدیمی مثل v2store را حذف به سمت حذف نهایی می‌برد و یک بازسازی کامل در پروتوباف انجام می‌دهد. 😊

اگر می‌خواهید نصب یا ارتقا دهید، مستندات نصب و صفحهٔ کامل تغییرات را قبل از هر کاری بررسی کنید. یادآوری مهم: پیش از ارتقا، گره‌ها را یکی‌یکی به‌روزرسانی کرده و سلامت خوشه را بین هر مرحله تأیید کنید — مخصوصاً چون حذف مؤلفه‌های نسخهٔ 2 می‌تواند سازگاری را تحت‌تأثیر قرار دهد.

RangeStream یکی از بزرگ‌ترین قابلیت‌های جدید است: به‌جای این‌که کل نتایج بزرگ را در سمت سرور یا کلاینت بافر کند، پاسخ‌ها را تکه‌ای (streamed chunks) می‌فرستد. این رویکرد باعث کاهش تاخیر غیرقابل‌پیش‌بینی و مصرف حافظهٔ سرور/کلاینت می‌شود و برای درخواست‌های بزرگ یا watch/scan در clusterهای پرکارکرد خیلی مفید است. راهنمای استفاده از RangeStream در تماس‌های gRPC و etcdctl در مستندات توضیح داده شده — حتماً آن را در برنامه‌های خود تست کنید. ⚡

نکتهٔ مرتبط با Kubernetes: در نسخه‌های هماهنگ، RangeStream با فعال کردن feature gate به نام EtcdRangeStream در دسترس قرار می‌گیرد (برای Kubernetes نسخهٔ 1.37 برنامه‌ریزی شده). این همگرایی توسعهٔ etcd و Kubernetes باعث شده پذیرش تدریجی این ویژگی بهتر مدیریت شود.

بهبودهای عملکرد در v3.7 شامل چند مورد خاص است که برای control planeِ Kubernetes بسیار مؤثرند: مصرف CPU اعضای etcd نسبت به 3.6 به‌طور قابل‌توجهی کاهش یافته است. یکی از بهینه‌سازی‌ها «keys_only range» است: وقتی درخواست keys_only ارسال می‌شود، etcd فقط از ایندکس درون‌حافظه خوانده و کلیدهای منطبق را بدون بارگذاری مقادیر سریال‌شده از bbolt برمی‌گرداند؛ مگر این‌که مرتب‌سازی بر اساس VALUE لازم باشد. این تغییر برای عملیات بزرگ خواندن/لیست بسیار مؤثر است.

در حوزهٔ مدیریت lease و قابلیت دسترسی، تغییراتی داریم: درخواست‌های LeaseRevoke در شرایط اضافه‌بار اولویت‌بندی می‌شوند تا اجاره‌ها به‌موقع منقضی شوند و قابلیت‌های جدیدی مثل FastLeaseKeepAlive نیز برای کاهش تاخیر در عملیات مرتبط با lease اضافه شده‌اند. این‌ها ثبات و پاسخ‌دهی سیستم را در بارهای سنگین بهتر می‌کنند.

بازسازی پروتوباف (protobuf refactor) یکی از تغییرات زیرساختی مهم است: کتابخانه‌های قدیمی مثل github.com/golang/protobuf و github.com/gogo/protobuf با google.golang.org/protobuf جایگزین شده و grpc-middleware به نسخهٔ v2 منتقل شده است. این بهبودها امنیت، قابلیت نگهداری و به طور کلی مصرف CPU را کاهش می‌دهد، اما ممکن است مصرف‌کنندگانی که مستقیم از ماژول‌های Goِ etcd یا SDKهای بسته‌بندی‌شده استفاده می‌کنند نیاز به به‌روزرسانی کد یا وابستگی‌ها داشته باشند — لذا قبل از ارتقا بررسی کنید. 🔧

توسعه‌های عملیاتی دیگر: پشتیبانی از Unix socket endpoints اضافه شده که برای ارتباطات محلی بدون TCP مفید است (محدود به خوشه‌های تک‌عضوی، مناسب برای توسعه/تست/edge)، سرور اکنون می‌تواند از v3store بوت‌استرپ شود که روند بوت‌استرپ را ساده‌تر می‌کند، و etcdutl دستورات timeout را قبول می‌کند. همچنین clientv3 اکنون امکان تنظیم مستقیم JWT را می‌دهد که انعطاف‌پذیری احراز هویت را افزایش می‌دهد.

متریک‌های جدید اضافه شده‌اند تا دید بهتری نسبت به رفتار watch/send loop و latencies داشته باشید، از جمله متریک جدید etcd_server_request_duration_seconds. دستورات etcdctl هم بازآرایی شده‌اند و پرچم‌های سراسری (global flags) پنهان‌سازی شده‌اند تا تجربهٔ CLI مرتب‌تر شود.

نسخهٔ جدید با bbolt v1.5.1 و raft v3.7.0 عرضه می‌شود؛ bbolt 1.5 امکاناتی مثل محدودیت اندازهٔ فایل DB، غیرفعال‌سازی آمار برای کاهش سربار، و پردازش کارآمدتر hash map را دارد. raft 3.7 هم بهبودهای بوت‌استرپ و ReadIndex را دارد که کمک می‌کند خوانش‌ها بیات نشوند. به‌علاوه به‌روزرسانی‌هایی برای وابستگی‌ها (مثلاً golang.org/x/crypto برای رفع CVE، OpenTelemetry و سازگاری با Go 1.26.4) انجام شده است.

یک نکتهٔ مهم برای تصاویر کانتینر: توزیع رسمی v3.7 فقط به‌صورت multi-arch container images ارائه می‌شود و تصاویر با تگ معماری مجزا منتشر نمی‌شوند — پس در تنظیمات استقرار این موضوع را در نظر بگیرید. همچنین حذف تدریجی پشتیبانی v2 ادامه دارد (برخی APIها و بسته‌های client/internal/v2 حذف شده‌اند) و پرچم‌های experimental-* منسوخ حذف شده‌اند؛ اگر هنوز به آرگومان‌های –experimental-* متکی هستید، قبل از ارتقا آن‌ها را به feature gates یا پرچم‌های پایدار منتقل کنید.

خلاصهٔ عملی برای DevOps/SRE: قبل از ارتقا مستندات و راهنمای ارتقا را با دقت بخوانید، یک عضو را در هر مرحله ارتقا دهید و سلامت خوشه را کنترل کنید؛ اگر اپلیکیشن یا بسته‌های داخلی شما مستقیم از ماژول‌های Goِ etcd استفاده می‌کنند، وابستگی‌های protobuf/GRPC را بررسی کنید و احتمالاً کد را به‌روزرسانی کنید. از RangeStream و keys_only optimization در محیط تست استفاده کنید تا ببینید چطور مصرف حافظه و تأخیرها بهبود می‌یابند. 🚀

تشکر از بیش از صد مشارکت‌کننده‌ای که در ساخت این نسخه کمک کردند؛ این نوع انتشار‌ها نشان‌دهندهٔ همکاری جامعه برای بهبود پایداری و عملکرد زیرساخت‌های توزیع‌شده است. 🙌