现阶段社区的程序架构与数据备份策略
昨天重新设计了下数据的自动备份,分享下现阶段社区的程序架构与数据备份策略 :8:
[b]整体架构与开发协作流程图[/b]
当前社区还处于初级发展阶段,只使用了一台新加坡的服务器。为了加快访问速度和抵御恶意攻击,使用了Cloudflare作为CDN。
刚用draw.io画的架构示意图
[url=https://sm.ms/image/JIouMcgQT2EAmHe][img]https://i.loli.net/2020/12/27/JIouMcgQT2EAmHe.png[/img][/url]
[b]数据库数据备份策略[/b]
对MySQL数据库数据采用的是mysqldump全量备份的策略(后续社区的用户规模上来后将会增加服务器,数据库备份采用mysql主从复制增量备份的方式,更科学高效)。自己使用Java写了个定时器,其中有两个方法。
一个是定时执行mysqldump命令全量备份数据库
[code]
//备份 每2小时执行一次
@Scheduled(cron = "0 0 1,3,5,7,9,11,13,15,17,19,21,23 * * ?")
public void dump() {
System.out.println("数据库备份任务开始执行……");
String path = "/folderName" +UUID.randomUUID().toString();
String[] cmd = new String[]{"/bin/sh", "-c", "mysqldump -u userName -p \"password\" databaseName --hex-blob > " + path + ".sql"};
Runtime runtime = Runtime.getRuntime();
try {
Process process = runtime.exec(cmd);
InputStream errorStream = process.getErrorStream();
InputStream inputStream = process.getInputStream();
handleStream(errorStream, inputStream);
int i = process.waitFor();
process.destroy();
if (i == 0) {
System.out.println("子进程正常结束");
} else {
System.out.println("子进程异常结束");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void handleStream(InputStream... inputStreams) {
for (InputStream in : inputStreams) {
new Thread(() -> {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println("inputStream: " + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
[/code]
另一个是定时读取数据库备份并把它们上传到云服务商的对象存储
[code]
public static long lastModifiedTime = 0L;
// 上传 每6小时执行一次
@Scheduled(cron = "0 0 0,6,12,18 * * ?")
public void upload() {
System.out.println("数据库上传任务开始执行……");
String path = "/folderName";
File directory = new File(path);
if (directory.isDirectory()) {
File[] files = directory.listFiles();
if(files.length != 0) {
File file = files[0];
for (int i = 0; i < files.length; i ++) {
File temp = files[i];
if (temp.lastModified() > lastModifiedTime) {
lastModifiedTime = temp.lastModified();
file = temp;
}
}
//调用云服务商的接口,上传数据
CloudCosUtil ccu = new CloudCosUtil();
ccu.uploadfile(file);
}
}
}[/i]
[/code]
这样就实现了数据备份的全自动化,在手机端也能实时查看数据备份的状态啦
[url=https://sm.ms/image/8AaUd5vJuqPkz6X][img]https://i.loli.net/2020/12/27/8AaUd5vJuqPkz6X.jpg[/img][/url]
6 条回复