目前有个项目,需要将系统克隆部署到内服(内网服务器),但是服务器本身可以访问公服(公网服务器)。
内服系统没有固定公网ip,经普通电信线路接入公网
因此无法使用复制集,最多只能使用传统主从,设置slave source
主主同步也因为内网服务器公网ip不固定而不纳入考虑。
DB version:2.4.6
NodeJs version 0.10.x
现在通过一个oplog导出工具进行内服Db与公服Db的同步:
- 内服发起ssh请求公服导出某个时间的oplog。
- 内服发起sftp将公服oplog下载到内服。
- 内服使用下载得到的oplog增量数据到内服数据库。
但是有一个问题,就是由于公司为saas平台,那么公服数据库里面有不止是内服客户的数据存在,按照上面的做法,会出现这样的问题:
- 同步的数据中会有相当一部分数据对于内服系统而言是相对无用数据。
- 执行ssh、sftp命令 导出——传输——导入oplog 比较费时间,起码效率远低于使用主从去处理。
于是有下面几个方案希望可以改进这个问题:
均要求公服数据库需要开放远程连接(已设置auth),更改常用端口
-
内服直连公服数据库,所有CRUD都提到公服数据库中:
- 相当于内服作为session管理与逻辑处理,内服没有数据库。
- 不需要涉及数据同步问题,因为数据没有落地到内服。
- 连接请求在网络环境优良的情况下(测试200M宽带),使用统计查询,XHR Time相差10%以内。
-
内服做从数据库,公服做主数据库,使用主从同步
-
内服数据库source公服数据库,问题是:
- 项目代码没有做读写分离,如果内服数据库Slave,由于Slave写操作不许可,则需要大量重构代码实现读写分离。
- 读写分离后,内服将从本地从服读,而写依然需要直连公服数据库。
- 内服数据库作为slave,依然需要同步很大量的 相对无用数据。
-
-
制作公网跳板数据库实例,只储存该客户需要的数据,内服从数据库source公服跳板:
- 公服系统代码需要大量重构代码实现数据选择同步到不同跳板数据库中(不同客户)。
除上所述我相信必定会有其他更加优良的方式,但个人眼界不足,尚未发现其他更好的方案,因此亟待各位不吝赐教!
希望可以找到一个更加抽象的数据方案,因为目前SaaS业务开展起来太耗费开发资源,公司方向是逐渐往Daas上面靠拢,如果需要分库,尽可能的希望保留数据关系。
试试 Change Streams
不明白为什么不完全分离内服数据库和外服数据库?