Tôi đã một phân phối/liên cơ sở dữ liệu có cấu trúc như sau:Tối ưu hóa băng thông mạng qua việc tập hợp cơ sở dữ liệu phân tán
- Các cơ sở dữ liệu nằm rải rác trên ba vị trí địa lý ("nút")
- Nhiều cơ sở dữ liệu được nhóm tại mỗi node
- Cơ sở dữ liệu quan hệ là sự kết hợp giữa PostgreSQL, MySQL, Oracle và MS SQL Server; cơ sở dữ liệu không quan hệ là một trong hai MongoDB hay Cassandra
- khớp nối lỏng trong mỗi nút và trên liên nút đạt được thông qua RabbitMQ, với mỗi nút chạy một nhà môi giới RabbitMQ
Tôi đang thực hiện một tập hợp liên nút readonly hệ thống công việc cho các công việc mở rộng liên kết nút (ví dụ cho các công việc không phải là cục bộ cho một nút). Những công việc này chỉ thực hiện các truy vấn "get" - chúng không sửa đổi cơ sở dữ liệu. (Nếu kết quả của các công việc được dự định đi vào một hoặc nhiều cơ sở dữ liệu thì điều này được thực hiện bởi một công việc riêng biệt không phải là một phần của hệ thống công việc liên nút mà tôi đang cố gắng tối ưu hóa.) Mục tiêu của tôi là giảm thiểu băng thông mạng được yêu cầu bởi các công việc này (đầu tiên để giảm thiểu băng thông giữa các nút/WAN, sau đó để giảm thiểu băng thông nội bộ/LAN); Tôi giả định một chi phí thống nhất cho mỗi liên kết WAN, và một chi phí thống nhất khác cho mỗi liên kết mạng LAN. Các công việc không đặc biệt nhạy cảm với thời gian. Tôi thực hiện một số cân bằng tải CPU trong một nút nhưng không phải giữa các nút.
Lượng dữ liệu được truyền qua mạng WAN/LAN cho công việc tổng hợp là nhỏ so với số lượng cơ sở dữ liệu viết cục bộ cho cụm hoặc cơ sở dữ liệu cụ thể, vì vậy sẽ không thực tế khi phân phối đầy đủ cơ sở dữ liệu trên toàn liên bang.
Các thuật toán cơ bản tôi sử dụng để giảm thiểu băng thông mạng là:
- Với một công việc chạy trên một tập hợp các dữ liệu được trải rộng ra các liên đoàn, các nút quản lý sẽ gửi một thông điệp cho mỗi các nút khác chứa các truy vấn cơ sở dữ liệu có liên quan.
- Mỗi nút chạy tập hợp truy vấn của nó, nén chúng bằng gzip, lưu trữ chúng và gửi kích thước đã nén của chúng đến nút người quản lý.
- Người quản lý di chuyển đến nút chứa đa số dữ liệu (cụ thể, với máy trong cụm có nhiều dữ liệu nhất và có lõi nhàn rỗi); nó yêu cầu phần còn lại của dữ liệu từ hai nút khác và từ các máy khác trong cụm, sau đó nó chạy công việc.
Khi có thể, công việc sử dụng cách tiếp cận phân chia và chinh phục để giảm thiểu lượng dữ liệu đồng vị trí cần thiết. Ví dụ, nếu công việc cần tính tổng của tất cả các số liệu bán hàng trên toàn liên đoàn, thì mỗi nút tại địa phương tính tổng doanh thu của nó, sau đó được tổng hợp tại nút người quản lý (thay vì sao chép tất cả dữ liệu bán hàng chưa xử lý sang nút người quản lý) . Tuy nhiên, đôi khi (chẳng hạn như khi thực hiện một kết nối giữa hai bảng được đặt tại các nút khác nhau) thì cần phải có dữ liệu đồng vị trí. Điều đầu tiên tôi đã làm để tối ưu hóa điều này là tổng hợp các công việc, và để chạy các công việc tổng hợp tại mười phút epochs (tất cả các máy đều chạy NTP, vì vậy tôi có thể chắc chắn rằng "mỗi mười phút" có nghĩa là như nhau ở mỗi nút). Mục đích là cho hai công việc để có thể chia sẻ cùng một dữ liệu, làm giảm tổng chi phí vận chuyển dữ liệu.
- Cho hai công việc truy vấn cùng một bảng, tôi tạo ra kết quả của mỗi công việc, sau đó tôi lấy giao điểm của hai bộ kết quả.
- Nếu cả hai công việc được lập biểu để chạy trên cùng một nút, thì chi phí chuyển mạng được tính bằng tổng của hai kết quả trừ đi giao điểm của hai kết quả.
- Hai bộ kết quả được lưu trữ vào các bảng tạm thời của PostgreSQL (trong trường hợp dữ liệu quan hệ) hoặc các bộ khung Cassandra columnfamilies/MongoDB tạm thời (trong trường hợp dữ liệu nosql) tại nút được chọn để chạy các công việc; các truy vấn ban đầu sau đó được thực hiện dựa trên các kết quả kết hợp và dữ liệu được gửi đến các công việc riêng lẻ. (Bước này chỉ được thực hiện trên kết quả kết hợp, dữ liệu resultset cá nhân chỉ đơn giản là được giao cho công việc của mình mà không được lưu trữ trước trên các nhóm/bộ sưu tập/bảng tạm thời.)
Điều này dẫn đến cải thiện băng thông mạng, nhưng 'm tự hỏi nếu có một khuôn khổ/thư viện/thuật toán sẽ cải thiện về điều này. Một tùy chọn mà tôi xem xét là lưu các bộ kết quả vào một nút và tính toán các kết quả được lưu trong bộ nhớ cache này khi xác định băng thông mạng (tức là cố gắng sử dụng lại tập hợp kết quả trên các công việc ngoài tập hợp hiện tại của các công việc đã định trước. công việc chạy trong một kỷ nguyên 10 phút có thể sử dụng bộ kết quả được lưu trong bộ nhớ cache từ một kết quả 10 phút trước đó, nhưng trừ khi công việc sử dụng cùng một kết quả chính xác (nghĩa là trừ khi chúng sử dụng các mệnh đề giống hệt nhau) thì tôi không biết thuật toán mục đích sẽ điền vào các khoảng trống trong resultset (ví dụ, nếu resultset sử dụng mệnh đề "where N> 3" và một công việc khác cần resultset với mệnh đề "where N> 0" thì thuật toán nào tôi có thể sử dụng xác định rằng tôi cần phải lấy liên kết của resultset gốc và với resultset với mệnh đề "where N> 0 AND N < = 3") - Tôi có thể thử viết thuật toán của riêng mình để làm điều này, nhưng kết quả sẽ là buggy vô dụng mess. Tôi cũng cần xác định khi nào dữ liệu được lưu trữ là cũ - cách đơn giản nhất để làm điều này là so sánh dấu thời gian của dữ liệu được lưu trong bộ nhớ cache với dấu thời gian được sửa đổi cuối cùng trên bảng nguồn và thay thế tất cả dữ liệu nếu dấu thời gian đã thay đổi. Tôi muốn chỉ có thể cập nhật các giá trị đã thay đổi với dấu thời gian cho mỗi hàng hoặc mỗi đoạn.
Sẽ dễ dàng hơn khi phân phối đầy đủ các bảng đầy đủ đến từng trang web, thay vì cố gắng xử lý các đoạn từ một phần trong mệnh đề? Dung lượng ổ đĩa là rẻ, nhưng nó phụ thuộc vào tần suất dữ liệu cơ bản thay đổi so với mức độ hẹp của các biến vị ngữ của bạn là liệu wil có làm giảm lưu lượng mạng hay không. – rlb
@rlb Vấn đề là có rất nhiều hoạt động viết trong mỗi cụm, và vì vậy bảng phân phối đầy đủ sẽ có nghĩa là hoạt động viết này sẽ cần phải truyền đến từng cụm ngay cả khi nó không cần thiết. Ví dụ, một cơ sở dữ liệu là một cơ sở dữ liệu tài chính với giá cổ phiếu, có nghĩa là có ** ** nhiều cơ sở dữ liệu viết. Các công việc được liên kết có thể chỉ cần một ảnh chụp nhanh dữ liệu này nhiều nhất mỗi giờ hoặc lâu hơn, một lượng nhỏ băng thông mạng cần thiết để truyền dữ liệu cho mỗi lần cập nhật cổ phiếu cho mỗi cụm. –
Ok hiểu vấn đề về âm lượng. Bạn có quyền kiểm soát những gì được chuyển qua dây không? Chúng tôi đã chuyển từ hàng này sang cột khác cho kết quả và tỷ lệ nén đã tăng lên, vì vậy, độ cao này là một chiến thắng đơn giản, ít rủi ro nhưng không phải là những gì bạn đang yêu cầu chính xác. Sẽ săn lùng quanh văn phòng để tìm một thứ gì đó cho câu hỏi thực tế của bạn nhưng chủ yếu chúng tôi làm việc để tối ưu hóa như một sự tham gia được phân phối, như bạn đề cập có thể flakey nếu không được thực hiện một cách hoàn hảo. – rlb