Chương 1 CƠ SỞ DỮ LIỆU NoSQL 1. NoSQL là gì NoSQL – Not Only SQL (không chỉ SQL), là một thế hệ cơ sở dữ liệu (CSDL) mới ra đời vào những năm 2000. Nó không sử dùng mô hình dữ liệu quan hệ truyền thống, với ngôn ngữ truy vấn quen thuộc SQL để quản lý dữ liệu. NoSQL được thiết kế cho các mô hình lưu trữ dữ liệu phân bố trên nhiều máy, với kích thước dữ liệu đến hàng petabytes.
Theo Eric Evans “NoSQL được tạo ra để giải quyết các vấn đề mà hệ quản trị CSDL quan hệ (RDBMS) không thể giải quyết được”. NoSQL đáp ứng các ứng dụng mới, có đặc điểm khác so với các ứng dụng truyền thống trước đây về dữ liệu và cả về tính chất. Những ưu điểm của 11 CSDL truyền thống lại trở thành các nhân tố cản trở cho các ứng dụng mới sau này. NoSQL là một thế hệ CSDL mới với các đặc điểm nổi bật như: không quan hệ (Non relation - các dữ liệu không có mối quan hệ khóa ngoại và khóa chính), dữ liệu được phân tán trên nhiều máy vật lý (Distribute), mã nguồn mở (open source), có khả năng mở rộng theo chiều ngang (Horizontal scalable), lược đồ tự do, API đơn giản.
CSDL NoSQL có thể lưu trữ, xử lý khối lượng dữ liệu trong một vùng rộng, từ một kích thước nhỏ cho đến hàng petabytes, có thể chịu lỗi cao và đáp ứng thời gian thực. NoSQL bao gồm nhiều hệ sinh thái CSDL khác nhau, gồm hàng loạt các công nghệ CSDL khác nhau, được phát triển để đáp ứng với nhu cầu gia tăng khối lượng dữ liệu nhanh, dữ liệu phi cấu trúc, tần số truy cập và hiệu suất xử lý tốt. Trong khi đó, do yêu cầu của thực tiễn, cơ sở dữ liệu quan hệ không được thiết kế để đáp ứng những thách thức về năng lực lưu trữ, tính phi cấu trúc của dữ liệu và năng 12 lực xử lý nhanh trên khối lượng dữ liệu khổng lồ của các ứng dụng gần đây. Nghĩa là nó không hình dung được sự tăng trưởng và đa dạng dữ liệu sau năm 2000 (hình 1.
Biểu đồ tăng trưởng dữ liệu [https://www.com/2018/04/30/big-data-friend-or-foe/] 1. Lịch sử NoSQL đã có nhiều động lực bắt nguồn từ thực tiễn để thúc đẩy sự phát triển. Thuật ngữ "NoSQL" được sử dụng 13 đầu tiên bởi tác giả Carlo Strozzi năm 1998. Nó là tên chung cho các nhóm cơ sở dữ liệu nhỏ mã nguồn mở, đặc biệt không dùng ngôn ngữ SQL làm nền tảng trong truy vấn dữ liệu.
Vào năm 2009 tác giả Eric Evans, người được ủy thác dự án Cassandra-cũng là một hệ quản trị CSDL NoSQL nổi tiếng, giới thiệu lại thuật ngữ NoSQL khi Johan Oskarsson muốn tổ chức một hội thảo về cơ sở dữ liệu mã nguồn mở và dữ liệu phân tán. Eric Evans đã sử dụng cụm từ “NoSQL” để đặt tên cho các thay đổi có tính cách mạng hiện nay trong cơ sở dữ liệu phi quan hệ. Thuật ngữ NoSQL thường được sử dụng với ý nghĩa là "không chỉ SQL" hoặc CSDL không quan hệ (phi quan hệ). Kiến trúc lưu trữ của NoSQL Các hệ quản trị cơ sở dữ liệu quan hệ hiện tại đã bộc lộ những hạn chế trong các vấn đề sau: tạo chỉ mục cho một lượng dữ liệu lớn; việc mở rộng hệ thống bằng cách thêm các node mới chứa dữ liệu; việc phân trang trong khi đọc và 14 ghi dữ liệu; hoặc phân phối luồng dữ liệu đa phương tiện (phim, ảnh, nhạc.
Cơ sở dữ liệu quan hệ (CSDLQH) được thiết kế cho những ứng dụng mà dữ liệu có thể thiết kế bằng các lược đồ và có tần suất đọc/viết thường xuyên, trong đó viết bao hàm: chèn, xóa, sửa dữ liệu. Trong khi các ứng dụng dịch vụ mạng xã hội lại có một lượng dữ liệu lớn, mô hình dữ liệu biến động theo thời gian, và dữ liệu được chèn liên tục do số lượng người dùng quá nhiều ở một thời điểm, nhưng thao tác xóa, sửa là khá ít. Thiết kế dữ liệu phân tán của NoSQL giảm thiểu tối đa việc tập trung các phép tính toán và nhập xuất liên quan, để đảm bảo yêu cầu xử lý dữ liệu nhanh của các ứng dụng dịch vụ dữ liệu cộng đồng. Facebook, Twitter, Amazon là những ví dụ điển hình về dữ liệu cộng đồng và mạng xã hội.
Trong các hệ thống phân tán, việc lưu trữ chấp nhận trùng lặp dữ liệu, nghĩa là chấp nhận tính dư thừa, nhưng có kiểm soát tính nhất quán. Một yêu cầu truy vấn dữ liệu từ máy A, có thể gửi tới nhiều máy khác trong hệ thống cùng lúc. Khi một máy nào đó chứa dữ liệu, nếu gặp sự cố, cũng 15 không ảnh hưởng tới toàn hệ thống. Để đảm bảo tính thời gian thực trong các hệ thống xử lý lượng lớn dữ liệu và cân đối việc gia tăng dữ liệu dư thừa quá mức, hệ thống thiết kế sao cho các node chứa dữ liệu giống nhau nhưng vai trò khác nhau.
Thông thường người ta sẽ tách biệt cơ sở dữ liệu ra làm hai (hoặc nhiều) cơ sở dữ liệu: CSDL chỉ đọc, CSDL đồng thời đọc/ghi. Sơ đồ thiết kế hệ thống CSDL Master –Slave [linuxtrainingAcademy.com] Một cơ sở dữ liệu phụ (slave database) đảm bảo tính liên tục của dữ liệu trong việc cung cấp thao tác đọc. Ngược lại, CSDL chính phục vụ đồng thời cho cả 2 thao tác đọc và ghi.2 minh họa hệ thống CSDL Master-Slave. Các thuật ngữ cơ bản 1.
Phi lược đồ (Schemaless) Trong CSDLQH, công đoạn quan trọng trước khi lập trình là thiết kế, là công đoạn sống còn của một ứng dụng. Kết quả khâu thiết kế CSDL là lược đồ CSDL. Tuy nhiên trong CSDL NoSQL, bước thiết kế lại không được chú trọng như thế - thậm chí không có. Xem ví dụ sau, tại thời điểm 2015, khi khảo sát, 1 nhân viên chỉ cần 2 thuộc tính (Họ, tên).
Năm 2017, 1 nhân viên cần thêm thuộc tính thứ 3 (Họ, tên, email). Năm 2018 lại có nhu cầu thêm thuộc tính thứ 4: (Họ, tên, email, số điện thoại). Nếu sơ đồ được thiết kế như năm 2015, nó sẽ khó dùng cho năm 2017, 2018. Và đây là một trong những nguyên nhân chính để chọn cơ sở dữ liệu NoSQL chứ không phải là SQL.
Các nhà phát triển đã chuyển hướng sang một hệ quản trị cơ sở dữ liệu hoàn toàn mới, bởi vì cơ sở dữ liệu quan hệ không đủ linh hoạt như ví dụ trên. 17 NoSQL cho phép lưu trữ bất kỳ dữ liệu nào, thậm chí cấu trúc dữ liệu có thể thay đổi theo thời gian. Trong NoSQL, các nhà phát triển có thể biến các cơ sở dữ liệu thành một nơi để chứa dữ liệu. Mặc dù có cấu trúc phi lược đồ, nó vẫn chứa một lược đồ ẩn.
Nó là một qui tắc không cho phép người dùng thoải mái đến mức tối đa. NoSQL ra qui tắc giả định về cấu trúc của dữ liệu sẽ được tạo ra, chẳng hạn như thuộc tính tên. Bất kỳ dữ liệu mà không phù hợp với sơ đồ ngầm này sẽ không được thao tác đúng cách, dẫn đến sai sót. Trong ví dụ nhân viên trên, sẽ là sai nếu có dòng dữ liệu có 4 thuộc tính sau (Họ, tên NV, email, số điện thoại).
Vì thuộc tính thứ 2 tên NV lại không dùng chung thuộc tính tên ở các dòng dữ liệu tồn tại trước. Lý thuyết CAP (Consistency- Availability-Partition) CAP được giới thiệu bởi tác giả Brewer thuộc đại học California năm 2000, sau đó được công bố chính thức bởi 18 Gilbert và Lynch. Theo lý thuyết CAP (hình 1.3), trong một hệ thống lưu trữ dữ liệu phân tán chỉ có thể thoả mãn hai trong ba thuộc tính, nghĩa là được thứ này, thì cần hi sinh thứ khác. Nhất quán (Consistency): dữ liệu vật lý nằm tại nhiều node, nhưng về mặt logic chúng chỉ là một.
Tính sẵn có (Availability) trong mọi trường hợp, người dùng luôn luôn có thể đọc và ghi dữ liệu trong cùng một khoảng thời gian cho phép. Khả năng chịu lỗi phân vùng (Partition tolerance). Một cơ sở dữ liệu có khả năng chịu lỗi phân vùng với các vấn đề kết nối tạm thời. Một hệ thống có khả năng chịu lỗi phân vùng cần chấp nhật mất tính quán mạnh mẽ với tính sẵn có của nó là rất tự nhiên.
CA: các hệ QTCSDLQH thỏa. CP: các hệ QTCSDL sau thỏa: BigTable, Hbase, MongoDB, Redis… 19 AP: các hệ QTCSDL sau thỏa: Dynamo, Voldemort, Cassandra, CouchDB… Hình 1. Các thuộc tính của CAP [https://www.com/Questions/1064371/Why-theory- CAP-in-mongodb-CP-and-Cassandra-Ap-and] 1. Phân loại trên CAP Các hệ thống rất lớn dễ xảy ra tính phân vùng P tại một điểm nào đó do nhiều nguyên nhân.
Nên buộc hệ thống sẽ chọn đánh trọng số 3 giá trị này. Việc xem xét chọn C và A rất cần thiết. Thông thường các hệ quản trị cơ sở dữ liệu 20 truyền thống (ví dụ hệ thống quản lý ngân hàng, bảo hiểm) ưu tiên thuộc tính C hơn là A và P, tuy nhiên phần lớn các ứng dụng Web (có tính công cộng cao) lại thích A. Việc chọn trọng số 2 trong 3 giá trị CAP sẽ phân loại các cơ sở dữ liệu thành các cặp cơ bản: CA, AP và CP.
Với mỗi cặp có những ưu và nhược điểm nhất định. Tương ứng với mỗi cặp sẽ có một số hệ thống phù hợp được phát triển trên đó.1 mô tả các tình huống lựa chọn các yếu tố CAP. Lựa chọn các yếu tố CAP thích hợp cho từng tình huống Chọn Đặc điểm Ứng dụng Nhất quán + sẵn có Giao thức xác nhận - CSDL dành cho (CA) website 2 pha khi cần sự (Khuyết chịu lỗi tham gia nhiều - CSDL phân cụm phân vùng) node Nhất quán + Phân - Khóa bi quan - Phân tán dữ liệu Vùng (CP) - Thiết lặp phân - Phân tán khóa (Khuyết tính sẵn vùng ưu tiên không có) sẵn có - Đa giao thức Sẵn có + Phân vùng - Lưu trữ website (AP) Thỏa thuận giải trong bộ nhờ tạm (Khuyết tính nhất quyết xung đột - DNS quán) 21 1. Base và ACID ACID là viết tắt của 4 từ: nguyên tử (Atomicity), nhất quán (Consitency), cô lập (Isolation) và bền vững (Durability).
Một CSDL quan hệ cần thỏa tính ACID. Trong các ứng dụng thuộc nhóm cơ sở dữ liệu NoSQL, tính ACID là quá mức cần thiết do đặc thù của ứng dụng, và nó cản trở hoạt động khác của các cơ sở dữ liệu, thậm chí các hoạt động này có tính sống còn vì làm việc trên dữ liệu lớn: thời gian tìm kiếm.