سناریو برای میکرو سرویس

درود خدمت دوستان گرامی

من قصد راه اندازی چند میکرو سرویس رو دارم و میخوام به هر کانتینر منبع اختصاص بدم .
nginx / elxir-phoenix / postgres / mail / redis

سناریو اول

کانتینرهای بالا برای ۳ سایت هست
یک کانتینر nginx که بصورت پروکسی معکوس هست جهت هندل کردن درخواست ها به کانتینرهای دیگه
۳ کانتینر nginx دیگه که برای هر سایت جدا هست و با اون۳ کانتینر فونیکس و الکسیر رو که برای هر سایت جدا هست
یک کانتینر email که برای همه سایت ها مشترک هست و احتمالا سرویسی بر اساس php هست .roundcubemail
یک کانتینر redis مشترک برای همه کانتینرها
یک کانتینر دیتابیس مشترک برای همه

سناریو دوم

2

کانتینرهای بالا برای ۳ سایت هست
یک کانتینر nginx که بصورت پروکسی معکوس هست جهت هندل کردن درخواست ها به کانتینرهای دیگه
۳ کانتینر فونیکس و الکسیر رو که برای هر سایت جدا هست
یک کانتینر email که برای همه سایت ها مشترک هست و احتمالا سرویسی بر اساس php هست .roundcubemail
یک کانتینر redis مشترک برای همه کانتینرها
یک کانتینر دیتابیس مشترک برای همه

در سناریو اول من میتونم به هر سایتی که با nginx خودش داره درخواست هاش رو به کانتینر الکسیرمیفرسته منبع اختصاص بدم . همچنین میتونم به بقیه کانتینرها هم منبع اختصاص بدم

در سناریو دوم به هر کانتینر میشه منبع اخصاص داد

سوالم این هست که کدوم سناریو بهتره . از نظر تخصیص منابع . امنیت . کارایی

با تشکر

1 Likes

سلام آیا این سایت ها همه JSON API خروجی میدن یا html از سرور؟ من سناریو دوم را ترجیح میدم چون ساده تره
در سناریو اول nginx برای هرکانتیر کمک خاصی نمیکنه

2 Likes

با تشکر از ما

هم جی سان برای اپلیکیشن
و هم خروجی html می دند برای قسمت سایت
خوده فونیکس که خروجی جی سان می ده جدا هست و با فونیکسی که خروجی html گرافیکی سایت می ده
و به صورت مدل آمبرلا نوشته شده

سناریو دوم بهتر هست . فقط سوالم این هست که برای nginx که داره بعنوان پروکسی عمل میکنه و درخواست ها رو هندل میکنه چقدر منبع نیازه و اینکه ممکنه از سمت یک سایت درخواست های بیشتری بیاد و از سایت دیگه ای هم درخواست های کمتر . ایا تعداد درخواست ها تاثیری زیادی روی منابع دارن که ما بخوایم از کانتینرهای nginx جدا استفاده بکنیم که بخوایم بهشون منبع جداگانه بدیم ؟ یا اینکه بیشتر منابع رو الکسیر استفاده میکنه ؟

Nginx خیلی کم منبع نیاز داره و بسیار performance بالایی داره الیکسیر هم خیلی خوب scale میشه و من از نظر هندل کردن درخواست زیاد نگرانی ندارم
در تجربه من دیتابیس زودتر به مشکل برمیخوره تا app server و webserver
و آن هم بعد ۵۰۰ هزار کاربر یا بیشتر شروع میشه

4 Likes

درود
من استراتژي رو تغییر دادم و به صورت زیر در آوردم

photo_2017-12-08_22-55-51

البته یه کانتینرهای بالا disscourse هم اضافه میشه . فعلا با چیزی که توی عکس مشخص کردم هر کانتینر الکسیر با شبکه داخلی خودش به ۳ کانتینر redis و postgres و email و با شبکه خارجی خودش به کانتینر nginx که همون پروکسی هست کانکت میشه

سوال من این هست که سایت های دیگه هم که به اون ۳ کانتینر با شبکه داخلی خودشون وصل میشن و با شبکه خارجی خودشون هم به nginx کانکت میشن آیا اصلا این شبکه داخلی و خارجی که برای هر کدوم جدا تعریف شده تاثیری داره یا نه ؟ چون بهرحال اینا دارن از سرویسها مشترکا استفاده میکنن

تشکر از شما

1 Likes

در حال حاضر فرقی نداره ولی بعدازظهر بخواهی هر سرویس را روی سرور خودش اجرا کنی مفید میشه
سعی کن در سناریو الان هم هر سرویس در postgresql از دیتابیس مجزای خودش استفاده کنه و فقط سرویس مختص به دیتابیس داده شو تغییر بده
مثلا دیتابیس trangell و فقط سرویس trangell باید دسترسی بهش داشته باشه

2 Likes

من طبق گفته شما به صورت زیر تغییر دادم . البته یک سرویس دیگه هم اضافه شده . برای ردیس هم دوتا مجاز در نظر گرفتم

اگر درست متوجه شده باشم . منظورتون از اجرای هر سرویس روی سرور خودش یعنی خارج در سرورهای مختلف با طریق public ip به هم وصل میشن ؟

2 Likes

بله این طور که شما الان تغییر دادین بسیار خوبه و در ساخت مایکروسرویس ها تشویق میشه
بله شما درست متوجه شدید

2 Likes

با توجه به شبکه هایی که جدا شده اگر من سرویس nginx رو هم برای هر سایت جدا کنم و هر سایت با سرویس های اون رو بوسیله داکر ماشین داخل یک vm قرار بدم چطوره ؟ که بعدا با استفاده از حالت swarm برای بالانس کردن مدیریت بهتر استفاده کنم . البته اگر درست گفته باشم

