etcd 3.7 منتشر شد؛ RangeStream از راه رسید
خلاصهٔ کاملتر
تیم SIG etcd نسخهٔ v3.7.0 رو منتشر کرد، آخرین نسخهٔ فرعی از همون انبارهٔ کلید-مقدار توزیعشدهای که یکی از اجزای اصلی کوبرنتیزه. طبق اعلام رسمی، این نسخه چهار محور داره: قابلیت پرطرفدار RangeStream، چند بهبود کارایی، حذف آخرین بازماندههای انبارهٔ قدیمی v2store، و تکمیل یه بازنویسی بزرگ در لایهٔ protobuf.
مهمترین قابلیت جدید RangeStream ـه. تو نسخهٔ ۳.۶ و قبلتر، کار با درخواستهایی که نتیجهٔ حجیم برمیگردوندن دردسر داشت: دیتابیس کل نتیجه رو قبل از ارسال بافر میکرد و همین باعث تأخیر و مصرف حافظهٔ غیرقابل پیشبینی، هم سمت سرور و هم سمت کلاینت میشد. با RPC جدید، برنامهٔ فراخوان میتونه نتیجه رو تکهتکه تحویل بگیره.
این قابلیت قراره برای کاربرهای کوبرنتیز v1.37 هم با فعال کردن feature gate ـی به اسم EtcdRangeStream در دسترس باشه. تو خود اعلام اومده که این پذیرش زودهنگام و برنامهریزیشده، ثمرهٔ ادغام توسعهٔ etcd و کوبرنتیز از سال ۲۰۲۳ ـه.
در بخش کارایی، کاربرهای کوبرنتیز باید کاهش محسوس مصرف CPU اعضای etcd نسبت به v3.6 رو ببینن. یکی از منابعش بهینهسازی range فقط-کلیده: حالا برای etcdctl get --keys-only فقط از ایندکس درونحافظه خونده میشه و دیگه لازم نیست همهٔ مقادیر از bbolt بارگذاری بشن — تنها استثناش وقتیه که مرتبسازی بر اساس مقدار خواسته شده باشه.
lease ها هم بهتر شدن: درخواستهای LeaseRevoke اولویت گرفتن تا حتی زیر بار سنگین، انقضای lease بهموقع انجام بشه، و قابلیت جدید FastLeaseKeepAlive با رد کردن انتظار برای applied index تمدید رو سریعتر کرده. جدا از این، عملیات find() سریعتر شده که مستقیماً به کارایی watch های همزمان روی کلیدها کمک میکنه.
بازنویسی protobuf هم بالاخره تموم شد: کتابخانههای قدیمی github.com/golang/protobuf و github.com/gogo/protobuf جاشون رو به google.golang.org/protobuf دادن و grpc-logging به grpc-middleware نسخهٔ ۲ منتقل شد. این کار جدا از امنیت و نگهداریپذیری، مصرف CPU رو هم کم کرده. کاربر باینری و ایمیج رسمی چیزی حس نمیکنه، ولی هر کی به ماژولهای Go ـی etcd وابستهست ممکنه لازم باشه کدش رو بهروز کنه.
تغییر ساختاری بزرگ اینه که سرور حالا کاملاً از v3store بوت میشه و وابستگی دیرینه به انبارهٔ v2 موقع راهاندازی از بین رفته — نتیجهٔ تلاشی که از v3.4 شروع شده بود. برای سازگاری، v3.7 هنوز اسنپشات v2 تولید میکنه و پرچم --snapshot-count باقی مونده، ولی هر دو تو v3.8 حذف میشن. پشتیبانی از سوکت یونیکس هم اضافه شده که فعلاً محدود به کلاستر تکعضویه و بیشتر به درد توسعه، تست و دستگاههای لبه میخوره.
قبل از ارتقا حتماً راهنمای مهاجرت رو بخون، چون تغییرات ناسازگار کم نیست: پرچمهای --experimental-* حذف شدن و جاشون رو feature gate ها گرفتن، بستههای v2 discovery و v2 request و کلاینت v2 پاک شدن، گزینهٔ منسوخ grpc.WithBlock دیگه رعایت نمیشه و ایمیجهای رسمی فقط به شکل multiarch منتشر میشن. ارتقا رو هم عضو به عضو انجام بده و بین هر قدم سلامت کلاستر رو چک کن.
نکات کلیدی:
- RangeStream نتیجههای حجیم رو تکهتکه میفرسته و مصرف حافظه رو قابل پیشبینی میکنه
- در کوبرنتیز v1.37 با feature gate ـی به نام EtcdRangeStream فعال میشه
- range فقط-کلید حالا فقط از ایندکس درونحافظه میخونه؛ lease ها سریعتر و پایدارترن
- بازنویسی کامل protobuf، هم امنیت و نگهداری بهتر هم مصرف CPU کمتر
- بوت کامل از v3store؛ اسنپشات v2 و پرچم snapshot-count در v3.8 حذف میشن
- تغییرات ناسازگار: حذف پرچمهای experimental، بستههای v2 و انتشار فقط multiarch
- همراهش bbolt v1.5.1 و raft v3.7.0 با محدودیت اندازهٔ فایل و رفع خواندن کهنه




