ساخت یک خوشه محلی MongoDB با Docker

این آموزش شما را از طریق راه اندازی یک خوشه محلی MongoDB با استفاده از Docker راهنمایی می کند. این مجموعه برای توسعه و آزمایش ایده آل است و محیطی را فراهم می کند که از نزدیک شبیه به استقرار تولید شده تولید شده است.
مخاطبان هدف: توسعه دهندگان نیاز به یک نمونه محلی و مونگودب.
پیش نیازها:
- Docker نصب شده (https://docs.docker.com/get-docker/)
- Docker Compose نصب شده (که معمولاً با دسک تاپ Docker گنجانده شده است)
- درک اساسی مفاهیم Docker و MongoDB (Sharding ، مجموعه های ماکت).
- یک ویرایشگر متن
- یک ترمینال یا فرمان سریع.
چرا یک خوشه محلی Sharded؟
- پشتیبانی معامله: دلیل اصلی این است که هنگام توسعه/آزمایش معامله در MongoDB Basic MongoDB ظروف نمی توانند ظروف کار کنند ، شما به یک خوشه و نه یک گره واحد نیاز دارید.
- *توسعه واقع بینانه: * منطق برنامه آزمون در برابر یک محیط تابیده.
- بینش عملکرد: رفتار پرس و جو را در سراسر تکه ها درک کنید.
- انزوا: از درگیری با پایگاه داده های توسعه مشترک خودداری کنید.
معماری خوشه
ما یک خوشه حداقل Sharded متشکل از:
- تنظیم ماکت سرور پیکربندی (1 گره): فروشگاه های ابرداده خوشه ای. (بندر: 27018)
- مجموعه ماکت Shard (1 گره): بخشی از داده ها را ذخیره می کند. (بندر: 27019)
- روتر Mongos (1 نمونه): نقطه ورود برنامه ها. (بندر: 27017)
تمام مؤلفه ها در یک ظرف داکر واحد اجرا می شوند که توسط یک اسکریپت استارتاپ ارکستر شده است.
مرحله 1: تنظیم پروژه
-
یک فهرست اختصاصی برای این تنظیم ایجاد کنید. بیایید آن را صدا کنیم
mongodb-dev
بشرmkdir mongodb-dev cd mongodb-dev
-
درون
mongodb-dev
، ما پرونده های پیکربندی و اسکریپت لازم را ایجاد خواهیم کرد.
مرحله 2: اسکریپت های اولیه سازی را ایجاد کنید
این پرونده های JavaScript حاوی دستوراتی هستند که توسط mongosh
برای اولیه سازی مجموعه های ماکت و ثبت نام Shard.
-
init-replica.js
.-
یک پرونده به نام ایجاد کنید
init-replica.js
با محتوای زیر:// init-replica.js rs.initiate({ _id: "configReplSet", configsvr: true, members: [ { _id: 0, host: "localhost:27018" } ] });
-
توضیح: این مجموعه ای از ماکت را آغاز می کند configReplSet
، آن را به عنوان یک سرور پیکربندی علامت گذاری می کند (configsvr: true
) ، و اضافه می کند mongod
نمونه دویدن localhost:27018
به عنوان تنها عضو آن
-
init-shard.js
(مجموعه ماکت های شارد را اولیه کنید)-
یک پرونده به نام ایجاد کنید
init-shard.js
با محتوای زیر:// init-shard.js rs.initiate({ _id: "shard1", members: [ { _id: 0, host: "localhost:27019" } ] });
-
توضیح: این یک مجموعه ماکت معمولی را آغاز می کند shard1
با mongod
نمونه دویدن localhost:27019
به عنوان تنها عضو آن
-
init-router.js
(اضافه کردن Shard به خوشه)
توضیح: این دستور ، در مقابل mongos
روتر ، خوشه را در مورد shard1
مجموعه ماکت واقع در localhost:27019
بشر
مرحله 3: Dockerfile را ایجاد کنید
این پرونده تصویر Docker را برای خوشه ما تعریف می کند.
-
یک پرونده به نام ایجاد کنید
Dockerfile
(بدون پسوند) با محتوای زیر:# Dockerfile FROM mongo:latest # Create necessary directories RUN mkdir -p /data/configdb /data/shard1 /scripts # Copy initialization scripts COPY init-replica.js /scripts/ COPY init-shard.js /scripts/ COPY init-router.js /scripts/ # Copy the startup script COPY start-cluster.sh /scripts/ RUN chmod +x /scripts/start-cluster.sh # Expose ports (Router, Config Server, Shard) EXPOSE 27017 27018 27019 # Set the working directory (optional) WORKDIR / # Command to run when the container starts CMD ["/scripts/start-cluster.sh"]
توضیح:
* از رسمی استفاده می کند mongo
تصویر به عنوان یک پایه.
* دایرکتوری هایی را برای پرونده های پایگاه داده ایجاد می کند (/data/*
) و اسکریپت ها (/scripts
).
* ما را کپی می کند .js
اسکریپت های اولیه سازی و فیلمنامه راه اندازی (هنوز ایجاد نمی شود) به /scripts
بشر
* اسکریپت استارتاپ را اجرایی می کند.
* پورت ها را برای روتر ، سرور پیکربندی و Shard در معرض دید قرار می دهد.
* دستور را برای اجرای start-cluster.sh
اسکریپت هنگام راه اندازی کانتینر.
مرحله 4: اسکریپت استارتاپ را ایجاد کنید
این اسکریپت شروع و اولیه سازی کلیه اجزای mongoDB را در ظرف ایجاد می کند.
-
یک پرونده به نام ایجاد کنید
start-cluster.sh
با محتوای زیر:#!/bin/bash # start-cluster.sh echo "Starting config server (configReplSet)..." mongod --configsvr --replSet configReplSet --port 27018 --dbpath /data/configdb --fork --logpath /data/configdb/config.log # Wait for config server to be ready echo "Waiting for config server..." until mongosh --port 27018 --eval "db.adminCommand('ping')" &> /dev/null; do sleep 2 done echo "Config server is ready." echo "Initializing config server replica set..." mongosh --port 27018 < /scripts/init-replica.js echo "Config server replica set initialized." echo "Starting shard server (shard1)..." mongod --shardsvr --replSet shard1 --port 27019 --dbpath /data/shard1 --fork --logpath /data/shard1/shard1.log # Wait for shard server to be ready echo "Waiting for shard server..." until mongosh --port 27019 --eval "db.adminCommand('ping')" &> /dev/null; do sleep 2 done echo "Shard server is ready." echo "Initializing shard replica set..." mongosh --port 27019 < /scripts/init-shard.js echo "Shard replica set initialized." echo "Starting router (mongos)..." mongos --configdb configReplSet/localhost:27018 --port 27017 --bind_ip_all --fork --logpath /data/mongos.log # Wait for router to be ready echo "Waiting for router..." until mongosh --port 27017 --eval "db.adminCommand('ping')" &> /dev/null; do sleep 2 done echo "Router is ready." echo "Adding shard to the cluster via router..." mongosh --port 27017 < /scripts/init-router.js echo "Shard added." echo "Cluster setup complete. Tailing mongos log..." # Keep container running by tailing a log file tail -f /data/mongos.log
توضیح:
* شروع می شود mongod
به عنوان یک سرور پیکربندی (--configsvr
) ، آن را به configReplSet
، در بندر 27018 گوش می دهد ، داده ها را ذخیره می کند /data/configdb
، و چنگال به پس زمینه (--fork
).
* منتظر می ماند تا سرور به پینگ پاسخ دهد.
* تنظیم ماکت سرور پیکربندی با استفاده از mongosh
وت init-replica.js
بشر
* شروع می شود mongod
به عنوان یک سرور Shard (--shardsvr
) ، آن را به shard1
، در بندر 27019 گوش می دهد ، داده ها را ذخیره می کند /data/shard1
، و چنگال.
* منتظر سرور Shard است.
* تنظیم ماکت Shard را با استفاده از mongosh
وت init-shard.js
بشر
* شروع می شود mongos
(روتر) ، آن را به مجموعه ماکت پیکربندی متصل می کند (--configdb configReplSet/localhost:27018
) ، گوش در پورت 27017 ، به همه رابط ها متصل می شود (--bind_ip_all
) بنابراین از خارج از ظرف و چنگال ها در دسترس است.
* منتظر روتر است.
* با استفاده از قطعه به خوشه اضافه می کند mongosh
به روتر وصل شده و init-router.js
بشر
* استفاده می کند tail -f
در mongos
پرونده را به عنوان اصلی ترین فرآیند برای نگه داشتن ظرف وارد کنید.
مرحله 5: خوشه را بسازید و اجرا کنید
اکنون می توانیم تصویر Docker را بسازیم و ظرف را اجرا کنیم.
-
تصویر را بسازید:
-
ظرف را اجرا کنید:
-
تصویر را به عنوان یک ظرف اجرا کنید:
docker run -d --name mongo-cluster-dev \ -p 27017:27017 \ -p 27018:27018 \ -p 27019:27019 \ local-mongo-cluster
-
* **Explanation:**
* `-d`: Run in detached (background) mode.
* `--name mongo-cluster-dev`: Give the container a convenient name.
* `-p :`: Map ports from your host machine to the container. We map all three for potential direct access/debugging, but only 27017 (mongos) is essential for application connection.
* `local-mongo-cluster`: The name of the image to run.
-
سیاهههای مربوط را بررسی کنید (اختیاری):
* Press `Ctrl+C` to stop following the logs. You should see messages indicating the successful start and initialization of all components.
مرحله ششم: اتصال و تأیید
-
با استفاده از اتصال متصل شوید
mongosh
:
* This connects you to the `mongos` router.
-
تأیید وضعیت خوشه:
* This command should show information about the sharded cluster, including the `configReplSet`, the `shard1` shard, and databases.
استفاده از آهنگسازی Docker (ادغام)
در حالی که docker run
فرمان کار می کند ، این کار را در یک docker-compose.yaml
پرونده اغلب برای برنامه های چند سرویس عملی تر است.
در نظر گرفتن a dev.docker-compose.yaml
در فهرست اصلی پروژه خود:
# dev.docker-compose.yaml (Example Snippet)
volumes:
mongodb_data:
name: mongodb_cluster_data # Use a named volume for persistence
services:
mongodb-cluster:
build:
context: ./mongodb-dev # Path to the directory containing the Dockerfile
dockerfile: Dockerfile
container_name: mongodb-cluster
ports:
- "27017:27017" # Expose router port to host
# - "27018:27018" # Optional: Expose config server
# - "27019:27019" # Optional: Expose shard
volumes:
- mongodb_data:/data # Mount named volume to persist data
# Add healthcheck, restart policy etc. as needed
# healthcheck:
# test: ["CMD", "mongosh", "--port", "27017", "--eval", "db.adminCommand('ping')"]
# interval: 20s
# timeout: 10s
# retries: 5
# start_period: 30s
# restart: unless-stopped
# Example application service
my-app:
build: . # Or specify app context/dockerfile
ports:
- "8080:8080"
environment:
# Connect using the service name 'mongodb-cluster'
- DATABASE_URL=mongodb://mongodb-cluster:27017/myappdb
depends_on:
mongodb-cluster:
# condition: service_healthy # Use if healthcheck is defined
condition: service_started # Basic dependency
-
برای اجرای با آهنگسازی:
docker compose -f dev.docker-compose.yaml up -d
-
برای متوقف کردن:
docker compose -f dev.docker-compose.yaml down
(اضافه کردن
-v
بهdown
برای حذفmongodb_data
حجم)
پایان
شما با موفقیت با استفاده از Docker یک خوشه محلی Sharded MongoDB محلی ساخته و اجرا کرده اید. این تنظیم ابزاری ارزشمند برای توسعه و آزمایش برنامه های طراحی شده برای محیط های Sharded فراهم می کند. به یاد داشته باشید که نقشه های پورت ، حجم و تنظیمات را با نیازهای خاص پروژه خود سازگار کنید.