NoSQL là gì?



1. Thuật ngữ
NoSQL có nghĩa là Non-Relational (NoRel) - không ràng buộc. Tuy nhiên, thuật ngữ đó ít phổ dụng hơn và ngày nay người ta thường dịch NoSQL thành Not Only SQL.
- Không chỉ là SQLĐây là thuật ngữ chung cho các hệ CSDL không sử dụng mô hình dữ liệu quan hệ. NoSQL đặc biệt nhấn mạnh đến mô hình lưu trữ cặp giá trị - khóa và hệ thống lưu trữ phân tán.

2. Lịch sử
Thuật ngữ NoSQL được giới thiệu lần đầu vào năm 1998 sử dụng làm tên gọi chung cho các lightweight open source relational database (cơ sở dữ liệu quan hệ nguồn mở nhỏ) nhưng không sử dụng SQL cho truy vấn.
Vào năm 2009, Eric Evans, nhân viên của Rackspace giới thiệu lại thuật ngữ NoSQL trong một hội thảo về cơ sở dữ liệu nguồn mở phân tán. Thuật ngữ NoSQL đánh dấu bước phát triển của thế hệ database mới: distributed (phân tán) + non-relational (không ràng buộc).
Ghi chú: Một mệnh đề khá thú vị về non-relational data store: “select fun, profit from real_world where relational=false;”.

3. Định nghĩa
Thế hệ database kế tiếp là một thế hệ cơ sở dữ liệu non-relational (không ràng buộc), distributed (phân tán), open source, horizontal scalable (khả năng mở rộng theo chiều ngang) có thể lưu trữ, xử lý từ một lượng rất nhỏ cho tới hàng petabytes dữ liệu trong hệ thống có độ chịu tải, lỗi cao với những đòi hỏi về tài nguyên phần cứng thấp.
Một số đặc điểm nhận dạng cho thế hệ database mới này bao gồm: schema-free, hỗ trợ mở rộng dễ dàng, API đơn giản, eventual consistency (nhất quán cuối) và/hoặc transactions hạn chế trên các thành phần dữ liệu đơn lẻ, không giới hạn không gian dữ liệu,…
NoSQL storage đặc biệt phổ dụng trong thời kỳ Web 2.0 bùng nổ, nơi các mạng dịch vụ dữ liệu cộng đồng cho phép người dùng tạo hàng tỷ nội dung trên web. Do đó, dữ liệu lớn rất nhanh vượt qua giới hạn phần cứng và cần phải giải quyết bằng bài toán phân tán. Nửa đầu năm 2009, người ta đã manh nha thuật ngữ NoSQL đánh dấu sự trưởng thành của thế hệ database mới trong khi những sản phẩm phần mềm có thể đã được phát triển từ trước đó rất lâu.

4. Một số thuật ngữ liên quan.
Relational (Rằng buộc) thuật ngữ sử dụng đến các mối quan hệ giữa các bảng trong cơ sở dữ liệu quan hệ (RDBMs) sử dụng mô hình khóa gồm 2 loại khóa: khóa chính và khóa phụ (primary key + foreign key) để ràng buộc dữ liệu nhằm thể hiện tính nhất quán dữ liệu từ các bảng khác nhau.
Non-relational (Không rằng buộc): là khái niệm không sử dụng các ràng buộc dữ liệu cho nhất quán dữ liệu ở NoSQL database.
- High Availability (Tính sẵn sàng): Do chấp nhận sự trùng lặp trong lưu trữ nên nếu một node (commodity machine) nào đó bị chết cũng không ảnh hưởng tới toàn bộ hệ thống
- High Scalability (Khả năng mở rộng): Gần như không có một giới hạn cho dữ liệu và người dùng trên hệ thống.
- Eventual consistency (Nhất quán cuối): tính nhất quán của dữ liệu không cần phải đảm bảo ngay tức khắc sau mỗi phép write. Một hệ thống phân tán chấp nhận những ảnh hưởng theo phương thức lan truyền và sau một khoảng thời gian (không phải ngay tức khắc), thay đổi sẽ đi đến mọi điểm trong hệ thống, tức là cuối cùng (eventually) dữ liệu trên hệ thống sẽ trở lại trạng thái nhất quán.
- Vertical scalable (Khả năng mở rộng chiều dọc): Khi dữ liệu lớn về lượng, phương pháp tăng cường khả năng lưu trữ và xử lý bằng việc cải tiến phần mềm và cải thiện phần cứng trên một máy tính đơn lẻ được gọi là khả năng mở rộng chiều dọc. Ví dụ việc tăng cường CPUs, cải thiện đĩa cứng, bộ nhớ trong một máy tính,… cho DBMs nằm trong phạm trù này. Khả năng mở rộng chiều dọc còn có một thuật ngữ khác scale up.
- Horizontal scalable (Khả năng mở rộng chiều ngang): Khi dữ liệu lớn về lượng, phương pháp tăng cường khả năng lưu trữ và xử lý là dùng nhiều máy tính phân tán. Phân tán dữ liệu được hỗ trợ bởi phần mềm tức cơ sở dữ liệu.
- Distributed Data (Phân tán dữ liệu): mô hình lưu trữ phân tán các file hoặc dữ liệu ra nhiều máy tính khác nhau trong mạng LAN hoặc Internet dưới sự kiểm soát của phần mềm.
- Deployment Flexibility (Triển khai linh hoạt): việc bổ sung thêm/loại bỏ các node, hệ thống sẽ tự động nhận biết để lưu trữ mà không cần phải can thiệp bằng tay. Hệ thống cũng không đòi hỏi cấu hình phần cứng mạnh, đồng nhất
Durability (Lưu trữ tốt): dữ liệu có thể tồn tại trong bộ nhớ máy tính nhưng đồng thời cũng được lưu trữ lại đĩa cứng.


