Hình ảnh lịch sự //mongodb.com
Tại Ithaka, khá nhiều trong số các dịch vụ microsb của chúng tôi sử dụng MongoDB 3.6 để tồn tại dữ liệu. Nếu bạn đã sử dụng MongoDB, có lẽ bạn đã biết rằng bắt đầu từ phiên bản 3.4 MongoDB, WiredTiger Engine chiếm một lượng RAM đáng kể. Để cụ thể, nó sẽ mất 50% [RAM trừ 1GB] hoặc 256 MB, tùy theo mức nào cao hơn. Bạn có thể đọc thêm về cách thức và tại sao trong hướng dẫn của họ.
Điều này, cùng với sự hiểu biết chung rằng không bao giờ là một ý tưởng tốt để chạy dịch vụ cơ sở dữ liệu của bạn trên cùng một phiên bản máy chủ với dịch vụ sản xuất của bạn, cho thấy rõ rằng bạn cần thiết lập máy chủ MongoDB từ xa mà dịch vụ của bạn sau đó kết nối.
Các bước cấp cao:
- Thiết lập một thể hiện EC2 mới
- Người dùng cơ sở dữ liệu thiết lập và gán cho họ vai trò
- Bật MongoDB Auth để bảo vệ quyền truy cập vào cơ sở dữ liệu
- Mở cổng mạng để kết nối với MongoDB
- Kết nối với máy chủ từ xa
Xin lưu ý rằng mặc dù tại Ithaka, chúng tôi sử dụng một bản phân phối Linux trên các phiên bản EC2, các điểm được đề cập trong bài viết này đủ chung để hoạt động trên hầu hết các kết hợp đám mây+OS. Không có cách nào, hãy để Lừa để thiết lập mọi thứ.
1. Thiết lập một thể hiện EC2 mới
Trước khi thực hiện điều này, hãy tính đến kích thước cơ sở dữ liệu và số lượng chỉ mục của bạn để quyết định không gian đĩa và RAM tối ưu cho ví dụ của bạn. Một tính toán đơn giản phù hợp với chúng tôi là cứ 16 GB dữ liệu trong DB, chúng tôi phân bổ 1GB RAM cho WiredTiger vì cách cấu trúc dữ liệu của chúng tôi. Có nghĩa là đối với 16 GB dữ liệu được lưu trữ mà máy chủ của bạn cần có RAM 2GB ít nhất. Khi phiên bản EC2 của bạn được thiết lập, SSH vào ví dụ và cài đặt MongoDB.
2. Người dùng cơ sở dữ liệu thiết lập và gán cho họ vai trò
Giống như tất cả các cơ sở dữ liệu khác, MongoDB có hỗ trợ được xây dựng để kiểm soát truy cập. Bạn có thể tạo người dùng và gán cho họ các vai trò khác nhau và các cấp độ truy cập khác nhau vào cơ sở dữ liệu. Đối với phạm vi của bài viết này, chúng ta hãy tuân thủ hai vai trò quan trọng - người dùng quản trị và DB. Sử dụng vai trò quản trị viên, bạn có thể tạo người dùng DB và gán cho họ vai trò trên cơ sở dữ liệu riêng lẻ.
Mở vỏ Mongo
ubuntu:~$ mongo
Bên trong Mongo Shell truy cập cơ sở dữ liệu quản trị. Tạo người dùng quản trị viên mới.
> use admin;
> db.createUser[{
user: "admin",
pwd: "myadminpassword",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" }
]
}];
Bạn có thể gán nhiều vai trò cho một người dùng trong một lần. Các vai trò này cấp cho người dùng quản trị tất cả các đặc quyền cần thiết để tạo người dùng, sửa đổi người dùng, đọc và ghi vào bất kỳ cơ sở dữ liệu nào.
Bây giờ tạo người dùng DB và cấp cho họ vai trò trên cơ sở dữ liệu tương ứng của họ. Nếu hệ thống của bạn bao gồm nhiều cơ sở dữ liệu, là một ý tưởng tốt để có một người dùng riêng cho mỗi cơ sở dữ liệu.
> db.createUser[{
user: "user1",
pwd: "user1password",
roles: [
{ role: "userAdmin", db: "sampledb" },
{ role: "dbAdmin", db: "sampledb" },
{ role: "readWrite", db: "sampledb" }
]
}];
Lưu ý làm thế nào các vai trò đã thay đổi ở đây. Nếu bạn cố gắng gán một trong các vai trò của quản trị viên như Hồi UserAdMinanyDatabase, cho người dùng trên bất kỳ cơ sở dữ liệu phi quản trị nào, Mongo sẽ đưa ra một lỗi cho biết rằng vai trò đó không được xác định trên cơ sở dữ liệu đó. Vai trò quản trị chỉ hoạt động trên cơ sở dữ liệu quản trị viên.
3. Bật MongoDB Auth
Khi quản trị viên của bạn được thiết lập và người dùng cụ thể cơ sở dữ liệu đã được tạo, giờ đây đã đến lúc cho phép MongoDB bắt đầu sử dụng các điều khiển truy cập này. Để làm như vậy, hãy mở tệp Cấu hình MongoDB:
sudo vim /etc/mongod.conf
Trong tệp này, thêm các dòng sau:
security:
authorization: 'enabled'
Điều này sẽ nói với MongoDB rằng bất cứ khi nào nó bắt đầu tiếp theo, nó cần thực thi kiểm soát truy cập cơ sở dữ liệu bằng cách sử dụng các vai trò chúng tôi đã tạo trong bước trước.
Theo mặc định MongoDB được cấu hình để chỉ cho phép các kết nối từ localhost. Chúng ta cần cho phép các kết nối từ xa. Trong cùng một tệp cấu hình, hãy chuyển đến phần Giao diện mạng và thay đổi BINDIP từ 127.0.0.1 thành 0.0.0.0 có nghĩa là cho phép các kết nối từ tất cả các địa chỉ IP.bindIp from 127.0.0.1 to 0.0.0.0 which means allow connections from all ip addresses.
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 #default value is 127.0.0.1
Bây giờ hãy lưu và thoát tệp cấu hình và khởi động lại máy chủ MongoDB.
ubuntu:~$ sudo service mongod restart
Bây giờ nếu bạn cố gắng truy cập vào vỏ Mongo bằng cách gõ Mongo vào thiết bị đầu cuối, bạn sẽ vượt qua nhưng won có thể truy cập bất kỳ cơ sở dữ liệu nào. Bạn cần sử dụng người dùng được tạo để truy cập cơ sở dữ liệu.
# to access the admin database
ubuntu:~$ mongo -u admin -p myadminpassword 127.0.0.1/admin# to access the other databases
ubuntu:~$ mongo -u user1 -p user1password 127.0.0.1/sampledb
Tuy nhiên, chúng tôi vẫn đang truy cập vào vỏ Mongo từ trong trường hợp EC2. Chúng tôi đã cố gắng kết nối từ xa. Để có thể làm điều đó, thay đổi cài đặt mạng của thể hiện EC2 của bạn.
4. Mở cổng mạng trên thể hiện EC2
MongoDB sử dụng số cổng 27017 cho tất cả các kết nối theo mặc định. Vì vậy, hãy để mở ra cổng đó. Bạn có thể truy cập cài đặt mạng của bảng điều khiển AWS của mình và mở lưu lượng truy cập trong và ngoài trên cổng 27017. Sử dụng TCP tùy chỉnh làm giao thức. Thông tin thêm về điều đó ở đây. Nếu điều đó không hoạt động, SSH vào ví dụ của bạn và chạy các lệnh sau
ubuntu:~$ sudo iptables -A INPUT -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPTubuntu:~$ sudo iptables -A OUTPUT -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT
5. Kiểm tra các kết nối từ xa
Thoát khỏi phiên bản EC2 của bạn và thử kết nối với máy chủ cơ sở dữ liệu từ máy cục bộ của bạn
ubuntu:~$ mongo -u user1 -p user1password /sampledb
Lưu ý: Mặc dù làm theo các hướng dẫn này, bạn vẫn có thể gặp các vấn đề khi kết nối với cơ sở dữ liệu từ xa trong mã của bạn. Và những vấn đề đó chủ yếu là cụ thể cho thư viện mà bạn sử dụng trong mã của mình. Cho đến nay, chúng tôi đã giải quyết các vấn đề với pymongo cho Python, MGO cho Golang và Mongoose cho Node.js. Nếu bạn đang sử dụng bất kỳ trong số này, hãy đưa tôi trên Twitter @MithileshsAid và tôi sẽ rất vui khi được giúp đỡ.