关于SegmentFault:云上开发之数据备份

2020年7月份时,Github 挂了。是的,你没有听错,背靠微软,坐拥 azure 的 Github 挂了。最近还看到近几年大火的 Docker 也开始限度 Docker 商业版及 Docker 的其它服务(像Docker Hub)对特定国家和公司的应用。这些都体现了数据备份的重要性,尽管下面的事件对咱们小小集体影响不是很大,但覆巢之下,安有完卵。早点把握数据备份的办法能力从容应对将来突发的“意外”。本文将介绍在 ECS 上搭建类 Github 服务 Gogs, 并且定期备份 ECS 上数据到 OSS上,有条件的能够再将 OSS上的数据备份到本人的群辉 NAS 上。 介绍“All in Cloud”的时代曾经到来。对于公司而言,保护机房的老本太高,所以购买像阿里这样的云服务器就比拟灵便且老本可控;而对于集体而言,领有一台云服务器(能够是阿里云,也能够是自搭的服务器【带公网IP】),在任何机器,任何环境下都领有同一套本人折腾的环境那也太不便了。上面就来介绍在云上进行开发中数据备份的那点事。 Gogs搭建为什么要搭建 Gogs,因为 Github 也会挂,而且任何人也无奈保障它不会受某国的贸易管制影响。Gogs 是一款极易搭建的 Git 服务,外围性能和 Github,Gitlab一样,但比二者更加轻量级。我的项目应用的 MIT 受权协定,能够无任何条件的收费应用。它有如下长处: 易装置 二进制包装置,同时反对Docker跨平台 Go开发,反对全平台轻量级 便宜的树莓派即可反对它的运行(2核512M)这里应用 Docker 对其进行装置部署,docker-compose.yml文件如下: version: '3'services: gogs: image: gogs/gogs ports: - 10022:22 - 10080:3000 volumes: - ./data/:/data通过下方命令启动服务: docker stack deploy -c docker-compose.yml gogs这样根本就搭建好一个初步的 Git 服务了,通过 IP:10080 就能够拜访。当然第一次登陆须要进行一些设置。这里能够抉择 SQLite 作为存储数据库,在服务器起来后,其容器的内存才 47M ,而独自启动一个 MySql 容器,其内存占到 371M。这曾经足够证实 Gogs 的轻量级。 ...

January 19, 2021 · 1 min · jiezi

关于数据备份:技术分享-MySQL-闪回工具-MyFlash

作者:陈怡爱可生南分团队 DBA,负责公司自动化运维平台保护和解决客户问题。本文起源:原创投稿*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。前言MyFlash 是美团点评开源的一个 MySQL 闪回工具,能够用来回滚 MySQL 中的 DML 操作,复原到某时刻的数据。本文将简略地介绍 MySQL 闪回工具 MyFlash 的应用。 限度MyFlash 工具存在如下限度: binlog 格局必须为 row,且 binlog_row_image = full仅反对 5.6 与 5.7 版本的 MySQL只能回滚 DML( 增、删、改 )操作下载安装下载 MyFlash 安装包,将安装包装置于 /data 目录下,编译之前,先装置依赖包。 [root@10-186-62-22 ~ ]# cd /data[root@10-186-62-22 data]# wget https://github.com/Meituan-Dianping/MyFlash/archive/master.zip[root@10-186-62-22 data]# unzip master.zipArchive: master.zipb128c0faaf1a657d09238b7cda1c2a80ad599909 creating: MyFlash-master/ extracting: MyFlash-master/.gitignore inflating: MyFlash-master/License.md inflating: MyFlash-master/README.md creating: MyFlash-master/binary/ inflating: MyFlash-master/binary/flashback inflating: MyFlash-master/binary/mysqlbinlog20160408 inflating: MyFlash-master/binlog_output_base.flashback inflating: MyFlash-master/build.sh creating: MyFlash-master/doc/ extracting: MyFlash-master/doc/FAQ.md extracting: MyFlash-master/doc/Function.md inflating: MyFlash-master/doc/INSTALL.md inflating: MyFlash-master/doc/TestCase.md inflating: MyFlash-master/doc/how_to_use.md creating: MyFlash-master/source/ inflating: MyFlash-master/source/binlogParseGlib.c creating: MyFlash-master/source/mysqlHelper/ extracting: MyFlash-master/source/mysqlHelper/mysqlHelper.c creating: MyFlash-master/source/network/ inflating: MyFlash-master/source/network/network.c creating: MyFlash-master/testbinlog/ inflating: MyFlash-master/testbinlog/haha.000005 inflating: MyFlash-master/testbinlog/haha.000007 inflating: MyFlash-master/testbinlog/haha.000008 inflating: MyFlash-master/testbinlog/haha.000009 inflating: MyFlash-master/testbinlog/haha.000041[root@10-186-62-22 data]# mv MyFlash-master MyFlash[root@10-186-62-22 data]# cd MyFlash/[root@10-186-62-22 MyFlash]# yum install gcc glib2-devel -y[root@10-186-62-22 MyFlash]# gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback用法flashback [OPTION...]罕用参数阐明: ...

