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
entities
bả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 SELECT
hoặc VIEW
chạ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 entities
bảng chỉ chứa SERIAL8
trường PK . Bảng vị trí sau đó có, giả sử, x NUMERIC, y NUMERIC, z NUMERIC
cá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 SELECT
vớ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 JOIN
về 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à SELECT
truy 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ốngrun
chứ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 SELECT
từ 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
REFERENCE
s)
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.