Skip to content

Commit

Permalink
c
Browse files Browse the repository at this point in the history
  • Loading branch information
MacHu-GWU committed Sep 4, 2022
1 parent 9fac399 commit 084a8d7
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,69 @@

架构选择
------------------------------------------------------------------------------
- 游戏服务器: 部署在位于 VPC Public Subnet 上的 EC2 中.
- 数据库: 使用 RDS MySQL. 注意, 请不要使用 Aurora MySQL compatible version. 因为 Aurora 的 Storage engine 是完全重新设计的, 和 MySQL 的完全不同. AC 的一些 SQL 要求使用旧款的 ``MyISAM`` 存储引擎, 这是 Aurora 所不支持的.


选择游戏服务器 EC2
为游戏服务器选择 EC2 类型
------------------------------------------------------------------------------
根据 AC Wiki 上 https://www.azerothcore.org/wiki/memory-usage 的说法, 当游戏玩家探索到一片地图后, 这个区域的地图就会被加载进内存, 而玩家多的时候几乎所有的地图都会被加载进内存, 这些地图至少占用 11G 左右. 而且操作系统本身大约会占用 1G 左右的内存. 而且大约每 100 个玩家需要占用 1G 内存. 你需要留给服务器大约 1 - 2G 内存左右供临时使用. 根据这篇 AC 上的讨论 https://github.com/azerothcore/azerothcore-wotlk/discussions/3891, 维护者 FrancescoBorzi 说了, CPU 一般不是瓶颈, 而 RAM 才是. < 200 个玩家的话, 16GB 内存是足够了的. 这和我们之前计算的 200 玩家 = 11G + 2G + 1G = 占用 14G 内存一致.

在官服, 一个服务器最大玩家容量在 3000 - 5000 左右, 按照 5000 玩家计算, 我们需要 5000 / 100 ~= 50G 内存, 加上 11G 地图和操作系统的 1G 大约是 62G 内存. 显然我们用 64G 内存的服务器会有随时崩溃的危险, 由于内存在 64 以上一般是 32G 一档, **所以对于 5000 玩家的服务器我们需要用 96G 内存的虚拟机比较合适**
我们再来看一个例子. 在官服, 一个服务器最大玩家容量在 3000 - 5000 左右, 按照 5000 玩家计算, 我们需要 5000 / 100 ~= 50G 内存, 加上 11G 地图和操作系统的 1G 大约是 62G 内存. 显然我们用 64G 内存的服务器会有随时崩溃的危险, 由于内存在 64 以上一般是 32G 一档, **所以对于 5000 玩家的服务器我们需要用 96G 内存的虚拟机比较合适**

同理我们可以计算出不同玩家数量下所需的内存:
**如何选择 AWS EC2 Type**

-
根据使用场景, 内存要够用, 在内存中对数据进行计算为主, 所以是内存够用, CPU 性能优先. 所以 T3 作为 General Purpose 的场景适合对性能要求不高, 小于 200 人的场景, 也比较便宜. 而对于更多的玩家, 我们就应该上 C6g Compute Optimized 服务器了, 因为 AWS 说明了它是适合游戏服务器的 EC2 类型.

**不同玩家数量下所需的 EC2 以及成本**

对于人数少的服务器我们通常使用按需付费模型, 随时停止缴费. 对于 1000 人以上的服务器通常就是以盈利为目的的了, 一般会用年度合约的方式节约成本.

- 纯单机玩家: 需要 4G 内存, 跑地图太多内存不够的化重启世界服务器即可, 选用 ``t3.medium`` 服务器, $1 一天, $30 一个月, $360 一年.
- 和朋友一起玩, 25 人以下: 需要 8G 内存, 一起玩一般不会满世界跑, 都是来做任务打副本的, 实在不行重启世界服务器即可, 选用 ``t3.large`` 服务器, $2 一天, $60 一个月, $720 一年.
- 开小型服务器, 200 人以下: 需要 16G 内存, 满负载时大约会占用 11 + 2 = 13G 左右内存, 选用 ``c6g.12xlarge`` 服务器, $6.528 一天, $196 一个月, $2,383 一年. 或者选用 ``t3.xlarge`` 服务器, $4 一天, $120 一个月, $1,457 一年.
- 开中型服务器, 1000 人以下: 需要 32G 内存, 满负载时大约会占用 11 + 8 = 20G 左右内存, 选用 ``c6g.4xlarge`` 服务器, $13.056 一天, $392 一个月, $4,765 一年
- 开大型服务器, 3000 人以下: 需要 64G 内存, 满负载时大约会占用 11 + 30 = 41G 左右内存, 选用 ``c6g.8xlarge`` 服务器, 一年 $5,604
- 开超大型服务器, 5000 人以下: 需要 96G 内存, 满负载时大约会占用 11 + 50 = 61G 左右内存, 选用 ``c6g.12xlarge`` 服务器, 一年 $8,406
- 开超大型服务器, 12000 人以下: 需要 192G 内存, 满负载时大约会占用 11 + 120 = 131G 左右内存, 选用 ``c6a.24xlarge`` 服务器, 一年 $19,860