December 14, 2020 · 6 min · jiezi

K8S中手动扩容云盘数据卷

介绍:云盘数据卷扩容包括以下几个部分: 云盘物理空间扩容,需要在云盘控制台操作;文件系统扩容,需要挂载云盘到一个物理节点手动操作;PV、PVC Size更新,需要更新StorageClass、PVC;注意:扩容云盘前需要为云盘打快照,以预防升级失败导致数据丢失; 云盘目前无法做到在线扩容,需要重启应用才可以实现,可以通过两种方法实现云盘扩容。下面以集群中部署Zookeeper为例介绍两种扩容方式,Zookeeper集群如下: # kubectl get podNAME READY STATUS RESTARTS AGEzookeeper-default-zookeeper-0 1/1 Running 0 2m55szookeeper-default-zookeeper-1 1/1 Running 0 2m14szookeeper-default-zookeeper-2 1/1 Running 0 94s# kubectl get pvc| grep zoodatadir-zookeeper-default-zookeeper-0 Bound d-8vb5teafaoa80ia7affg 20Gi RWO alicloud-disk-efficiency 3m12sdatadir-zookeeper-default-zookeeper-1 Bound d-8vb60faf6epslbctnzka 20Gi RWO alicloud-disk-efficiency 2m31sdatadir-zookeeper-default-zookeeper-2 Bound d-8vbidmq57w4df6k84zem 20Gi RWO alicloud-disk-efficiency 111s# kubectl get pv| grep zood-8vb5teafaoa80ia7affg 20Gi RWO Delete Bound default/datadir-zookeeper-default-zookeeper-0 alicloud-disk-efficiency 3m17sd-8vb60faf6epslbctnzka 20Gi RWO Delete Bound default/datadir-zookeeper-default-zookeeper-1 alicloud-disk-efficiency 2m33sd-8vbidmq57w4df6k84zem 20Gi RWO Delete Bound default/datadir-zookeeper-default-zookeeper-2 alicloud-disk-efficiency 107s暂停应用方式:如果应用可以暂停服务,可以先停掉应用(删除),手动对每个依赖数据盘进行扩容,然后再启动应用。缺点是:应用会暂停一定时间; ...

September 19, 2019 · 3 min · jiezi

Table Store: 海量结构化数据实时备份实战

