• [产品介绍] 【DRS云小课】数据复制服务,如何实现对象名映射
    数据复制服务(Data Replication Service,简称DRS)是一种易用、稳定、高效、用于数据库在线迁移和数据库实时同步的云服务。数据复制服务提供了在线迁移、备份迁移、数据同步、数据订阅和多活灾备等多种功能。数据复制服务支持哪些对象名映射数据复制服务的数据同步功能支持源数据库和目标数据库中同步对象的名称不同,即源库中的对象A同步到目标库,成为目标库中的对象B。可以使用对象名映射功能实现该目的,支持库映射、表映射和schema映射。持对象映射的同步场景映射类型支持同步场景库映射MySQL->MySQL同步MySQL->PostgreSQL同步表映射MySQL->PostgreSQL同步Schema映射MySQL->PostgreSQL同步操作步骤库映射1.     在“设定同步”页面,同步对象右侧已选对象框中,选择需要进行映射的数据库,单击“编辑”按钮。图1 库映射2.     修改库名。在“编辑库名”的弹出框中,填写新的数据库名,修改后的名称即为保存在目标数据库中的库名。图2 修改库名3.     查看修改结果。库名修改成功后,您会看到修改前的库名和修改后的新数据库名,至此,表示完成库映射的配置。图3 查看库名修改结果schema映射schema指数据库对象的集合,这个集合包含了各种对象如:表、视图、存储过程、索引等。1.     在“设定同步”页面,同步对象右侧已选对象框中,选择需要进行映射的schema,单击“编辑”按钮。图4 schema映射2.     修改schema名。在“编辑schema名”的弹出框中,填写新的schema名,修改后的名称即为保存在目标数据库中的schema名。图5 修改schema名3.     查看修改结果。schema名修改成功后,您会看到修改前的schema名和修改后的新schema名,至此,表示完成schema映射的配置。图6 查看schema修改结果表映射1.     在“设定同步”页面,同步对象右侧已选对象框中,选择需要进行映射的表,单击“编辑”按钮。图7 表映射2.     修改表名。在“编辑表名”的弹出框中,填写新的表名,修改后的名称即为保存在目标数据库中的表名。图8 修改表名3.     查看修改结果。表名修改成功后,您会看到修改前的表名和修改后的新表名,至此,表示完成表映射的配置。图9 查看表名修改结果 了解更多,请戳我...
  • [数据库] 【第41课】如何通过DRS实现他云MySQL到GaussDB(for MySQL)的数据迁移
    数据复制服务(DRS)是一种易用、稳定、高效、用于数据同步的云服务,本节小课为您介绍,如何通过DRS将其他云 MySQL实例的数据迁移到华为云GaussDB(for MySQL)。使用场景DRS实时迁移可自动化迁存量数据并持续同步增量数据,保证源和目标数据近实时一致,可自由选择业务割接窗口实现平滑无感搬家,可迁表、视图、存储过程、触发器、用户权限、参数等特性。本实践中的选择均为测试简化基本操作,仅做参考,实际情况请用户按业务场景选择,更多关于DRS的使用场景请单击这里了解。部署架构本示例中,DRS源数据库为其他云MySQL,目标端为华为云云数据库GaussDB(for MySQL),通过公网网络,将源数据库迁移到目标端。创建GaussDB(for MySQL)实例1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域“华南-广州”。3. 单击左侧的服务列表图标,选择“数据库 > 云数据库 GaussDB”。4. 选择GaussDB(for MySQL),单击“购买数据库实例”。5. 配置实例名称和实例基本信息。6. 选择实例规格。7. 选择实例所属的VPC和安全组、配置数据库端口。VPC和安全组已在创建VPC和安全组中准备好。8. 配置实例密码。9. 单击“立即购买”。10. 返回云数据库GaussDB实例列表。当GaussDB(for MySQL)实例运行状态为“正常”时,表示实例创建完成。其他云MySQL实例准备前提条件已购买其他云数据库MySQL实例。帐号权限符合要求,具体见帐号权限要求。帐号权限要求当使用DRS将其他云MySQL数据库的数据迁移到华为云云数据库GaussDB(for MySQL)实例时,在不同迁移类型的情况下,对源数据库的帐号权限要求如下:迁移类型全量迁移全量+增量迁移源数据库(MySQL)SELECT、SHOW VIEW、EVENT。SELECT、SHOW VIEW、EVENT、LOCK TABLES、REPLICATION SLAVE、REPLICATION CLIENT。MySQL的相关授权操作可参考操作指导。网络设置源数据库MySQL实例需要开放外网域名的访问。各厂商云数据库对应方法不同,请参考各厂商云数据库官方文档进行操作。以阿里云RDS MySQL为例,需要通过申请外网地址来允许外部的应用对接,具体的操作及注意事项可以参考其官方文档进行操作他云提供的相关指导。创建DRS迁移任务本章节介绍如何创建DRS实例,将其他云MySQL上的数据库迁移到华为云GaussDB(for MySQL)。迁移前检查在创建任务前,需要针对迁移条件进行手工自检,以确保您的同步任务更加顺畅。本示例为MySQL到GaussDB(for MySQL)入云迁移,您可以参考入云迁移使用须知获取相关信息。创建迁移任务1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域,本示例中为“华北-北京四”。3. 单击左侧的服务列表图标,选择“数据库 > 数据复制服务 DRS”。4. 单击“创建迁移任务”。5. 填写迁移任务参数:配置迁移任务名称。填写迁移数据并选择模板库。这里的目标库选择创建GaussDB(for MySQL)实例所创建的GaussDB(for MySQL)实例。6. 单击“下一步”。迁移实例创建中,大约需要5-10分钟。7. 配置源库网络白名单。源数据库MySQL实例需要将DRS迁移实例的弹性公网IP添加到其网络白名单中,确保源数据库可以与DRS实例互通。各厂商云数据库添加白名单的方法不同,请参考各厂商云数据库官方文档进行操作。以阿里云RDS MySQL为例,具体设置网络白名单的操作及注意事项可以参考相关指导。8. 配置源库信息和目标库数据库密码。配置源库信息,单击“测试连接”。当界面显示“测试成功”时表示连接成功。配置源库信息,单击“测试连接”。当界面显示“测试成功”时表示连接成功。9. 单击“下一步”。10. 在“迁移设置”页面,设置迁移用户和迁移对象。迁移用户:否迁移对象:全部迁移11. 单击“下一步”,在“预检查”页面,进行迁移任务预校验,校验是否可进行任务迁移。查看检查结果,如有不通过的检查项,需要修复不通过项后,单击“重新校验”按钮重新进行迁移任务预校验。预检查完成后,且所有检查项结果均成功时,单击“下一步”。12. 单击“提交任务”。返回DRS实时迁移管理,查看迁移任务状态。启动中状态一般需要几分钟,请耐心等待。当状态变更为“已结束”,表示迁移任务完成。说明:目前MySQL到GaussDB(for MySQL)迁移支持全量、全量+增量两种模式。如果创建的任务为全量迁移,任务启动后先进行全量数据迁移,数据迁移完成后任务自动结束。如果创建的任务为全量+增量迁移,任务启动后先进入全量迁移,全量数据迁移完成后进入增量迁移状态。增量迁移会持续性迁移增量数据,不会自动结束。确认迁移结果确认迁移结果可参考如下两种方式:DRS会针对迁移对象、用户、数据等维度进行对比,从而给出迁移结果,详情参见在DRS管理控制台查看迁移结果。直接登录数据库查看库、表、数据是否迁移完成。手工确认数据迁移情况,详情参见在GaussDB管理控制台查看迁移结果。在DRS管理控制台查看迁移结果1. 登录华为云控制台。2. 单击管理控制台左上角的,选择目标区域。3. 单击左侧的服务列表图标,选择“数据库 > 数据复制服务 DRS”。4. 单击DRS实例名称。5. 单击“迁移对比”,选择“对象级对比”,查看数据库对象是否缺失。6. 选择“数据级对比”,查看迁移对象行数是否一致。7. 选择“用户对比”,查看迁移的源库和目标库的账号和权限是否一致。在GaussDB管理控制台查看迁移结果1. 登录华为云控制台。2. 单击管理控制台左上角的,选择目标区域。3. 单击左侧的服务列表图标,选择“数据库 > 云数据库 GaussDB”。4. 选择GaussDB(for MySQL),单击迁移的目标实例的操作列的“登录”。5. 在弹出的对话框中输入密码,单击“测试连接”检查。6. 连接成功后单击“登录”。7. 查看并确认目标库名和表名等。确认相关数据是否迁移完成。
  • [数据库] 【第40课】如何通过DRS实现RDS for MySQL到Kafka的数据同步
    数据复制服务(DRS)是一种易用、稳定、高效、用于数据同步的云服务,本节小课为您介绍,如何通过DRS将RDS for MySQL实例的增量数据同步到分布式消息服务Kafka。使用场景DRS实时同步功能一般用于建立数据同步通道,解决数据共享问题,也可以用于数据流式集成,具有数据转换能力,如库表映射,行列过滤等。本实践中的选择均为测试简化基本操作,仅做参考,实际情况请用户按业务场景选择,更多关于DRS的使用场景请单击这里了解。部署架构本示例中,DRS源数据库为华为云RDS for MySQL,目标端为华为云同Region下的分布式消息服务Kafka,通过VPC网络,将源数据库的增量数据同步到目标端。更多关于DRS的使用场景请单击这里了解。源端RDS for MySQL准备创建RDS for MySQL实例如何创建RDS for MySQL实例,请点击这里查看详细步骤。构造数据1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域“华南-广州”。3. 单击左侧的服务列表图标,选择“数据库 > 云数据库 RDS”。4. 选择RDS实例,单击实例后的“更多 > 登录”。5. 在弹出的对话框中单击“测试连接”检查。6. 连接成功后单击“登录”。7. 输入实例密码,登录RDS实例。8. 单击“新建数据库”,创建db_test测试库。9. 在db_test库中执行如下语句,创建对应的测试表table3_。CREATE TABLE `db_test`.`table3_` ( `Column1` INT(11) UNSIGNED NOT NULL, `Column2` TIME NULL, `Column3` CHAR NULL, PRIMARY KEY (`Column1`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;目标端Kafka准备创建Kafka实例1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域“华南-广州”。3. 单击左侧的服务列表图标,选择“应用中间件 > 分布式消息服务Kafka版”。4. 单击“购买Kafka实例”。5. 选择实例区域和可用区。6. 配置实例名称和实例规格等信息。7. 选择存储空间和容量阈值策略。8. 选择实例所属的VPC和安全组。VPC和安全组已在创建VPC和安全组中准备好。9. 配置实例密码。10. 单击“立即购买”。11. 返回实例列表。当Kafka实例运行状态为“运行中”时,表示实例创建完成。创建Topic1. 在“Kafka专享版”页面,单击Kafka实例的名称。2. 选择“Topic管理”页签,单击“创建Topic”。3. 在弹出的“创建Topic”的对话框中,填写Topic名称和配置信息,单击“确定”,完成创建Topic。创建DRS同步任务本章节介绍创建DRS实例,将RDS for MySQL上的数据库增量同步到Kafka。同步前检查在创建任务前,需要针对同步条件进行手工自检,以确保您的同步任务更加顺畅。本示例中,为RDS for MySQL到Kafka的出云同步,您可以参考出云同步使用须知获取相关信息。操作步骤介绍RDS for MySQL到Kafka增量同步任务的详细操作过程。1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域“华南-广州”。3. 单击左侧的服务列表图标,选择“数据库 > 数据复制服务 DRS”。4. 选择左侧“实时同步管理”,单击“创建同步任务”。5. 填写同步任务参数:配置同步任务名称。选择需要同步任务的源库、目标数据库以及网络信息。这里的目标库选择源端RDS for MySQL准备创建的RDS实例。企业项目选择“default”。   6. 单击“下一步”。同步实例创建中,大约需要5-10分钟。7. 配置源库信息和目标库数据库密码。配置源库信息。单击“测试连接”。当界面显示“测试成功”时表示连接成功。      选择目标库所在VPC和子网,填写Kafka的IP地址和端口。单击“测试连接”。当界面显示“测试成功”时表示连接成功。      8. 单击“下一步”。9. 选择同步信息、策略、消息格式和对象等,投递到Kafka的消息格式。本次选择如下。表1 同步设置类别设置同步Topic策略集中投递到一个Topic,Topic名称“testTopic”。同步到Kafka partition策略按表名+库名的hash值投递到不同Partition。投递到Kafka的数据格式可选择JSON格式,可参考Kafka消息格式。同步对象同步对象选择db_test下的table3_表。10.单击“下一步”。11. 选择数据加工方式。RDS for MySQL到Kafka数据同步目前只支持列加工,列加工提供列级的查询和过滤能力。12. 单击“下一步”,等待预检查结果。13. 当所有检查都是“通过”时,单击"下一步”。14. 确认同步任务信息正确后,单击“启动任务”。返回DRS实时同步管理,查看同步任务状态。启动中状态一般需要几分钟,请耐心等待。当状态变更为“增量同步”,表示同步任务已启动。说明:目前RDS for MySQL到Kafka仅支持增量同步,任务启动后为增量同步状态。如果创建的任务为全量同步,任务启动后进行全量数据同步,数据同步完成后任务自动结束。如果创建的任务为全量+增量同步,任务启动后先进入全量同步,全量数据同步完成后进入增量同步状态。增量同步会持续性同步增量数据,不会自动结束。确认同步任务执行结果由于本次实践为增量同步模式,DRS任务会将源库的产生的增量数据持续同步至目标库中,直到手动任务结束。下面我们通过在源库RDS for MySQL中插入数据,查看Kafka的接收到的数据来验证同步结果。操作步骤1. 登录华为云控制台。2. 单击管理控制台左上角的,选择区域“华南-广州”。3. 单击左侧的服务列表图标,选择“数据库 > 云数据库 RDS””。4. 单击RDS实例后的“更多 > 登录”。5. 在弹出的对话框中单击“测试连接”检查。6. 连接成功后单击“登录”。7. 输入实例密码,登录RDS实例。8. 在DRS同步对象的db_test.table3_表中,执行如下语句,插入数据。INSERT INTO `db_test`.`table3_` (`Column1`,`Column2`,`Column3`) VALUES(4,'00:00:44','ddd');9. 单击左侧的服务列表图标,选择“应用中间件 > 分布式消息服务Kafka版”。10. 在“Kafka专享版”页面,单击Kafka实例的名称。11. 选择“消息查询”页签,在Kafka对应的Topic中,查看接收到相应的JSON格式数据。12. 结束同步任务。根据业务情况,确认数据已全部同步至目标库,可以结束当前任务。单击“操作”列的“结束”。仔细阅读提示后,单击“是”,结束任务。     
  • [存储] GaussDB(DWS)高可用之数据复制
    1      前言   数据库中高可用普遍使用的是Log Shipping方式,即将WAL日志采用streaming方式传输给备实例,备实例通过重放该日志得到主实例的数据。对于行存储方式使用Log Shipping方式效率较高,但是对于列式存储,通常都是批量导入,如果同样将数据记录到日志中,会使数据写两遍IO,难以发挥列存储优势,因此通常采用数据复制方式(即数据从主实例的内存中直接通过网络传输给备实例,然后备实例写盘)更为合理。在行存的批量导入中,使用数据复制不仅可以提升传输效率(直接从内存中读取数据,无需通过磁盘读取日志),还可提升备实例恢复效率(直接从内存中恢复,无需将日志先写盘,再读取恢复)。GaussDB for DWS的复制方式采用日志和数据混合方式,对于行存单条insert/update/delete,然后使用日志复制方式,对于行存批量导入(copy/insert into select from)默认采用数据复制方式;对于列存默认采用数据复制方式。下面主要介绍下GaussDB for DWS中数据复制的主要设计。2      数据复制总体设计   在GaussDB for DWS中,数据复制默认打开,分别在行存批量导入和列存导入时使用。整体设计如下图所示:                                           在数据导入过程中,每个业务线程Backend将收到的数据组成一个block(列存为一个CU)放到Datasend线程的数据队列(DataSenderQueue)里,Datasend线程将数据队列数据发送给Datareceive线程,Datareceive线程将接收的数据写入到数据队列(DataWriterQueue)中,Datarcvwrite线程从数据队列(DataWriterQueue)中取出数据按block分别写入到磁盘,实现主备复制高可用。 2.1       Dataqueue设计Dataqueue是一块共享内存,用于实现DataSenderQueue和DataWriterQueue,其算法核心是循环使用共享内存,如下图所示:                                           首先tail1,head2,tail2初始化为0,每个变量为两个uint32位,第一个uint32 queueid表示数据队列使用了第几次,第二个uint32 queue offset表示当前数据队列的offset。数据导入后,首先tail2向后递增,各个导入通过锁控制实现并发,Datasend发送数据后将head2向后移动,当tail2到达末尾时,新导入数据将移动tail1指针,当tail1与head2接近时,表明没有缓存空间了,因此需要等待Datasend发送数据后将head2向后移动腾出空间。整体算法是一个循环利用实例制,数据的offset是一个单调递增的过程,类似WAL日志的LSN。2.2.2       同步提交设计在GaussDB for DWS中,数据冗余使用的是同步提交,即数据写完两份后事务提交。WAL日志中通过比较LSN非常简单的实现了同步提交。类似WAL日志,数据复制由于Dataqueue中offset也是有序递增的,因此也很容易实现同步提交。其过程是Datarcvwrite将数据单元写入磁盘后,刷新写盘offset,Datareceive线程通过心跳信息将写盘offset发送给Datasend,各业务线程在事务提交前check本次导入最后一段数据备实例端已经写盘后即可提交。2.2.3       BCM与Catchup设计由于GaussDB for DWS设计之初考虑到RAID5数据冗余存储,因此上层只存储两副本,由于分布式环境下各个数据节点采用异步提交时可能会导致全局数据不一致,因此各个数据节点必须使用同步提交。那么系统中如果坏了一个任何一个数据节点的主实例或者备实例系统便不可进行写事务操作。然而在大型分布式系统中这是往往不能接受的,必须要支持单节点故障。GaussDB for DWS使用了缓存接收数据(从备)来实现同步提交下的单节点故障。那么就是备实例挂了后,数据将发往从备,等备实例修复后,备实例可以从主实例同步数据,如何区分哪些数据未同步便显得尤为重要。这里使用BCM(bit change map)文件来实现哪些block需要在追赶时发送给备实例,哪些不用发送。具体设计如下:当数据导入时,每个block对应BCM页面中两个bit(第一个bit用于标记是否同步,第二个保留),放入发送队列后将BCM页面中两个bit第一个标记为未同步,当数据已经写入到备实例端后,将对应block的BCM页面bit标记为已经同步。当备实例挂掉时,数据发送给从备后,BCM页面对应bit将不再清理未同步标记,任然为未同步。当备实例起来后,连接主实例,主实例启动catchup线程先获取从备上增量数据列表,然后扫描本地所有未同步数据发送给备实例,实现主备同步。2.2.4       数据复制与日志复制并发控制数据复制和日志复制是并发运行的,当数据复制正在写入数据时,日志复制无法恢复删除表与truncate表等操作,两者通过锁控制。同样当数据复制时要写入的database与表空间还未恢复时,同样需要等待日志复制恢复完成,这里通过循环检测等待实现。3    数据复制相比日志复制 当IO负载较高时,批量导入场景数据复制的性能优于日志复制30%左右,因此在大数据量入库时,使用数据复制性能更佳。然而对于行存来说触发数据复制时每次会获取新页面,因此对于insert into t1 values v1,v2,v3这种值较少的场景下会导致大量的空页面,不适用于数据复制,可以手动关闭数据复制开关。
  • [其他] GaussDB(DWS)DRS创建数据同步任务报错:DRS.M00004:服务器错误
    【问题现象】       DRS同步到DWS上时,创建数据同步任务时,页面报错DRS.M00004:服务器错误;【原因分析】1、查看drs service日志:       页面打开F12-》》DRS界面点击下一步创建同步任务-》》network中找到报错的接口,点击打开后查看headers中的X-TRACE-ID-》》在drs后台进入这个目录        cd /opt/cloud/drs-service/logs/drs-service        more drs-service.project.log | grep 加上刚才那个traceId;       得到报错日志,报connection refused,此时应该是与DWS接口对接问题2、登录API网关或DMK,查看DWS配置:     DMK页面:点击任务管理—》》在里面找到DWS,查看API配置     dwsAddressMap中调用的URL是否有端口号【解决方案】       DWS接口调用时不需要端口号,如果调用的接口域名后有端口号,将配置中端口号删除
  • [技术干货] 【数据库GaussDB系列技术直播第4期】GaussDB(for openGauss)数据迁移之DRS
    【直播回看】点击观看直播【直播简介】DRS是一款易用、稳定、高效,用于数据库在线迁移和数据库实时同步的云服务,它提供了以Oracle、MySQL、PostgreSQL、华为云RDS等多种数据库作为源端的数据迁移上云服务,其中GaussDB(for openGauss)作为华为云上的主力云数据库,DRS对其做了深度的开发支持,在迁移的功能和性能上具有很大优势,可以帮助客户简单、快捷、一键式的完成数据迁移。本次直播特邀华为云数据迁移DRS产品架构师南风老师,为大家讲解DRS数据迁移功能简介、实现原理及适用场景,快来学习吧!戳这里→参与活动
  • [行业资讯] 华为云数据库亮相2021PG中国技术大会并斩获4项大奖
    1月7日-9日,以“开源论道·数据驱动·共建数字化未来”为主题的第十一届PostgreSQL中国技术大会隆重举办。华为多位数据库专家出席并发表了重要演讲,分享了华为云数据库最新技术与实践,积极推动商业落地,使能企业智能升级。会上,华为云RDS for PostgreSQL荣获“数据库最具潜力产品奖”,华为流程IT DBA团队荣获“PostgreSQL中国最具价值团队奖”,华为数据库架构师陈华军和华为云数据库高级专家赵全明分别荣获“十周年卓越贡献特别奖”、“中国PostgreSQL最具价值专家MVP奖”。大会主会场,华为质量与流程IT数据库架构师陈华军分享了《华为集团IT PostgreSQL运用实践》主题演讲。他介绍到,流程IT作为服务华为公司19万员工的企业IT部门,支持华为公司全球业务、全球研发、全球协同,客户覆盖全球170多个国家、服务上亿消费者。为了应对日益增长的业务数据和海量并发问题,华为集团对交易库选择主要采用云数据库PostgreSQL去“O”,通过架构部署、参数调优、客户端配置、监控告警、性能诊断工具、闪回实现等能力,很好地解决了数据库兼容性、扩展性、数据一致性、性能等方面的问题。目前,华为集团IT去“O”和上云工作已完成一半。华为云数据库高级工程师刘志俊在分论坛分享了《Oracle迁移到PostgreSQL的挑战与突破》。他提到,近年来去“O”的呼声越来越大,大量的传统企业开始脱离“IOE”集中式架构,进行云端分布式改造。针对扩展性、技术不可控、高成本等去“O”难题,华为云GaussDB推出了数据库和应用迁移UGO+数据复制服务DRS专属组合解决方案,该方案从迁移评估、结构迁移、应用迁移、全量+增量数据迁移、数据一致性动态校验、流量回放等方面提供了一站式迁移上云方案,让客户上云更轻松、更高效。华为云数据库产品经理冯万里分享了《解锁华为云数据库PostgreSQL高速增长密码》。他表示,华为云数据库PostgreSQL连续3年保持5倍营收增长,持续为5000+客户创造了价值。取得这一重大成果的原因在于,华为云RDS for PostgreSQL具备卓越的高可靠、高安全、插件丰富、兼容开源、便捷上云、低成本等能力优势,并在国家地理信息服务平台天地图和中国一汽等企业中成功落地。华为云数据库高级工程师杨科伟在分论坛分享了《GaussDB(for Redis)的云原生存算分离架构实践》。他指出,存算分离的分布式架构是大势所趋,目前已经有越来越多企业选择将核心业务上云到该架构。华为云GaussDB(for Redis)基于该架构,完美避开了开源Redis的主从堆积、主从不一致、fork抖动、内存利用率只有50%等问题,构筑了强一致、高可用、冷热分离、弹性伸缩、高性能等极具竞争力的能力优势,极大促进了企业业务的发展。华为云数据库高级工程师党李飞分享了《华为云DDS数据库容灾关键技术》。他介绍到,华为云DDS是一款兼容MongoDB 3.4/4.0版本的文档数据库服务,目前支持分片集群、副本集和单节点三种部署架构。华为云DDS基于华为云数据复制服务DRS灾备技术,支持主备倒换,通过数据抓取和数据回放,保障数据一致性。通过优化原生Change Streams,华为云DDS支持更丰富的DDL语句,对于集合删除、数据库删除事件,日志拉取不中断,支撑近50000 ops,与社区版相比,性能得到大幅提升。技术不止步,服务更贴心,华为云数据库未来将会打造更优、更专业高效的数据库服务,赋能企业挖掘数据价值,推动业务革新,加速企业数字化转型。 错过直播不要怕,点击下面链接可直接回顾精彩:1月7日,华为数据库架构师陈华军演讲链接:https://live.csdn.net/room/postgresqlchina/1Ppndzfv?spm=1001.2014.3001.55011月8日,华为云数据库高级工程师刘志俊演讲链接:https://live.csdn.net/room/postgresqlchina/FS0reRwq?spm=1001.2014.3001.55011月9日,华为云数据库高级工程师杨科伟和党李飞、华为云数据库产品经理冯万里演讲链接:https://live.csdn.net/room/postgresqlchina/XB2Uc2AA?spm=1001.2014.3001.5501 【阅读原文】https://www.huaweicloud.com/product/dbs.html
  • [版主精选] 2021华为云GaussDB年度大盘点,感恩有你
    回首2021,我们探索数字化实践和前沿技术之路,深入产业发展与生态合作,勇攀一个个高峰;展望2022,我们怀抱更大的数字梦想,继续探索数字时代星辰大海。前行之路感谢相伴,华为云GaussDB 与您一起筑梦前行。https://www.huaweicloud.com/product/dbs.html
  • [版主精选] “数”驰天下,华为云DRS 高效支撑T3出行平稳迁移
    数字化潮流浩浩汤汤,企业上云如火如荼,网约车行业也借助这一股东风展现出了蓬勃的生命力,因为它的高效便捷,吸引了越来越多的都市**验。T3出行是南京领行科技股份有限公司打造的智慧出行生态平台,公司以“科技引领 愉悦出行”为使命,致力于成为能够为用户提供“安全、便捷、品质”出行服务的科技创新型企业。随着业务扩张和用户数量的增加,T3出行原系统在支撑海量数据和提供出行服务方面渐渐力不从心。为满足业务发展,提供安全高效的出行服务,T3出行开始对出行产品进行迭代更新,而华为云也在这段升级之旅中发挥了巨大作用。那么这段升级之旅是否顺畅无阻呢?我们接着往下瞧。重压之下,快与稳的迁移之路?升级需要将现有系统的数据进行迁移,而T3出行涉及业务繁多,若因为迁移而停止提供服务,将会造成巨大的业务损失。因此,客户希望既尽量避免对业务的影响,同时迁移工作也能顺利进行,求快与求稳是其核心诉求。数据库种类多,迁移难度大。T3出行不同业务类型的数据分别存放在MySQL、MongoDB、PostgreSQL等数据库中,需要很好适配各种不同数据库,以减轻应用改造压力。时间紧任务重,要在30h内完成。各种类型的数据基数庞大,存在亿级的大表,单单关系数据就有数十TB,而且还存在实例只迁移表级数据的梳理,场景复杂。客户要求在30h内完成新老数据库之间的迁移,并要求数据做增量比对,保证数据一致性。业务不停机,系统持续平稳运行。在数据库迁移过程中,不能因为对源端数据库的查询,导致对应实例性能受到影响,进而影响业务;客户原先使用的开源c**频繁重启,导致业务受损,希望有高可靠、能提前告警等能力的服务替换c**。层层重压之下,华为云如何应对呢?逐一击破,华为云DRS利刃出击天下武功,唯快不破。华为云通过优化目标端数据写入能力,结合数据复制服务DRS的限流功能,快速适配c**能力,实现30小时内完成全量数据同步,并在原有基础上提供了更高可靠和提前告警的能力。容纳百川,高效迁移:华为云DRS支持其他云、本地IDC、ECS自建数据库等不同平台之间的迁移,目前共支持60+类不同的数据库链路,充分满足T3出行的不同数据库迁移需求。润物无声,平滑在线迁移:华为云DRS针对不同实例,通过优化参数、同步方式和架构,并结合其特有的限流能力,确保迁移期间源端业务正常平稳运行,成功在指定时间内完成全量数据同步。稳如磐石,业务持续可用:华为云通过RDS适配c**能力,结合DRS高可靠和自动化运维能力,大大提高数据订阅稳定性。通过这一系列操作,华为云DRS成功助力T3出行在规定时间内完成数十TB级全量数据的迁移,迁移过程业务无须停机,迁移前后数据强一致,实现业务的持续平稳运行。如果将数据迁移比作一段旅行,那么华为云DRS就是助你快速到达目的地的飞机。在这个万事都讲究效率的时代,华为云DRS用扎实领先的技术为客户的迁移之旅保驾护航,客户诉求所指,便是华为云DRS迁移之道。相信在华为云DRS的能力加持下,未来的数据库迁移之路会更畅通无阻。 【重磅活动推荐】12.12 华为云数据库专场火热来袭,云数据库MySQL 低至12.12元,爆款云数据库包年1折起,更多优惠详情,请前往华为云官网:https://activity.huaweicloud.com/dbs_Promotion/index.html
  • [版主精选] 监控不掉线,安全看得见,华为云数据库让煤矿生产更安全
    摘要:华为云&精英数智,用数据驱动服务,让煤矿开采更安全煤炭,被誉为黑色的金子,工业的食粮,是十八世纪以来人类世界使用的主要能源之一。尽管近年来越来越多新能源取代煤炭,但是煤炭在我国能源体系中还具有“压舱石”的作用,煤炭目前仍是我国非常重要的能源。强烈的需求背后,煤矿的安全开采问题也一直牵动着人们的心。作业人员的不安全行为、设备的不安全状态,以及环境的不安全因素等,成为导致矿难产生的主要原因。因此,优化煤矿安全生产过程是一件势在必行的工程。华为云和精英数智科技股份有限公司(简称:精英数智)一拍即合,联合打造了“煤矿大脑”解决方案,该方案通过覆盖矿山安全态势感知与信息共享体系化协同模型,设计、实施、评测一体化智能监控平台,视觉、语音、OCR多维度作业场景分析模型,层级职能部门联合执行异常事件联动与处置机制等四个部分,基于煤矿生产和安全痛点,为煤炭行业注入了最强的人工智能技术和完备的服务体系。其中,由华为云数据库支撑的系列智能监控平台为精英数智提供了高效、稳定、可靠的数据服务,通过统一采集数据源,为决策分析提供有力的数据凭证,助力“煤矿大脑”更智慧、反应更灵敏。守护煤矿安全生产,华为云数据库从不玩虚的改造前:千呼万唤始出来,一看页面还空白精英数智原监控系统架构局限于容量瓶颈,无法满足业务增长诉求,当出现故障或者进行应用改造时,面临较长时间监控数据缺失,业务连续性方面得不到有效保障。改造后:千里江陵一日还,实时监控心里安华为云基于分布式数据库中间件DDM,对精英数智系列监控系统和生产调度指挥系统进行分布式改造,通过分布式高扩展、分库分表、平滑无感迁移等方式,成功支撑上千+矿井实现实时监控,为煤矿安全生产提供连续安全监测服务。支撑1300+矿井监控,华为云数据库助力精英数智打造智能矿山为满足精英数智16TB数据量、1300+个矿井的目标,华为云分布式数据库中间件 DDM通过分布式扩展和分库分表提升监控系统的性能,同时利用华为云数据复制服务DRS实现平滑在线迁移,让监控实时高效,分秒守护煤矿安全生产。提供极致扩展能力,让监控更高效分布式高扩展:精英数智需要支撑1300个矿井,对数据库弹性扩容要求极高,华为云DDM采用分布式架构提供横向扩容能力,快速弹性伸缩以满足业务增长诉求,让监控更平稳高效。分库分表:精英数智监控数据体量约16TB,客户希望在满足基本性能的同时,数据库反应更灵敏高效。华为云DDM采用分库分表方案,提升查询性能,业务集中访问场景下,监控平台依旧稳定高效,有效减少生产波动,达到稳定生产。监控不掉线,分秒守护安全精英数智的管控系统涉及整个生产流程,涵盖各系统生产状态、设备运行状态、井下作业人员等诸多场景环节,如果某一环节受影响,将造成不可估量的损失,因此,对业务连续性要求很高。华为云数据库采用数据复制服务DRS,将RDS数据库在线迁移到华为云DDM架构中,整个过程业务无须停机,最大程度减少了业务中断带来的风险,实现平滑无感迁移,监控实时在线,数据零丢失。经过改造,精英数智系列监控系统在容量扩展方面,单套系统支撑矿井数量由600提升到1300个,业务支撑能力提升1.2倍;平台连续稳定,监控不中断,业务无感知;单实例数据量由2TB提升到16TB,满足海量数据存储,性能大幅提升。华为云数据库为1300+矿井提供安全监测,为煤矿行业安全生产提供了强有力的保障,最终实现整个产业的智能化升级。随着国家大力推进各行各业信息化、智能化,煤矿人工智能已被提到国家战略的高度,煤矿智能化已成为能源领域的重要发展方向,“煤矿大脑”为煤矿行业的智能化发展提供了重要支撑,而华为云数据库也在煤矿产业升级中注入自己的力量,未来的煤矿发展前景可期。 【重磅活动推荐】12.12 华为云数据库专场火热来袭,云数据库MySQL 低至12.12元,爆款云数据库包年1折起,更多优惠详情,请前往华为云官网:https://activity.huaweicloud.com/dbs_Promotion/index.html
  • [版主精选] 分钟级查看报表,华为云&一汽-大众,让商机时刻被洞见
    摘要:华为云DRS助力一汽-大众BI平台实时查看报表,提升数字化决策能力数字化时代下,企业IT的数据重心从支持在线交易后移到运营分析,数据的及时更新、高效分析、减少人工干预,是企业经营的追求目标,因此企业不再满足于“T+1”,而是“T+0”,需要实时和个性化,对于汽车行业也不例外。一汽-大众汽车有限公司(简称一汽-大众)于1991年成立,是我国第一个按经济规模起步建设的现代化乘用车工业基地,旗下有奥迪、大众、捷达三大品牌20余款产品,覆盖A、B、C级全系列乘用车型。数字革命的浪潮下,4S门店的服务也更加精准高效,为了更好的服务客户,4S集团通过分析客户使用习惯及偏好、产品个性化需求收集等方式,多维度满足用户购车和体验需求。但随着数据挖掘的深入,对BI平台的要求也越高,为解决报表业务系统数据量的快速增长、数据汇集、交互分析难等难题,一汽-大众携手华为云数据库在MEP(经销商多功能生态平台)-BI平台项目合作中取得了突破,跨越了挑战。实时数据更新,才能具备更快的市场反应能力众所周知,BI平台的报表系统可以连接多维数据库,报表目的是帮助用户掌握和了解数据,企业决策者通过实时的数据进行分析和挖掘,为业务的变化及时作出应对策略。一汽-大众4S门店的BI报表业务需要实时汇集所有门店的数据,面临巨大的技术挑战。一汽-大众所有的4S门店拥有总计60+MySQL实例,200+数据库,每个数据库约有150+张表要同步,共有3万张表需要数据实时同步到BI系统内。如果按照传统的数据入湖方式,需要配置3万条数据同步链路,更需要海量的工作比对数据一致性,维护成本极高,同步效率低下。此外,随着数据量的膨胀,现有的数据库无法支撑数TB级别的数据量。因此打造支持海量数据存储、数据实时同步的商业数据智能分析的BI平台迫在眉睫。面对一汽-大众的业务挑战,华为在方案选型上的主要考量如下:抽取数据对源数据库影响最小化:抽取数据绝对不能拖垮源数据库,也不能对源业务的性能造成较大的衰减,甚至表被锁定;部署实施要轻量简单:不需要在每个数据源安装代理程序,即开即用,配置操作简单易用;数据一致性有保障:基于binlog解析进行逻辑数据同步,具有断点续传和严格的认点技术,不惧网络抖动,有效确保数据一致性。综上,具备实时精准同步且保障数据一致的轻量级服务,华为云数据复制服务DRS是迎接业务挑战的不二之选。华为云DRS助力一汽-大众报表系统数据实时同步,全面释放数据价值DRS(Data replication Service)华为云数据复制服务,将云上的数据通过多对一的方案汇集到具备超强写入能力的华为旗舰型云原生数据库GaussDB(for MySQL)中,保证数据一致性和实效性,再通过DRS实施同步,从GaussDB(for MySQL)同步到华为云数据仓库GaussDB(DWS)中进行分析。但要想达到实时数据同步难度极大,因此,华为云数据库解决了如下核心难题:增加数据来源列,解决主键冲突:通过MySQL到GaussDB(for MySQL)的多对一方案,增加数据来源列,记录server/database/table信息,避免多个源表主键冲突。同步链路支持动态加减表:新增业务随时需要增加同步的表,华为云DRS支持GaussDB(for MySQL)的链路动态增减表,配置更加简单方便。标记数据入湖时间,帮助实时分析:华为云数据库提供的方案中,增加附加列数据行写入时间和更新时间的列,标记数据插入和更新时间。为数据入湖及数据实时分析打下基础。引入缓冲数据库,实时计算:针对8万张表不停的汇集和写入,选择了百万级QPS吞吐量和海量数据存储能力的GaussDB(for MySQL)作为缓冲层数据库,解决OLTP和OLAP数据库之间天然的数据处理能力差异。基于DRS实时准确的数据同步后,华为云GaussDB(DWS)实现实时计算,极大缩短复杂报表的执行时间。数据实时精准同步:基于华为云DRS准确的数据同步能力,正常情况下延迟均在1s以内,为实时报表提供基础条件,帮助一汽-大众实现了销售报表数据可用时间从1天降低为10分钟。且数据同步准确度高,源端和目标端数据行数一致。业务上线后,一汽-大众业务报表系统维护的链路数量从3万条降低至65条,工作效率大幅提升;同时DRS保证数据一致性,10亿级数据无一条丢失,极大降低数据比对工作;帮助一汽-大众实现了销售报表数据可用时间从1天降低为10分钟,时效性大幅提升。此外,对于缓冲层数据库GaussDB(for MySQL) 具备海量数据存储能力,最大支持128TB,超百万级QPS吞吐,可支撑业务快速发展;基于GaussDB(for MySQL)的计算存储分离架构,数据三副本存储强一致,数据零丢失;RTO秒级,故障秒切换,全面保障数据安全。一汽-大众以用户为中心,构建以数据分析为核心的生态圈,洞察用户需求,提供高价值产品,深受客户青睐。而华为云数据库通过技术手段实现数据实时同步,从海量的数据中发现洞察,为企业经营决策提供数据基础。未来,华为云数据库将持续携手一汽-大众通过数字技术,打造差异化有竞争力的数字化服务,满足客户对产品和服务日益增长的个性化需求。更多华为云数据库详情了解,欢迎前往华为云官网:https://www.huaweicloud.com/product/dbs.html
  • [技术干货] 题目:将一个列表的数据复制到另一个列表中。
    题目:将一个列表的数据复制到另一个列表中。程序分析:使用列表[:]。程序源代码:实例#!/usr/bin/python# -*- coding: UTF-8 -*-a = [1, 2, 3]b = a[:]print (b)以上实例输出结果为:[1, 2, 3]
  • 【云图说】第226期 DRS数据对比——带您随时观测数据一致性
    数据复制服务DRS介绍页入口,详情请点击链接数据复制服务DRS数据对比功能入口,详情请点击链接小云妹又来啦,新的一周,新的知识,今天给大家介绍一个数据迁移的神器----数据对比功能。除了网络中断自动重试、任务断点续传等各种技术保障以外,DRS还提供了数据对比功能,数据一不一致,对比见分晓,精准定位,动态实时对比,云图说为您一一详解:
  • 【云图说】第226期 DRS数据对比——带您随时观测数据一致性
    数据复制服务DRS介绍页入口,详情请点击链接数据复制服务DRS数据对比功能入口,详情请点击链接小云妹又来啦,新的一周,新的知识,今天给大家介绍一个数据迁移的神器----数据对比功能。除了网络中断自动重试、任务断点续传等各种技术保障以外,DRS还提供了数据对比功能,数据一不一致,对比见分晓,精准定位,动态实时对比,云图说为您一一详解:
  • [活动体验] 数据处理中的张量代码①
    ```C++ // 导入同名的.h头文件 #include "minddata/dataset/core/tensor.h" // 导入系统标准库文件 #include #include #include #include #include #include #include #include // 导入自定义.h头文件 #include "minddata/dataset/core/type_id.h" #include "utils/ms_utils.h" #include "minddata/dataset/include/dataset/constants.h" // ifndef定义的宏ENABLE_ANDROID,如果没有被定义过,就执行后续代码,如果被定义过,就执行endif的代码 #ifndef ENABLE_ANDROID #include "minddata/dataset/core/cv_tensor.h" #endif // 导入自定义头文件 #include "minddata/dataset/core/global_context.h" // 与上文的类似,不做解释 #ifdef ENABLE_PYTHON #include "minddata/dataset/core/pybind_support.h" namespace py = pybind11; // 存放python代码的命名空间 #endif #include "minddata/dataset/core/tensor_shape.h" // 双重命名空间 namespace mindspore { namespace dataset { // 用于打印张量元素的辅助宏 #define CASE_PRINT(de_type, native_type) case de_type: { native_type o; rc = GetItemAt(&o, index); out o; break; } #define CASE_PRINT_HEX(de_type, native_type) \ case de_type: { \ native_type o; \ rc = GetItemAt(&o, index); \ out std::hex std::setw(2) std::setfill('0') o std::dec std::setfill(' '); \ break; \ } /// 复制内存没有最大限制,因为当 byte_size > 2^31 - 1 (SECUREC_MEM_MAX_LEN) 时,memcpy_s 将失败。 /// \param dest 目标缓冲区。 /// \param destMax 目标缓冲区的大小。 /// \param src 要从中复制的缓冲区。 /// \param count 要复制的字符数 /// \return 错误号。 成功复制返回 0。 errno_t memcpy_ss(uchar *dest, size_t destMax, const uchar *src, size_t count) { uint32_t step = 0; while (count >= SECUREC_MEM_MAX_LEN) { // 循环 int ret_code = memcpy_s(dest + step * SECUREC_MEM_MAX_LEN, SECUREC_MEM_MAX_LEN, src + step * SECUREC_MEM_MAX_LEN, SECUREC_MEM_MAX_LEN); if (ret_code != 0) { return ret_code; } count -= SECUREC_MEM_MAX_LEN; step++; } if (count > 0) { return memcpy_s(dest + step * SECUREC_MEM_MAX_LEN, count, src + step * SECUREC_MEM_MAX_LEN, count); } return 0; } Tensor::Tensor(const TensorShape &shape, const DataType &type) : shape_(shape), type_(type), data_(nullptr) { // 从全局上下文中获取内存池并为字符数据区创建分配器 std::shared_ptr global_pool = GlobalContext::Instance()->mem_pool(); data_allocator_ = std::make_unique>(global_pool); } Tensor::Tensor(Tensor &&other) noexcept : shape_(other.shape()), type_(other.type()), data_(other.GetMutableBuffer()), data_end_(other.data_end_), data_allocator_(std::move(other.data_allocator_)) { other.Invalidate(); } Tensor &Tensor::operator=(Tensor &&other) noexcept { if (&other != this) { shape_ = other.shape(); type_ = other.type(); data_ = other.GetMutableBuffer(); data_end_ = other.data_end_; data_allocator_ = std::move(other.data_allocator_); // 移动数据 other.Invalidate(); } return *this; } Status Tensor::CreateEmpty(const TensorShape &shape, const DataType &type, TensorPtr *out) { CHECK_FAIL_RETURN_UNEXPECTED(shape.known(), "Invalid shape."); CHECK_FAIL_RETURN_UNEXPECTED(type != DataType::DE_UNKNOWN, "Invalid data type."); const TensorAlloc *alloc = GlobalContext::Instance()->tensor_allocator(); *out = std::allocate_shared(*alloc, shape, type); // 如果它是一个字符串张量并且它没有元素,只需初始化形状和类型。 if (!type.IsNumeric() && shape.NumOfElements() == 0) { return Status::OK(); } // 元素数不为 0。类型应为数字 CHECK_FAIL_RETURN_UNEXPECTED(type.IsNumeric(), "Number of elements is not 0. The type should be numeric."); int64_t byte_size = (*out)->SizeInBytes(); // 如果我们有一个没有元素的张量,就不要分配。 if (byte_size != 0) { RETURN_IF_NOT_OK((*out)->AllocateBuffer(byte_size)); } return Status::OK(); } Status Tensor::CreateFromMemory(const TensorShape &shape, const DataType &type, const uchar *src, TensorPtr *out) { RETURN_IF_NOT_OK(CreateEmpty(shape, type, out)); if (src != nullptr) { // 给定此张量的形状/类型,计算数据大小并复制输入字节。 int64_t byte_size = (*out)->SizeInBytes(); int ret_code = memcpy_ss((*out)->data_, byte_size, src, byte_size); // 无法将数据复制到张量中 CHECK_FAIL_RETURN_UNEXPECTED(ret_code == 0, "Failed to copy data into tensor."); } return Status::OK(); } Status Tensor::CreateFromMemory(const TensorShape &shape, const DataType &type, const unsigned char *src, const dsize_t &length, TensorPtr *out) { // 指向源数据的指针为空 CHECK_FAIL_RETURN_UNEXPECTED(src != nullptr, "Pointer to source data is null."); const TensorAlloc *alloc = GlobalContext::Instance()->tensor_allocator(); *out = std::allocate_shared(*alloc, shape, type); if (type.IsNumeric()) { dsize_t calculated_length = (*out)->SizeInBytes(); // 源数据的长度与形状不匹配 CHECK_FAIL_RETURN_UNEXPECTED(calculated_length == length, "Length of source data does not match the shape."); } else { // min_length 是空字符串张量的长度 // min_length = 存储偏移量所需的字节数 + 每个元素的 1 个字节 dsize_t min_length = (shape.NumOfElements() + 1) * kOffsetSize + shape.NumOfElements(); // 源数据的长度与形状不匹配 CHECK_FAIL_RETURN_UNEXPECTED(min_length = length, "Length of source data does not match the shape."); } RETURN_IF_NOT_OK((*out)->AllocateBuffer(length)); int ret_code = memcpy_ss((*out)->data_, length, src, length); // 无法将数据复制到张量中。 CHECK_FAIL_RETURN_UNEXPECTED(ret_code == 0, "Failed to copy data into tensor."); return Status::OK(); } #ifdef ENABLE_PYTHON Status Tensor::CreateFromNpString(py::array arr, std::shared_ptr *out) { std::vector shape; for (dsize_t i = 0; i arr.ndim(); i++) { shape.push_back(static_cast(arr.shape()[i])); } arr.resize({arr.size()}); // 压平 py::array 以便我们可以迭代一次 std::vector strings; if (arr.dtype().kind() == 'U') { std::for_each(arr.begin(), arr.end(), [&strings](const auto &s) { strings.emplace_back(py::cast(s)); }); } else { std::for_each(arr.begin(), arr.end(), [&strings](const auto &s) { strings.emplace_back(py::cast(s)); }); } arr.resize(shape); // 将 arr 调整回原始形状 return CreateFromVector(strings, TensorShape{shape}, out); } Status Tensor::CreateFromNpArray(const py::array &arr, std::shared_ptr *out) { if (DataType::FromNpArray(arr) == DataType::DE_STRING) { return CreateFromNpString(arr, out); } std::vector shape; std::vector strides; // 检查步幅是否连续 bool is_strided = false; dsize_t count = arr.size(); for (dsize_t i = 0; i arr.ndim(); i++) { shape.push_back(static_cast(arr.shape()[i])); strides.push_back(static_cast(arr.strides()[i])); // 在空数组的情况下 num_items=0 if (count != 0) { count /= shape[i]; if (strides[i] != arr.itemsize() * count) { is_strided = true; } } } // 定义指针 unsigned char *data = static_cast(arr.request().ptr); // 判断条件是否符合 if (is_strided) { RETURN_IF_NOT_OK(Tensor::CreateEmpty(TensorShape(shape), DataType::FromNpArray(arr), out)); RETURN_IF_NOT_OK(CopyStridedArray((*out)->data_, data, shape, strides, (*out)->type_.SizeInBytes())); } else { RETURN_IF_NOT_OK(Tensor::CreateFromMemory(TensorShape(shape), DataType::FromNpArray(arr), data, out)); } return Status::OK(); } #endif ```
总条数:104 到第
上滑加载中