Cơ sở dữ liệu quan hệ: phân vùng trong RAM? Thảo luận về cấu trúc lý thuyết


7

Tôi đang viết lại một công cụ máy chủ MMORPG bằng cách sử dụng một số yếu tố bí truyền (về mặt lý thuyết là tốt nhưng hiếm khi được sử dụng trong thực tế) và có một chút nghi ngờ. Một số yếu tố trong số này là loại rắn rắn - nhưng quan điểm của việc thực hiện một máy chủ MMO Máy chủ MMO khác là thử nghiệm một số khái niệm này trong mã cấp độ sản xuất.

Tuy nhiên, tôi hy vọng ai đó ở đây có thể có một số kinh nghiệm thực tế, tuy nhiên, với các mô hình phân vùng PostgreSQL và có thể cung cấp một số kiến ​​thức chuyên môn cho dự án này.

Tổng quat

Có phiên bản TL; DR bên dưới.

  • Cấu trúc hệ điều hành lõi là một cụm các phiên bản Linux, có thể trên hệ thống đám mây. Sơ khai để giám sát hiệu suất hệ thống tổng thể và tạo ra các phiên bản mới bằng API bên ngoài được lên kế hoạch để thực hiện sau này; cho mục đích thử nghiệm, chúng tôi đang xem xét có thể sử dụng Amazon, nhưng chúng tôi đang mở cửa để biến nó thành một mô-đun có thể cắm được, ví dụ như RackSpace và các nhà cung cấp khác, hoặc thậm chí thực hiện một số điều nghịch ngợm với việc cấu hình lại một nhóm vật lý, chế độ chờ nóng máy chủ trên một giá riêng.
  • Logic MMO chính dựa trên mô hình Hệ thống thực thể-thành phần-hệ thống tinh khiết. Các thực thể là các ID số nguyên dài Các thành phần là các bản ghi dữ liệu quan hệ hoặc bộ (danh sách) các bản ghi (tài liệu tham khảo THAM GIA); Hệ thống là chức năng. Các hệ thống cung cấp siêu dữ liệu về các Thành phần mà chúng cần truy cập và phương thức ← → dữ liệu cục bộ trên cụm được dựa trên một kế hoạch dự đoán các truy cập này, cố gắng tiếp tục chạy cùng một hệ thống trên cùng một máy chủ. Đó là: các hệ thống truy cập cùng một thành phần của cùng một thực thể sẽ có xu hướng nằm trên cùng một máy.
  • Kho dữ liệu quan hệ được hỗ trợ bởi cơ sở dữ liệu PostgreSQL. Điều này đã được lựa chọn dựa trên phần mềm miễn phí cũng như cung cấp dịch vụ SQL / ACID tốt hơn cho mục đích của chúng tôi so với MySQL theo một số cách. Hãy giả sử rằng đây là một bất biến (nó đã được tranh luận về rất nhiều).
  • Các phiên bản máy chủ lưu trữ đại diện cho một thế giới trò chơi duy nhất, chiếm một không gian liên kết liền kề: không có sự không liên tục (ví dụ: cấp độ; hệ thống sao; thể hiện thế giới) trong thế giới trò chơi. Do đó, các thực thể có thể được phân vùng trên các máy chủ dựa trên các vùng động, kích thước của kích thước có thể thay đổi khi chạy. Đây là một khu vực được đưa ra bởi các khu vực như vậy có thể được phân vùng hiệu quả hơn hoặc ít hơn trong SQL: ví dụ: chúng ta có thể định nghĩa một mặt phẳng phân vùng trên mạng tại Y = -10 và phân chia các thực thể dựa trên các liên kết Y của chúng hoặc tương tự. Các cơ chế chính xác được sử dụng cho việc này có thể sẽ trải qua một số thử nghiệm dưới tải mô phỏng. Thay đổi quy tắc phân vùng này sẽ là một sự kiện tương đối không thường xuyên: có lẽ bộ đếm thời gian 5 hoặc 10 phút có thể theo dõi tải máy chủ và cố gắng xác định phân chia tối ưu hơn.
  • Nó được phép cho một máy chủ lưu trữ là một máy chủ cơ sở dữ liệu (cụm), máy chủ logic trò chơi hoặc (cho kích thước cụm = 1 hệ thống) cả hai. Đó là một mối quan hệ được đưa ra, chúng ta có thể tạo ra các phiên bản DB dưới sự kiểm soát của hệ thống kế hoạch chính và cấu hình chúng theo các cách phức tạp tùy ý để quản lý việc tham gia cụm và v.v. Có khả năng, điều này có thể bao gồm việc tạo RAMdiscs cơ bản hoặc quy tắc phân vùng hoặc vv.
  • Do đó, tập dữ liệu cho một máy chủ nhất định có thể là sự kết hợp của một tập hợp các bảng (thành phần) nhất định, nhưng chỉ quan tâm đặc biệt đến một nhóm thực thể nhất định, được chọn theo một tiêu chí riêng. Nhằm mục đích hiệu quả, chúng tôi có thể lưu trữ một cột trên entitiesbảng cho biết nhóm địa phương máy chủ nào mà nó thuộc về hoặc một bảng riêng biệt cung cấp ánh xạ đó hoặc một cái gì đó cho hiệu ứng đó.
  • Có một giả định bẩm sinh rằng các hồ sơ riêng lẻ chứa đủ dữ liệu để duy trì tính toàn vẹn miễn là nhật ký cơ sở dữ liệu phía sau không bị phá hủy. IE: miễn là một giao dịch COMMIT, chúng tôi không quan tâm khủng khiếp đến việc gặp sự cố cho dù chúng tôi có nhận được hình ảnh trước khi đưa ra trước hoặc sau khi hình ảnh của bất kỳ giao dịch cụ thể nào. Tôi nghĩ rằng tôi đã xử lý khái niệm đó bằng lời nói: đặt một cách khác, chúng tôi không lo lắng khủng khiếp, cho mục đích phục hồi sự cố, cho dù toàn bộ giao dịch bị mất, miễn là chúng tôi mất toàn bộ giao dịch. Khả năng mất máy chủ cụm (ví dụ: máy bắt lửa) được xử lý ở cấp độ kế hoạch và khu vực trách nhiệm của máy chủ đó có thể được chỉ định lại khá nhanh nếu chúng tôi phát hiện mất nhịp tim.
  • Hầu như mọi máy chủ lưu trữ sẽ viết khoảng một nửa so với khi đọc, cao hơn rất nhiều so với nhiều hệ thống cơ sở dữ liệu được thiết kế để mong đợi.