5. So sánh NoSql và RDBMs
- Các RDBMs hiện tại đã bộc lộ những yếu kém như việc đánh chỉ mục một lượng lớn dữ liệu, phân trang, hoặc phân phối luồng dữ liệu media (phim, ảnh, nhạc ...). Cơ sở dữ liệu quan hệ được thiết kế cho những mô hình dữ liệu nhỏ thường xuyên đọc viết trong khi các Social Network Services lại có một lượng dữ liệu cực lớn và cập nhật liên tục do số lượng người dùng quá nhiều ở một thời điểm. Thiết kế trên Distributed NoSQL giảm thiểu tối đa các phép tính toán, I/O liên quan kết hợp với batch processing đủ đảm bảo được yêu cầu xử lý dữ liệu của các mạng dịch vụ dữ liệu cộng đồng này. Facebook, Amazon là những ví dụ điểm hình.
- Về cơ bản, các thiết kế của NoSQL lựa chọn mô hình lưu trữ tập dữ liệu theo cặp giá trị keyvalue. Khái niệm node được sử dụng trong quản lý dữ liệu phân tán. Với các hệ thống phân tán, việc lưu trữ có chấp nhận trùng lặp dữ liệu. Một request truy vấn tới data có thể gửi tới nhiều máy cùng lúc, khi một máy nào nó bị chết cũng không ảnh hưởng nhiều tới toàn bộ hệ thống. Để đảm bảo tính real time trong các hệ thống xử lý lượng lớn, thông thường người ta sẽ tách biệt database ra làm 2 hoặc nhiều database. Một database nhỏ đảm bảo vào ra liên tục, khi đạt tới ngưỡng thời gian hoặc dung lượng, database nhỏ sẽ được gộp (merge) vào database lớn có thiết kế tối ưu cho phép đọc (read operation). Mô hình đó cho phép tăng cường hiệu suất I/O - một trong những nguyên nhân chính khiến performance trở nên kém.
- Thế hệ CSDL mới - NoSQL - giảm thiểu tối đa các phép tính toán, tác vụ đọc-ghi liên quan kết hợp với xử lý theo lô (batch processing) đảm bảo được yêu cầu xử lý dữ liệu của các dịch vụ mạng xã hội. Hệ CSDL này có thể lưu trữ, xử lý từ lượng rất nhỏ đến hàng petabytes dữ liệu với khả năng chịu tải, chịu lỗi cao nhưng chỉ đòi hỏi về tài nguyên phần cứng thấp. Thiết kế đặc biệt tối ưu về hiệu suất, tác vụ đọc - ghi, ít đòi hỏi về phần cứng mạnh và đồng nhất, dễ dàng thêm bớt các node không ảnh hưởng tới toàn hệ thống .
- Các mô hình dữ liệu đặc thù của NoSQL cũng cấp API tự nhiên hơn so với việc dùng RDBM.

- Những ràng buộc về giấy phép sử dụng cùng với một khoản phí không nhỏ cũng là ưu thế. Chấp nhận NoSQL đồng nghĩa với việc bạn tham gia vào thế giới nguồn mở nơi mà bạn có khả năng tùy biến mạnh mẽ các sản phẩm, thư viện theo đúng mục đích của mình

