Giới thiệu về Sharding
Sharding trong MongoDB là một kỹ thuật lưu trữ và xử lý dữ liệu, cho phép chia nhỏ dữ liệu ra thành nhiều phần (shards) và phân tán chúng trên nhiều máy chủ khác nhau. Điều này giúp tăng khả năng mở rộng quy mô của cơ sở dữ liệu, cải thiện hiệu suất và đảm bảo tính khả dụng cao.
Khi sử dụng sharding, dữ liệu sẽ được chia nhỏ thành nhiều phần dựa trên một trường nhất định (shard key), và mỗi phần sẽ được lưu trữ trên một shard riêng biệt. MongoDB sẽ tự động phân phối dữ liệu giữa các shards, đồng thời cung cấp một lớp trừu tượng để người dùng có thể tương tác với dữ liệu như thể chúng vẫn nằm trong một cơ sở dữ liệu duy nhất.
Quá trình sharding trong MongoDB bao gồm các thành phần chính sau:
- Shards: Là các phân đoạn dữ liệu, mỗi shard chứa một phần của dữ liệu.
- Shard Key: Là trường dữ liệu được sử dụng để chia nhỏ dữ liệu, dựa trên giá trị của trường này, MongoDB sẽ quyết định đặt một tài liệu vào shard nào.
- Mongos: Đóng vai trò là router, nhận các truy vấn từ ứng dụng và điều phối chúng đến các shards thích hợp.
- Config Servers: Lưu trữ các metadata về cluster sharding, bao gồm thông tin về các shards và cách phân phối dữ liệu giữa chúng.
Sharding giúp gia tăng khả năng mở rộng quy mô của MongoDB bằng cách cho phép thêm nhiều máy chủ để lưu trữ dữ liệu. Nó cũng cải thiện hiệu suất bằng cách phân tán tải trên nhiều máy chủ, giảm bớt áp lực trên một máy chủ duy nhất. Tuy nhiên, sharding cũng đem lại một số phức tạp nhất định, vì vậy bạn cần cân nhắc kỹ lưỡng trước khi quyết định sử dụng nó cho dự án của mình.
Chuẩn bị
Trước khi bắt đầu, bạn cần cài đặt Docker và Docker Compose trên máy của mình. Sau đó, tạo một thư mục mới và di chuyển vào thư mục đó.
Tạo Docker Compose file
- Tạo một file mới có tên
docker-compose.yml
1nano docker-compose.yml - Thêm cấu hình sau vào file
docker-compose.yml
:
1234567891011121314151617181920212223242526272829303132333435version: '3'services:mongo-1:image: mongo:4.4restart: alwayscommand: mongod --shardsvr --replSet rs1ports:- 27017:27017mongo-2:image: mongo:4.4restart: alwayscommand: mongod --shardsvr --replSet rs2ports:- 27018:27018mongo-3:image: mongo:4.4restart: alwayscommand: mongod --shardsvr --replSet rs3ports:- 27019:27019mongo-router:image: mongo:4.4restart: alwayscommand: mongos --configdb rs1/mongo-1:27017,rs2/mongo-2:27018,rs3/mongo-3:27019 --bind_ip_allports:- 27020:27020depends_on:- mongo-1- mongo-2- mongo-3Giải thích:
- Chúng ta sẽ tạo ra 3 replicas sets (rs1, rs2, rs3), mỗi replica set có 1 node duy nhất.
- Mỗi node sẽ chạy trong một container Docker riêng biệt với cổng được ánh xạ tương ứng.
- Container
mongo-router
sẽ chạy mongos, đóng vai trò làm router để kết nối với các shards. - Tùy chọn
--configdb
chỉ định các địa chỉ của các replicas sets để lưu trữ metadata về sharding.
- Khởi động Docker Compose
1docker-compose up -dLệnh này sẽ khởi chạy tất cả các container trong nền (detached mode).
Cấu hình Sharding
- Kết nối vào mongo-router
1docker exec -it <container_id> mongoTrong đó,
<container_id>
là id của containermongo-router
. - Khởi tạo replicas sets
123sh.addShard("rs1/mongo-1:27017")sh.addShard("rs2/mongo-2:27018")sh.addShard("rs3/mongo-3:27019") - Bật sharding cho database
Giả sử bạn muốn bật sharding cho database
mydb
:1sh.enableSharding("mydb") - Chọn một collection để shard
Ví dụ, chúng ta sẽ shard trên collection
users
theo trường_id
:1sh.shardCollection("mydb.users", { "_id": "hashed" }) - Kiểm tra trạng thái sharding
1sh.status()Lệnh này sẽ hiển thị thông tin về các shards, databases và collections đã được shard.
Kết luận
Bằng cách sử dụng Docker Compose, bạn có thể dễ dàng cài đặt một môi trường sharding trong MongoDB. Việc chia nhỏ dữ liệu ra thành nhiều shards giúp tăng khả năng mở rộng quy mô, cải thiện hiệu suất và đảm bảo tính khả dụng cao cho ứng dụng của bạn. Hãy nhớ rằng, sharding cũng đi kèm với một số phức tạp nhất định, do đó, bạn nên cân nhắc kỹ lưỡng trước khi quyết định sử dụng nó cho dự án của mình.