Apache moduli mod_unique_id

By 08.09.2021 08.09.2021

Ushbu modul har bir so'rov uchun sehrli belgini taqdim etadi, bu juda aniq sharoitlarda "barcha" so'rovlarda noyob bo'lishi kafolatlanadi. Noyob identifikator hatto to'g'ri tuzilgan mashinalar klasteridagi bir nechta mashinalarda noyobdir. UNIQUE_ID muhit o'zgaruvchisi har bir so'rov uchun identifikatorga o'rnatiladi. Noyob identifikatorlar ushbu hujjat doirasidan tashqarida bo'lgan turli sabablarga ko'ra foydalidir.

Mavzular

  • Nazariya

Direktivalar

Ushbu modulda ko'rsatmalar mavjud emas.

Xatoliklar tuzatish ro'yxati

Shuningdek qarang

Nazariya

Dastlab Apache serverining Unix mashinalarida qanday ishlashi haqida qisqacha ma'lumot. Hozirda ushbu xususiyat Windows NT-da qo'llab-quvvatlanmaydi. Unix mashinalarida Apache bir nechta bolalarni yaratadi, bolalar so'rovlarni birma-bir ko'rib chiqadilar. Har bir bola o'z hayoti davomida bir nechta so'rovlarni bajarishi mumkin. Ushbu munozarani o'tkazish uchun bolalar bir-birlari bilan hech qanday ma'lumot almashishmaydi. Biz bolalarga murojaat qilamiz.

Sizning veb-saytingizda ma'muriy nazorati ostida bitta yoki bir nechta mashinalar mavjud, biz ularni birgalikda mashinalar klasteri deb ataymiz. Har bir mashina, ehtimol Apache-ning bir nechta nusxasini ishlatishi mumkin. Bularning barchasi birgalikda "koinot" deb hisoblanadi va ma'lum taxminlar bilan biz ushbu koinotda klasterdagi mashinalar o'rtasida keng aloqasiz, har bir so'rov uchun noyob identifikatorlarni yaratishimiz mumkinligini ko'rsatamiz.

Sizning klasteringizdagi mashinalar ushbu talablarga javob berishi kerak. (Agar sizda bitta mashinangiz bo'lsa ham, uning soatini NTP bilan sinxronlashtirishingiz kerak.)

  • Mashinalarning vaqtlari NTP yoki boshqa tarmoq vaqt protokoli orqali sinxronlashtiriladi.
  • Mashinalarning xost nomlari bir-biridan farq qiladi, chunki modul xost nomida xost nomini qidirishi va klasterdagi har bir mashina uchun boshqa IP-manzil olishi mumkin.

Operatsion tizim taxminlariga kelsak, biz pidlar (jarayon identifikatorlari) 32 bitga mos keladi deb taxmin qilamiz. Agar operatsion tizim pid uchun 32 bitdan ko'proq ishlatsa, tuzatish ahamiyatsiz, lekin kodda bajarilishi kerak.

Ushbu taxminlarni hisobga olgan holda, biz bir vaqtning o'zida biz boshqa barcha httpd jarayonlaridan klasterdagi har qanday mashinada har qanday httpd jarayonini aniqlashimiz mumkin. Buning uchun mashinaning IP-manzili va httpd jarayonining pidasi etarli. Agar siz ko'p tarmoqli MPM dan foydalansangiz, httpd jarayoni bir vaqtning o'zida bir nechta so'rovlarni bajarishi mumkin. Mavzuni aniqlash uchun biz Apache httpd ichki ishlatadigan ip indeksidan foydalanamiz. Shunday qilib, so'rovlar uchun noyob identifikatorlarni yaratish uchun biz faqat vaqtning turli nuqtalarini ajratishimiz kerak.

Vaqtni ajratish uchun biz Unix vaqt tamg'asi (1970 yil 1-yanvardan boshlab soniya) va 16 bitli hisoblagichdan foydalanamiz. Vaqt tamg'asi faqat bitta soniyali donadorlikka ega, shuning uchun hisoblagich bir soniya davomida 65536 tagacha qiymatni ko'rsatish uchun ishlatiladi. To'rt kishilik (ip_addr, pid, time_stamp, counter) httpd jarayonida boshiga sekundiga 65536 so'rovlarini numaralandırmak uchun etarli bo'ladi. Vaqt o'tishi bilan pidni qayta ishlatish bilan bog'liq muammolar mavjud va hisoblagich bu muammoni engillashtirish uchun ishlatiladi.

Httpd bolasi yaratilganda, hisoblagich (joriy mikrosaniyalar 10 ga bo'lingan) 65536 moduli bilan boshlanadi (bu formulalar ba'zi tizimlarda mikrosaniyadagi taymerlarning past tartibli bitlari bilan ba'zi dispersion muammolarni bartaraf etish uchun tanlangan). Noyob identifikator yaratilganda, vaqt markasi veb-serverga so'rov kelib tushgan vaqt hisoblanadi. Hisoblagich har safar identifikator yaratilganda ko'paytiriladi (va uni ag'darishga ruxsat beriladi).

Yadro har bir jarayon uchun pid hosil qiladi, chunki u jarayonni talab qiladi va pidlarni ag'darishga ruxsat beriladi (ular ko'plab Unixlarda 16-bit, ammo yangi tizimlar 32-bitgacha kengaygan). Shunday qilib, vaqt o'tishi bilan bir xil pid qayta ishlatiladi. Ammo shu soniya ichida qayta ishlatilmasa, bu bizning to'rtburchagimizning o'ziga xosligini yo'q qilmaydi. Ya'ni, biz tizim bir soniya oralig'ida 65536 jarayonni tug'dirmaydi deb taxmin qilamiz (hatto ba'zi Unixlarda 32768 jarayon bo'lishi mumkin, ammo bu ham sodir bo'lmaydi).

