# 分布式服务器之间的数据同步

在了解了分布式技术假设服务器之后,如何在不同服务器之间共享数据,就成为了一个问题。

从插件数据的持久化部分来说,应该优先使用数据库,而不是本地文件进行数据保存。同时在需要时,对数据预先进行缓存。

开服工具2.0的服务器默认提供了3种数据库:MySQL、Redis、MongoDB。开发者可以根据自己的开发习惯和数据的格式,来选择更加合适的数据库来存储数据。如果自己更习惯的数据库不在这三者之中,也可以自行或联系机房技术人员在服务器上安装其他数据库。

# 持久化

数据在持久化上,应该优先考虑使用MySQL或MongoDB来进行数据存储。

推荐使用连接池来预先准备足够数量的连接,方便在需要时立刻取用。

可以使用的库例如

# MySQL

# MongoDB

# 缓存

对于高频访问的数据,可以考虑使用内存或Redis (opens new window)进行存储,防止流量直击数据库,对数据库造成较大的压力。

对于Java,可以使用Jedis (opens new window)redisson (opens new window)来创建并管理Redis连接池。

例如RedisBungee (opens new window)插件,就是利用Redis高速的特性,通过Redis存储BungeeCord之间的玩家在线数据,实现了数据同步。

# 分布式锁

在分布式服务器之间,经常会遇到需要争抢同一个资源的情况。

例如:交易市场功能

遇到此类情景时,经常会遇到多个用户同时争抢购买同一个商品的功能,为了防止同时对一个资源进行操作,推荐使用Redis提供的分布式锁的功能。在尝试交易之前,首先设置Redis的分布式锁,抢锁成功后,开始交易操作,交易完成释放锁。

具体操作方法可以参考官方文档 (opens new window)

# 订阅/发布

Redis还提供了订阅发布功能,即Pub/Sub

如果要实现服务器之间的消息广播通信,可以依赖Pub/Sub来实现。

例如全服喊话功能,就可以在不同BC服之间订阅同一个频道来实现。

具体操作方法可以参考官方文档 (opens new window)

# 消息队列

如果需要使用消息队列功能,新版本Redis也同样提供了Streams接口,来实现消息队列,具体可以参考官方文档 (opens new window)

如果Redis无法满足你的需求,也可以自行或联系机房工作人员,安装其他消息队列中间件。

持久化

MySQL

MongoDB

缓存

分布式锁

订阅/发布

消息队列