MongoDB: đồng định vị quy trình mongos trên các máy chủ ứng dụng


12

Tôi muốn hỏi một câu hỏi về một thực tiễn tốt nhất được mô tả trong tài liệu này:

http://info.mongodb.com/rs/mongodb/images/MongoDB-Performance-Best-Practices.pdf

Sử dụng nhiều bộ định tuyến truy vấn. Sử dụng nhiều quá trình mongos trải rộng trên nhiều máy chủ. Việc triển khai phổ biến là đồng định vị quy trình mongos trên các máy chủ ứng dụng, cho phép giao tiếp cục bộ giữa ứng dụng và quy trình mongos. Số lượng quy trình mongos thích hợp sẽ phụ thuộc vào bản chất của ứng dụng và triển khai.

Chỉ cần một chút nền tảng về việc triển khai của chúng tôi. Chúng tôi có rất nhiều nút máy chủ ứng dụng. Mỗi người trong số họ chạy một quy trình dựa trên JVM với WSful không trạng thái. Như cách thực hành tốt nhất này cho thấy, mỗi nút máy chủ ứng dụng duy nhất chạy mongosquy trình riêng của nó , điều đó có nghĩa là số lượng các quy trình JVM luôn bằng với số lượng mongosquy trình.

Tất cả các mongosquy trình kết nối với 3 máy chủ cấu hình và một số phân đoạn mongo (với các bộ bản sao trong mỗi phân đoạn). Mặc dù chúng tôi đang sử dụng một triển khai được bảo vệ, chúng tôi không thực sự che chắn các bộ sưu tập của mình. Trong thực tế, chúng tôi có một số lượng lớn các cơ sở dữ liệu được trải rộng trên tất cả các phân đoạn trong thời gian tạo ra chúng (và đây là trường hợp sử dụng chính của chúng tôi để bảo vệ tại thời điểm này).

Vì thực tiễn tốt nhất cũng đề xuất rằng "Số lượng quy trình mongos phù hợp sẽ phụ thuộc vào bản chất của ứng dụng và triển khai" Tôi bắt đầu tự hỏi liệu việc sử dụng của chúng tôi mongoscó thực sự phù hợp hay không nếu chúng ta có nhiều mongosnút chuyên dụng hơn và cho phép máy chủ ứng dụng của chúng tôi kết nối với chúng mà không cần phải mongoschạy cục bộ.

Ý kiến ​​của bạn về cách tiếp cận tốt nhất để quyết định có bao nhiêu mongostrường hợp phù hợp liên quan đến số lượng cá thể máy chủ ứng dụng hoặc kích thước của cụm MongoDB?

Gần đây, chúng tôi bắt đầu xem xét việc quản lý cụm cho các dịch vụ web phi trạng thái của mình, ý tôi là các công cụ như Docker, Apache Mesos và Kubernetes. Nếu chúng ta đang sử dụng Docker, thì thông thường không nên chạy nhiều hơn một quy trình trong container. Xem xét thực tế này, thật khó để đảm bảo rằng bộ chứa và bộ chứa máy chủ ứng dụng mongosluôn được đặt cùng một nút trên cùng một nút vật lý và có số lượng quá trình bằng nhau. Điều này khiến tôi tự hỏi liệu thực tiễn tốt nhất này có còn áp dụng cho kiến ​​trúc cụm mà tôi vừa mô tả hay không. Nếu không, bạn có thể vui lòng đề xuất đâu là cách tốt hơn để định vị và triển khai mongoscác quy trình trong kiến ​​trúc này?

Câu trả lời:


12

Vì đã có và câu trả lời được gửi, và một câu trả lời hữu ích và hợp lệ ở đó, tôi không muốn đánh lạc hướng khỏi sự hữu ích của chính nó nhưng thực sự có những điểm để đưa ra cách vượt qua chỉ là một nhận xét ngắn. Vì vậy, hãy xem xét "sự gia tăng" này, hy vọng là hợp lệ nhưng chủ yếu là ngoài những gì đã được nói.

Sự thật là thực sự xem xét "cách ứng dụng của bạn sử dụng dữ liệu" và cũng nhận thức được các yếu tố trong "môi trường bị che chở" cũng như "môi trường vùng chứa" được đề xuất của bạn ảnh hưởng đến điều này.

Trường hợp nền

Mục đích chung đưa ra khuyến nghị thực hành cho việc định vị mongosquy trình cùng với thể hiện của ứng dụng là làm giảm mọi chi phí mạng cần thiết để ứng dụng giao tiếp với mongosquy trình đó . Tất nhiên, đó cũng là "thực hành được khuyến nghị" để chỉ định một số mongostrường hợp trong chuỗi kết nối ứng dụng trong trường hợp nút "gần nhất" không có sẵn vì một số lý do có thể được chọn, mặc dù có thể có chi phí liên hệ với một nút từ xa.

Trường hợp "docker" mà bạn đề cập có vẻ hơi độc đoán. Mặc dù đúng là một trong những mục tiêu chính của container (và trước đó, một cái gì đó như nhà tù BSD hoặc thậm chí là chroot) nói chung là để đạt được một mức độ "cô lập quy trình", nhưng không có gì thực sự sai khi chạy nhiều quy trình miễn là bạn hiểu ý nghĩa.

Trong trường hợp cụ thể này, mongosnó có nghĩa là "nhẹ" và chạy như một "chức năng bổ sung" cho quy trình ứng dụng theo cách mà nó gần như là một phần "được ghép nối" của chính ứng dụng. Vì vậy, bản thân hình ảnh docker không có "initd" như quy trình nhưng thực sự không có gì sai khi chạy bộ điều khiển quy trình như giám sát viên (ví dụ) làm quy trình chính cho bộ chứa mà sau đó cung cấp cho bạn điểm kiểm soát quy trình cái container đó cũng vậy. Tình huống "các quy trình được ghép nối" này là một trường hợp hợp lý và cũng là một câu hỏi đủ phổ biến rằng có tài liệu chính thức cho nó.

Nếu bạn đã chọn loại hoạt động "được ghép nối" đó để triển khai, thì nó thực sự giải quyết điểm chính là duy trì một mongosthể hiện trên cùng một kết nối mạng và thực sự là "cá thể máy chủ" như chính máy chủ ứng dụng. Nó cũng có thể được xem theo một cách nào đó trong trường hợp "toàn bộ container" bị lỗi thì bản thân nút đó sẽ không hợp lệ. Không phải là tôi muốn giới thiệu nó, và trên thực tế có lẽ bạn vẫn nên cấu hình các kết nối để tìm kiếm các mongostrường hợp khác ngay cả khi chúng chỉ có thể truy cập qua kết nối mạng làm tăng độ trễ.

Phiên bản cụ thể / cụ thể sử dụng

Bây giờ thời điểm đó đã được thực hiện, sự cân nhắc khác ở đây trở lại với sự xem xét ban đầu về việc đồng định vị mongosquy trình với ứng dụng cho mục đích độ trễ mạng. Trong các phiên bản MongoDB trước 2.6 và đặc biệt liên quan đến các hoạt động như với khung tổng hợp, thì trường hợp sẽ có nhiều lưu lượng mạng hơn và tiếp theo sau khi xử lý công việc được thực hiện bởi mongosquy trình xử lý dữ liệu từ các phân đoạn khác nhau . Đó không phải là quá nhiều trường hợp bây giờ vì một khối lượng công việc xử lý tốt hiện có thể được thực hiện trên chính các phân đoạn đó trước khi "chưng cất" vào "bộ định tuyến".

Trường hợp khác là các mẫu sử dụng ứng dụng của bạn liên quan đến shending. Điều đó có nghĩa là liệu khối lượng công việc chính có trong "phân phối ghi" trên nhiều phân đoạn hay thực sự là một cách tiếp cận "phân tán" trong việc hợp nhất các yêu cầu đọc. Trong những kịch bản đó

Kiểm tra, thử nghiệm và sau đó thử nghiệm lại

Vì vậy, điểm cuối cùng ở đây là thực sự tự giải thích, và đi đến sự đồng thuận cơ bản của bất kỳ câu trả lời lành mạnh nào cho câu hỏi của bạn. Đây không phải là một điều mới đối với MongoDB hoặc bất kỳ giải pháp lưu trữ nào khác, nhưng môi trường triển khai thực tế của bạn cần được kiểm tra trên "mô hình sử dụng" gần với thực tế thực tế giống như bất kỳ "thử nghiệm đơn vị" nào về chức năng dự kiến ​​từ các thành phần cốt lõi hoặc kết quả tổng thể cần phải được kiểm tra.

Thực sự không có tuyên bố "dứt khoát" để nói "cấu hình theo cách này" hoặc "sử dụng theo cách này" mà thực sự có ý nghĩa ngoài việc kiểm tra những gì "thực sự hoạt động tốt nhất" cho hiệu suất và độ tin cậy của ứng dụng như mong đợi.

Tất nhiên, "trường hợp tốt nhất" sẽ luôn là không "đám đông" các mongostrường hợp có yêu cầu từ các nguồn máy chủ ứng dụng "nhiều". Nhưng sau đó để cho phép họ một số "chẵn lẻ" tự nhiên có thể được phân phối theo khối lượng công việc tài nguyên có sẵn để có "ít nhất" một "nhóm tài nguyên" có thể được chọn, và thực sự lý tưởng trong nhiều trường hợp nhưng không cần phải tạo thêm "Chi phí vận chuyển mạng".

Đó là mục tiêu, nhưng lý tưởng nhất là bạn có thể "thử nghiệm" các cấu hình cảm nhận khác nhau để đưa ra giải pháp "phù hợp nhất" cho giải pháp triển khai cuối cùng của mình.

Tôi cũng rất muốn giới thiệu các khóa học "miễn phí" (như trong bia) có sẵn như đã đề cập, và bất kể trình độ kiến ​​thức của bạn là gì. Tôi thấy rằng các nguồn tài liệu khóa học khác nhau thường cung cấp "đá quý ẩn" để hiểu rõ hơn về những điều mà bạn có thể không xem xét hoặc bỏ qua. Các M102 lớp như đã đề cập được xây dựng và thực hiện bởi Adam Commerford cho người mà tôi có thể chứng thực có một mức độ cao về kiến thức về triển khai quy mô lớn của MongoDB và kiến trúc dữ liệu khác. Đáng để dành thời gian ít nhất là xem xét một viễn cảnh mới mẻ về những gì bạn có thể nghĩ rằng bạn đã biết.


5

Vì thực tiễn tốt nhất cũng đề xuất rằng "Số lượng quy trình mongos phù hợp sẽ phụ thuộc vào bản chất của ứng dụng và triển khai" Tôi bắt đầu tự hỏi liệu việc sử dụng mongos của chúng tôi có thực sự phù hợp không

Tôi nghĩ rằng đây là một câu hỏi mà cuối cùng chỉ có bạn có thể trả lời, như tài liệu đề cập đến.

Một trong những chiến lược được đề xuất là có một mongosdịch vụ trên mỗi nút ứng dụng và thậm chí có thể có thêm một nút dành riêng cho tính khả dụng bổ sung. Như bạn có điều này hiện tại, tôi thấy không có gì sai với việc triển khai hiện tại của bạn. Nếu không có gì thay đổi trong kiến ​​trúc của bạn, thì hiện tại bạn đang ở trong các thực tiễn tốt nhất. Tuy nhiên...

Nếu chúng ta đang sử dụng Docker, thì thông thường không nên chạy nhiều hơn một quy trình trong container.

mongosquá trình này không quá tốn tài nguyên, bạn cũng có thể đặt một thể hiện của nó vào từng phân đoạn của mình và để mỗi mongodnút cũng hoạt động như một mongosnút. Điều này có thể có ý nghĩa hơn nếu bạn làm cho kiến ​​trúc máy chủ ứng dụng của bạn phức tạp hơn một chút.

Cá nhân tôi không quá quen thuộc với các sản phẩm này nhưng tôi cũng kiểm tra với nhà cung cấp về các đề xuất của họ vì mongoscó thể ít chuyên sâu hơn hầu hết các quy trình khác mà bạn có thể chạy song song.

Cuối cùng, bạn luôn có thể tham gia các nút chuyên dụng cho mongosquy trình tùy thuộc vào quy mô, tài nguyên của bạn, v.v ... cũng sẽ nằm trong thực tiễn tốt nhất. Điều thực sự mang đến ở đây là miễn là bạn có một loạt các mongosquy trình ở đâu đó thì bạn đang làm tốt.

Tuy nhiên, có bao nhiêu thực sự phụ thuộc vào quy mô triển khai và yêu cầu SLA của bạn. Nếu bạn sử dụng phân đoạn, bạn sẽ có quá đủ, nhưng nếu bạn sẽ sử dụng các nút chuyên dụng, tôi sẽ cố gắng khớp số lượng nút ứng dụng càng sát càng tốt.

Bạn có thể xem video này từ khóa học trực tuyến MongoDB M102 liên quan đến các chủ đề này và có thể muốn thử đăng ký lớp M102 cho các DBA vào lần tới trong phiên (miễn phí, trực tuyến).


Cảm ơn đã trả lời tuyệt vời! "nhưng nếu bạn sẽ sử dụng các nút chuyên dụng, tôi sẽ cố gắng khớp số lượng nút ứng dụng càng sát càng tốt." Lý do đằng sau tuyên bố này là gì?
chục

Ý kiến ​​của tôi: trong hầu hết các trường hợp có ít nút ứng dụng hơn phân đoạn và vì một khuyến nghị là sử dụng các nút ứng dụng cho mongos, sau đó khớp với cùng số nút chuyên dụng sẽ cung cấp ít nhất đủ các mongostrường hợp. Đó không phải là một khoa học chính xác và phụ thuộc vào nhu cầu của bạn, nhưng đó là cách tôi thích môi trường sản xuất.
LowlyDBA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.