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

داکر
سرور

#1

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

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

سناریو اول

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

سناریو دوم

2

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

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

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

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

با تشکر


#2

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


#3

با تشکر از ما

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

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


#4

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


#5

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

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

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

تشکر از شما


#6

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


#7

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

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


#8

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


#9

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


#10

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


#11

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

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

با تشکر


#12

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

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


#13

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


#14

با تشکر از شما . یه مورد دیگه یادم اومد . الان کانتینر 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


#15

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


#16

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


#17

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


#18

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

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


#19

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

در لینک زیر

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


#20

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

# 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 ثابت داد ولی تا الان نتونستم چیزی پیدا بکنم . نظر شما در این مورد چی هست ؟