Hướng dẫn docker mongodb replica set - bộ bản sao mongodb docker

Đã đăng vào thg 4 22, 2017 2:44 CH 0 phút đọc 0 phút đọc

Bước 1:

Lấy 1 image mongo về

docker pull mongo

Bước 2:

Tạo 1 network trong docker tên là my-mongo-cluster

docker create network my-mongo-cluster

Bước 3:

Tạo 3 mongo container

docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set

Bước 4: Cài đặt Replication

docker exec -it mongo1 mongo

Tạo 1 bản cài đặt

> config = {
        "_id":"my-mongo-set",
        "members":[
            {
                "_id" : 0,
                "host" : "mongo1:27017"
            },
            {
                "_id" : 1,
                "host" : "mongo2:27017"
            },
            {
                "_id" : "3",
                "host" : "mongo3:27017"
            }
        ]
}

Truyền bản cài đặt vào để thực hiện

> rs.initiate[config]

Nếu hiện ra:

{ "ok" : 1 }

Là cài đặt thành công. Mọi ý kiến hãy để lại bình luận bên dưới. Xin cảm ơn. Video:

All rights reserved

Mongo Replica Set

  • Một Replica Set [một bộ các bản sao] là một nhóm các thể hiện [instance]

    docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    
    6, các thể hiện này lưu trữ bộ dữ liệu [ data set] giống nhau.

  • Trong môi trường product các tính dự phòng và sẵn sàng cao [ redundancy and high available] mà mongo replica set cung cấp là hết sức cần thiết. Không giống như khi chúng ta chạy thử với môi trường

    docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    
    7 hoặc
    docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    
    8 thì có thể chỉ cần một
    docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    
    6 chạy là đủ.

  • Một mongo replica set sẽ chứa các node mang dữ liệu [

    docker exec -it mongo1 mongo
    
    0] và có thể có một node trọng tài [
    docker exec -it mongo1 mongo
    
    1], riêng
    docker exec -it mongo1 mongo
    
    1 không mang dữ liệu nhiệm vụ duy nhất của nó dành cho bình bầu.

  • Trong số các

    docker exec -it mongo1 mongo
    
    0 có duy nhất một node
    docker exec -it mongo1 mongo
    
    4 có quyền ghi dữ liệu. Trong quá trình ghi dữ liệu node primary này ghi lại toàn bộ thay đổi lên dữ liệu của nó vào trong operation log hay còn gọi oplog.

  • Trong

    docker exec -it mongo1 mongo
    
    0 ngoài
    docker exec -it mongo1 mongo
    
    4 sẽ còn lại các
    docker exec -it mongo1 mongo
    
    7 node, các
    docker exec -it mongo1 mongo
    
    8 này sao chép
    docker exec -it mongo1 mongo
    
    9 của primary và thao tác trên bộ dữ liệu của mình, đó là cách các node lưu trữ bộ dữ liệu giống nhau.

  • Automatic Failover: là khi

    docker exec -it mongo1 mongo
    
    4 node down. Các
    docker exec -it mongo1 mongo
    
    8 còn lại sẽ bình bầu để một node lên làm primary. Chúng ta sẽ không thể ghi dữ liệu cho tới khi quá trình này hoàn tất. Replica set có thể tiếp tục phục vụ đọc dữ liệu nếu được cấu hình run on secondaries khi primary offline.

  • Write concern: Mô tả số node cần acknowledge cho việc ghi dữ liệu hoàn tất trước khi việc ghi dữ liệu được thông báo lại phía client là thành công[ default 1].

  • Read Operations [ Trade off]: Có tất cả 5 tùy chọn cho việc đọc dữ liệu và đây là một sự đánh đổi chúng ta nên xem xét để có cấu hình phù hợp với ứng dụng của mình nhất:

    • docker exec -it mongo1 mongo
      
      4: Mặc định luôn là đọc dữ liệu từ node
      docker exec -it mongo1 mongo
      
      4. Multi-document transactions transactions thao tác trên nhiều bản ghi có chứa thao tác đọc phải sử dụng đọc từ primary. Các thao tác trong một transaction cần được thực hiện trên cùng một node. [Transaction vừa có thao tác đọc, ghi cần thao tác trên cùng node B. Không thể đọc trên node B, ghi trên node C].

    • > config = {
              "_id":"my-mongo-set",
              "members":[
                  {
                      "_id" : 0,
                      "host" : "mongo1:27017"
                  },
                  {
                      "_id" : 1,
                      "host" : "mongo2:27017"
                  },
                  {
                      "_id" : "3",
                      "host" : "mongo3:27017"
                  }
              ]
      }
      
      4: Thông thường sẽ đọc từ node primary nhưng nếu primary offline thì có thể đọc từ
      docker exec -it mongo1 mongo
      
      8.

    • docker exec -it mongo1 mongo
      
      7: Luôn đọc từ các node secondaries.

    • > config = {
              "_id":"my-mongo-set",
              "members":[
                  {
                      "_id" : 0,
                      "host" : "mongo1:27017"
                  },
                  {
                      "_id" : 1,
                      "host" : "mongo2:27017"
                  },
                  {
                      "_id" : "3",
                      "host" : "mongo3:27017"
                  }
              ]
      }
      
      7: Mặc định sẽ đọc từ secondaries nhưng nếu không có node nào available thì sẽ đọc từ node primay.

    • > config = {
              "_id":"my-mongo-set",
              "members":[
                  {
                      "_id" : 0,
                      "host" : "mongo1:27017"
                  },
                  {
                      "_id" : 1,
                      "host" : "mongo2:27017"
                  },
                  {
                      "_id" : "3",
                      "host" : "mongo3:27017"
                  }
              ]
      }
      
      8: Sẽ đọc từ node gần nó nhất. Trong mongo replica set. Các node sẽ được lưu trữ trên các Data center khác nhau [ theo thiết kế] thậm chí khác cả khu vực địa lý [ châu Âu, châu Á]. Tùy chọn này sẽ cho phép client lấy dữ liệu từ node nó kết nối mạng nhanh nhất.

  • Nhận xét [quan điểm cá nhân]:

    • Set đọc primary only có thể tăng tải trên node primay [ vừa đọc vừa ghi]. Nếu primary down không chỉ không ghi được dữ liệu lúc này việc đọc dữ liệu cũng tạm thời không thực hiện được [ cho tới khi primary mới lên].

    • > config = {
              "_id":"my-mongo-set",
              "members":[
                  {
                      "_id" : 0,
                      "host" : "mongo1:27017"
                  },
                  {
                      "_id" : 1,
                      "host" : "mongo2:27017"
                  },
                  {
                      "_id" : "3",
                      "host" : "mongo3:27017"
                  }
              ]
      }
      
      4: Vẫn là tăng tải trên primary [ vừa đọc vừa ghi], khắc phục được khi primary down [ sẽ chuyển qua đọc từ secondaries].

    • Nếu đọc từ secondaries giảm tải cho primay node [ lúc này chỉ cần ghi], tuy nhiên có thể xảy ra trường hợp dữ liệu chưa được cập nhật. [ dữ liệu đã thay đổi trên primary nhưng chưa cập nhật trên secondaries]