Tổng quan (TL; DR)

Chúng tôi có một loạt các boxen Linux với PostgreSQL. Chúng tôi có một số chức năng nhận một tập hợp con dữ liệu có thể được xác định bằng cách sử dụng SELECThoặc VIEWchạy trên các máy chủ đó và viết ra các thay đổi gần như nhiều khi chúng đọc.

Mô hình lý thuyết thuần túy

Đây là nơi nó trở nên dễ vỡ:

Các thành phần ánh xạ trực tiếp đến các bảng và hàng quan hệ. Ví dụ: giả sử có một thành phần Position. ID thực thể sẽ là khóa chính trên bảng và để kiểm tra tính nhất quán, cũng là khóa ngoại đối với entitiesbảng chỉ chứa SERIAL8trường PK . Bảng vị trí sau đó có, giả sử, x NUMERIC, y NUMERIC, z NUMERICcác cột.

Sau đó, hãy tưởng tượng một Hệ thống Trọng lực sẽ cần các thành phần Vị trí, Khối lượng và Quán tính và một Hệ thống Va chạm khác sử dụng các Thành phần này cũng như Thành phần Vật lý.

Trong một thế giới hoàn hảo (nghĩa là hiệu suất không thành vấn đề), chúng tôi biết Thực thể nào sẽ được xử lý bởi một Hệ thống sử dụng SQL SELECTvới một số tiêu chí. Có lẽ PhysVolume có thể có một hộp giới hạn, cho phép loại bỏ nhanh chóng các Thực thể, những người không chiếm một khối lượng vật lý, hoặc rõ ràng là không ở gần bất kỳ Thực thể nào khác mà họ có thể va chạm (một số vị trí không quá lạ mắt JOINvề Vị trí và Vật lý ). Vì vậy, chúng ta có một định nghĩa hệ thống liệt kê: Thành phần nào sẽ cần dữ liệu và SELECTtruy vấn để có được cấu trúc bản ghi bất biến theo thời gian. Những hồ sơ đó được đưa vào, từng cái một, cho Hệ thốngrunchức năng, và nó thực hiện bất kỳ thay đổi là cần thiết. Nếu Hệ thống ghi vào Thành phần mà nó không đọc, chúng tôi sẽ khai báo trước để bảo toàn địa phương dữ liệu.

Bộ thực tế trong

Tất nhiên, vấn đề là các SQL SELECTtừ các đĩa từ xa không phải là thứ mà người ta muốn thực hiện trong mỗi khung hình hình chữ nhật của một vòng lặp mô phỏng chính. Một số hệ thống này có thể đang chạy vượt quá 10Hz.

