برنامه نویسی

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

این آموزش شما را از طریق راه اندازی یک خوشه محلی MongoDB با استفاده از Docker راهنمایی می کند. این مجموعه برای توسعه و آزمایش ایده آل است و محیطی را فراهم می کند که از نزدیک شبیه به استقرار تولید شده تولید شده است.

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

  • Docker نصب شده (https://docs.docker.com/get-docker/)
  • Docker Compose نصب شده (که معمولاً با دسک تاپ Docker گنجانده شده است)
  • درک اساسی مفاهیم Docker و MongoDB (Sharding ، مجموعه های ماکت).
  • یک ویرایشگر متن
  • یک ترمینال یا فرمان سریع.

چرا یک خوشه محلی Sharded؟

  • پشتیبانی معامله: دلیل اصلی این است که هنگام توسعه/آزمایش معامله در MongoDB Basic MongoDB ظروف نمی توانند ظروف کار کنند ، شما به یک خوشه و نه یک گره واحد نیاز دارید.
  • *توسعه واقع بینانه: * منطق برنامه آزمون در برابر یک محیط تابیده.
  • بینش عملکرد: رفتار پرس و جو را در سراسر تکه ها درک کنید.
  • انزوا: از درگیری با پایگاه داده های توسعه مشترک خودداری کنید.

معماری خوشه

ما یک خوشه حداقل Sharded متشکل از:

  1. تنظیم ماکت سرور پیکربندی (1 گره): فروشگاه های ابرداده خوشه ای. (بندر: 27018)
  2. مجموعه ماکت Shard (1 گره): بخشی از داده ها را ذخیره می کند. (بندر: 27019)
  3. روتر Mongos (1 نمونه): نقطه ورود برنامه ها. (بندر: 27017)

تمام مؤلفه ها در یک ظرف داکر واحد اجرا می شوند که توسط یک اسکریپت استارتاپ ارکستر شده است.

مرحله 1: تنظیم پروژه

  1. یک فهرست اختصاصی برای این تنظیم ایجاد کنید. بیایید آن را صدا کنیم mongodb-devبشر

    mkdir mongodb-dev
    cd mongodb-dev
    
  2. درون mongodb-dev، ما پرونده های پیکربندی و اسکریپت لازم را ایجاد خواهیم کرد.

مرحله 2: اسکریپت های اولیه سازی را ایجاد کنید

این پرونده های JavaScript حاوی دستوراتی هستند که توسط mongosh برای اولیه سازی مجموعه های ماکت و ثبت نام Shard.

  1. 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 به عنوان تنها عضو آن

  1. init-shard.js (مجموعه ماکت های شارد را اولیه کنید)

    • یک پرونده به نام ایجاد کنید init-shard.js با محتوای زیر:

      // init-shard.js
      rs.initiate({
        _id: "shard1",
        members: [
          { _id: 0, host: "localhost:27019" }
        ]
      });
      

توضیح: این یک مجموعه ماکت معمولی را آغاز می کند shard1 با mongod نمونه دویدن localhost:27019 به عنوان تنها عضو آن

  1. 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 را بسازیم و ظرف را اجرا کنیم.

  1. تصویر را بسازید:

  2. ظرف را اجرا کنید:

    • تصویر را به عنوان یک ظرف اجرا کنید:

      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.
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. سیاهههای مربوط را بررسی کنید (اختیاری):

*   Press `Ctrl+C` to stop following the logs. You should see messages indicating the successful start and initialization of all components.
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مرحله ششم: اتصال و تأیید

  1. با استفاده از اتصال متصل شوید mongosh:

*   This connects you to the `mongos` router.
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. تأیید وضعیت خوشه:

*   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 فراهم می کند. به یاد داشته باشید که نقشه های پورت ، حجم و تنظیمات را با نیازهای خاص پروژه خود سازگار کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا