So sánh tổng quan giữa WiredTiger và MMAPv1 engine Mongodb
mongodb
14
White

manhdung viết ngày 21/07/2016

Vài điểm so sánh giữa WiredTiger engine và MMAPv1 engine trong MongoDB

MongoDB sử dụng mô hình pluggable engine. Hiện tại MongoDB hỗ trợ hai loại engine chính MMAPv1 và WiredTiger. Engine sẽ quản lý data, cách data trong memory lẫn disk được thao tác lưu trữ.

MMAPv1 engine là engine thời kỳ đầu của MongoDB và cho đến tận bản 3.0, MMAPv1 vẫn là default storage engine của MongoDB. MMAPv1 là kỹ thuật memory map, file nằm trên disk sẽ được map với virtual memory khiến cho việc thao tác data file trong MongoDB như thể nằm trong memory.

WiredTiger là engine mới của MongoDB, bắt đầu được giới thiệu từ version 3.0 và cho đến version 3.2, wired tiger chính thức trở thành default engine của MongoDB

Level Concurrency

WiredTiger sử dụng document level locking, cho phép nhiều client cùng modify document khác nhau trong cùng collection.

MMAPv1 sử dụng collection level locking nên nếu client modify một document thì các client khác phải đợi để lấy lock trên collection mà chứa document đó.

Do cơ chế này nên WiredTiger có lợi thế lớn khi insert/update data.

Thao tác data

Với MMAP dùng cơ chế mapping giữa data files và virtual memory thì cho phép in-place update, tức là nếu bạn cần thay đổi một phần nhỏ một file thì bạn chỉ cần thay đổi phần đó qua mapping chứ không phải theo cách truyền thống là load toàn bộ file vào memory rồi sửa đổi rồi flush disk.

Nhưng WiredTiger thì không cho phép in-place update như vậy. Trong WiredTiger, một snapshot - một ảnh chụp nhanh của data trong memory được thực hiện, sau đó cứ sau mỗi checkpoint interval tầm khoảng 60s thì một checkpoint được thực hiện. Ở đây checkpoint nghĩa là write data trong memory xuống data files trên disk. Điều kiện sinh checkpoint là dựa vào checkpoint interval 60s hoặc khi thấy journal data đã đến ngưỡng 2G. Khi checkpoint thực hiện mà bị lỗi thì mongod vẫn có thể phục hồi từ last checkpoint. Tuy vậy những data nằm trong khoảng giữa hai checkpoint thì không phục hồi được. Case này sẽ được xử lý nhờ cơ chế jouraling.

Một vấn đề của MMAPv1 là không tái thu hồi data space khi xóa document hoặc collection trong db. Mục đích để làm giảm việc cấp phát space ảnh hưởng hiệu năng nhưng đồng thời cũng gây lãng phí tài nguyên khiến việc quản trị khó khăn trong môi trường giới hạn disk space. Tổ chức data trong MMAPv1 gồm các bson data, chia thành các extent, mỗi extent có thể chứa index hoặc data, còn WiredTiger thì tách rời file thành data và index riêng. Và WiredTiger sẽ thu hồi data bị xóa.

Journaling

Vai trò của journaling tương đương với redo log trên mysqld. Khi database bị crash nó cần replay lại các log record trong journaling để recovery.

Với mmap engine thì journaling là on-disk còn với WiredTiger, jouraling ban đầu là các log record nằm trong buffer memory, mỗi log record tối đa 128KB, từ 128 bytes trở lên, log record sẽ được compress, mặc định dùng snappy compression. Sau đó, log record này sẽ dần được commit xuống disk nếu một trong các điều kiện sau xảy ra:

  • sau mỗi 50ms
  • khi checkpoint được thực hiện sau mỗi 60s hoặc khi journal data trong buffer lên đến 2G
  • Nếu write operation có option j: true
  • Khi MongoDB tạo journal file mới ( vì journal file giới hạn 100MB), khi đó journal file liền trước sẽ được commit từ buffer xuống.

Sử dụng journal trên buffer có thể tăng performance nhưng nó lại giảm đi tính an toàn so với mmap chỉ sử dụng on-disk journal. Một shutdown giữa hai checkpoint khi log record chưa được commit thì sẽ làm mất data đang có trong buffer.

Nếu bạn quá coi trọng yếu tố performance thì có thể thiết lập hệ replicaset và disable journal. Rất hiếm trường hợp toàn bộ hệ replicase chết chùm. Tuy vậy, bản thân mình thì không khuyến khích thiết kế theo hướng phiêu lưu như vậy.

Compression

WiredTiger hỗ trợ nén tất cả các collection và indexes. Dù có thể giảm không gian lưu trữ nhưng hành động này yêu cầu xử lý từ CPU.

Mặc định, mongodb sử dụng snappy để nén collection data, journal và prefix compression để nén indexes. Ngoài ra, mongodb còn hỗ trợ zlib.

Tips:
Tốt nhất khi xây dựng db nên chọn CPU có xung xử lý cao, nhiều core. Ví dụ các dòng X5650 với 2.67GHz hỗ trợ 2xCPU, mỗi CPU base có 6 core, hỗ trợ hyper threading nên hoạt động vơi 12 core hoặc nếu dòng một CPU thì xung phải cao cỡ E3-1230 v2 hỗ trợ đến 3.3GHz, 4 core, hỗ trợ hyper threading nên thực tế có 8 core. Việc chọn CPU cũng phải căn cứ yêu tố memory: lượng memory tối đa + speed memory + channel thì mới tương thích được.

Memory use

MMAP thì hầu như có xu hướng sử dụng hết memory có thể có. Nếu có process nào cần dùng thì nó cũng sẵn sàng nhường cho. Nhưng WiredTiger thì sử dụng memory điều độ hơn. Mục đích sử dụng memory của WiredTiger cho engine internal cache và cho filesystem cache ( data trong filesystem cache cũng được nén )

Trong bản 3.2, mongodb sẽ dùng: hoặc 60% memory trừ đi 1GB hoặc là 1GB, tùy vào giá trị nào lớn hơn thì chọn giá trị đó.

Và cuối cùng, một bức tranh đáng giá ngàn lời:

alt text

Tham khảo:

https://www.vembu.com/blog/mongodb-mmap-vs-wiredtiger-comprehensive-comparison/
https://docs.mongodb.com/manual/core/wiredtiger/
https://docs.mongodb.com/manual/core/mmapv1/
https://www.mongodb.com/blog/post/whats-new-mongodb-30-part-3-performance-efficiency-gains-new-storage-architecture

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

manhdung

44 bài viết.
300 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
86 11
Giới thiệu RabbitMQ là một message broker ( messageoriented middleware) sử dụng giao thức AMQP Advanced Message Queue Protocol (Đây là giao thức ph...
manhdung viết 4 năm trước
86 11
White
50 4
Giả định bạn tiếp nhận một server mới toanh, bạn cần tìm một số thông tin về nó như loại CPU, loại main, loại memory, memory dùng của hãng nào... c...
manhdung viết 3 năm trước
50 4
White
47 13
Trong phần 1, tôi đã giới thiệu về sơ lược rabbitmq, vai trò của rabbitmq trong hệ thống phân tán và hướng dẫn cài đặt. Trong phần này, tôi sẽ trìn...
manhdung viết 4 năm trước
47 13
Bài viết liên quan
White
44 7
Giới thiệu MongoDB là một giải pháp nosql database. Data được lưu ở dạng các bson document. Hỗ trợ vertical scaling và horizontal scaling, dynamic...
manhdung viết 4 năm trước
44 7
White
6 0
Khoảng 5, 7 năm nay NOSQL là đề tài rất nóng bỏng. SQL phổ biến thì chỉ có khoảng vài ba cái như PostgreSQL, MySQL, MS SQL, Oracle nói chung na na ...
Ngoc Dao viết hơn 3 năm trước
6 0
White
10 1
Chatbotlà khái niệm không mới nhưng gần đây trở thành hot trend khi kết hợp cùng machine learning và AI. Mình sẽ có một bài viết cụ thể hơn về kỹ t...
Mầu Hà Quang viết hơn 1 năm trước
10 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
44 bài viết.
300 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!