• 周年纪念勋章活动已圆满结束,如有已购买但仍未申请的用户,可以通过对应勋章的下载链接申请~

核心 MultiPaper——多服同图 崭新架构

SakuranaRanbom暮雪

【Lv:4】

开发者
组长
正式会员
注册
2020/04/30
消息
78
金粒
8,281金粒
先自嘲一波,自从2019年我开启了国内首个基岩版地球ol暮雪 の世界后,陷入2k人的群,服务器载荷到60-70人就已经是极限,服务器费用如无底洞一般增长的窘境后,我就一直在留意各种优化方式,以及架构层面的优化。之前有看到一个区块链的思路:https://www.minebbs.com/threads/minecraft.9647/,当时也确实对这个很感兴趣。
今年回坑后首次了解到有这样一种可以多服运行同一张地图存档,并且允许不同服务器的玩家可以同时在这一份存档上游玩的时候便被深深吸引。
此项目的wiki并不清晰明了,下面很多内容是在本人测试以及开发之后所得结论。

交流群:718270988
| 项目链接
Github: https://github.com/MultiPaper/MultiPaper
官方首页: https://multipaper.io/

| 架构
1673546764146.png
  1. Master database(主控)
  2. MultiPaper端(这是一个同时包括AirplanePufferfish 优化的Paper下游分支)
  3. 负载均衡插件(新版独立使用时自带负载均衡,在下文会介绍;BC端可以用 PlayerBalancer;velocity可以用 VelocityLoadBalancer
  4. 玩家
主控Master是用于存储所有可以共享的数据、地图、存档。并且会来分配区块到不同的服务器上,同时协调子服之间进行数据通信(如上图中MultiPaper之间的箭头)同时里面含有一个类似bc的代理,可以自带负载均衡地分配玩家
MultiPaper端,它是一个包括了Airplane和Pufferfish优化的下游分支(我愿称之为优化优化再优化,类似的单端可能还有bee或者petal这种试验性项目,在此不过多介绍)。Master是一个很适合存储数据的程序,但也仅此而已,在服务器之间数据同步的效果就不是很好,因此MultiPaper被设计成了两两点对点通信。【你可能会有疑惑:啊?两两点对点通信,那它的带宽占用一定很大吧?——答案是:它目前为止只在延迟ping<1ms时才能正常应用,也就是目前的设计仅允许它们被部署在同一台机子或内网环境下,适合多核机型彻底解放自己的性能】
负载均衡插件:如果你不做负载均衡,让玩家手动选择进入a服或者b服,那玩家可能会扎堆进入同一个服,导致服务器性能没有得到最大化利用。官方首页上推荐bc可以用bc负载均衡插件,但是此插件尚未更新1.19(至少官网上没写)。我更推荐把master作为负载均衡的bc,然后把原bc套在外面,组成bc套bc的架构。(经测试可行)

| 插件适配性

重点来了,可能你觉得,这是paper的下游分支,那肯定也适配市面上的bukkit的插件吧。——当然不是,很多插件可以正常启用,但是效果却无法正常实现。官方首页的话“如果你确定要用multipaper作为你的服务器,请确保你有足够的时间和资金来支持你适配插件”
举个例子,CMI基础插件的tpa功能,它需要输入一个玩家的名字作为参数。但是这个玩家的名字必须是同一个服的。也就是a服和b服即使是同一个地图,即使两个服的玩家可以相互看到,甚至互相扔东西,捡东西,但tpa后的参数却不能用另外一个服的玩家名字。(这跟插件本身的缓存设计有关,mc本身的tp是没问题的)

大多数情况下,可以用MySql是可以适配的一个标准(Mysql多用于跨服),但是也不一定百分之百适配。(比如说CMI的经济功能,虽然可以用Mysql进行经济存储,但是并不适配多服跨服经济)

| 适用场景
如果你希望在保留原版特性的基础上,对服务器玩家数量进行提示,那么很建议使用此架构(指大规模生电服)。其他各种服务端的优化实际上是以牺牲原版特性来换取玩家载荷数量的提升。Github中有写到“硬件足够好的情况下,带1000人也是有可能的”
| 常用指令
/servers
列出在此多纸集群上运行的所有服务器。包括性能 TPS、玩家数量等指标。

/slist
列出所有在线玩家和所在服务器(类似bc的/glist)
/mpdebug
以粒子效果的形式显示你所在附近区域归属于哪一个子服
/mpmap
把地图区块显示在聊天框的形式显示你附近的区块所属子服
| 安装方式
  • multipaper.io 下载multipaper和master
  • 将您的世界存档放在master的目录中(和master同级,也可以让master自动生成地图)
  • 通过以下任一方式启动master:
    • 独立版:java -jar multipaper-master.jar <port> [optionalProxyPort] //前面的port是master监听子服的端口,不用放通外网。后面的端口是监听玩家的端口,需要放开外网。
    • bc插件:在plugins/MultiPaperProxy/config.yml设置端口
    • velocity插件:在plugins/multipaper-velocity/config.toml设置端口
  • 在每个多纸服务器中:
    • 运行服务器后会生成配置文件——multipaper.yml
    • 将 BungeeCord 或 Velocity 配置中使用的服务器名称放入bungeecordName
      • 如果您没有使用BungeeCord或Velocity,只需将其设置为一些唯一标识符即可
      • 例如。survival1
    • 输入多纸主数据的地址和端口multipaperMasterAddress
      • 例如。localhost:35353

| 后话
交流群:718270988

最近会陆续开发一些相关的适配MultiPaper、适配各类型跨服(指通过bc跨服,通过velocity跨服和直接transfer跨服)以及单端的插件(目前测试市面上所有公会和国家类插件,包括付费插件husktowns等,全部无法完美适配)

MuSnowCMIFixed——让CMI适配MultiPaper吧!站内贴
 
最后编辑:
领取红包用户
啊~ LRan 星元 StarElement 赧仁
GriefDefender 使用起来似乎没有什么问题
 
暮雪大大辛苦了~
 
GriefDefender 使用起来似乎没有什么问题
您的gd在Multipaper不会降低tps吗?我在打开mysql并设置随时更新后,玩家破坏一个方块,服务端会瞬间变成接近0的0.几tps
严重影响服务器性能(即使只有1个人也是)
 
适配paper和spigot的一系列反作弊可以在这种架构下正常运行吗?(比如说AAC)
 
适配paper和spigot的一系列反作弊可以在这种架构下正常运行吗?(比如说AAC)
如果不涉及在服务器上存储作弊次数的反作弊插件是ok的。存储作弊次数的话可能会同时在2个服计数,可能正常,可能不正常,需要具体针对反作弊测试。
 
类似于群组服么qwq
类似,群组服是一个群组里面集成了多个子服。子服的玩家们被分散在各个服务器上。
但是这个multipaper是子服的玩家们都在同一个地图,同一个世界,可以相互看到玩家实体,可以互相攻击等等互动操作
 

在线管理成员

在线会员

  • 例外
  • 啊咧咧lla
  • DATA_CELESTIA
  • tsrdzy
  • 王聪聪
  • Kenit
  • Biga4
  • EnderPhantomWing
  • User.Time
  • 未来a
  • dcfdc
  • hnhf
  • 钱来钱往
  • JunFeng
  • YouZi Fang
  • all白色
  • 南荣
  • 芜湖胡子
  • ACGBaozi
  • Yoyo666
  • polang
  • DY333
...和 45 更多。
后退
顶部 底部