Bây giờ, khi chúng ta đã hiểu rõ các loại cơ sở dữ liệu có sẵn và cách chọn cơ sở dữ liệu phù hợp cho từng trường hợp, hãy tiếp tục thảo luận về cơ sở dữ liệu trong bối cảnh của hệ thống quy mô lớn. Trong bài viết này, chúng ta sẽ tìm hiểu về ba kỹ thuật để cải thiện hiệu suất, tính sẵn sàng và khả năng mở rộng của cơ sở dữ liệu.
1. Indexing (lập chỉ mục)
Kỹ thuật đầu tiên giúp cải thiện hiệu suất truy vấn cơ sở dữ liệu được gọi là indexing (lập chỉ mục). Mục đích của lập chỉ mục là để tăng tốc các thao tác truy xuất và định vị các bản ghi mong muốn. Nếu không có index, các thao tác đó có thể yêu cầu quét toàn bộ bảng, điều này có thể mất rất nhiều thời gian khi chúng ta có các bảng lớn. Hãy xem một vài ví dụ về các thao tác như vậy.
- Giả sử chúng ta có một bảng rất lớn với nhiều hàng chứa dữ liệu về người dùng của công ty. Nếu chúng ta muốn thực hiện truy vấn để tìm tất cả người dùng sống ở một thành phố cụ thể để gửi cho họ các thông báo phù hợp. Để tìm tất cả các hàng trong bảng thỏa điều kiện này, cơ sở dữ liệu của chúng ta sẽ phải quét qua tất cả các hàng. Điều này có thể mất rất nhiều thời gian đối với các bảng lớn.
- Các ví dụ khác về các thao tác tốn kém liên quan đến việc quét toàn bộ bảng bao gồm lấy danh sách người dùng trong bảng được sắp xếp, ví dụ như theo họ, tuổi hoặc thu nhập của họ. Ngoài thao tác sắp xếp, chúng ta vẫn cần phải đi qua toàn bộ bảng ít nhất một lần. Bất kỳ thao tác nào trong số đó, nếu được thực hiện thường xuyên hoặc trên các bảng rất lớn, có thể trở thành nút thắt cổ chai về hiệu suất và ảnh hưởng đến trải nghiệm của người dùng.
Đây chính là lúc index trở nên hữu ích. Chỉ mục cơ sở dữ liệu (index) là một bảng phụ mà chúng ta có thể tạo từ một cột hoặc một nhóm cột cụ thể. Khi chỉ mục được tạo từ một cột, bảng chỉ mục này chứa một ánh xạ từ giá trị của cột đến bản ghi chứa giá trị đó. Một khi bảng chỉ mục được tạo, chúng ta có thể đưa bảng đó vào một cấu trúc dữ liệu. Ví dụ, chúng ta có thể sử dụng hashmap để có các thao tác tìm kiếm nhanh hoặc sử dụng một loại cây cân bằng như B-Tree, loại cây này giữ cho tất cả các giá trị được sắp xếp, do đó dễ dàng hơn để tìm một bản ghi cụ thể và trả về danh sách các hàng đã sắp xếp theo một điều kiện nhất định. Ví dụ, chúng ta có thể sử dụng hashmap, cung cấp khả năng tra cứu rất nhanh, hoặc sử dụng một loại cây cân bằng như B-Tree, loại cây này giữ cho tất cả các giá trị được sắp xếp, giúp dễ dàng tìm một bản ghi cụ thể và trả về danh sách các hàng đã sắp xếp theo một điều kiện nhất định. Chẳng hạn, nếu chúng ta tạo một chỉ mục từ cột "city" (thành phố) và đặt chỉ mục đó trong bảng băm, thì một truy vấn tìm tất cả người dùng sống ở thành phố LA có thể trả về danh sách này ngay lập tức mà không cần quét qua toàn bộ bảng. Tương tự, nếu chúng ta muốn lấy danh sách tất cả người dùng được sắp xếp theo tuổi trong một khoảng tuổi nhất định, thì một chỉ mục được tổ chức trong cây cân bằng sẽ cung cấp cho chúng ta danh sách này với độ phức tạp thời gian logarit, tránh việc quét toàn bộ bảng và sắp xếp lại cho mỗi truy vấn.
Như đã đề cập, chỉ mục có thể được tạo từ không chỉ một cột mà còn từ một tập hợp cột. Một ví dụ cho trường hợp này là nếu chúng ta muốn lấy tất cả người dùng sống ở một thành phố cụ thể và có họ nhất định. Nếu chỉ tạo chỉ mục cho cột "city", chúng ta sẽ có ngay tất cả người dùng sống ở thành phố đó. Tuy nhiên, chúng ta vẫn phải quét qua tất cả những người dùng đó để kiểm tra xem họ của họ có khớp với truy vấn hay không. Ngược lại, nếu chúng ta tạo một composite index từ cả hai cột, chúng ta có thể có một ánh xạ trực tiếp từ cặp giá trị đến hàng chứa chúng. Vì vậy, với truy vấn tìm người sống ở một thành phố và có họ cụ thể, chúng ta sẽ nhận được kết quả ngay lập tức mà không cần quét toàn bộ dữ liệu.
Dĩ nhiên, như mọi khi, nếu chúng ta ưu tiên một loại thao tác nào đó, chúng ta phải đánh đổi ở một mặt khác (tradeoff). Trong trường hợp lập chỉ mục, chúng ta làm cho các truy vấn đọc nhanh hơn nhưng phải đánh đổi bằng không gian lưu trữ bổ sung cho các bảng chỉ mục, và tốc độ của các thao tác ghi. Lý do khiến các thao tác ghi chậm hơn là vì mỗi khi chúng ta muốn cập nhật hoặc thêm một hàng mới, chúng ta cũng cần phải cập nhật bảng chỉ mục. Việc lập chỉ mục cũng được sử dụng rộng rãi trong các cơ sở dữ liệu phi quan hệ, chẳng hạn như các document store, để tăng tốc độ truy vấn. Vì vậy hầu hết các loại cơ sở dữ liệu đề có hỗ trợ indexing, khi tiếp cận với một cơ sở dữ liệu mới với tư tưởng tối ưu hóa hiệu suất chung ta có thể tiếp cận dễ dàng hơn và hiểu rõ được sự đánh đổi rõ nét hơn bằng cách nghiên cứu cơ chế tổ chức lưu trữ index và cấu trúc dữ liệu áp dụng của index trong cơ sở dữ liệu mà chúng ta nghiên cứu.
2. Sao chép cơ sở dữ liệu (Replication)
Kỹ thuật tiếp theo chúng ta sẽ thảo luận là sao chép cơ sở dữ liệu. Khi chúng ta lưu trữ dữ liệu quan trọng của doanh nghiệp trong cơ sở dữ liệu, thì phiên bản cơ sở dữ liệu đó trở thành một điểm có nguy cơ gây gián đoạn nếu gặp sự cố. Đổi lại, nếu chúng ta sao chép dữ liệu và chạy nhiều phiên bản cơ sở dữ liệu trên các máy tính khác nhau, chúng ta có thể tăng khả năng chịu lỗi của hệ thống, từ đó mang lại khả năng sẵn sàng cao hơn. Với nhiều bản sao của dữ liệu, chúng ta có thể đảm bảo rằng nếu một trong các bản sao gặp sự cố hoặc không khả dụng, dù tạm thời hay vĩnh viễn, hoạt động kinh doanh của chúng ta vẫn không bị ảnh hưởng. Các truy vấn có thể tiếp tục được gửi tới các bản sao còn lại trong khi chúng ta tiến hành khôi phục hoặc thay thế phiên bản bị lỗi. Ngoài khả năng sẵn sàng cao hơn, chúng ta cũng có thể cải thiện hiệu suất dưới dạng tăng thông lượng. Nếu chúng ta có hàng nghìn hoặc hàng triệu người dùng gửi yêu cầu tới cơ sở dữ liệu thông qua các service của mình, chúng ta có thể xử lý khối lượng truy vấn lớn hơn nhiều nếu phân phối chúng qua nhiều máy tính hơn. Ví dụ trong cơ sở dữ liệu mysql, chúng ta triển khai theo mô hình gồm 2 node, trong đó 1 node primary (chịu toàn bộ tải ghi hệ thống) và 1 node secondary (nhận dữ liệu sao chép từ primary và qui hoạch tải read hệ thống về node này), vì vậy giúp cho hệ thống có thể xử lí thông lượng cao hơn.
Tuy nhiên, sự đánh đổi (tradeoff) của việc sao chép cơ sở dữ liệu rõ ràng là sự phức tạp cao hơn, đặc biệt khi thực hiện các thao tác ghi, cập nhật và xóa. Việc đảm bảo rằng các thay đổi đồng thời trên cùng một bản ghi không xung đột với nhau và cung cấp các đảm bảo có thể dự đoán được về tính nhất quán và chính xác không phải là một nhiệm vụ đơn giản. Cơ sở dữ liệu phân tán nổi tiếng là khó thiết kế, cấu hình và quản lý, đặc biệt ở quy mô lớn, và đòi hỏi một mức độ chuyên môn nhất định trong lĩnh vực hệ thống phân tán. Việc sao chép cơ sở dữ liệu được hỗ trợ bởi hầu hết các cơ sở dữ liệu hiện đại. Đặc biệt, tất cả các cơ sở dữ liệu phi quan hệ đều tích hợp tính năng sao chép ngay từ ban đầu, vì các cơ sở dữ liệu này được thiết kế trong thời kỳ mà tính sẵn sàng cao và quy mô lớn đã là mối quan tâm hàng đầu của hầu hết các công ty. Việc hỗ trợ sao chép trong các cơ sở dữ liệu quan hệ khác nhau tùy thuộc vào từng phiên bản cơ sở dữ liệu quan hệ. Một thứ rất quan trọng có thể anh em sẽ bỏ lỡ là cơ chế sao chép dữ liệu lựa chọn phụ thuộc rất nhiều mà mô hình kinh doanh của doanh nghiệp, nên cùng tùy mô hình và yêu cầu, các ràng buộc sẽ ảnh hưởng đến việc lựa chọn mô hình sao chép. Một số mô hình sao chép cơ sở dữ liệu mình đã viết rất chi tiêt ở những bài viết này:
3. Phân vùng cơ sở dữ liệu (Sharding)
Kỹ thuật thứ ba mà chúng ta sẽ thảo luận là phân vùng cơ sở dữ liệu, còn được gọi là database sharding. Khác với sao chép dữ liệu (replication) khi chúng ta chạy nhiều phiên bản của cơ sở dữ liệu với cùng một bản sao dữ liệu trên mỗi phiên bản, phân vùng cơ sở dữ liệu là quá trình chia nhỏ dữ liệu ra và phân chia giữa các phiên bản cơ sở dữ liệu khác nhau. Để tăng hiệu suất, chúng ta thường chạy mỗi phiên bản trên một máy tính riêng biệt. Khi dữ liệu của chúng ta được chia nhỏ và lưu trữ trên một nhóm máy tính, chúng ta có thể lưu trữ nhiều dữ liệu hơn so với khi chỉ có một máy duy nhất. Ngoài ra, với phân vùng cơ sở dữ liệu, các truy vấn khác nhau, nếu truy cập vào các phần dữ liệu khác nhau, có thể được thực hiện hoàn toàn song song. Vì vậy, phân vùng cơ sở dữ liệu mang lại cho chúng ta hiệu suất tốt hơn và khả năng mở rộng cao hơn.
Tất nhiên, vẫn là sự đánh đổi, cái này thực chất sẽ là thứ mang lại sự đắn đo trong thiết kế của chúng ta, giống như sao chép cơ sở dữ liệu, database sharding thực chất biến cơ sở dữ liệu của chúng ta thành một cơ sở dữ liệu phân tán. Điều này làm tăng tính phức tạp của cơ sở dữ liệu và thêm một số chi phí bổ sung, vì giờ đây chúng ta cần phải có khả năng định tuyến các truy vấn đến đúng phần dữ liệu (shard) và đảm bảo rằng không có phần dữ liệu nào trở nên quá lớn so với các phần còn lại. Phân vùng cơ sở dữ liệu là tính năng số một và rất mạnh mẽ trong hầu hết các cơ sở dữ liệu phi quan hệ. Lý do là vì các cơ sở dữ liệu phi quan hệ theo thiết kế đã tách biệt các bản ghi khác nhau với nhau, nên việc lưu trữ các bản ghi này trên các máy tính khác nhau trở nên tự nhiên và dễ thực hiện hơn.
Khi nói đến cơ sở dữ liệu quan hệ, giống như trường hợp của sao chép dữ liệu, hỗ trợ phân vùng phụ thuộc vào từng phiên bản cơ sở dữ liệu cụ thể. Lý do việc phân vùng ít được hỗ trợ hơn trong các cơ sở dữ liệu quan hệ là vì các truy vấn trong cơ sở dữ liệu quan hệ thường yêu cầu làm việc với nhiều bản ghi. Việc phân tán các bản ghi này trên nhiều máy tính khiến việc thực hiện các truy vấn như vậy trở nên phức tạp hơn, đặc biệt khi vẫn cần hỗ trợ các giao dịch ACID hoặc kết nối bảng (join).
Khi chúng ta chọn cơ sở dữ liệu quan hệ cho một trường hợp sử dụng liên quan đến khối lượng dữ liệu lớn, chúng ta cần đảm bảo rằng phân vùng được hỗ trợ tốt. Nhân tiện nói về phân vùng, cũng cần đề cập rằng phân vùng không chỉ được sử dụng cho cơ sở dữ liệu mà còn có thể được dùng để chia nhỏ cơ sở hạ tầng một cách hợp lý. Ví dụ, chúng ta có thể phân vùng các phiên bản tính toán bằng cách sử dụng tệp cấu hình, để yêu cầu từ các khách hàng trả phí sẽ đi đến một số máy, còn lưu lượng từ người dùng miễn phí có thể được gửi đến các máy có cấu hình yếu hơn. Ngoài ra, chúng ta có thể gửi lưu lượng từ các thiết bị di động đến một nhóm máy tính, và lưu lượng từ máy tính để bàn đến một nhóm máy khác chạy cùng ứng dụng. Bằng cách này, nếu có sự cố xảy ra, chúng ta có thể dễ dàng biết được loại người dùng nào bị ảnh hưởng và quyết định cách hành động. Thực tế tại doanh nghiệp mình đang làm việc cũng đã thực hiện phân vùng lưu lượng đến các cụm hệ thống khác nhau để tránh việc gián đoạn diện rộng trên toàn hệ thống như ứng dụng web sẽ đến cụm proxy khác, ứng dụng di động đến cụm proxy khác,....
4. Kết luận
Cuối cùng, cần lưu ý rằng ba kỹ thuật này — lập chỉ mục, sao chép và phân vùng — hoàn toàn độc lập với nhau. Vì vậy, chúng ta không cần phải chọn chỉ một trong số chúng. Thực tế, cả ba kỹ thuật này thường được sử dụng đồng thời trong hầu hết các hệ thống quy mô lớn ngoài đời thực.
Trong bài viết này,
- Chúng ta đã thảo luận về ba kỹ thuật có thể áp dụng cho cơ sở dữ liệu để làm cho nó mạnh mẽ hơn trong một hệ thống quy mô lớn. Trước tiên, chúng ta đã tìm hiểu về lập chỉ mục (index), giúp cải thiện hiệu suất cơ sở dữ liệu bằng cách tăng tốc các thao tác tìm kiếm và truy xuất.
- Sau đó, chúng ta thảo luận về sao chép cơ sở dữ liệu (replication), giúp cải thiện khả năng sẵn sàng và hiệu suất của hệ thống thông qua tăng cường thông lượng.
- Cuối cùng, chúng ta thảo luận về kỹ thuật thứ ba là phân vùng cơ sở dữ liệu (sharding), giúp cải thiện khả năng mở rộng của cơ sở dữ liệu bằng cách chia nhỏ dữ liệu trên nhiều phiên bản cơ sở dữ liệu chạy trên các máy tính khác nhau.
5. Thông tin kết nối
Nếu anh em muốn trao đổi thêm về bài viết, hãy kết nối với mình qua LinkedIn và Facebook:
- LinkedIn: https://www.linkedin.com/in/nguyentrungnam/
- Facebook: https://www.facebook.com/trungnam.nguyen.395/
Rất mong được kết nối và cùng thảo luận!