1.
参考资料:

-
- https://aws.amazon.com/ec2/instance-types/
- Instant Type: https://aws.amazon.com/ec2/instance-types/
- Pay as you go: https://aws.amazon.com/ec2/pricing/on-demand/
- Term contract: https://aws.amazon.com/ec2/pricing/reserved-instances/pricing/

https://github.com/azerothcore/azerothcore-wotlk/blob/master/data/sql/create/create_mysql.sql

为游戏数据库选择 Instance Type
------------------------------------------------------------------------------
选择合适的数据库大小要考虑两个维度:

1. 随着玩家数量的增加, 装备, 物品, 天赋等数量就会随之线性增加. 数据库引擎会将索引或是一些数据存在内存中, 以提高读写效率.
2. 同时在线的玩家数量增加, 需要将数据落盘的频率也就越高, 也就是俗称的 TPS 越多.

游戏本身的初始数据量大约在 200 MB 左右. 而每 1 个玩家的新增数据一般也就顶多 1 MB.

**不同玩家数量下所需的 Instance Type 以及成本**

- 纯单机玩家: 需要 1G 内存, 用 ``db.t4g.micro``, $0.384 一天, $11.52 一个月, $140 一年
- 200 人以下: 需要 2G 内存, 用 ``db.t4g.small``, $0.768 一天, $23 一个月, $280 一年
- 1000 人以下: 需要 4G 内存, 用 ``db.t4g.medium``, $15.36 一天, $46 一个月, $560 一年

参考资料:

- Instance Type: https://aws.amazon.com/rds/instance-types/
- Pricing: https://aws.amazon.com/rds/mysql/pricing/


配置数据库
------------------------------------------------------------------------------
.. code-block:: bash
mysql --host="prod-server.cluster-c7pwcs7oc5l0.us-east-1.rds.amazonaws.com" --user="admin" --password="gw8CH&wjRW%Q"
SELECT user, host FROM mysql.user;
prod-server.c7pwcs7oc5l0.us-east-1.rds.amazonaws.com
prod-server.cluster-c7pwcs7oc5l0.us-east-1.rds.amazonaws.com
prod-server.cluster-ro-c7pwcs7oc5l0.us-east-1.rds.amazonaws.com
prod-server.cluster-c7pwcs7oc5l0.us-east-1.rds.amazonaws.com
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-

import boto3

ssm_client = boto3.client("ssm")


def send_command(
instance_id: str,
cmd: str,
):
ssm_client.send_command(
InstanceIds=[
instance_id,
],
DocumentName="AWS-RunShellScript",
DocumentVersion="1",
Parameters={
"commands": [
cmd,
]
}
)


send_command(
instance_id="i-1a2b3c4d",
cmd="echo 1a2b3c4d > /home/ubuntu/chore",
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
.. _remote-control-your-server-from-phone:

使用你的手机控制服务器的开关 Remote Control Your Server From Phone
==============================================================================
无论是单机玩家还是服务器管理员, 如果能从你的手机上对服务器进行一些简单的控制, 例如查询状态, 启动, 关闭, 重启, 那简直是太棒了.


1. 如何用你的手机远程控制服务器.
2. 如何优雅的在服务器上远程执行命令.


如何用手机远程控制服务器
------------------------------------------------------------------------------
首先我们的手机不是一个电脑设备, 在手机上配置软件, 并且像在终端中敲命令那样使用手机是完全不现实的. 一个比较现实的情况就是银行的手机短信银行的方式. 你预先定义好一些操作码, 然后发送操作码到特定的电话号码, 然后会收到自动回复以用来展示一些信息. 这比你开发一个 Web App, 然后用手机登录 Web App 操作要省事多了.

AWS Pinpoint 服务器就支持这个功能, 你可以申请一个号码作为你的虚拟客服, 然后用你的手机给这个号码发短信. 你的短信会被发送到一个 AWS SNS Topic 上, 然后你可以用 AWS Lambda Subscribe 这个 Topic, 于是便可以根据你发送的短信让 Lambda 来做任何事情了. 因为 Lambda 里面可以运行各种编程语言和命令, 这里的想象力是无穷的.

参考文档:

- https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-two-way.html


如何优雅的在服务器上远程执行命令
------------------------------------------------------------------------------
通常我们都是用 SSH 登录服务器, 然后再终端里敲命令. 这样还是有登陆, 以及手动输命令的过程, 无法被自动化, 不够优雅.

AWS 有一个历史悠久的服务 SSM (System Manager). 你在启动 EC2 的时候, 如果给其配备的 IAM Role 里包含这个由 AWS 管理的 IAM Policy ``arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM``, 那么 EC2 会自动安装 SSM Agent. 这个 Agent 就能允许你在 AWS Console 或是用 SSM API 在 EC2 上远程执行命令.

请看一段 Python 代码的例子:

.. literalinclude:: ./example.py
:language: python


- https://aws.amazon.com/getting-started/hands-on/remotely-run-commands-ec2-instance-systems-manager/
- https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm.html#SSM.Client.send_command

0 comments on commit 084a8d7

Please sign in to comment.