Run mongo replica set on Docker

  • Phần này mình sẽ chạy thử 1 replica set đơn giản trên docker.

  • Dĩ nhiên trên PC của mình đã cài docker . Kiểm tra đã có image của

    > rs.initiate[config]
    
    0 [ như bên dưới mongo version latest còn product chúng ta sẽ chỉ rõ version nào [bow] ].
    . Kiểm tra đã có image của
    > rs.initiate[config]
    
    0 [ như bên dưới mongo version latest còn product chúng ta sẽ chỉ rõ version nào [bow] ].

    root:~# docker images | grep mongo
    mongo               latest              bcef5fd2979d        4 weeks ago         386MB
    
  • Create network bằng lệnh:

    root:~# docker network create my-mongo-cluster
    
  • Chắc chắn chúng ta đã có:

    root:~# docker network ls | grep my
    d4b0ed47349c        my-mongo-cluster    bridge              local
    
  • Here we go, cùng chạy

    > rs.initiate[config]
    
    1 đầu tiên:

    docker create network my-mongo-cluster
    
    0
    • > rs.initiate[config]
      
      2: Start một container từ một image

    • > rs.initiate[config]
      
      3: đặt tên cho container đầu tiên này là :
      > rs.initiate[config]
      
      1.

    • > rs.initiate[config]
      
      5: thêm container này vào network
      > rs.initiate[config]
      
      6.

    • > rs.initiate[config]
      
      0: file ảnh để chạy các container.

    • > rs.initiate[config]
      
      8: join mongo1 vào replSet có tên
      > rs.initiate[config]
      
      9.

  • Ok! Giờ con thứ 2 và thứ 3 sẽ được chạy [ở đây mình chạy trên 3 cửa sổ terminal khác nhau]:

    docker create network my-mongo-cluster
    
    1
  • Sau khi chạy chúng ta có thể thấy log báo chưa config replSet:

    docker create network my-mongo-cluster
    
    2
  • Cùng kiểm tra ip các container này đã[nếu muốn xem full thông tin network thì bỏ cái grep thôi ]:

    ]:

    docker create network my-mongo-cluster
    
    3
  • Ok thấy ip rồi thì connect vào rồi setup replSet thoai . [ terminal dưới là đang connect vào mongo1 theo IP như show ở trên]

    . [ terminal dưới là đang connect vào mongo1 theo IP như show ở trên]

    docker create network my-mongo-cluster
    
    4
  • Thêm cấu hình cho replica set

    docker create network my-mongo-cluster
    
    5
  • Phần còn lại là start replSet thôi. Vẫn đang trên con mongo1 nhé. Sau khi start replSet nó sẽ chuyển trạng thái Secondary và chờ 1 lát nó sẽ trở thành Primary như dưới.

    docker create network my-mongo-cluster
    
    6
  • Phần dưới đây lần lượt với con mongo2 và mongo3

    docker create network my-mongo-cluster
    
    7
  • Có thể sẽ có câu hỏi tại sao phần này ko thấy expose port ra như 1 số tutorial [?]

    { "ok" : 1 }
    
    0. Mình nghĩ nếu hiểu mô hình triển khai bạn sẽ thấy việc expose port ra hơi thừa.

