GDNSD-PLUGIN-WEIGHTED(8) gdnsd GDNSD-PLUGIN-WEIGHTED(8)

gdnsd-plugin-weighted - افزونه gdnsd برای پیاده‌سازی رکوردهای «وزن‌دار» (weighted)

پیکربندی نمونه افزونه:

plugins => {
  weighted => {
    multi = false # default
    service_types = up
    up_thresh => 0.5 # default
    corpwww => {
      lb01 = [ lb01.example.org., 99 ]
      lb02 = [ lb02.example.org., 15 ]
      lb03 = [ lb03.example.org., 1 ]
    }
    frontwww6 => {
      service_types = up
      multi = true
      wwwhost01 = [ 2001:db8::123, 4 ]
      wwwhost02 = [ 2001:db8::456, 1 ]
      wwwhost03 = [ 2001:db8::789, 2 ]
    }
    pubwww => {
      service_types = [ web_check, foo ]
      up_thresh => 0.01,
      pubhost01 = [ 192.0.2.1, 44 ]
      pubhost02 = [ 192.0.2.2, 11 ]
      pubhost03 = [ 192.0.2.3, 11 ]
      pubhost04 = [ 192.0.2.4, 11 ]
    }
    cdnwww => {
      service_types = web_check
      datacenter1 => {
        d1-lb1 = [ 127.0.0.1, 2 ]
        d1-lb2 = [ 127.0.0.2, 2 ]
      }
      datacenter2 => {
        d2-lb1 = [ 127.0.0.3, 2 ]
        d2-lb2 = [ 127.0.0.4, 2 ]
        d2-lb3 = [ 127.0.0.5, 1 ]
      }
    }
    mixed => {
      multi => false,
      addrs_v4 => {
        lb1 = [ 127.0.0.3, 2 ]
        lb2 = [ 127.0.0.4, 2 ]
      }
      addrs_v6 => {
        multi => true
        www6set1 = {
          lb01 => [ 2001:db8::123, 4 ]
          lb02 => [ 2001:db8::456, 1 ]
        }
        www6set2 = {
          lb01 => [ 2001:db8::789, 4 ]
          lb02 => [ 2001:db8::ABC, 1 ]
        }
      }
    }
    cn => {
      service_types = my_cn_check
      foo = [ lb01.example.org., 99 ]
      bar = [ lb02.example.org., 15 ]
    }
  }
}

رکوردهای فایل منطقه (Zonefile RRs) ارجاع‌دهنده به موارد بالا، در example.com:

www.corp   300 DYNC weighted!corpwww
www6.front 300 DYNA weighted!frontwww6
www        300 DYNC weighted!pubwww
cdn        300 DYNA weighted!cdnwww
mixed-a    300 DYNA weighted!mixed
cnames     300 DYNC weighted!cn

افزونه gdnsd-plugin-weighted می‌تواند برای بازگرداندن یک (یا زیرمجموعه‌ای از) چندین رکورد آدرس، یا یکی از چندین رکورد CNAME بر اساس احتمالات وزن‌دار پویا (dynamic-weighted) به کار رود.

در بالاترین سطح، سه کلید پارامتر ویژه وجود دارد: "service_types"، "up_thresh" و "multi". پارامتر "multi" برای منابع مبتنی بر CNAME نادیده گرفته می‌شود. همه این کلیدها به سطوح هر منبع و هر خانواده آدرس به ارث می‌رسند و در آن سطوح قابل بازنویسی (override) هستند.

کلید "service_types" مشخص می‌کند که آدرس‌ها یا CNAMEهای مربوطه چگونه پایش می‌شوند. مقدار پیش‌فرض "service_types" در بالاترین سطح، "up" است که یک نوع سرویس توکار ارائه‌شده توسط gdnsd است. برای اطلاعات بیشتر درباره پیکربندی انواع سرویس غیرپیش‌فرض، مستندات اصلی gdnsd.config(5) را ببینید.

پارامتر "multi" یک مقدار بولی است که می‌تواند "true" یا "false" باشد، و مقدار پیش‌فرض آن "false" است. پارامتر "multi" رفتار الگوریتم انتخاب آدرس‌های نتیجه را کنترل می‌کند که در ادامه با جزئیات بررسی شده است.