Aytaylik, vaqt negadir takrorlanadi. Ya'ni, tizim soati vidalanadi va u o'tgan vaqtni qayta ko'rib chiqadi (yoki u juda oldinga siljiydi, to'g'ri tiklanadi va keyin kelajak vaqtini qayta ko'rib chiqadi). Bunday holda biz pid va vaqt tamg'asini qayta ishlatishimiz mumkinligini osongina ko'rsatishimiz mumkin. Hisoblagich uchun boshlang'ichni tanlash uni engishga yordam beradi. E'tibor bering, biz hisoblagichni ishga tushirishni tasodifiy raqamga aylantirmoqchimiz, lekin ko'pgina tizimlarda mavjud bo'lgan raqamlar mavjud emas ( ya'ni siz rand () ishlata olmaysiz, chunki generatorni urug 'kerak va uni urib bo'lmaydi vaqt bilan, chunki vaqt, hech bo'lmaganda bir soniya rezolyutsiya takrorlandi). Bu mukammal himoya emas.

Himoya qanchalik yaxshi? Sizning mashinalaringizdan biri soniyasiga ko'pi bilan 500 ta so'rovni bajaradi deylik (bu yozuvda juda oqilona yuqori chegaradir, chunki tizimlar odatda statik fayllarni olib tashlashdan ko'proq narsani bajaradi). Buning uchun sizga bir nechta bolalar kerak bo'ladi, bu sizning bir vaqtning o'zida mijozlaringiz qancha bo'lishiga bog'liq. Ammo biz pessimistik bo'lamiz va bitta bola soniyada 500 ta so'rovni bajarishi mumkin deb o'ylaymiz. 500 ta so'rovning ikkita ketma-ketligi bir-biriga mos keladigan 1000 ta boshlang'ich hisoblagich qiymati mavjud. Demak, vaqt (bir soniyada) takrorlansa, bu bola hisoblagich qiymatini takrorlashi va o'ziga xoslik buzilishi ehtimoli 1,5% ni tashkil qiladi. Bu juda pessimistik misol edi va haqiqiy dunyo qadriyatlari bilan bu sodir bo'lish ehtimoli kamroq. Agar sizning tizimingiz hali ham shunday bo'lishi mumkin bo'lsa,ehtimol siz hisoblagichni 32 bit qilishingiz kerak (kodni tahrirlash orqali).

Yozgi kunduzgi tejamkorlik paytida soatni "orqaga qaytarish" sizni tashvishga solishi mumkin. Ammo bu muammo emas, chunki bu erda "har doim" oldinga siljigan UTC ishlatiladi. Shuni esda tutingki, x86 asosidagi Unixlar to'g'ri bo'lishi uchun to'g'ri konfiguratsiyani talab qilishi mumkin - ular anakart soatini UTC-da va to'g'ri kompensatsiya qilish uchun tuzilgan bo'lishi kerak. Ammo shunga qaramay, agar siz NTP-ni ishlatsangiz, u holda UTC vaqti qayta ishga tushirilgandan ko'p o'tmay to'g'ri bo'ladi.

UNIQUE_ID muhit o'zgaruvchisi 144-bitli (32-bitli IP-manzil, 32-bitli pid, 32-bitli vaqt tamg'asi, 16-bitli hisoblagich, 32-bitli ip indekslari) to'rtburchakni alfavit yordamida kodlash orqali tuziladi [A-Za-z0-9 @ -] MIME base64 kodlashiga o'xshash tarzda, 24 ta belgidan iborat. MIME base64 alifbosi aslida [A-Za-z0-9 + /], ammo + va / URL-larda maxsus kodlangan bo'lishi kerak, bu ularni kamroq kerakli qiladi. Barcha qiymatlar tarmoq baytlari tartibida kodlanadi, shunda kodlash turli xil baytlar tartibidagi arxitekturalar bilan taqqoslanadi. Kodlashning haqiqiy buyurtmasi quyidagilardir: vaqt muhri, IP-manzil, pid, hisoblagich. Ushbu buyurtmaning maqsadi bor, lekin shuni ta'kidlash kerakki, dasturlar kodlashni ajratmasligi kerak. Ilovalar butun kodlangan UNIQUE_IDni shaffof bo'lmagan belgi sifatida ko'rib chiqishi kerak,buni faqat tenglik uchun boshqa UNIQUE_ID lar bilan taqqoslash mumkin.