بله اگر در اتوماتیک کردن رفع خطا ویا بالانس کردن مدیریت به شما کمک میکنه حتما انجام بدین.

2 Likes

تغییراتی در سرویس ها و شبکه انجام دادم

اگر مشکلی وجود داره لطف کنید و عنوان کنید

با تشکر

2 Likes

سلام
بر اساس نیازی که داشتیم شبکه بندی تغییر کرده و به صورت زیر شده

اگر مشکلی در شبکه بندی بالا وجود داره لطف کنید بیان کنید
یه موردی برام پیش اومده در تصویر بالا
کانتینر nginx به کانتینر email متصل هست به این دلیل که درسته به صورت مستقیم توی یک شبکه نیستن ولی غیر مستقیم با هم شبکه هستن .
سوال من این هست که آیا با این مورد که گفتم از طریق کانتینر nginx میشه به کانتینر USER دسترسی پیدا کرد ؟
آیا چنین چیزی اصلا امکان داره ؟ اگر امکان داره چطور جلوش رو میشه گرفت

خیر نمیشه API Gateway هدفش جدا کردن حریم عمومی با حریم service های داخلیه مثل user
دسترسی به user فقط توسط API باید صورت بگیره

1 Likes

با تشکر از شما . یه مورد دیگه یادم اومد . الان کانتینر nginx به ۳ کانتینر دیگه وصل میشه .

کدوم حالت برای تعریف شبکه درسته ؟
حالت اول
nginx
172.10.1.1
172.10.2.1
172.10.3.1

HTML
172.10.1.2

Email
172.10.2.2

Disourse
172.10.3.2

========================================
حالت دوم

Nginx
172.10.1.1

HTML
172.10.1.2

Email
172.10.1.3

Disourse
172.10.1.4

1 Likes

من حالت دوم ترجیح میدم چون ساده تره

1 Likes

آیا حالت دوم ایزوله بودن شبکه رو از بین نمیبره ؟

1 Likes

بله حق با شماست حواسم نبود . حالت اول بهتره

1 Likes

من سوالات یکی یکی یادم میاد ببخشید :sweat_smile: . باز بعدا همه رو در پست اول قرار میدم با جوابش که خوندش راحت تر بشه

با توجه به حالت اول . چون شبکه های زیادی باید تعریف بشه و فایل داکر کمپوز شلوغ میشه .
اگر من برای شبکه یک فایل جدا درست کنم بهتر هست ؟
اگر این کارو انجام بدم زمانیکه سرور به هر دلیلی ریبوت بشه بعد از ران شدن سرویس داکر
آیا اول شبکه درست میشه و بعد سرویس های کانتینر بالا میاد یا اینکه شبکه اصلا پاک نمیشه تا زمانیکه ما حذف نکردیم ؟

کمی سرچ زدم . ظاهرا نمیشه شبکه رو از داکر کمپوز جدا کرد و جداگانه در یک فایل دیگه با دکر کمپوز ساخت . فقط میشه به صورت کلی برای حالت production و developer فایل های داکر کمپوز جدا ساخت .

در لینک زیر

گفتن که بهتره از شل اسکریپت استفاده بشه با همون دستور
docker network create همه رو پشت هم بزاریم و تا برامون شبکه ها رو درست بکنه . فکر کنم این حالت دردسرش کمتر باشه :sweat_smile:
قاعدتا با این حالت دیگه سرور ریبوت هم بشه شبکه از بین نمیره . بقیه سرویس ها هم که حالت استارت مجددا دارن بر اساس تنظیماتی که انجام میشه و در کل نباید مشکلی پیش بیاد

دوباره سرچ زدم دیدم مورد بالا که نوشته بودم اشتباه بود و میشه تنظیمات شبکه و یا حتی تنظیمات دیگه رو یک فایل داکر کمپوز جدا ساخت به این صورت

# docker-compose.yml
version: "3"

services:
  nginx:
    image: mojtabanaserei/nginx:1.15.4
    container_name: nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf/:/etc/nginx/
      - ./nginx/html/:/var/www/html/

و برای شبکه هم به این صورت

# docker-compose.override.yml
version: '3'
services:
  nginx:
    networks:
      nginx_to_email:
        ipv4_address: 172.20.0.2


networks:
  nginx_to_email:
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/24 

اجرا به صورت زیر
sudo docker-compose -f docker-compose.yaml -f docker-compose.override.yaml up -d

البته چون اسم فایل ها رو به صورت پیشفرض داکر میدونه میشه به صورت ساده تر از این دستور استفاده کرد
sudo docker-compose up -d

اینجوری هم فایل اصلی شلوغ نمیشه و مدیریتش راحت تره
================================================================
اون مورد که گفته بودم رو هم تست کردم
شبکه هایی که میخواستم رو توی یک شل اسکریپت گزاشتم و همه رو ساختم . شبکه ها رو در فایل داکر کمپوز به کانتینرها اختصاص دادم . فقط مشکلم این بود که موردی پیدا نکردم که بتونم به هر کانتینر ip ثابت بدم تا زمانیکه سرور ریبوت میشه ip اونا عوض نشه ولی خارج از داکر کمپوز میتونیم کانینتر رو با شبکه ای که قبلا ساختیم ران کنیم و بهش ip ثابت هم بدیم

sudo docker network create test --subnet 172.20.0.0/24
sudo docker run  -exec -it --net test --ip 172.20.0.22  alpine:3.8 ash

وقتی حالت بالا امکان پذیر هست پس یه راهی باید باشه تا بشه توی داکر کمپوز هم به کانتینر ip ثابت داد ولی تا الان نتونستم چیزی پیدا بکنم . نظر شما در این مورد چی هست ؟

1 Likes