数据备份简介在信息技术与数据管理领域,备份是指将文件系统或数据库系统中的数据加以复制,一旦发生灾难或者错误操作时,得以方便而及时地恢复系统的有效数据和正常运作。在实际备份过程中,最好将重要数据制作三个或三个以上的备份,并且放置在不同的场所异地备援,以供日后回存之用。备份有两个不同的目的,其主要的目的是在数据丢失后恢复数据,无论数据是被删除还是被损坏。备份的第二个目的是根据用户定义的数据保留策略从较早的时间恢复数据,通常在备份应用程序中配置需要备份多长时间的数据副本。由于备份系统至少会包含一个被认为值得保存的所有数据的副本,因此对数据存储的要求可能会很高,组织此存储空间和管理备份过程可能是一项复杂的任务。如今,有许多不同类型的数据存储设备可用于进行备份,还可以通过许多不同的方式来安排这些设备以提供地理冗余,数据安全性和可移植性。在将数据发送到其存储位置之前,会选择,提取和操作它们,目前已经有许多不同的技术来优化备份过程,其中包括处理打开的文件(open files)和实时数据源的优化,以及压缩,加密和重复数据删除等。每个备份方案都应包括演习过程,以验证正在备份的数据的可靠性,更重要的是要认识到任何备份方案中涉及的限制和人为因素。Table Store备份需求分析对于存储系统而言,数据的安全可靠永远是第一位的,要保障数据尽可能高的可靠性,需要从两个方面保障:存储系统本身的数据可靠性:表格存储(Table Store)是阿里云自研的面向海量结构化数据存储的Serverless NoSQL多模型数据库,提供了99.9999999%的数据可靠性保证,在业界属于非常非常高的标准了。误操作后能恢复数据:误操作永远都无法避免,要做的是当误操作发生的时候能尽快恢复,那么就需要有备份数据存在。对于备份,有两种方案,一个是部署同城或异地灾备,这种代价高费用高,更多的用于社会基础信息或金融信息。另一种是将数据备份到另一个价格更低廉的系统,当万一出现误操作的时候,可以有办法恢复就行。一般可以选择文件存储系统,比如阿里云OSS。Table Store备份恢复方案简介下图为Table Store备份恢复的逻辑结构图,基于全增量一体的通道服务我们可以很容易的构建一整套的数据备份和数据恢复方案,同时具备了实时增量备份能力和秒级别的恢复能力。只要提前配置好备份和恢复的计划,整个备份恢复系统可以做到完全的自动化进行。Table Store备份恢复方案实战目前表格存储虽然未推出官方的备份和恢复功能,但是笔者会step-by-step的带大家基于表格存储的通道服务设计属于自己的专属备份恢复方案,实战步骤会分为备份和恢复两部分。1. 备份预准备阶段:需要确定待备份的数据源和备份的目的源,在此次的实战中,分别对应着TableStore的表和OSS的Bucket。确定备份计划和策略使用通道服务SDK编写代码执行备份策略并监测备份过程2. 恢复执行文件恢复确定备份计划和策略备份策略需要确定备份内容、备份时间和备份方式,目前常见的备份策略主要有以下几类。全量备份(Full Backup): 把硬盘或数据库内的所有文件、文件夹或数据进行一次性的复制。增量备份(Incremental Backup): 对上一次的全量备份或增量备份后更新的数据进行的备份。差异备份(Differential Backup): 提供运行全量备份后变更文件的备份。选择式备份:对系统数据的一部分进行的备份。冷备份:系统处于停机或维护状态下的备份。这种情况下,备份的数据与系统该时段的数据应该完全一致。热备份:系统处于正常运转状态下的备份。这种情况下,由于系统中的数据可能随时在更新,备份的数据相对于系统的真实数据可能会有一定的滞后。在此次的实战中,笔者对于备份计划和策略的选择如下(这里可以根据自己的需求进行自定义设计,然后利用通道服务的SDK来完成相应的需求)。备份内容:TableStore 数据表备份时间:全量备份定期执行(时间可调,默认为一周)。增量备份根据配置定期执行,表格存储的通道服务可以保障数据的严格有序性,每个增量文件是流式append的,可随时被消费。备份方式:全量备份+增量备份,热备份。使用通道服务SDK编写代码这部分会结合代码片段的形式讲解,详细的代码后续会开源出去(链接会更新在本文中),尽请期待。在进行实战之前,推荐先阅读通道服务Java SDK的 使用文档。创建一个全量+增量类型的Tunnel,这里可以使用SDK或者官网控制台进行创建。 private static void createTunnel(TunnelClient client, String tunnelName) { CreateTunnelRequest request = new CreateTunnelRequest(TableName, tunnelName, TunnelType.BaseAndStream); CreateTunnelResponse resp = client.createTunnel(request); System.out.println(“RequestId: " + resp.getRequestId()); System.out.println(“TunnelId: " + resp.getTunnelId());}了解通道服务自动化数据处理框架 在通道服务的快速开始里,我们可以看到用户只需要传入处理数据的process函数和shutdown函数即可完成自动化的数据处理。在process函数的入参中会带有List,而StreamRecord包装的正是TableStore里每一行的数据,包括Record的类型,主键列,属性列,用户写入Record的时间戳等。设计TableStore每一行数据的持久化格式 本次实战中我们使用CSV文件格式,当然你也可以用pb或者其它格式,CSV的优点是可读性比较强,每一行数据会对应CSV文件的一行,持久化的格式如下图所示,CSV文件会有四列, TimeStamp列是数据写入TableStore的时间戳(全量时都为0,增量备份为具体的时间戳),RecordType是数据行的操作类型(PUT, UPDATE和DELETE),PrimaryKey为主键列的JSON字符串表示,RecordColumns为属性列的JSON字符串表示。转换部分的核心代码参见如下代码片段,笔者处理这部分用的是univocity-parsers(CSV)和Gson库,有几个地方需要特别注意下:1). Gson反序列化Long类型会转为Number类型,可能会造成进度丢失,有若干解决办法,笔者采用的是将其转为String类型序列化。2). 对于binary类型的数据的特殊处理,笔者进行了base64的编解码。3). 可以直接流式写入OSS中,减少本地持久化的消耗。this.gson = new GsonBuilder().registerTypeHierarchyAdapter(byte[].class, new ByteArrayToBase64TypeAdapter()) .setLongSerializationPolicy(LongSerializationPolicy.STRING).create();// ByteArrayOutputStream到ByteArrayInputStream会有一次array.copy, 可考虑用管道或者NIO channel.public void streamRecordsToOSS(List<StreamRecord> records, String bucketName, String filename, boolean isNewFile) { if (records.size() == 0) { LOG.info(“No stream records, skip it!”); return; } try { CsvWriterSettings settings = new CsvWriterSettings(); ByteArrayOutputStream out = new ByteArrayOutputStream(); CsvWriter writer = new CsvWriter(out, settings); if (isNewFile) { LOG.info(“Write csv header, filename {}”, filename); List<String> headers = Arrays.asList(RECORD_TIMESTAMP, RECORD_TYPE, PRIMARY_KEY, RECORD_COLUMNS); writer.writeHeaders(headers); System.out.println(writer.getRecordCount()); } List<String[]> totalRows = new ArrayList<String[]>(); LOG.info(“Write stream records, num: {}”, records.size()); for (StreamRecord record : records) { String timestamp = String.valueOf(record.getSequenceInfo().getTimestamp()); String recordType = record.getRecordType().name(); String primaryKey = gson.toJson( TunnelPrimaryKeyColumn.genColumns(record.getPrimaryKey().getPrimaryKeyColumns())); String columns = gson.toJson(TunnelRecordColumn.genColumns(record.getColumns())); totalRows.add(new String[] {timestamp, recordType, primaryKey, columns}); } writer.writeStringRowsAndClose(totalRows); // write to oss file ossClient.putObject(bucketName, filename, new ByteArrayInputStream(out.toByteArray())); } catch (Exception e) { e.printStackTrace(); }}执行备份策略并监测备份过程运行通道服务的自动化数据框架,挂载上一步中设计的备份策略代码。public class TunnelBackup { private final ConfigHelper config; private final SyncClient syncClient; private final CsvHelper csvHelper; private final OSSClient ossClient; public TunnelBackup(ConfigHelper config) { this.config = config; syncClient = new SyncClient(config.getEndpoint(), config.getAccessId(), config.getAccessKey(), config.getInstanceName()); ossClient = new OSSClient(config.getOssEndpoint(), config.getAccessId(), config.getAccessKey()); csvHelper = new CsvHelper(syncClient, ossClient); } public void working() { TunnelClient client = new TunnelClient(config.getEndpoint(), config.getAccessId(), config.getAccessKey(), config.getInstanceName()); OtsReaderConfig readerConfig = new OtsReaderConfig(); TunnelWorkerConfig workerConfig = new TunnelWorkerConfig( new OtsReaderProcessor(csvHelper, config.getOssBucket(), readerConfig)); TunnelWorker worker = new TunnelWorker(config.getTunnelId(), client, workerConfig); try { worker.connectAndWorking(); } catch (Exception e) { e.printStackTrace(); worker.shutdown(); client.shutdown(); } } public static void main(String[] args) { TunnelBackup tunnelBackup = new TunnelBackup(new ConfigHelper()); tunnelBackup.working(); }}监测备份过程备份过程的监控可以通过表格存储控制台或者 DescribeTunnel 接口完成,DescribeTunnel接口可以实时获取当前Tunnel下每一个Channel的Client(可以自定义), 消费总行数和消费位点等信息。比如用户有下午2点-3点的数据需要同步,若DescribeTunnel获取到的消费位点为下午2点半,则表示备份到一半了,若获取到的消费位点为下午3点,则代表2点-3点的数据已经备份完毕了。执行文件恢复在数据备份完成后,我们可以根据需求进行全量的恢复和部分数据的恢复,来降低RTO。在恢复数据时,可以有一些措施来优化恢复的性能:从OSS下载时,可以使用流式下载或者分片下载的方式,必要时可以增加并发。写入TableStore时,可以使用并发BatchWrite的方式。下图为Restore的实例代码(略去若干细节),首先根据需求算出需要下载的文件名(和备份策略对应),然后用OSS的流式下载读取相应的文件,最后用并发的BatchWrite方式写入TableStore的恢复表中。public class TunnelRestore { private ConfigHelper config; private final SyncClient syncClient; private final CsvHelper csvHelper; private final OSSClient ossClient; public TunnelRestore(ConfigHelper config) { this.config = config; syncClient = new SyncClient(config.getEndpoint(), config.getAccessId(), config.getAccessKey(), config.getInstanceName()); ossClient = new OSSClient(config.getOssEndpoint(), config.getAccessId(), config.getAccessKey()); csvHelper = new CsvHelper(syncClient, ossClient); } public void restore(String filename, String tableName) { csvHelper.parseStreamRecordsFromCSV(filename, tableName); } public static void main(String[] args) { TunnelRestore restore = new TunnelRestore(new ConfigHelper()); restore.restore(“FullData-1551767131130.csv”, “testRestore”); }}总结本文首先介绍了Table Store备份的需求,接着介绍了使用表格存储的通道服务进行数据备份和恢复的原理,最后结合实际的代码片段讲述了如何一步步的构建Tabel Store数据备份恢复方案。参考链接4 Steps to Create Your Backup Planhttps://en.wikipedia.org/wiki/Backup本文作者:琸然阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