پارامتر "up_thresh" یک کسر اعشاری ممیز شناور از مجموع وزن آدرس‌ها را در محدوده "(0.0 - 1.0]" تعریف می‌کند که مقدار پیش‌فرض آن 0.5 است و برای اثرگذاری بر رفتار شکست/تغییر مسیر اضطراری (failover) استفاده می‌شود.

به غیر از این سه مورد، بقیه کلیدهای سطح بالا نام‌های منابع شما هستند و مقادیر آنها، پیکربندی هر منبع را تعیین می‌کند.

درون جدول درهم‌سازی پیکربندی یک منبع مشخص، مجدداً سه پارامتر مرتبط با آدرس "services_types"، "multi" و "up_thresh" می‌توانند برای بازنویسی تنظیمات به ازای هر منبع مشخص شوند.

دو حالت پیکربندی پایه درون یک منبع وجود دارد:

۱) بندهای فرعی صریح آدرس به ازای هر خانواده. در این حالت، منبع شامل یک یا چند مورد از کلیدهای "addrs_v4" و "addrs_v6" است. معمولاً از هر دو با هم استفاده می‌شود، زیرا هنگام پیکربندی یک خانواده آدرس منفرد، استفاده از گزینه دوم ساده‌تر است.

محتویات هر بند، رکوردهای پاسخ (RRs) از نوع آدرس مشخص‌شده را برای این منبع پیکربندی می‌کند، و ۳ پارامتر رفتاری "service_types"، "multi" و "up_thresh" نیز می‌توانند به ازای هر خانواده آدرس بازنویسی شوند.

۲) تشخیص خودکار سطح بالا برای تنها یک خانواده آدرس یا CNAMEها. در این حالت، تا زمانی که مدخل‌ها مجموعه‌ای همسان از یک نوع منفرد باشند (همگی آدرس‌های IPv4، همگی آدرس‌های IPv6 یا همگی CNAME)، می‌توانید سطح بالای یک منبع را با مدخل‌های مستقیم پیکربندی کنید و نوع آن به طور خودکار تشخیص داده می‌شود.

منابعی که به جای آدرس‌ها حاوی فهرست‌های وزن‌دار CNAME هستند، فقط می‌توانند با رکوردهای "DYNC" در فایل‌های منطقه استفاده شوند، در حالی که منابعی که فقط حاوی آدرس هستند می‌توانند در رکوردهای "DYNC" یا "DYNA" به کار روند.

هنگام پیکربندی cnameها، مقدار هر مورد باید به صورت "[ CNAME, WEIGHT ]" باشد، و منبع برای رکوردهای "DYNC" فایل منطقه کاربردی خواهد بود، که در پاسخ‌ها به یک رکورد CNAME وزن‌دار ترجمه می‌شود. الگوریتم انتخاب مبتنی بر وزن‌ها و نتایج پایش، همان‌طور است که در ادامه برای آدرس‌ها در بخش حالت تک‌عضوی گروه‌بندی‌نشده (THE UNGROUPED SINGLE CASE) مستند شده است، زیرا گروه‌هایی از CNAMEها قابل پیکربندی نیستند و گزینه "multi" برای آنها معتبر نیست.

داده CNAME باید به طور کامل نام‌گذاری شده باشد (به "." ختم شود)، و یک رکورد "DYNC" نمی‌تواند برای تولید یک CNAME استفاده شود که به همان منطقه حاوی "DYNC" اشاره دارد.

به استثنای اینکه "addrs_v4" و "addrs_v6" فقط باید حاوی آدرس‌های خانواده درست باشند (یا در حالت تشخیص خودکار سطح بالا، مدخل‌های سطح بالا همگی باید از یک خانواده باشند)، این دو بند رفتار یکسانی دارند. زمانی که هر دو وجود داشته باشند، هر دو در هر پاسخ "DYNA" استفاده می‌شوند (زیرا gdnsd همیشه رکوردهای خانواده مخالف را در بخش Additional پرس‌وجوهای A/AAAA درج می‌کند).

در هر یک از انواع خانواده آدرس، دو بعد دودویی متفاوت (multi -> true/false، و گروه‌بندی‌شده در برابر گروه‌بندی‌نشده) وجود دارد که پیکربندی و رفتار به آنها وابسته است و به چهار حالت ممکن مختلف می‌انجامد: تک‌عضوی گروه‌بندی‌نشده (ungrouped-single)، چندعضوی گروه‌بندی‌نشده (ungrouped-multi)، تک‌گروهی گروه‌بندی‌شده (grouped-single) و چندگروهی گروه‌بندی‌شده (grouped-multi). هر کدام در ادامه با جزئیات بررسی خواهند شد:

این ساده‌ترین حالت است. کد زمانی این حالت را تشخیص می‌دهد که ببیند "multi" برابر با false است (پیش‌فرض)، و مقادیر کلیدها به جای جدول‌های درهم‌سازی فرعی، آرایه هستند. هر کلید درهم‌سازی یک برچسب آدرس است، و هر مقدار آرایه‌ای از "[ IPADDR, WEIGHT ]" می‌باشد.

هنگام پاسخ دادن به یک پرس‌وجو در این حالت، ابتدا وزن‌ها به وزن‌های پویا تبدیل می‌شوند. وزن پویای یک آدرس برابر با وزن پیکربندی‌شده آن است اگر وضعیت پایش‌شده "UP" باشد، یا اگر وضعیت پایش‌شده "DOWN" باشد صفر است. وزن‌های پویا برای تولید مجموع وزن پویا جمع می‌شوند، و سپس یک آدرس منفرد برای پاسخ دادن از میان مجموعه انتخاب می‌شود، که در آن هر آدرس دارای شانس "addr_dynamic_weight / total_dynamic_weight" است.

با این حال، اگر "total_dynamic_weight" کمتر از "ceil(up_thresh * total_configured_weight)" باشد، آن‌گاه وزن‌های پویا همگی به مقادیر کامل پیکربندی‌شده خود بازنشانی می‌شوند تا شانس‌های پاسخ همانند زمانی باشد که همگی "UP" بودند، و در صورت لزوم شکست در سطح منبع به هر فراافزونه (meta-plugin) لایه بالاتر (مانند metafo یا geoip) گزارش می‌شود.

مثال (X می‌تواند یک منبع کامل، یا یک بند addrs_v4 باشد):

X => {
  multi => false # default
  # odds below assume no addresses are down:
  lb01 => [ 192.0.2.1, 45 ] # 25% chance (45/180)
  lb02 => [ 192.0.2.1, 60 ] # 33% chance (60/180)
  lb03 => [ 192.0.2.1, 75 ] # 42% chance (75/180)
}

این حالت زمانی تشخیص داده می‌شود که (همانند بالا) مقادیر کلیدها آرایه‌هایی از "[ IPADDR, WEIGHT]" باشند، اما پارامتر "multi" برابر با true باشد. تغییر نسبت به رفتار فوق عمدتاً این است که چندین آدرس از مجموعه وزن‌دار می‌توانند در هر پاسخ بازگردانده شوند. مقدار بیشینه ("maximum")، به جای مجموع وزن‌های پویا (باز هم صفر برای آدرس‌های قطع، و وزن پیکربندی‌شده در غیر این صورت) به دست می‌آید، و شانس گنجانده شدن هر آدرس در مجموعه پاسخ برابر است با: "addr_dyanmic_weight / max_dynamic_weight".

این بدان معناست که همه آدرس‌های غیر "DOWN" که مقدار بیشینه وزن پویای گروه را به اشتراک دارند همیشه گنجانده خواهند شد، در حالی که سایرین بسته به شانس به طور اختیاری گنجانده می‌شوند. حداقل یک آدرس همیشه بازگردانده می‌شود (زیرا از نظر منطقی، حداقل یک آدرس دارای بیشینه وزن است که به آن شانس ۱۰۰٪ می‌دهد)، و گاهی کل مجموعه غیر "DOWN" بازگردانده خواهد شد.

پارامتر "up_thresh" همانند حالت قبل رفتار می‌کند: اگر مجموع مقادیر وزن پویا کمتر از "ceil(up_thresh * total_configured_weight)" باشد، آن‌گاه وزن‌های پویا همگی روی مقادیر پیکربندی‌شده خود تنظیم می‌شوند و مجموعه نتیجه به گونه‌ای محاسبه می‌شود که گویی همگی "UP" بودند، در حالی که شکست در سطح منبع به فراافزونه‌های بالادستی (geoip یا metafo) گزارش می‌شود.

مثال:

X => {
  multi => true
  # odds below assume no addresses are down:
  lb01 => [ 192.0.2.1, 45 ] # 75% chance (45/60)
  lb02 => [ 192.0.2.1, 60 ] # 100% chance (60/60)
  lb03 => [ 192.0.2.1, 60 ] # 100% chance (60/60)
  # overall possible result-sets:
  # lb01,lb02,lb03 -> 75%
  # lb02,lb03 -> 25%
}

حالت‌های گروه‌بندی‌شده زمانی تشخیص داده می‌شوند که مقادیر کلیدها در سطح بیرونی جدول‌های درهم‌سازی فرعی باشند به جای آرایه‌هایی از "[ IPADDR, WEIGHT]". در حالت گروه‌بندی‌شده، ابتدا مجموعه به گروه‌های نام‌گذاری‌شده تقسیم می‌شود، و سپس در هر گروه، آدرس‌های منفرد به صورت "addrlabel => [ IPADDR, WEIGHT ]" پیکربندی می‌گردند.

مثال:

X => {
  group1 => {
    lb01 => [ 192.0.2.1, 10 ]
    lb02 => [ 192.0.2.1, 20 ]
    lb03 => [ 192.0.2.1, 30 ]
  }
  group2 => {
    lb01 => [ 192.0.2.7, 10 ]
    lb02 => [ 192.0.2.8, 20 ]
    lb03 => [ 192.0.2.9, 30 ]
  }
}

حالت تک‌گروهی گروه‌بندی‌شده، طبیعتاً زمانی رخ می‌دهد که ساختار پیکربندی مطابق بالا باشد و پارامتر "multi" برابر با "false" (پیش‌فرض) باشد.

در حالت grouped-single، در اصل گروه‌ها مشابه حالت تکی برای آدرس‌های گروه‌بندی‌نشده نسبت به یکدیگر وزن‌دهی می‌شوند، که منجر به انتخاب یک گروه منفرد از میان مجموعه گروه‌ها می‌شود. سپس آدرس‌های درون گروه انتخاب‌شده به سبک چندعضوی (multi-style) نسبت به یکدیگر وزن‌دهی می‌شوند که بالقوه بیش از یک آدرس را از گروه انتخاب‌شده بازمی‌گردانند.

به طور مشخص، شانس هر گروه برای این‌که تنها گروه انتخاب‌شده باشد برابر است با "group_dyn_weight / total_dyn_weight"، که در آن وزن پویای گروه مجموع وزن‌های پویای درون آن است (آدرس‌های "DOWN" صفر هستند)، و مجموع وزن پویا مجموع پویای تمام گروه‌ها است. سپس درون هر گروه، شانس هر آدرس برای گنجانده شدن در مجموعه پاسخ چندعضوی برابر با "addr_dyn_weight / group_max_dyn_weight" است.

پارامتر "up_thresh" بر روی تمام گروه‌ها به عنوان یک کل عمل می‌کند، و اگر مجموع وزن‌های غیر "DOWN" در تمام گروه‌ها نتواند به معیار "ceil(up_thresh * total_sum_configured_weight)" برسد، آن‌گاه برای اهداف انتخاب، با تمام آدرس‌ها به گونه‌ای رفتار می‌شود که گویی "UP" هستند، و شکست در سطح منبع به بالادست گزارش خواهد شد.

احتمالاً می‌توانید با مطالعه سه حالت قبلی، رفتار این حالت را استنباط کنید. تفاوت با حالت grouped-single قبلی این است که رفتارهای چندعضوی و تک‌عضوی معکوس شده‌اند. چندین گروه بر اساس بیشینه وزن پویای میان گروه‌ها انتخاب می‌شوند، و یک آدرس وزن‌دار منفرد از زیرمجموعه درون هر گروه انتخاب‌شده بازگردانده می‌شود. تمام جزئیات بالا به همان صورت منطقی و مورد انتظار اعمال می‌شوند، چرا که هر چهار حالت در بخش داخلی از کد و منطق یکسانی استفاده می‌کنند و صرفاً بخش‌های متفاوتی از آن را برای زیرمجموعه‌های متفاوتی از مسئله به کار می‌برند.