Bây giờ, tôi biết, không có tối ưu hóa trước thời điểm đó, nhưng điều này có vẻ như là một sự thất bại của mô hình, vì trừ khi có cách sử dụng mô hình lý thuyết đó theo cách thời gian thực.

Ngoài ra, tùy chọn cần thiết hơn cho các cài đặt lớn hơn, hệ thống kế hoạch cũng có khả năng muốn di chuyển các nhóm pool của các thực thể, rất có thể là các thực thể được đặt ở một khu vực nhất định trên thế giới, vào các máy chủ riêng lẻ, để cân bằng tải và giữ cho bộ nhớ cache của bộ nhớ cache bỏ lỡ mà phải đạt bất kỳ cơ sở dữ liệu phụ trợ chung nào có mục đích thấp.

Câu hỏi (cuối cùng!)

Được

  • một nhóm dữ liệu cho
    • một bộ XEM và XEM cập nhật
    • Có thể cung cấp nguồn đầu vào và đầu ra cho:
      • một bộ hệ thống nhất định
      • (đại diện như một danh sách các bảng)
      • Như được áp dụng cho một nhóm các Thực thể,
      • (đại diện là một lựa chọn không liền kề của SERIAL8 REFERENCEs)

Có một cách hợp lý để tạo ra

  • một phiên bản PostgreSQL trong RAM (hoặc tương tự)
    • Sọ duy trì quyền hạn chính cho dữ liệu đã cho
  • mà không phá vỡ tính toàn vẹn giao dịch chung?

Nếu đây là một thiết kế không hợp lý, khái niệm dự phòng của tôi về cơ bản là mô phỏng hiệu ứng tương tự bằng cách thử tải trước các khung nhìn vào các bảng tạm thời trong RAM hoặc một cái gì đó, mặc dù tôi đã không dành nhiều thời gian để suy nghĩ về việc nó có thể hoạt động kém như thế nào.

Bất kỳ sự thay thế hợp lý nào có thể phục vụ mô hình lý thuyết cơ bản đều được đánh giá cao.


Thiết kế cơ sở dữ liệu, khó như một cuộc chiến, nên được xem xét cho cả quan điểm và một số chi tiết phức tạp. Tôi giới thiệu cuốn sách " Nghệ thuật của SQL ". Tôi nghiêng về mối quan tâm của bạn về cơ sở dữ liệu và 「không tối ưu hóa trước thời điểm」 không phải là trường hợp thiết kế cơ sở dữ liệu. Hai chương đầu tiên của cuốn sách sẽ cho bạn cái nhìn rõ ràng hơn về vấn đề của bạn. Tôi xin lỗi tôi không thể cho bạn một gợi ý hữu ích hơn.
Mike Lue

Bạn đang hỏi về một cá thể postgres duy nhất đang chạy trong bộ nhớ hay là câu hỏi về phân cụm?
Jack nói hãy thử topanswers.xyz

Kinda cụm, tôi nghĩ. Ở dạng đơn giản nhất, một thành viên của cụm RAM (trên mỗi máy chủ xử lý của bộ xử lý hình chữ nhật) có thể phản chiếu một tập hợp con của một hoặc nhiều máy chủ được hỗ trợ đĩa đĩa?
BRPocock

Câu trả lời:


3

Đó là một câu hỏi dài.

Trước hết, dự án hiện tại của tôi (tôi là người cơ sở dữ liệu, có các chuyên gia về công cụ MMO để giải quyết vấn đề đó) là một dạng MMORPG dựa trên một công cụ sẵn có. Các tập sẽ giống như tập trực tuyến đêm giao thừa "hoặc" World of Tanks ".

Bây giờ cho một câu trả lời ngắn trực giao:

  • tách riêng DB và Engine hoàn toàn
    Không trộn lẫn và khớp vì tối ưu hóa phần cứng
  • phần cứng: DB và máy chủ cơ sẽ cách thông số kỹ thuật khác nhau
  • thiết kế cơ sở dữ liệu của bạn bình thường

Tất nhiên còn nhiều điều nữa, nhưng tôi khuyên bạn nên suy nghĩ quá mức về vấn đề và tự bắn vào chân mình. Tôi chỉ đơn giản là áp dụng các kỹ thuật tương tự cho MMO của mình mà tôi đã sử dụng trong Ngân hàng Đầu tư vì IMO hầu hết các hệ thống khối lượng lớn sẽ hội tụ theo kiến ​​trúc tương tự

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.