March 7, 2019 · 2 min · jiezi

体验URLOS自动快照备份 5分钟一次的快照备份真的很爽

近日,容器云管理面板URLOS更新了一个重大功能——快照备份,使用快照备份数据非常快速,只需1秒,而且恢复快照也不会中断当运行中的服务,快照体积也非常小(相比阿里云、腾讯的快照),使用起来相当舒爽!现在带大家体验一下,值得注意的是,要想使用快照功能,那么机器中必须配备两块硬盘,以阿里云主机为例,先加一个硬盘再说。阿里云最少要购买20G,购买后,首先要挂载硬盘选择要挂载到哪个实例上挂载完成后,通过SSH工具查看云主机硬盘信息,输入命令:fdisk -lOK,新硬盘添加成功!登录URLOS主控端 http://ip:9968 或 https://ip:8866,点击集群,选择【自动添加集群和节点】先填写云主机的SSH密码,再点击挂载硬盘这里要填写块存储设备,这个怎么填?我们之前通过fdisk -l命令查看了硬盘信息,把红框标注部分填进去如果你的主机内存不大于1G,请设置一下虚拟内存,如果内存为1G,则设置1G虚拟内存点击提交,等待节点部署完成。在URLOS应用市场中,几乎每一个应用都自带快照功能,下面以安装一个mysql服务和wordpress博客系统来做如何使用URLOS快照功能的说明。首先安装mysql5.7,这里不会详细讲解安装过程,详细过程可参考URLOS官方教程:https://www.urlos.com/center-…,现在直接看快照部分:目前该功能面向所有用户开放,但是免费版只能设置48小时的时间间隔,付费版则无限制。同样,在wordpress安装时也可以选择快照备份时间间隔如何管理快照,在已安装的服务后面,点击“更多”按钮,显示出快照列表和手动快照备份选项先看快照列表标红框的就是快照存放的目录,可以通过sftp工具去查看,如需要恢复快照,点击【恢复快照】即可,恢复时,程序会先对当前状态进行1次备份,然后再恢复成你指定的快照。URLOS除了支持自动快照外,还支持手动快照,手动快照时填写快照描述URLOS快照功能十分强大,尤其是自动快照,有了这个功能的保驾护航,相信你的网站数据安全又多了一份保障。值得注意的是,现阶段,网站服务和数据库是需要分别备份的,比如wordpress网站快照只是备份了网站文件内容,数据库方面另外在mysql服务中备份。而且数据库服务的快照是将当前服务里的所有数据库整体快照,恢复时也是整体恢复,所以,URLOS官方建议创建1个网站服务则对应创建1个数据库服务,这样能保证该网站数据库恢复时不影响其他网站的数据库。

January 5, 2019 · 1 min · jiezi