6. Phân loại NoSQL
Tính đến thời điểm hiện tại có 150 loại cơ sở dữ liệu NoSql (http://nosql-database.org), chia làm các loại :
Wide Column Store / Column Families: Hệ cơ sở dữ liệu cho phép truy xuất ngẫu nhiên/tức thời với khả năng lưu trức một lượng lớn dữ liệu có cấu trúc. Dữ liệu có thể tồn tại dạng bảng với hàng tỷ bản ghi và mỗi bản ghi có thể chứa hàng triệu cột. Hệ thống triển khai từ vài trăm cho đến hàng nghìn thiết bị dẫn đến khả năng lưu trữ hàng petabytes nhưng vẫn đảm bảo hiệu năng cao. Một số sản phẩm thông dụng: Hadoop/Hbase – Apache, Bigtable - Google, Cassandra - Facebook, Hypertable - Baidu, Accumulo, Amazon SimpleDB, Cloundata, Clouera...
- Document Store: Thực chất là các cơ sở dữ liệu hướng tài liệu, một thiết kế riêng biệt cho việc lưu trữ tài liệu. Các cài đặt có thể là giả lập tương tác trên các cở sở dữ liệu quan hệ, cơ sở dữ liệu đối tượng hay key-value store. Một số sản phẩm tiêu biểu: MongoDB, Elasticsearch, Couchbase Server, CouchDB, RethinkDB, .
- Key Value / Tuple Store: Mô hình lưu trữ dữ liệu dưới dạng cặp giá trị key-value trong đó việc truy suất, xóa, cập nhật giá trị thực thông qua key tương ứng.Với sự hỗ trợ của các kĩ thuật Btree, B+Tree, Hash,… dữ liệu có thể tồn tại trên RAM hoặc ổ cứng, phân tán hoặc không phân tán. Hầu hết cá NoSql Database đều là key-value store. Các sản phẩm thông dụng: DynamoDB, Azure Table Storage, Riak, Redis,
Graph Databases: Là một dạng cơ sở dữ liệu được thiết kế riêng cho việc lưu trữ thông tin đồ họa như cạnh, nút hay thuộc tính. Một số sản phẩm tiêu biểu như: Neo4j, Infinite Graph, InfoGrid, HyperGraphDB, Dex, GraphBase, …
Multimodel Databases: Datomic, OrentDB, ArangoDB, FatDB, AlchemyDB, …
Object Databases: Versant, db4o, Objectivity, Starcounter, Perst, VelocityDB, HSS Database, ZoDB, …g) Grid & Cloud Database Solutions: Gigaspaces, Infinispan, Queplix, Hazelcast, …
XML Databases: EMC Document xDB, eXist, Sedna, BaseX, Qizx, …

Tổng kết : Tuy cùng mang những đặc điểm chung của NoSQL nhưng mỗi CSDL NoSQL cũng có những đặc điểm riêng, và vì thế thường được dùng cho những dự án khác nhau. 

Ví dụ:
- MongoDB và Redis là những lựa chọn tốt cho việc lưu trữ các dữ liệu thống kê ít được đọc mà lại được viết thường xuyên.
- Hadoop, một CSDL dạng tự do, phân tán làm tốt công việc lưu trữ các dữ liệu lớn như các con số thống kê thời tiết hoặc công việc phân tích nghiệp vụ.
- Memcachedb, một CSDL nhất thời chóng tàn, tuyệt vời trong lưu trữ các phiên làm việc web, các khóa, và các con số thống kê ngắn hạn.
- Cassandra và Riak (các lưu trữ dư thừa, tự động tạo bó cluster) làm tốt trong các môi trường với các ứng dụng có tính sẵn sàng cao, khi thời gian sống tối đa là sống còn

7. Kiến trúc lưu trữ
7.1. Kiến trúc cơ bản
Về cơ bản, các thiết kế của NoSQL lựa chọn mô hình lưu trữ tập dữ liệu theo các cặp khóa – giá trị. Dữ liệu được lưu trữ phân tán.
Dưới đây tôi xin trình bày về cấu trúc của một số loại NoSQL thông dụng nhất hiện nay tương ứng với các cơ sở dữ liệu NoSQL.

