现阶段社区的程序架构与数据备份策略
tsuna 1389天前 · IP已记录 184

昨天重新设计了下数据的自动备份,分享下现阶段社区的程序架构与数据备份策略  :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 条回复