Câu hỏi MySQL sharding phương pháp tiếp cận?


Cách tiếp cận tốt nhất để Sharding bảng MySQL là gì. Các phương pháp tôi có thể nghĩ là:

  1. Ứng dụng cấp sharding?
  2. Sharding ở lớp proxy MySQL?
  3. Trung tâm tra cứu máy chủ cho sharding?

Bạn có biết bất kỳ dự án hoặc công cụ thú vị nào trong lĩnh vực này không?


76
2018-04-04 16:26


gốc




Các câu trả lời:


Cách tiếp cận tốt nhất để sharding bảng MySQL không làm điều đó trừ khi nó là hoàn toàn không thể tránh khỏi để làm điều đó.

Khi bạn đang viết một ứng dụng, bạn thường muốn làm như vậy theo cách tối đa hóa vận tốc, tốc độ của nhà phát triển. Bạn tối ưu hóa cho độ trễ (thời gian cho đến khi câu trả lời đã sẵn sàng) hoặc thông lượng (số câu trả lời mỗi đơn vị thời gian) chỉ khi cần thiết.

Bạn phân vùng và sau đó gán phân vùng cho các máy chủ khác nhau (= shard) chỉ khi tổng của tất cả các phân vùng này không còn phù hợp với một cá thể máy chủ cơ sở dữ liệu duy nhất - lý do cho việc viết hoặc đọc.

Trường hợp ghi là a) tần số ghi là quá tải các máy chủ này đĩa vĩnh viễn hoặc b) có quá nhiều ghi đang diễn ra để sao chép vĩnh viễn chậm trong hệ thống phân cấp nhân rộng này.

Các trường hợp đọc cho sharding là khi kích thước của dữ liệu là quá lớn mà bộ làm việc của nó không còn phù hợp với bộ nhớ và dữ liệu đọc bắt đầu đánh đĩa thay vì được phục vụ từ bộ nhớ hầu hết thời gian.

Chỉ khi bạn  để bạn làm điều đó.


Khoảnh khắc bạn phân mảnh, bạn đang trả tiền cho điều đó bằng nhiều cách:

Phần lớn SQL của bạn không còn khai báo nữa.

Thông thường, trong SQL bạn đang nói cho cơ sở dữ liệu dữ liệu nào bạn muốn và để nó cho trình tối ưu hóa để biến đặc tả đó thành một chương trình truy cập dữ liệu. Đó là một điều tốt, bởi vì nó là linh hoạt, và bởi vì viết các chương trình truy cập dữ liệu này là công việc nhàm chán làm tổn hại đến vận tốc.

Với môi trường bị phân mảnh, có thể bạn đang nối một bảng trên nút A với dữ liệu trên nút B hoặc bạn có bảng lớn hơn nút, trên nút A và B và đang nối dữ liệu từ nó với dữ liệu trên nút B và C. Bạn đang bắt đầu viết các giải pháp tham gia dựa trên hàm băm theo cách thủ công để giải quyết (hoặc bạn đang phát minh lại cụm MySQL), nghĩa là bạn kết thúc với rất nhiều SQL không còn khai báo nữa, nhưng thể hiện chức năng SQL theo cách thủ tục (ví dụ bạn đang sử dụng câu lệnh SELECT trong vòng lặp).

Bạn đang phải chịu nhiều thời gian chờ mạng.

Thông thường, một truy vấn SQL có thể được giải quyết cục bộ và trình tối ưu hóa biết về các chi phí liên quan đến các truy cập đĩa cục bộ và giải quyết truy vấn theo cách giảm thiểu chi phí cho việc đó.

Trong một môi trường được phân giải, các truy vấn được giải quyết bằng cách chạy truy cập khóa-giá trị trên mạng tới nhiều nút (hy vọng với truy cập khóa theo đợt và không tra cứu khóa riêng cho mỗi chuyến đi khứ hồi) hoặc bằng cách đẩy các phần của WHERE mệnh đề trở đi cho các nút mà chúng có thể được áp dụng (được gọi là 'điều kiện đẩy lùi'), hoặc cả hai.

Nhưng ngay cả trong trường hợp tốt nhất, điều này liên quan đến nhiều chuyến đi vòng quanh mạng hơn là tình hình địa phương và điều đó phức tạp hơn. Đặc biệt là vì trình tối ưu hóa MySQL không biết gì về độ trễ của mạng cả (Ok, MySQL cluster đang dần dần cải thiện điều đó, nhưng đối với vanilla MySQL bên ngoài cluster vẫn đúng).

Bạn đang mất rất nhiều sức mạnh biểu cảm của SQL.

Ok, điều đó có lẽ ít quan trọng hơn, nhưng các ràng buộc khóa ngoài và các cơ chế SQL khác cho toàn vẹn dữ liệu không có khả năng mở rộng nhiều phân đoạn.

MySQL không có API cho phép truy vấn không đồng bộ trong thứ tự hoạt động.

Khi dữ liệu cùng loại nằm trên nhiều nút (ví dụ dữ liệu người dùng trên các nút A, B và C), các truy vấn ngang thường cần được giải quyết dựa trên tất cả các nút này ("Tìm tất cả tài khoản người dùng chưa đăng nhập trong 90 ngày Hoặc nhiều hơn"). Thời gian truy cập dữ liệu tăng tuyến tính với số lượng nút, trừ khi nhiều nút có thể được hỏi song song và kết quả được tổng hợp khi chúng đến ("Map-Reduce").

Điều kiện tiên quyết cho điều đó là một API giao tiếp không đồng bộ, không tồn tại cho MySQL trong một hình dạng hoạt động tốt. Phương án thay thế là rất nhiều tiền và các kết nối trong các tiến trình con, đang truy cập vào thế giới của hút trên một mùa giải.


Một khi bạn bắt đầu sharding, cấu trúc dữ liệu và cấu trúc liên kết mạng sẽ được hiển thị dưới dạng các điểm hiệu suất cho ứng dụng của bạn. Để thực hiện một cách hợp lý, ứng dụng của bạn cần phải nhận thức được những điều này, và điều đó có nghĩa là việc sharding cấp ứng dụng thực sự chỉ có ý nghĩa.

Câu hỏi đặt ra là nhiều hơn nếu bạn muốn tự động phân đoạn (xác định hàng nào đi vào nút nào bằng cách băm khóa chính chẳng hạn) hoặc nếu bạn muốn chia chức năng theo cách thủ công ("Các bảng liên quan đến câu chuyện người dùng xyz đi tới master, trong khi abc và def liên quan đến các bảng đến master đó ").

Chức năng sharding có lợi thế là, nếu được thực hiện đúng, nó là vô hình với hầu hết các nhà phát triển hầu hết thời gian, bởi vì tất cả các bảng liên quan đến câu chuyện người dùng của họ sẽ có sẵn tại địa phương. Điều đó cho phép họ vẫn được hưởng lợi từ SQL khai báo càng lâu càng tốt, và cũng sẽ phải chịu độ trễ mạng ít hơn vì số lượng chuyển giao qua mạng được giữ ở mức tối thiểu.

Chức năng sharding có những bất lợi mà nó không cho phép cho bất kỳ bảng duy nhất để được lớn hơn một ví dụ, và nó đòi hỏi sự chú ý bằng tay của một nhà thiết kế.

Chức năng sharding có lợi thế là nó tương đối dễ dàng thực hiện cho một codebase hiện có với một số thay đổi không quá lớn. http://Booking.com đã thực hiện nó nhiều lần trong những năm qua và nó hoạt động tốt cho họ.


Có nói tất cả điều đó, nhìn vào câu hỏi của bạn, tôi tin rằng bạn đang đặt câu hỏi sai, hoặc tôi hoàn toàn hiểu lầm tuyên bố vấn đề của bạn.


93
2018-04-11 06:16



Đây là một câu trả lời hay. Nhưng tôi muốn chỉ ra rằng sharding là thực sự chỉ cần thiết cho các ứng dụng khối lượng cao và rất có thể là họ đang tạo ra một số loại doanh thu. Một ứng dụng tích trữ của bên thứ ba sẽ xử lý tất cả các mối quan tâm bạn có với các giao dịch, các giao dịch chéo, vv Và nếu bạn nhận được một giao dịch tốt, nó sẽ duy trì tính toàn vẹn của cơ sở dữ liệu "quan hệ". Các ứng dụng khác, bạn đúng, sẽ đơn giản biến cơ sở dữ liệu của bạn thành một cặp khóa-giá trị và do đó đánh bại mục đích của SQL. - chantheman
Tôi chưa từng gặp một ứng dụng sharding, thương mại hay không, điều đó thành công trong việc che giấu dữ liệu hiện đang nằm rải rác trên mạng và tùy thuộc vào độ trễ hoặc mâu thuẫn do thiếu thời gian chờ. Nếu bạn đang sharding, bạn ứng dụng sẽ thông báo và sẽ yêu cầu thay đổi. Bạn cũng có thể kiểm soát chính mình. Không có viên đạn bạc, nhưng có rất nhiều dầu rắn. - Isotopp
Bạn nên kiểm tra dbShards. Nó quy mô tốt hơn tuyến tính cho mỗi # của "mảnh" bạn thêm vào. Bạn sẽ yêu cầu rất ít, nếu có, thay đổi về phía ứng dụng, và có bạn ứng dụng không biết sự khác biệt. Nó chỉ gửi và nhận các giao dịch giống như bạn làm với ODBC hoặc JDBC. dbShards cũng cho phép shard-gợi ý nếu bạn muốn kiểm soát nhiều hơn một giao dịch. Bạn có thể cho dbShards biết chính xác những gì bạn muốn đọc hoặc viết. - chantheman
@ Gigala tốt, dành thời gian sáng tác một câu trả lời rõ ràng như thế này, bất kể độ rộng, cũng không cần thiết, nhưng tôi mừng vì nó đã được thực hiện, vì câu trả lời này đã chứng tỏ hữu ích cho tôi. Vui lòng không khuyến khích người dùng không "suy nghĩ bên ngoài hộp" khi trả lời. - mewm


  1. Ứng dụng Cấp sharding: dbShards là sản phẩm duy nhất mà tôi biết điều đó không "ứng dụng nhận biết sharding". Có một vài bài viết hay trên trang web. Chỉ cần theo định nghĩa, ứng dụng nhận biết sharding sẽ hiệu quả hơn. Nếu một ứng dụng biết chính xác nơi để đi với một giao dịch mà không cần phải tìm kiếm nó hoặc được chuyển hướng bởi một proxy, rằng trong bản thân nó sẽ nhanh hơn. Và tốc độ thường là một trong những mối quan tâm chính, nếu không phải là mối quan tâm duy nhất, khi ai đó đang nhìn vào sharding.

  2. Một số người "shard" với một proxy, nhưng trong đôi mắt của tôi mà đánh bại mục đích của sharding. Bạn chỉ đang sử dụng một máy chủ khác để cho các giao dịch của bạn biết nơi tìm dữ liệu hoặc nơi lưu trữ dữ liệu đó. Với ứng dụng nhận biết sharding, ứng dụng của bạn biết nơi để đi trên riêng của mình. Hiệu quả hơn nhiều.

  3. Điều này cũng giống như # 2 thực sự.


10
2018-04-04 16:34



dbShards được sử dụng trong sản xuất một số ở đâu? nó cũng không phải là nguồn mở. - sheki
Ngoài ra cách tiếp cận 2 và 3 có thể khác nhau nếu proxy tra cứu dựa trên một băm thay vì DB hoặc một cửa hàng. - sheki
dbShards được sản xuất với nhiều khách hàng, nhưng không, nó không phải là nguồn mở. Tôi không nghĩ rằng bạn sẽ tìm thấy một sản phẩm mã nguồn mở tốt. Và có bạn là chính xác rằng một băm có thể được sử dụng như là một tra cứu, nhưng trong trường hợp đó bạn vẫn phải mất thêm một "stop" để có được giao dịch của bạn vào cơ sở dữ liệu. Đó là lý do tại sao "ứng dụng nhận thức" sharding sẽ hầu như luôn luôn nhanh hơn. - chantheman
Nhưng như tôi đã nói, nếu bạn có thể nhận được một ứng dụng sharding duy trì sự toàn vẹn của các mối quan hệ, sau đó bạn sẽ được trong hình dạng tốt. Tôi đề cập đến dbShards bởi vì nó là người duy nhất tôi biết điều đó. Và kể từ đó, nó quy mô của bạn viết và đọc tốc độ tuyến tính. Bạn thêm 4 "mảnh" hoặc bạn chia một máy chủ MySQL của bạn thành 4 và nó sẽ chạy nhanh gấp 4 lần. - chantheman


Bạn có biết bất kỳ dự án hoặc công cụ thú vị nào trong lĩnh vực này không?

Một số dự án mới trong không gian này:

  • citusdata.com
  • spockproxy.sourceforge.net
  • github.com/twitter/gizzard/

7
2018-06-29 12:35





Shard-Query là một giải pháp tích trữ dựa trên OLAP cho MySQL. Nó cho phép bạn xác định sự kết hợp của các bảng bị phân hủy và các bảng không bị chặn. Các bảng chưa được sắp xếp (giống như bảng tra cứu) được tự do nối với các bảng được phân loại và các bảng được phân chia có thể được nối với nhau miễn là các bảng được nối bằng khóa phân đoạn (không có dấu chéo hoặc tự tham gia chéo ranh giới phân đoạn). Là một giải pháp OLAP, Shard-Query thường có thời gian phản hồi tối thiểu 100ms hoặc ít hơn, ngay cả đối với các truy vấn đơn giản, do đó nó sẽ không hoạt động cho OLTP. Shard-Query được thiết kế để phân tích các tập dữ liệu lớn song song.

Các giải pháp tích trữ OLTP cũng tồn tại cho MySQL. Các giải pháp nguồn đóng bao gồm ScaleDB, DBShards. Giải pháp OLTP nguồn mở bao gồm JetPants, Cubrid hoặc là Flock / Gizzard (Cơ sở hạ tầng Twitter).


4
2018-06-17 01:40





Mức ứng dụng của khóa học.

Cách tiếp cận tốt nhất mà tôi từng tìm thấy trong cuốn sách này

Hiệu suất cao MySQL http://www.amazon.com/High-Performance-MySQL-Jeremy-Zawodny/dp/0596003064

Mô tả ngắn gọn: bạn có thể chia nhỏ dữ liệu của mình thành nhiều phần và lưu trữ ~ 50 phần trên mỗi máy chủ. Nó sẽ giúp bạn tránh được vấn đề lớn nhất thứ hai của sharding - tái cân bằng. Chỉ cần di chuyển một số người trong số họ đến máy chủ mới và mọi thứ sẽ ổn :)

Tôi khuyên bạn nên mua nó và đọc phần "mysql scaling".


3
2018-04-14 09:58



Cuốn sách mà bạn đề nghị là 8 tuổi ... cuốn sách có bao gồm việc phá hủy liên quan đến công nghệ hiện nay không? - raffian
Nó bao gồm một số phương pháp cơ bản để mở rộng mysql. AFAIK không có gì thay đổi trong việc mở rộng mysql. Các kỹ thuật sao chép và sao chép cấp ứng dụng giống nhau được sử dụng rộng rãi ngày nay. - Andrey Frolov
Tôi có thể sai, nhưng tôi đã làm một tấn nghiên cứu về điều này trong tuần qua và có vẻ như bản thân mySQL đã thực hiện rất nhiều thay đổi trong 8 năm qua, đặc biệt là về phân vùng và bộ nhớ đệm. Có một phiên bản mới xuất hiện trong năm nay: amazon.com/High-Performance-MySQL-Optimization-Replication/dp/… Tôi đã không đọc nó nhưng tôi nghĩ nó bao gồm các mô hình nhân rộng mới có sẵn. - NateDSaint
Sách .. tại sao không chỉ giải thích nó ở đây. - Azarus