One more thing [@@]

  • Phần trên đã chạy thành công replica set nhưng nếu gom lại 1 file docker-compose thì sẽ nhanh hơn.

  • Note:

    docker create network my-mongo-cluster
    
    8
  • Mình xóa hết các container trước đó đã tạo đi. Trước:

    docker create network my-mongo-cluster
    
    9
  • Sau:

    docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    
    0
  • Network được tạo ở trên vẫn còn nhé:

    docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    
    1
  • File

    { "ok" : 1 }
    
    1 như dưới:

    docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    
    2
  • Giờ cd vào thư mục chứa file

    { "ok" : 1 }
    
    2 chạy lệnh:
    { "ok" : 1 }
    
    3 lên thôi nếu bị như dưới là chưa có quyền nhé.
    { "ok" : 1 }
    
    4 lên

    docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    
    3
  • Chúng ta sẽ có log ntn:

    docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    
    4
  • Kiểm tra lại các container đã chạy:

    docker run -p 30001:27017 --name mongo1 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30002:27017 --name mongo2 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    docker run -p 30003:27017 --name mongo3 --net my-mongo-cluster  mongo mongod --replSet my-mongo-set
    
    5
  • Kiểm tra lại IP và chạy các lệnh config như phần trên là chúng ta sẽ có replSet trên local để test. Điểm lợi của docker-compose là khi chạy lệnh

    { "ok" : 1 }
    
    5 tự động các container được tạo bởi
    { "ok" : 1 }
    
    3 cũng sẽ bị remove luôn. Gom các cấu hình vào trong file .yml luôn như thế chính xác hơn là chạy lệnh terminal như phần trên.

P/s

  • Phần trên chỉ là note lại phần tìm hiểu của mình về mongo replica set trên docker và thử chạy nó với docker-compose. Vẫn còn tồn tại nhiều vấn đề cần phải thực hiện thêm trước khi chạy product:

    • Bảo mật netowrk với docker [ chỉ các host cụ thể mới truy cập được vào các replica set của mongo]

    • File docker compose nên thêm 1 bước chạy tự động cấu hình - phần trên vẫn đang làm bằng tay[ cái này làm được đã thấy trên mạng có - nhưng chưa thử ]

      ]

    • Định làm nodejs app nhỏ test thử khi primary down và vẫn đọc ghi được sau khi 1 secondary lên.[có thể sẽ bổ sung sau]

    • Bảo mật khi triển khai replica set [ vẫn đang `mongo --host vẫn đang vào thoải mái ]

      ]

    • Happy using docker and mongoDB [F][F][F]

      and mongoDB [F][F][F]

Bài Viết Liên Quan

Chủ Đề