7.1.1. Cơ sở dữ liệu hướng văn bản (Document database)
Với cơ sở dữ liệu hướng văn bản ta có thể sử dụng các truy vấn để truy xuất cả hay một phần của dữ liệu. Một điển hình của cơ sở dữ liệu hướng văn bản là MongoDB, trong MongoDB, mỗi cơ sở dữ liệu là tập hợp của các bộ sưu tập (collection). Định dạng các tập tin lưu trữ cơ sở dữ liệu có dạng .ns, .x (với x = 1, 2, 3, 4, 5,…). Mỗi bộ sưu tập bao gồm các văn bản (document), các văn bản này có thể khác nhau.

Ví du 3.1:
{"greeting" : "Hello, world!"}
{"foo" : 5}

Mỗi văn bản là tập hợp các cặp khóa – giá trị.
Ví dụ 3.2: Một bộ sưu tập có thể là ở dạng:
{
FirstName:"Bob",
Address:"5 Oak St.",
Hobby:"sailing"
}

Ví dụ 3.3: Một bộ sưu tập có thể là ở dạng:
{
FirstName:"Jonathan",
Address:"15 Wanamassa Point Road",
Children:[
{Name:"Michael",Age:10},
{Name:"Jennifer", Age:8},
{Name:"Samantha", Age:5},
{Name:"Elena", Age:2}
]
}

7.1.2. Lưu trữ dạng cột mở rộng / họ các cột (Wide Column Store / Column Families)
Một điển hình của cơ sở dữ liệu lưu trữ dạng cột mở rộng là Cassandra, trong Cassandra, Mỗi Keyspace là một tập các column family. Thường thì một ứng dụng sử dung một keyspace. Về mặt vật lý, dữ liệu được lưu trữ dưới dạng column family. Mỗi column family là một tập các hàng (row), mỗi hàng là một tập các cặp giá trị khóa – giá trị. Mỗi hàng có khóa (row-key) để xác định hàng đó. Các hàng được sắp xếp và chia thành các cụm.
Có hai loại cơ sở dữ liệu loại họ các cột:
Họ các cột thông thường: Mỗi họ các cột chỉ chứa hàng.
Siêu họ các cột: Mỗi họ các cột chứa cả họ các cột khác.
Với cấu trúc như trên, có thể thêm một column vào bất kỳ row nào và các row có thể có nhiều column (cột) khác nhau.

7.1.3. Cơ sở dữ liệu hướng đồ thị (Graph database)
Một cơ sở dữ liệu hướng đồ thị bao gồm các nút, các mối quan hệ (Relationships) hay các cạnh (edges) và các thuộc tính (properties).Một cơ sở dữ liệu hướng đồ thị đơn giản nhất chỉ có một nút. Các nút tương tự như một đối tượng trong lập trình hướng đối tượng. Một nút chứa các thuộc tính dưới dạng là văn bản chứa các cặp khóa – giá trị. Khóa có kiểu dữ liệu là String và giá trị có kiểu dữ liệu tùy ý. Các cặp giá trị khóa – giá trị chứa thông tin cần thiết của nút chứa nó.
Các mối quan hệ (hay các cạnh) là các đường kết nối và đại diện cho mối quan hệ giữa các nút hoặc giữa các nút với các thuộc tính.
Giống như nút, các mối quan hệ hay các cạnh cũng chứa các thuộc tính. Việc thêm các thuộc tính vào các mối quan hệ (hay các cạnh) làm tăng tính ngữ nghĩa, giúp bổ sung thêm siêu dữ liệu cho các thuật toán đồ thị và hạn chế truy vấn trong khi thực thi.
Một Traversal là cách truy vấn dữ liệu trong cơ sở dữ liệu hướng đồ thị, sử dụng các thuật toán điều hướng từ nút bắt đầu đến các nút liên quan.

7.2. Mô hình phân tán
Một vấn đề trong NoSQL là việc triển khai lưu trữ dữ liệu trên một hệ thống cluster lớn. Chúng ta có thể triểu khai một hệ thống NoSQL trên mô hình phân tán bằng hai phương pháp là: Replication (nhân bản) and Sharding (mảnh lưu trữ). Nhân bản là sao chép cùng một loại dữ liệu lên nhiều node. Sharding là đặt các dữ liệu khác nhau trên nhiều node khác nhau. Ta có thể sử dựng một hoặc cả hai phương pháp này cho hệ thống của ta. Nhân bản gồm hai dạng: nhân bản chủ tớ và nhân bản ngang hàng. Ở phần này tôi sẽ trình bày vấn đề này trên các phần: Single Server (máy chủ đơn), Sharding (mảnh - vùng lưu trữ), nhân bản chủ tớ, nhân bản ngang hàng.