Buyurtma shunday tanlanganki, kelgusida mavjud bo'lgan UNIQUE_ID ma'lumotlar bazasi bilan to'qnashishdan xavotirlanmasdan kodlashni o'zgartirish mumkin bo'ladi. Shuningdek, yangi kodlashlar vaqt tamg'asini birinchi element sifatida saqlashi kerak, aks holda bir xil alifbo va bit uzunligini ishlatishi mumkin. Vaqt markalari asosan tobora ortib borayotgan ketma-ketlik bo'lganligi sababli , klasterdagi barcha mashinalar har qanday so'rovni bajarishni to'xtatadigan va eski kodlash formatidan foydalanishni to'xtatadigan bayroq soniyasiga ega bo'lish kifoya . Keyin ular so'rovlarni davom ettirishlari va yangi kodlashni berishni boshlashlari mumkin.

Biz ushbu muammoni nisbatan ko'chma echim deb bilamiz. Yaratilgan identifikatorlar, aslida, cheksiz umr ko'rish vaqtiga ega, chunki kelajakda identifikatorlar talab qilinadigan darajada uzoqroq bo'lishi mumkin. Aslida klasterdagi mashinalar o'rtasida hech qanday aloqa talab qilinmaydi (faqat NTP sinxronizatsiyasi talab qilinadi, bu esa past narx) va httpd jarayonlari o'rtasida hech qanday aloqa talab qilinmaydi (aloqa yadro tomonidan tayinlangan pid qiymatida aniq emas). Juda aniq vaziyatlarda identifikatorni qisqartirish mumkin, ammo ko'proq ma'lumotni qabul qilish kerak (masalan, har qanday sayt uchun 32-bitli IP-manzil haddan tashqari ko'p, ammo uning o'rnini portativ va qisqa almashtirish mumkin emas).