Sharding là gì? Khi nào nên sử dụng Sharding
Sharding là kỹ thuật tối ưu hiệu suất hệ thống bằng cách chia tách dữ liệu thành nhiều phần nhỏ hơn. Bài viết này Bizfly Cloud sẽ giải thích chi tiết về Sharding, bao gồm ưu nhược điểm và cách lựa chọn khóa Sharding hiệu quả.
Khái niệm về Khả năng mở rộng (Scalability) và Hệ thống phân tán
Trước khi đi sâu vào Sharding, hãy cùng ôn lại về khả năng mở rộng và hệ thống phân tán. Khả năng mở rộng là khả năng của một hệ thống hoặc ứng dụng để mở rộng quy mô, xử lý lượng truy cập ngày càng tăng mà không bị sập. Có hai cách để mở rộng quy mô là mở rộng theo chiều ngang (Horizontal Scaling) và mở rộng theo chiều dọc (Vertical Scaling). Mở rộng theo chiều ngang tập trung vào việc thêm nhiều nút vào hệ thống, trong khi mở rộng theo chiều dọc là thêm nhiều tài nguyên vào một máy duy nhất.
Hệ thống phân tán là tất cả các hệ thống được trải rộng trên nhiều nút và được kết nối qua mạng. Công việc trong một hệ thống như vậy được chia nhỏ trên tất cả các nút tồn tại bên trong hệ thống. Các nút phối hợp nỗ lực của chúng để hoạt động hiệu quả hơn so với môi trường một nút.
Lưu ý: Bài viết này tập trung vào Sharding như một khái niệm chung, không phải Sharding cơ sở dữ liệu thuộc bất kỳ loại nào.
Sharding là gì?
Sharding là kỹ thuật sử dụng một định danh duy nhất được gọi là khóa Sharding để chia một tập hợp các thực thể thành các phần nhỏ hơn được gọi là phân đoạn (shard). Các thực thể ở đây có thể là các thực thể miền từ DDD, các actor trong trường hợp của Akka, hoặc dữ liệu trong cơ sở dữ liệu. Sau khi Sharding được thực hiện, mỗi thực thể cụ thể sẽ chỉ tồn tại trong một phân đoạn duy nhất và một phân đoạn cụ thể chỉ tồn tại trong một vị trí.
Nói cách khác, Sharding có thể được xem như một loại phân vùng rất cụ thể, cụ thể là - phân vùng ngang. Điểm khác biệt chính là Sharding buộc phải chia dữ liệu thành nhiều máy vật lý trong khi phân vùng (Partitioning) thì không.
Lưu ý: Nếu bạn quyết định sử dụng Sharding, bạn nên đặt mục tiêu có số lượng phân đoạn gấp tối đa mười lần số lượng nút. Số lượng phân đoạn trên mỗi nút cao hơn có thể cho thấy một số sai sót trong thiết kế.
Khi nào nên sử dụng Sharding?
Mặc dù là một công cụ hữu ích và mạnh mẽ, nhưng Sharding dữ liệu cũng có thể là một khoản đầu tư lớn về thời gian và do đó, nó cần được lên kế hoạch và xem xét cẩn thận.
Một số yếu tố cần thiết nên thúc đẩy việc sử dụng Sharding là:
- Cần đảm bảo tính nhất quán tốt hơn mà không làm giảm hiệu suất
- Có nhiều tranh chấp bên trong hệ thống
- Thiếu các khả năng khác để mở rộng quy mô
Ưu và nhược điểm của Sharding
Ưu điểm lớn nhất của Sharding là nó có thể cô lập sự tranh chấp đến cấp độ của một phân đoạn duy nhất. Sharding cũng có thể làm giảm số lượng các hoạt động phân tán trong hệ thống. Bởi vì mỗi thực thể chỉ tồn tại ở một nơi trong hệ thống, nên về cơ bản chúng ta chỉ phải phân phối các hoạt động liên quan đến các thực thể trên nhiều phân đoạn.
Cả việc giảm thiểu sự tranh chấp và các hoạt động phân tán đều có thể làm tăng đáng kể hiệu suất của hệ thống vì sự tranh chấp và tương tác chéo là hai yếu tố chính hạn chế khả năng mở rộng.
Tuy nhiên, vấn đề chính với Sharding là nó là một kỹ thuật phức tạp và đòi hỏi rất nhiều suy nghĩ và lập kế hoạch để được triển khai chính xác. Hơn nữa, vì mỗi phân đoạn chỉ hiện diện ở một vị trí, nên có thể có lúc một trong các phân đoạn không khả dụng do một số lỗi - điều này làm giảm hiệu quả khả năng truy cập của hệ thống.
Cuối cùng nhưng không kém phần quan trọng, sự tranh chấp không được loại bỏ hoàn toàn. Nó được cô lập đến cấp độ của một phân đoạn duy nhất và một phần của nó được chuyển đến một vùng khác của cơ sở mã, ví dụ, điều phối viên - một thực thể kỹ thuật chịu trách nhiệm định tuyến tin nhắn đến phân đoạn thích hợp.
Các loại Sharding
Nhìn vào các loại khóa Sharding, chúng ta có thể phân biệt hai loại Sharding:
- Băm/Thuật toán: Khi chúng ta sử dụng một hoặc nhiều trường làm đầu vào để băm một hàm hoặc một thuật toán có đầu ra sẽ được sử dụng làm khóa Sharding.
- Dựa trên phạm vi: Khi chúng ta đang sử dụng một hoặc nhiều trường cùng với một số khóa cấu hình được xác định trước để định tuyến thực thể này đến phân đoạn thích hợp.
So sánh Sharding dựa trên Băm và dựa trên Phạm vi
Ưu điểm lớn nhất của Sharding dựa trên băm là nó làm tăng đáng kể cơ hội có các phân đoạn được phân phối đều. Ngược lại, khi sử dụng Sharding dựa trên phạm vi, chúng ta có thể dễ dàng gặp phải các điểm nóng (hotspots).
Thật không may, Sharding dựa trên phạm vi hoạt động tốt nhất với các khóa Sharding có độ chuẩn hóa cao, tần suất thấp và không đơn điệu - và việc đạt được cả ba đặc điểm này có thể gặp nhiều vấn đề.
Mặt khác, nếu bạn đang sử dụng Sharding dựa trên băm và quyết định thay đổi thuật toán Sharding hoặc sửa đổi số lượng phân đoạn, thì đó có thể là một nhiệm vụ rất lớn. Nó sẽ yêu cầu phân phối lại tất cả các thực thể hiện có trong các phân đoạn.
Một nhược điểm khác của Sharding dựa trên băm là các thực thể có liên quan chặt chẽ với nhau có nhiều khả năng được phân phối trên nhiều phân đoạn hơn là được đưa vào một phân đoạn duy nhất.
Khóa Sharding (Shard Key) là gì?
Đó là thuật ngữ được sử dụng để mô tả một giá trị hoặc một trường được sử dụng để phân phối các thực thể vào các phân đoạn. Nó sẽ cho phép phân phối đồng đều các thực thể trên các phân đoạn và, trong một kịch bản hoàn hảo, cũng đặt các thực thể có liên quan chặt chẽ gần nhau - tốt nhất là trên một phân đoạn duy nhất.
Khóa Sharding kém có thể dẫn đến điểm nóng (hotspots) - các phân đoạn nặng hơn đáng kể so với các phân đoạn khác, các thực thể được phân phối kém - rất nhiều yêu cầu phân tán cho dữ liệu nằm trên nhiều phân đoạn khác nhau để trả về kết quả phù hợp.
Làm thế nào để chọn Khóa Sharding tốt?
Việc chọn một khóa Sharding tốt là một trong những vấn đề quan trọng nhất khi sử dụng Sharding - một khóa Sharding kém có thể lớn hơn tất cả những lợi ích tiềm năng mà Sharding mang lại.
Dưới đây, tôi đã liệt kê những yếu tố quan trọng nhất mà chúng ta nên xem xét khi chọn Khóa Sharding:
- Độ chuẩn hóa: Sẽ giúp phân phối phân đoạn. Nó cũng sẽ thi hành số lượng phân đoạn có thể có bên trong hệ thống. Nói chung, chúng ta nên đặt mục tiêu sử dụng các khóa phân đoạn có độ chuẩn hóa cao vì nó sẽ cho phép chúng ta tạo ra nhiều phân đoạn hơn.
- Tần suất: đóng một vai trò quan trọng trong việc phân phối đồng đều các thực thể của chúng ta trong các phân đoạn vì khóa phân đoạn có tần suất thấp có thể dễ dàng tạo ra các điểm nóng hơn.
- Ngẫu nhiên hóa giá trị: chúng ta nên đặt mục tiêu có sự ngẫu nhiên hóa tốt các giá trị khóa phân đoạn vì tăng trưởng đơn điệu có thể làm tăng khả năng xảy ra điểm nóng.
Hãy nhớ rằng chỉ sự kết hợp tốt của cả ba thông số mới có thể đảm bảo việc phân phối đúng các thực thể trong hệ thống của chúng ta vì bất kỳ thông số nào trong số này đều không đủ.
Kết luận
Sharding là một khái niệm rất mạnh mẽ có thể làm tăng đáng kể khả năng mở rộng quy mô của hệ thống trong khi vẫn duy trì các đảm bảo nhất quán, tốt. Thật không may, nó cũng có thể tác động tiêu cực đến sự khả dụng của hệ thống.
Ngoài ra, trong khi thiết kế một hệ thống để hỗ trợ Sharding, chúng ta nên nhớ về việc chọn các khóa Sharding phù hợp vì chúng rất quan trọng trong cách thức hoạt động của hệ thống được Sharding. Cảm ơn thời gian của bạn.