Đã đă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]
6, các thể hiện này lưu trữ bộ dữ liệu [ data set] giống nhau.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
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
7 hoặcdocker 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ộtdocker 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à đủ.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
Một mongo replica set sẽ chứa các node mang dữ liệu [
0] và có thể có một node trọng tài [docker exec -it mongo1 mongo
1], riêngdocker 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.docker exec -it mongo1 mongo
Trong số các
0 có duy nhất một nodedocker 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.docker exec -it mongo1 mongo
Trong
0 ngoàidocker exec -it mongo1 mongo
4 sẽ còn lại cácdocker exec -it mongo1 mongo
7 node, cácdocker exec -it mongo1 mongo
8 này sao chépdocker 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.docker exec -it mongo1 mongo
Automatic Failover: là khi
4 node down. Cácdocker 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.docker exec -it mongo1 mongo
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:
4: Mặc định luôn là đọc dữ liệu từ nodedocker 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].docker exec -it mongo1 mongo
4: Thông thường sẽ đọc từ node primary nhưng nếu primary offline thì có thể đọc từ> config = { "_id":"my-mongo-set", "members":[ { "_id" : 0, "host" : "mongo1:27017" }, { "_id" : 1, "host" : "mongo2:27017" }, { "_id" : "3", "host" : "mongo3:27017" } ] }
8.docker exec -it mongo1 mongo
7: Luôn đọc từ các node secondaries.docker exec -it mongo1 mongo
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.> config = { "_id":"my-mongo-set", "members":[ { "_id" : 0, "host" : "mongo1:27017" }, { "_id" : 1, "host" : "mongo2:27017" }, { "_id" : "3", "host" : "mongo3:27017" } ] }
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].
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].> config = { "_id":"my-mongo-set", "members":[ { "_id" : 0, "host" : "mongo1:27017" }, { "_id" : 1, "host" : "mongo2:27017" }, { "_id" : "3", "host" : "mongo3:27017" } ] }
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
0 [ như bên dưới mongo version latest còn product chúng ta sẽ chỉ rõ version nào [bow] ].> rs.initiate[config]
. Kiểm tra đã có image của
0 [ như bên dưới mongo version latest còn product chúng ta sẽ chỉ rõ version nào [bow] ].> rs.initiate[config]
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
1 đầu tiên:> rs.initiate[config]
0docker create network my-mongo-cluster
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.> rs.initiate[config]
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]:
1docker create network my-mongo-cluster
Sau khi chạy chúng ta có thể thấy log báo chưa config replSet:
2docker create network my-mongo-cluster
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 ]:
]:
3docker create network my-mongo-cluster
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]
4docker create network my-mongo-cluster
Thêm cấu hình cho replica set
5docker create network my-mongo-cluster
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.
6docker create network my-mongo-cluster
Phần dưới đây lần lượt với con mongo2 và mongo3
7docker create network my-mongo-cluster
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 [?]
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.{ "ok" : 1 }
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:
8docker create network my-mongo-cluster
Mình xóa hết các container trước đó đã tạo đi. Trước:
9docker create network my-mongo-cluster
Sau:
0docker 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
Network được tạo ở trên vẫn còn nhé:
1docker 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
File
1 như dưới:{ "ok" : 1 }
2docker 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
Giờ cd vào thư mục chứa file
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{ "ok" : 1 }
3docker 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
Chúng ta sẽ có log ntn:
4docker 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
Kiểm tra lại các container đã chạy:
5docker 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
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
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.{ "ok" : 1 }
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]