Kết nối cụm mongodb

Như các bạn đã biết, mongodb là một nền tảng không có quan hệ rất nổi tiếng (NoSQL). Thay vì sử dụng các bảng có thuộc tính cố định, mongodb lưu trữ dữ liệu dưới dạng tài liệu, dạng khóa-giá trị, mongodb cũng hỗ trợ tỷ lệ ngang khi prod lớn lên. Trong bài này mình sẽ hướng dẫn các bạn setup cluster theo phong cách mi ăn liền

  Thao tác với MongoDB trong các ứng dụng Java

  Xây dựng cụm cơ sở dữ liệu bằng MongoDB ( Xây dựng cụm cơ sở dữ liệu với MongoDB )

Trước khi bắt đầu, các bạn hãy nhìn qua hình dưới đây là cách mà mongo cluster hoạt động

Kết nối cụm mongodb
Kết nối cụm mongodb

Nhìn vào hình trên cụm bao gồm 3 phần chính

  • mảnh vỡ. Mỗi phân đoạn chứa biến thể một tập tin nhỏ dữ liệu đã được phân đoạn, từ phiên bản 3. 6 trở lên, các phân đoạn phải được cấu hình để chạy bản sao nếu muốn trở thành một phần của cụm
  • cầy mangut. Đây thực chất là một bộ định tuyến truy vấn, cung cấp một giao diện tương tác giữa ứng dụng và các cụm phân đoạn
  • máy chủ cấu hình. Máy chủ cấu hình chứa biến siêu dữ liệu và cấu hình cho cụm, từ phiên bản 3. 4 trở lên máy chủ cấu hình phải triển khai bản sao định dạng dưới đây

Chuẩn bị

Dễ   các đặc điểm chúng ta cần phải chuẩn bị đủ ba phần của cụm, bao gồm 2 máy chủ cấu hình, 1 máy chủ bộ định tuyến truy vấn và . Đối với shard mình sẽ sử dụng 2 server chạy replicaset, mặc dù có thể sử dụng docker để nén lại nhưng làm như vậy sẽ mất tổng quan và mất dữ liệu.

Trước khi bắt đầu, chúng ta phải chuẩn bị mongo-keyfile. Mongo keyfile thứ giúp các máy chủ xác định là chúng nó là gà cùng một mẹ. Mình sẽ chỉ xác thực bằng mongo-keyfile để cho nó đơn giản, nếu các bạn muốn xác thực bằng cả tên người dùng và mật khẩu thì trên 2 con server config, và 2 con server để tạo 1 shard các bạn sử dụng mongo shell để tạo username và password cho . Trên cả 4 con server mà bạn chạy các lệnh sau

mongo
# lệnh trên dùng mongo shell để kết nối tới server, vì lúc đầu chưa # có username hay password gì cả nên bạn sẽ vào đượcuse admin
# lệnh trên dùng database admin,để lưu trữ những user mà ta sẽ tạo 
# phía saudb.createUser({user: "mongo-admin", pwd: "123", roles:[{role: "root", db: "admin"}]})
# lệnh trên tạo ra một user có username là "mongo-admin" và password # là "123" trên và có vai trò là root của database có tên là admin

To create key file you use command

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
1

Sau khi tạo keyfile, hãy sao chép chúng lên trên cả 5 máy chủ, đặt trong

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
2 và phân quyền cho tệp đó, chỉ phân quyền cho tệp đó

# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile

Để cho đơn giản của mình giả sử bạn có 5 máy chủ có ip và cổng mở như bên dưới. Chúng đều có thể kết nối với nhau

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017

Sau đó bắt đầu, chúng ta sẽ bắt đầu thiết lập cấu hình máy chủ chạy replicatSet trước

BƯỚC 1. CẤU HÌNH CÀI ĐẶT MÁY CHỦ

Chui vào cả hai máy chủ cấu hình. Edit file nội dung /etc/mongod. conf back sao cho đúng, cho nó bindIp đúng với ip của nó và trường bổ sung xác thực nhau bằng mongo-keyfile ,

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
3 và trong tệp đó. Ngoài ra thêm 
# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
4 cho cả hai máy chủ, tệp nội dung có thêm một số trường như bên dưới. Bảo đảm là các bạn đã thực hiện trên hai máy chủ conf1 và conf2

port: 27017
  bindIp: 100.100.100.101security: 
  authorization: enabled
  keyFile: /opt/mongo/mongo-keyfilereplication:
  replSetName: configReplSetsharding:
  clusterRole: "configsvr"

Sau đó bạn hãy bắt đầu mongod trên 2 máy chủ cấu hình

________số 8

Sau đó used to connect to 1 in two con config server, to connect 2 con back with nhau

mongo 100.100.100.101:27017 -u mongo-admin -p 123 --authenticationDatabase admin

Mongo shell from you run next command after

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
0

Nếu bạn làm đúng như vậy thì sẽ nhận được một thông báo bên dưới báo hiệu 2 máy chủ cấu hình của chúng ta đã có sẵn để chạy replicaSet

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
1

To check status of 2 con server you run command

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
2