7.2.1 Máy chủ đơn (Single Server)
Đây là mô hình chỉ có duy nhất một máy chủ để lưu trữ xữ lý dữ liệu và là mô hình đơn giản nhất. Dễ dàng để xây dựng và quản lý cơ sở dữ liệu trên một máy tính.
Mặc dù cơ sở dữ liệu NoSQL thường được thiết kế là triển khai trên một hệ thống cluster nhưng tùy vào ứng dụng với dữ liệu thích hợp ta cũng có thể triển khai trên một máy chủ. Cơ sở dữ liệu hướng đồ thị thường được triển khai và chạy tốt nhất trên mô hình này.

7.2.2. Mảnh lưu trữ (Sharding)
Mảnh lưu trữ là kỹ thuật hỗ trợ khả năng co giản của hệ thống theo chiều ngang bằng cách đặt các thành phần khác nhau của dữ liệu trên các máy chủ khác nhau trong trường hợp nhiều người dùng khác nhau truy cập vào nhiều thành phần khác nhau của dữ liệu.
Mảnh lưu trữ đặt dữ liệu khác nhau trên các node khác nhau. Mỗi node có thể xử lý việc đọc và ghi trên chính nó. Điều kiện lý tưởng là người dùng khác nhau tương tác với các node khác nhau, mỗi người dùng tương tác với một node. Ví dụ: Có 10 máy chủ thì mỗi máy thực hiện 10% công việc.
Để tăng hiệu suất, dữ liệu được lưu trữ tại node gần với điểm truy cập của người dùng nhất. Để giữ cho việc truyền tải dữ liệu đồng đều thì tập hợp các dữ liệu liên quan được phân tán trên các node.
Mảnh lưu trữ cần được tái cân bằng (rebalancing) nghĩa là thay đổi mã ứng dụng, di dời dữ liệu phù hợp. Nhiều cơ sở dữ liệu NoSQL có cung cấp tính năng autosharding để phân bố và truy cập dữ liệu vào các vùng lưu trữ ví dụ như MongoDB.
Khi xây dựng hệ thống NoSQL lớn ta phải chú trọng thực hiện mảnh lưu trữ từ đầu cho hệ thống của mình.

7.2.3. Nhân bản chủ - tớ (Master-slave replication)
Với mô hình sao chép chủ - tớ, dữ liệu được phân tán trên các node. Trong đó, có một node đóng vai trò là node chủ. Node chủ là node chịu trách nhiệm và có quyền thao tác với dữ liệu cao nhất trong hệ thống. Các node khác được gọi là các node thứ cấp hay là các node tớ.Mô hình nhân bản chủ - tớ rất hữu ích cho việc mở rộng trong những hệ thống cần đọc thường xuyên. Ta có thể mở rộng theo chiều ngang (horizontally scale) bằng cách thêm các node tớ vào và chắc chắn rằng các node chủ đủ sức để xử lý với số lượng node tớ tương ứng. Vì các node chủ có giới hạn cập nhật dữ liệu nên không tốt với các hệ thống cần ghi nhiều dữ liệu.
Khi một node chủ bị hỏng thì ta vẫn có thể đọc dữ liệu từ các node tớ. Điều này rất hữu ích cho hệ thống cần đọc nhiều của ta. Việc thay đổi (viết dữ liệu) được thực hiện do các node chủ khác hoặc một node chủ mới được bổ sung thực hiện. Ta cũng có thể lấy một node tớ làm node chủ một cách nhanh chóng.
Có thể chỉ định một node tớ làm node chủ bằng tay hay tự động. Khi xây dựng trên hệ thống cluster ta có thể chỉ định và cấu hình trước một node chủ. Việc chỉ định tự đông một node tớ làm node chủ khi một node chủ bị hỏng sẽ làm giảm thời gian lỗi của hệ thống.

7.2.4. Nhân bản ngang hàng (Peer to peer replication)
Với mô hình nhân bản ngang hàng, các node trong hệ thống đóng vai trò ngang nhau. Mỗi node có khả năng đọc và ghi dữ liệu.
Khi một node bị hỏng thì vấn không ảnh hưởng đến dữ liệu của hệ thống. Ta có thể dễ dàng thêm các node để tăng hiệu suất của hệ thống.

(Nguồn nodejs.vn)