توجه داشته باشید هر زمان که انتخاب چندگانه در یک لایه برقرار باشد (لایه بالایی هنگامی که multi برابر با true است، یا درون یک گروه هنگامی که multi برابر با false است)، حداقل تعداد موارد انتخاب‌شده برابر با تعداد مواردی خواهد بود که بیشترین وزن را درون مجموعه دارند. به عنوان مثال، مجموعه‌ای از موارد با وزن‌های "30, 30, 30, 20, 20" همیشه حداقل ۳ مورد از ۵ مورد را انتخاب می‌کند (زیرا سه مورد اول دارای شانس گنجانده شدن ۱۰۰٪ هستند)، و کل مجموعه پاسخ ممکن است با احتمالی مشخص حتی شامل هر ۵ مورد نیز باشد.

یک مثال کاربردی برای حالت تک‌گروهی گروه‌بندی‌شده (grouped-single):

تقسیم گروه‌ها بر روی مرزهای زیرشبکه در حالت grouped-single این نتیجه را می‌دهد که یک بسته پاسخ هرگز زیرشبکه‌ها را با هم ترکیب نمی‌کند. این کار به موازنه بار مبتنی بر DNS شما امکان می‌دهد تا با برخی اشکال تداخل در «انتخاب آدرس مقصد» در سطح کلاینت مقابله کند، در حالی که همچنان چندین آدرس در هر پاسخ برمی‌گرداند (همگی از یک زیرشبکه).

یک مثال کاربردی برای حالت چندگروهی گروه‌بندی‌شده (grouped-multi):

فرض کنید مجموعه بزرگی از آدرس‌ها دارید که می‌توان آنها را به طور منطقی به زیرمجموعه‌هایی با ریسک شکست مشترک گروه‌بندی کرد (مانند بخش‌های فرعی یک مرکز داده که زیرساخت مشترک دارند). با رفتار grouped-multi، کلاینت‌ها تا N آدرس (تعداد گروه‌ها) را در یک پاسخ نوبت‌گردشی (round-robin) دریافت خواهند کرد، اما یک مجموعه پاسخ معین هرگز شامل دو آدرس از یک گروه/زیرمجموعه یکسان نخواهد بود. این امر شانس این را به حداکثر می‌رساند که کلاینت در صورت شکست انتخاب اصلی خود، بتواند با موفقیت به آدرس دیگری در فهرست منتقل شود (failover)، زیرا کل مجموعه در هر پاسخ هیچ حالت شکست مشترکی به ازای هر زیرمجموعه ندارد.

تمامی وزن‌ها باید مقادیر عدد صحیح مثبت بزرگ‌تر از صفر و کمتر از 2^20 (۱۰۴۸۵۷۶) باشند.

محدودیت ۶۴ آدرس، گروه آدرس یا cname در بالاترین سطح یک منبع (یا به ازای هر خانواده آدرس در حالت‌های addrs_v4/addrs_v6) و محدودیت ۶۴ آدرس در هر گروه آدرس در حالت‌های گروه‌بندی‌شده وجود دارد.

gdnsd.config(5), gdnsd.zonefile(5), gdnsd(8)

کتابچه راهنمای gdnsd.

حق نشر (c) ۲۰۱۴ متعلق به Anton Tolchanov <me@knyar.net>، Brandon L Black <blblack@gmail.com> و Jay Reitz <jreitz@gmail.com>

این پرونده بخشی از gdnsd است.

برنامه gdnsd-plugin-weighted یک نرم‌افزار آزاد است: شما می‌توانید آن را تحت شرایط مجوز عمومی همگانی گنو همان‌طور که توسط بنیاد نرم‌افزارهای آزاد منتشر شده است، چه نسخه ۳ مجوز و یا (به انتخاب خودتان) هر نسخه پس از آن، بازتوزیع کرده یا تغییر دهید.

برنامه gdnsd-plugin-weighted به این امید توزیع شده است که مفید واقع شود، اما بدون هرگونه ضمانت؛ حتی بدون ضمانت ضمنی قابلیت فروش یا مناسب بودن برای یک هدف خاص. برای جزئیات بیشتر به مجوز عمومی همگانی گنو مراجعه کنید.

شما باید یک نسخه از مجوز عمومی همگانی گنو را به همراه gdnsd-plugin-weighted دریافت کرده باشید. در غیر این صورت، ببینید: http://www.gnu.org/licenses.

2026-04-04 gdnsd 3.8.3