Nếu kết quả như bên dưới, chúng tôi chúc mừng bạn đã thiết lập thành công máy chủ cấu hình

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
3

BƯỚC 2. CÁI ĐẶT QUERY ROUTER

Trong bước này, chúng ta sẽ cài đặt bộ định tuyến truy vấn MongoDB, nó sẽ thu thập thông tin siêu dữ liệu từ các máy chủ cấu hình, lưu vào bộ nhớ cache và ứng dụng để gửi các yêu cầu đã đọc đến các phân đoạn chính xác. Bộ định tuyến truy vấn cài đặt thực chất đang chạy một tiến trình 

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
5 ta có thể đăng ký nó như một dịch vụ systemd. Nhưng trước hết phải tạo file config cho mongos , file config cho mongos đặt ở 
# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
6

# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile
0

Sau đó ta sẽ đăng ký 

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
5 với systemd. Tạo tệp 
# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
8 với nội dung như bên dưới

# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile
1

Để mongos chạy thì phải tắt phải mongod tránh trường hợp dữ liệu confic, sau khi tắt thì phải bật dịch vụ mongos đó và khởi động nó. Tiếp theo là kiểm tra trạng thái của mongos

# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile
2

Nếu bạn làm đúng như trên thì đầu ra sẽ tương tự như bên dưới

# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile
3

Vì vậy, bạn đã thiết lập thành công 

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
9

Tìm việc hấp dẫn cơ sở dữ liệu tại TopDev

Tìm việc MongoDB lương cao cho bạn

BƯỚC 3. THÊM SHARD VÀO MÁY CHỦ

Trước khi add shard vào server thì các bân hãy setup 2 con server còn lại để chúng nó chạy replicaSet với nhau. Setup giống hoàn toàn so với config server only are in file config. Thay vì vai trò của nó là config server thì vai trò của nó là “shardsvr” còn tên replicaSet thì để nguyên cũng được, không thì các bạn đổi tùy chọn nhé. Còn IP thì các bạn bind cho đúng

  • 300. 300. 300. 301
  • 300. 300. 300. 302
# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile
4

Sau khi setup xong 2 con server chạy replicaSet thì mình sẽ tiến hành đưa nó vào shard

Từ một trong hai máy chủ vừa thiết lập mới đó (hoặc ở đâu cũng được), bạn hãy kết nối đến bộ định tuyến truy vấn

# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile
5

Sau khi kết nối thành công, các bạn chạy lệnh sau để thêm shard chúng ta vừa mới tạo ra để đưa nó vào cụm. Giả sử sử dụng lúc các bạn setup shard chạy replicaSet với tên là rs999

# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile
6

Tại thời điểm này, các bạn đã thiết lập thành công cụm. Để kiểm tra xem liệu nó có hoạt động hay không, các bạn hãy kết nối từ máy của mình tới máy chủ bộ định tuyến truy vấn

Nếu kết nối được, chúng tôi sẽ thử kích hoạt tính năng sharding ở tầng cơ sở dữ liệu

# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile
7

Sau đó từ mongo shell, mình sẽ tạo một cơ sở dữ liệu có tên là demo và kích hoạt sharding trên cơ sở dữ liệu demo

# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile
8

Để kiểm tra rằng công việc sharding đã thành công mình chuyển qua cấu hình cơ sở dữ liệu, nơi chứa thông tin của hệ thống

# sudo mkdir /opt/mongo
# tạo folder nếu chưa có# sudo mv ~/mongo-keyfile /opt/mongo
# nếu bạn dùng SSH để copy thì nhớ copy vào /opt/mongo # lệnh bên dưới chmod 400 set quyền chỉ đọc cho người sở hữu còn lại # thì không có quyền hạn gì cả
sudo chmod 400 /opt/mongo/mongo-keyfile# lệnh dưới gán quyền sở hữu cho mongodb, kết hợp với lệnh trên thì chỉ có mongodb mới có quyền đọc( ngoại lệ đối với root, root là full quyền)
sudo chown mongodb:mongodb /opt/mongo/mongo-keyfile
9

Nếu kết quả trả về như bên dưới thì chúc mừng bạn đã thành công

# 2 config server mình sẽ gán nó là conf1:27017 và conf2:27017
- 100.100.100.101:27017
- 100.100.100.102:27017
# 1 con router server mình sẽ gán nó à router:27017
- 200.200.200.200:27017
# 2 con server để tạo ra một con shard chạy replicaset mình sẽ gán   luôn là shard1
- 300.300.300.301:27017
- 300.300.300.302:27017
0

Các bạn hãy thử tạo một số tài liệu để thực hiện các thao tác tìm, cập nhật, xóa cụm xem của chúng ta hoạt động ổn định nhé. Còn về phần mình, đã khuya rồi mình xin đừng viết đây, sáng mai còn phải đi về chợ phơi hàng ra bán nữa. v

Trong tương lai, mình sẽ tìm hiểu các kỹ thuật sharding và hi vọng sẽ có nhưng điều thú vị để viết về và chia sẻ, cảm ơn các bạn đã đọc bài viết