امیر توحیدی
امیر توحیدی
خواندن ۳ دقیقه·۲ سال پیش

باگ mongoos برای استفاده از قابلیت Read روی کوئری

bug mongoose read
bug mongoose read


وقتی که روی mongodb از قابلیت replica استفاده میشه و به صورت cluster راه اندازی میشه

یک سری قابلیت وجود داره که بر روی درایور های mongodb روی زبان های مختلف ایجاد میشه .

محیطی که من می خوام باگش توضیح بدم شاید برای شما هم ممکنه پیش بیاد روی nodejs و mongoose هست .

&quotnode&quot: &quot14 .17&quot
&quotmongoose&quot: &quot^5.10.9&quot

اتفاقی که میفته روی حالت Cluster شما یک primary برای مجموع سرور ها ایجاد می کنید و بقیه سرور های به نام secondary مشخص می گردد.

در این حالت مسئله ای که پیش میاد شما دو راه برای استفاده از این قابلیت روی nodejs دارید.

یعنی تنظیمات انجام بدید خواندن از روی primary اصلی انجام بشه یا از یکی از Secondary ها .

اول این تنظیمات مشخص کنم

primary :
در این حالت اتفاقی که میفته اطلاعات تنها از روی primary خونده میشه و در صورت مشکل داشتن primary اطلاعات از روی secondary به هیچ وجه خوانده نمی شود.
primary preferred :
در این حالت اطلاعات از روی primary خونده میشه ترجیحا!! در صورت در دسترسی نبودن سراغ Secondary ها میره
secondary :
در این حالت اطلاعات از روی Secondary خونده میشه ( از یکی از Secondary ها) و در صورت در دسترس نبودن هیچ کدام از Secondary ها به هیچ وجه سراغ primary نمیره
secondary preferred :
در این حالت اطلاعات ترجیحا از Secondary ها خونده میشه و در صورت در دسترسی نبود از primary خونده میشه.
nearest :
بر اساس مستندات mongodb بر اساس پینگ و در دسترسی بودن سرور ها یکی از سرور هارو بدون توجه به primary , secondary بودن انتخاب می کنه .

چالش بعدی این هست که بعد از انتخاب این تنظیمات این تنظیمات در کجا به mongoose اطلاع بدیم .

دو راه وجود دارد

  • به صورت کلی readPreferrence بر روی کانشکن اصلی که تنظیم می کنیم مشخص کنیم .
  • بر روی هر کوئری با استفاده .read() این خواندن و نوشتن را مشخص نماییم .

توجه :

ممکن این سوال پیش بیاد چرا روی Secondary که معمولا تعداد بیشتری هستند همیشه برای خواندن استفاده نمی کنیم به این علت که در صورتی که یه کاری در بازه زمانی کوتاه نیاز به بررسی و ثبت در بانک اطلاعات دارد دچار چالش می شویم .

چون اطلاعات بر روی Secondary ها با تاخیر نوشته می شود.

البته برای این چالش این که مطمئن بشیم بر روی Secondary ها نوشته شده است و بعد سراغ ادامه کار بریم هم حالتی وجود دارد که می توانیم بر روی قسمت هایی که insert , update انجام میدیم از writeConcern استفاده کنیم که این اطمینان به ما میده که روی تمام کلاستر ها به صورت صحیح نوشته شده است اما ممکن است روند کارها را دچار اختلال و یا کنید کند.


ادامه مطلب :::

تا اینجا چالش خاصی نبوده همه واضح هست اما یه مشکلی که وجود داره وقتی روی mongoose شما روی کانکشن یه حالتی مانند primary تنظیم کردید و روی کوئری مقدار Secondary را تنظیم کردید اتفاقی که میفته با هر درخواست بر روی Secondary یه درخواست به سمت primary ارسال میشه .

(این باگ به صورت کامل تست و راستی آزمایی شده است )


راهکار :

بعد از بررسی های بسیار راهکاری که تست شد و بر روی پروژه پیاده سازی شد این حالت شد که روی کانکشن اصلی روی Secondary قرار دهیم و محل های چالش بر انگیز که نیاز به اپدیت بودن دیتابیس هست بر روی کوئری مقدار primary را تنظیم کنیم .




mongooseclusternodejsshardtomshardware
امیر توحیدی هستم. برنامه نویس و توسعه دهنده یا هر چیزی که شما بگید. :)
شاید از این پست‌ها خوشتان بیاید