-
6月24日,经中国信息通信研究院(以下简称“信通院”)严格测试,华为云数据库应用迁移解决方案顺利通过“数据库应用迁移服务能力”评测,成为国内首批通过该项的商用数据库迁移方案。该项是国内首个针对数据库迁移能力的全面评估测试,包括6大能力域、16个能力项,共154个测试用例,评估结果分为基础级、增强级和先进级三个等级,填补了数据库领域在迁移服务能力标准方面的空白,切实为用户解决数据库产品替换难的根本顾虑。同时,也标志着国产数据库领军企业已经不再局限于仅关注产品本身的能力,还具备了为用户提供全方位、高标准的数据库迁移服务的能力,让用户不仅敢于选择,而且选的放心。华为在数据库迁移技术领域里一直有着深厚的技术积累,作为第一家参与的企业,华为云数据库应用迁移整体解决方案在本次评测中经历了迁移评估、业务改造、迁移执行、迁移验证、运维优化、安全能力6大方面的严苛考验,设计了完备的Oracle到GaussDB的迁移测试用例展示,成功取得了国内首批评测最高级别的成绩。华为云数据库应用迁移解决方案由华为云数据库和应用迁移UGO、华为云数据复制服务DRS两款产品组成。UGO专注于异构数据库结构迁移和应用SQL转换,实现商用数据库的一键迁移。DRS负责数据库毫秒级数据同步,支持同构异构数据库之间的数据传输/搬迁,降低数据库之间数据流通的复杂性,减少数据传输成本。该方案覆盖了数据库迁移、管理等环节,提供了一站式上云迁移解决方案,让用户真正做到迁移放心、管理省心!华为云数据库应用迁移解决方案架构图在信通院6大考验中,华为云UGO基于各种迁移成本为用户提供精准的评估结果;支持亿级别样本训练,当前综合语法转化率接近85%,并在持续提升中;支持预迁移评估和语法转换、对象校正等。充分满足信通院对迁移评估能力、业务改造能力、迁移执行能力等方面的要求。华为云DRS支持全量+增量迁移,能够最大限度将业务系统中断时间和业务影响最小化;严格控制使用者的操作权限,多方面保障数据库安全。充分满足信通院对迁移执行能力、迁移验证能力、安全能力等方面的要求。华为云GaussDB数据库已广泛应用于金融、政府、运营商、交通、物流、互联网等领域,服务于1000+客户,应用迁移解决方案成功帮助各行各业客户顺利高效的完成数据与应用迁移。此番通过信通院评测,进一步得到了市场和行业的广泛认可。华为云数据库将联合更多合作伙伴,持续为各行业提供极具竞争力的数据库迁移解决方案。
-
感谢各位小伙伴参与本次活动,本次活动获奖名单如下:活动中奖公示奖项名称获奖楼层社区昵称奖品备注优秀提问69wolfandy华为无线充电器 幸运奖9nukinsan笔记本套装与#69优秀提问重复,顺延至#1032//#32内容无效,顺延至#34仍然无效78客家鱻粉笔记本套装 100linghz666笔记本套装 112//与#69优秀提问重复,顺延至下一楼层仍为同一人请各位获奖的伙伴在8月3日之前点击此处填写收货地址,如逾期未填写视为自动弃奖。再次感谢各位小伙伴参与本次活动,欢迎关注华为云更多活动~【直播简介】【专家简介】 南风 华为云数据迁移DRS产品架构师【直播简介】 DRS是一款易用、稳定、高效,用于数据库在线迁移和数据库实时同步的云服务,它提供了以Oracle、MySQL、PostgreSQL、华为云RDS等多种数据库作为源端的数据迁移上云服务,其中GaussDB(for openGauss)作为华为云上的主力云数据库,DRS对其做了深度的开发支持,在迁移的功能和性能上具有很大优势,可以帮助客户简单、快捷、一键式的完成数据迁移。【直播时间】2021年6月22日 星期二 19:00-20:00直播链接:https://bbs.huaweicloud.com/live/cloud_live/202106221900.html 【活动介绍】【互动方式】直播前您可以在本帖留下您感兴趣的问题,专家会在直播时为您解答。直播后您可以继续在本帖留言,与专家互动交流。我们会在全部活动结束后对参与互动的用户进行抽奖。【活动时间】6月17日—6月30日 【奖励说明】活动1:提问有礼评奖规则:在本帖提出与直播相关的问题,由专家在所有互动贴中选出1名最优互动贴的开发者进行奖励。奖品:华为无线充电器1个 活动2:盖楼有礼评奖规则在活动结束后(截止6月30日),在本帖所有盖楼的用户中抽取获奖楼层,获奖楼层=总楼层*中奖百分比,中奖百分比为8%、28%、68%、88%、98%。例如:活动束后总楼层为200,200*8%=16,即第16楼获奖,其他获奖楼层同理可得。如出现小数点,则四舍五入,例如:活动结束后总楼层为220,220*8%=17.6,即第18楼获奖。无效楼层不参与中奖,请勿连续刷楼超过5层或回复无关内容,否则视为无效。奖品:笔记本套装1套【注意事项】1、为保证您顺利领取活动奖品,请您提前填写奖品收货信息,如您没有填写,视为放弃奖励【点击此处填写信息】。2、活动获奖信息填写时间截止2021年7月9日,如未填写视为弃奖。本次先发活动奖品将于2021年7月30日前统一发出,请您耐心等待。3、活动期间每个ID(同一姓名/电话/收货地址)只能获奖一次,若重复则中奖资格顺延至下一个合格楼层,仅一次顺延。4、如活动奖品出现没有库存的情况,华为云工作人员将会替换等价值的奖品,获奖者不同意此规则视为放弃奖品。5、其他事宜请参考【华为云社区常规活动规则】。
-
请假大神们一个问题,现在项目面临的问题是在gaussdb中大概2000多张表,如何将这些表的数据同步到hive中去。请教了一下华为的客服,推荐用loader组件,可是这个组件对于这种大批量的数据迁移来说实在是太麻烦了,有没有大神有过这方面的经验,烦请告知!先谢谢了
-
### 数据迁移中的字符集 DRS数据迁移要求源库和目标库的字符集一致,否则会导致数据迁移异常或者数据不一致,原因得从字符集及其原理说起 #### 字符与字节 在计算机中,数据都是以二进制进行存储的,也就是 在物理上,最小的物理存储单元是字节byte(B), 也就是8个bit位,物理上基于字节可以扩展出KB, MB, GB等 在逻辑上,把一个或多个byte进行组合,来代表更多逻辑世界的东西 比如:在java中用4个字节为一个单元来表示范围为2^31~2^31-1的整数(int),用8个字节为一个单元表示一个双精度浮点数(double),用2个字节为一个单元,表示一个字符char ##### 字符集 为了用字节来表示各种文字,各个组织制定了多套字节到字符的映射关系,这些映射关系就是字符集 例如:在ascii表中用固定1个字节表示1个字符,但是ascci码表只能表示256个字符;在gbk字符集中用2个字节表示1个字符,但是gbk只能表示65535个字符,有许多汉字不一定包括进去了,其它外国文字就更不用说了;在UNICODE字符集中用2~4个字节表示一个字符,基本实现了所有语言文字使用同一套映射的功能(unicode.org) java的字符是基于unicode的 ###### 查看字符的unicode值 ``` System.out.println("我的uniocode编码 hex:" + Integer.toHexString('我') + " bin:" + Integer.toBinaryString('我')); //我的uniocode编码 hex:6211 bin:110001000010001 ``` ##### 字符编码 有些字符集只有一种字符编码,比如ascii, gbk等,byte值在什么地方都可以直接映射成对应的字符,但是UNICODE的字符集却有多种编码,因为在UNICODE中规定,用2~4个字节表示一个字符,如果文件内容全是英文的,那么每个字符用2~4个字节相对于ascii来说在存储或者传输中就会占用浪费太多的空间,为了解决这个问题,对于UNICODE出现了多种使用变长字符编码,其中最常使用的UTF8编码,分别用1-4个字节来表示一个字符。UTF8是基于UNICODE的一种编码,UTF8编码格式如下: 首字节:0xxxxxxx(单字节), 110xxxxx(2字节), 1110xxxx(3字节), 11110xxx(4字节) 剩余字节:10xxxxxx ###### 查看一个字符的编码 ``` for (byte b : new String(new char[]{'我'}).getBytes("UTF8")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + " "); } //e6:11100110 88:10001000 91:10010001 for (byte b : new String(new char[]{'我'}).getBytes("GBK")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + " "); } //ce:11001110 d2:11010010 ``` ##### UNICODE与UTF8的转换 ``` Unicode符号范围 | UTF-8编码方式 (十六进制) | (二进制) --------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx ``` 其中二进制中xxx部分即为unicode的内容 “我” unicode值为:110 001000 010001 utf8值为:11100110 10001000 10010001 ##### 字符排序规则 数据库中除了字符集外,还有字符排序规则, ### java中的字符集 根据不同的编码,一串字节流可以翻译成不同的字符,那么想正确翻译出文件或者数据流的内容,就需要知道对应的字符集或字符编码才行 ###### 读写数据 ``` Socket socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1", 8080)); InputStreamReader netIn = new InputStreamReader(socket.getInputStream()); char[] charsNet = new char[10]; netIn.read(charsNet); OutputStreamWriter netOut = new OutputStreamWriter(socket.getOutputStream()); netOut.write(new char[]{'我', '是', 'D', 'R', 'S'}); InputStreamReader fileIn = new InputStreamReader(new FileInputStream("/tmp/t.txt")); char[] fileChars = new char[10]; fileIn.read(fileChars); OutputStreamWriter fileOut = new OutputStreamWriter(new FileOutputStream("/tmp/t.txt")); fileOut.write(new char[]{'我', '是', 'D', 'R', 'S'}); ```  写入的时候,通过CharsetDecoder把CharBuffer转换成ByteBuffer 读取的时候,通过CharsetEncoder把ByteBuffer转换成CharBuffer ###### 错误的字符集 当我们用一个GBK的字符集去读取UTF8的byte的时候,程序不会报错,而且对于异常字符会由其它字符填充,不会保持byte的原样 注:这是因为java的String在处理字符集格式异常的时候,默认用的CharsetDecoder策略的替换(REPLACE), 另外两个是忽略(IGNORE)和报错(REPORT),如果是replace的情况下,会用一些特殊字符替换,于是byte内容就会失真 ``` char[] chars = new char[]{'我'}; System.out.print("UTF8:\t\t\t我\t\t"); for (byte b : new String(chars).getBytes("UTF8")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + "\t"); } System.out.println(); System.out.print("UTF8=>GBK:\t\t" + new String(new String(chars).getBytes("UTF8"), Charset.forName("GBK")) + "\t"); for (byte b : new String(new String(chars).getBytes("UTF8"), Charset.forName("GBK")).getBytes("GBK")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + "\t"); } System.out.println(); System.out.print("GBK:\t\t\t我\t\t"); for (byte b : new String(chars).getBytes("GBK")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + "\t"); } System.out.println(); System.out.print("GBK=>UTF8:\t\t" + new String(new String(chars).getBytes("GBK"), Charset.forName("UTF8")) + "\t"); for (byte b : new String(new String(chars).getBytes("GBK"), Charset.forName("UTF8")).getBytes("GBK")) { System.out.print(Integer.toHexString(b & 0xFF) + ":" + Integer.toBinaryString(b & 0xFF) + "\t"); } //UTF8: 我 e6:11100110 88:10001000 91:10010001 //UTF8=>GBK: 鎴 e6:11100110 88:10001000 3f:111111 //GBK: 我 ce:11001110 d2:11010010 //GBK=>UTF8: 3f:111111 3f:111111 ``` ### MySQL中的字符集 ###### 不同字符集的表,对于相同的字符(char),存储的内容(byte)不同 ``` CREATE TABLE `t_charset_gbk` ( `val` varchar(32) ) CHARSET=gbk; insert into t_charset_gbk values ('我'),('是'); select val,hex(val) from t_charset_gbk; +------+----------+ | val | hex(val) | +------+----------+ | 我 | CED2 | | 是 | CAC7 | +------+----------+ CREATE TABLE `t_charset_utf8` ( `val` varchar(32) ) DEFAULT CHARSET=utf8; insert into t_charset_utf8 select * from t_charset_gbk; select val,hex(val) from t_charset_utf8; +------+----------+ | val | hex(val) | +------+----------+ | 我 | E68891 | | 是 | E698AF | +------+----------+ ``` ###### 客户端选用不同显示字符集,数据存储内容也不同 ``` >mysql --default-character-set=utf8 mysql> select hex('我'), '我', convert(unhex('E68891') using utf8); +------------+-----+-------------------------------------+ | hex('我') | 我 | convert(unhex('E68891') using utf8) | +------------+-----+-------------------------------------+ | E68891 | 我 | 我 | +------------+-----+-------------------------------------+ >mysql --default-character-set=gbk mysql> select hex('我'), '我', convert(unhex('CED2') using gbk); +-----------+----+----------------------------------+ | hex('我') | 我 | convert(unhex('CED2') using gbk) | +-----------+----+----------------------------------+ | CED2 | 我 | 我 | +-----------+----+----------------------------------+ ``` ###### 字符集的转换 可以用convert函数来转换不同字符集的字符 ``` mysql> select convert(unhex('CED2') using gbk),convert(unhex('E68891') using utf8),hex(convert(convert(unhex('CED2') using gbk) using utf8)); +----------------------------------+-------------------------------------+-----------------------------------------------------------+ | convert(unhex('CED2') using gbk) | convert(unhex('E68891') using utf8) | hex(convert(convert(unhex('CED2') using gbk) using utf8)) | +----------------------------------+-------------------------------------+-----------------------------------------------------------+ | 我 | 我 | E68891 | +----------------------------------+-------------------------------------+-----------------------------------------------------------+ ``` ##### 错误的字符集的时候 跟java不同,MySQL错误的字符集转换会变为空值,类似于java的报错策略,而如果格式符合要求,它会存储成乱码但会保持byte原样存储 ``` > select convert(unhex('E68891') using gbk), convert(unhex('E68891E68891') using gbk), convert(unhex('E68891') using utf8); +------------------------------------+------------------------------------------+-------------------------------------+ | convert(unhex('E68891') using gbk) | convert(unhex('E68891E68891') using gbk) | convert(unhex('E68891') using utf8) | +------------------------------------+------------------------------------------+-------------------------------------+ | NULL | 鎴戞垜 | 我 | +------------------------------------+------------------------------------------+-------------------------------------+ ``` ##### 字符集校验规则 当collate不同的时候,有可能会把不同的字符认为是相同的字符 ``` mysql> select 'A'='a'; +---------+ | 'A'='a' | +---------+ | 1 | +---------+ 1 row in set (0.00 sec) mysql> select convert('a',CHAR CHARACTER SET utf8) COLLATE utf8_bin=convert('A', CHAR CHARACTER SET utf8) COLLATE utf8_bin; +--------------------------------------------------------------------------------------------------------------+ | convert('a',CHAR CHARACTER SET utf8) COLLATE utf8_bin=convert('A', CHAR CHARACTER SET utf8) COLLATE utf8_bin | +--------------------------------------------------------------------------------------------------------------+ | 0 | +--------------------------------------------------------------------------------------------------------------+ ``` 一些简单的名称规则 ``` 后缀名称 | 含义 _ai | 口音不敏感 _as | 口音敏感 _ci | 不区分大小写 _cs | 区分大小写 _ks | 假名敏感 _bin | 二进制 ``` ##### 默认字符集 1、创建库的时候,如果不指定库的字符集,默认用character_set_server,默认排序规则用infomation_schema.collations中对应的default值 2、创建表的时候,如是不指定表的字符集,默认用库的字符集和排序规则 ``` mysql> set character_set_server=gbk; Query OK, 0 rows affected (0.00 sec) mysql> create database test1; Query OK, 1 row affected (0.01 sec) mysql> show create database test1; +----------+---------------------------------------------------------------+ | Database | Create Database | +----------+---------------------------------------------------------------+ | test1 | CREATE DATABASE `test1` /*!40100 DEFAULT CHARACTER SET gbk */ | +----------+---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> create table t (name varchar(32)); Query OK, 0 rows affected (0.02 sec) mysql> show create table t; +-------+------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------------------------------------------+ | t | CREATE TABLE `t` ( `name` varchar(32) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=gbk | +-------+------------------------------------------------------------------------------------------+ mysql> set character_set_server=utf8mb4; Query OK, 0 rows affected (0.00 sec) mysql> create database test3; Query OK, 1 row affected (0.01 sec) mysql> show create database test3; +----------+-------------------------------------------------------------------+ | Database | Create Database | +----------+-------------------------------------------------------------------+ | test3 | CREATE DATABASE `test3` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ | +----------+-------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> create table t (name varchar(32)); Query OK, 0 rows affected (0.03 sec) mysql> show create table t; +-------+----------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------+ | t | CREATE TABLE `t` ( `name` varchar(32) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 | +-------+----------------------------------------------------------------------------------------------+ ``` ### DRS数据迁移中的字符集 在DRS做数据迁移的时候,我们要求 1、源和目标库的字符集保持一致,如果字符集不一致,源表字符集在目标表字符集中没有,就会出现异常或者乱码 例如韩文“조선글”不在gbk的字符集里面,但是在unicode字符集里面 ``` mysql> create table t_charset_gbk (val varchar(32) character set gbk); Query OK, 0 rows affected (0.03 sec) mysql> create table t_charset_utf8 (val varchar(32) character set utf8); Query OK, 0 rows affected (0.02 sec) mysql> mysql> insert into t_charset_utf8 value('汉字'), ('조선글'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into t_charset_gbk select * from t_charset_utf8; ERROR 1366 (HY000): Incorrect string value: '\xEC\xA1\xB0\xEC\x84\xA0...' for column 'val' at row 2 ``` 2、源和目标库的字符集校验规则一致,如果校验规则不一致,有可能会出现数据惟一约束失败的问题 ``` mysql> create table t_collate_ci (val varchar(32) character set gbk collate gbk_chinese_ci,unique key uk_v(val)); Query OK, 0 rows affected (0.02 sec) mysql> create table t_collate_bin (val varchar(32) character set gbk collate gbk_bin,unique key uk_v(val)); Query OK, 0 rows affected (0.03 sec) mysql> insert into t_collate_bin values ('a'), ('A'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into t_collate_ci select * from t_collate_bin; ERROR 1062 (23000): Duplicate entry 'a' for key 'uk_v' mysql> ``` 因此在做数据迁移的时候,源目标端的配置一定要相同,否则就会导致写入异常或者失败的情况
-
概览● 本文主要是想谈一下如何给HBase做增量数据的迁移,也就是迁移实时数据。在之前的博文HBase实用技巧:一种全量+增量数据的迁移方法-云社区-华为云 (huaweicloud.com)中提到HBase增量数据迁移可以使用Replication的方式去做,但是在实际搬迁时,要给原集群设置Replication可能需要重启,这样会影响业务,我们需要做到不停机迁移才行。WAL原理正常情况下,HBase新增的数据都是有日志记录的,数据在落盘成HFile之前,任何一个Put和Delete操作都是记录日志并存放在WALs目录中,日志中包含了所有已经写入Memstore但还未Flush到HFile的更改(edits)。默认情况下每个RegionServer只会写一个日志文件,该RS管理的所有region都在向这一个日志文件写入Put和Delete记录,直到日志文件大小达到128MB(由hbase.regionserver.hlog.blocksize设置)后roll出一个新的日志文件,总共可以roll出32个日志文件(由hbase.regionserver.maxlogs设置)。如果日志文件未写满128MB,RegionServer间隔1小时也会roll出新一个新日志文件(由hbase.regionserver.logroll.period设置)。当日志文件中涉及的所有region的记录都flush成HFile后,这个日志文件就会转移至oldWals目录下归档, Master没间隔10分钟(hbase.master.cleaner.interval)会检查oldWALs目录下的过期日志文件,当文件过期时会被Master清理掉,(日志过期时间由hbase.master.logcleaner.ttl控制)。RegionServer默认间隔1小时(由hbase.regionserver.optionalcacheflushinterval设置)会对它管理的region做一次flush动作,所以WALs目录中一直会有新的日志文件生成,并伴随着老的日志文件移动到oldWALs目录中。迁移方式一、迁移oldWALs目录中的文件,使用WALPlayer回放由于日志文件文件最终移动到oldWALs目录下,只需要写个脚本,定时检查oldWALs目录下是否有新文件生成,如果有文件,则move至其他目录,并使用WALPlayer工具对这个目录进行回放。优点:无代码开发量,仅需脚本实现缺点:无法做到实时,因为从数据写入到最后到达oldWAL目录会间隔很长时间。二、开发独立工具,解析日志文件,写入目的集群在网上查找迁移方法的时候了解到了阿里开发了一个专门的HBase迁移工具,可以实现不停机。通过阅读其设计BDS - HBase数据迁移同步方案的设计与实践了解到阿里开发了应用去读取HBase的WAL日志文件并回放数据至目的集群。优点:可以做到实时;缺点:需要一定的代码开发量;要做出这样一个工具,需要了解上面说的WAL文件归档的原理以及日志回放工具WALPlayer,下面简单说一下可以怎么去实现。独立工具实现这里简单说明下如何去做这样一个工具,只介绍读取WAL方面,任务编排就不描述了定时扫描WALs目录获取所有的日志文件,这里按ServerName去分组获取,每个分组内根据WAL文件上的时间戳排序;● 获取所有RS的ServerNameClusterStatus clusterStatus = admin.getClusterStatus(); Collection<ServerName> serverNames = clusterStatus.getServers();● 根据ServerName去组成Path获取日志Path rsWalPath = new Path(walPath, serverName.getServerName()); List<FileStatus> hlogs = getFiles(fs, rsWalPath, Long.MIN_VALUE, Long.MAX_VALUE);● getFiles()参考HBase源码中WALInputFormat.java中的实现,可以指定时间范围去取日志文件private List<FileStatus> getFiles(FileSystem fs, Path dir, long startTime, long endTime) throws IOException { List<FileStatus> result = new ArrayList<FileStatus>(); LOG.debug("Scanning " + dir.toString() + " for WAL files"); FileStatus[] files = fs.listStatus(dir); if (files == null) return Collections.emptyList(); for (FileStatus file : files) { if (file.isDirectory()) { // recurse into sub directories result.addAll(getFiles(fs, file.getPath(), startTime, endTime)); } else { String name = file.getPath().toString(); int idx = name.lastIndexOf('.'); if (idx > 0) { try { long fileStartTime = Long.parseLong(name.substring(idx+1)); if (fileStartTime <= endTime) { LOG.info("Found: " + name); result.add(file); } } catch (NumberFormatException x) { idx = 0; } } if (idx == 0) { LOG.warn("File " + name + " does not appear to be an WAL file. Skipping..."); } } } return result; }对于取到的每一个WAL文件,当做一个任务Task执行迁移,这个task主要有下面一些步骤● 使用WALFactory为每个日志文件创建一个ReaderWAL.Reader walReader = WALFactory.createReader(fileSystem, curWalPath, conf);● 通过Reader去读取key和edit,并记录下position,为了加快写入速度,这里可以优化为读取多个entryWAL.Entry entry = walReader.next(); WALKey walKey = entry.getKey(); WALEdit walEdit = entry.getEdit(); long curPos = reader.getPosition();● 记录position的目的是为了Reader的reset以及seek,因为这个原始WAL文件还正在写入的时候,我们的Reader速度很可能大于原WAL的写入速度,当Reader读到底的时候,需要等待一段时间reset然后再重新读取entryWAL.Entry nextEntry = reader.next(); if (nextEntry == null) { LOG.info("Next entry is null, sleep 10000ms."); Thread.sleep(5000); curPos = reader.getPosition(); reader.reset(); reader.seek(curPos); continue; }● 在读取WAL的过程中很可能会遇到日志转移到oldWALs目录下,这个时候捕获到FileNotFoundException时,需要重新生成一个oldWALs目录下Reader,然后设置curPos继续读取文件,这个时候如果再次读取到文件最后的时候,就可以关闭Reader了,因为oldWALs中的日志文件是固定大小的,不会再有追加数据。这里需要注意的是这个参数hbase.master.logcleaner.ttl不能设置过小,否则会出现这个在oldWALs目录下的日志文件还没读取完被清理掉了。Path oldWALPath = new Path(oldWalPath, walFileName); WAL.Reader reader = WALFactory.createReader(fileSystem, oldWALPath, conf); reader.seek(curPos)● 根据通过WAL.Reader可以读取到walKey,walEdit进而解析出Cell并写入目的集群,这个可以参考WALPlay的map()方法
-
迁移前准备主要对当前现有大数据平台做一个信息统计,以便更好地进行迁移决策。 离线大数据迁移范围说明:针对离线大数据平台迁移,涉及到数据部分主要有HDFS文件数据迁移、 Hive 数据(表数据、元数据)迁移、HBase 数据迁移。当前以这三个组件的数据做重点介绍详情请点击博文链接:https://bbs.huaweicloud.com/blogs/160949
-
1CODIS简介Codis是一个分布式Redis解决方案,对于上层的应用来说,连接到Codis Proxy和连接原生的RedisServer没有明显的区别,有部分命令不支持。Codis底层会处理请求的转发,不停机的数据迁移等工作,所有后边的一切事情,对于前面的客户端来说是透明的,可以简单的认为后边连接的是一个内存无限大的Redis服务。Codis由四部分组成:· Codis-proxy:实现redis协议,由于本身是无状态的,因此可以部署很多个节点· Codis-config :是codis的管理工具,包括添加/删除redis节点添加删除proxy节点,发起数据迁移等操作,自带httpserver,支持管理后台方式管理配置· Codis-server :是codis维护的redis分支,基于2.8.21分支,加入了slot的支持和原子的数据迁移指令; codis-proxy和codis-config只能和这个版本的redis交互才能正常运行· Zookeeper,用于codis集群元数据的存储,维护codis集群节点2环境信息2.1 环境信息类别子项版本获取地址OSCentOS7.5 Aarch64https://www.centos.org/download/服务器配置16U16GB50GB软件CODIS3.2.2https://codeload.github.com/CodisLabs/codis/tar.gz/3.2.2软件GO1.9.2https://dl.google.com/go/go1.9.2.linux-arm64.tar.gz软件Zookeeper3.4.14http://apache.fayea.com/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz3 软件移植3.1 环境准备:OS安装类型:CentOS-7.5-aarch64-1804。 注:操作系统安装使用最小简化版安装(如上图),其余步骤安装一般安装操作系统步骤即可。3.1.1 相关软件下载上传:1. 上传codis、go、zookeeper源码包至服务器目录下2. 上传CentOS-7.5-aarch64-Everything-1804.iso文件至服务器3.2 部署zookeeper3.2.1 安装java(三台机器)1. 配置本地yum源2. 安装java:yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel –y,修改/etc/profile,添加javahome和path,如:· vi /etc/profileexport JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.aarch64export PATH=$JAVA_HOME/bin:$PATH修改后执行:source /etc/profile3.2.2 配置hosts(三台机器)vi /etc/hosts#########zookeeper#########172.31.96.86 192.168.0.159 zk01172.31.96.204 192.168.0.211 zk02172.31.96.226 192.168.0.117 zk033.2.3 关闭防火墙(三台机器)· systemctl stop firewalld· sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config3.2.4 获取安装软件(zk01)· cd /opt (zookeeper安装包所在目录)· tar -xf zookeeper-3.4.14.tar.gz· mv zookeeper-3.4.14 zookeeper3.2.5 创建dataDir和dataLogDir(zk01)· cd /opt/zookeeper· mkdir {data,logs}3.2.6 集群环境配置文件(zk01)· cd /opt/zookeeper/conf· cp -rp zoo_sample.cfg zoo.cfg· vi zoo.cfgtickTime=2000# tickTime : 服务器与客户端之间交互的基本时间单元(ms)initLimit=10# initLimit : 此配置表示允许follower连接并同步到leader的初始化时间,它以tickTime的倍数来表示。当超过设置倍数的tickTime时间,则连接失败。syncLimit=5# syncLimit : Leader服务器与follower服务器之间信息同步允许的最大时间间隔,如果超过次间隔,默认follower服务器与leader服务器之间断开链接。dataDir=/usr/local/zookeeper/data# dataDir : 保存zookeeper数据路径dataLogDir=/usr/local/zookeeper/logs# dataLogDir : 保存zookeeper日志路径,当此配置不存在时默认路径与dataDir一致,事务日志,会产生version2目录clientPort=2181# clientPort : 客户端访问zookeeper时经过服务器端时的端口号maxClientCnxns=60# maxClientCnxns : 限制连接到zookeeper服务器客户端的数量。server.1=zk01:2888:3888server.2=zk02:2888:3888server.3=zk03:2888:3888# server.id=host:port:port : 表示了不同的zookeeper服务器的自身标识,作为集群的一部分,每一台服务器应该知道其他服务器的信息。用户可以从“server.id=host:port:port” 中读取到相关信息。在服务器的data(dataDir参数所指定的目录)下创建一个文件名为myid的文件,这个文件的内容只有一行,指定的是自身的id值。比如,服务器“1”应该在myid文件中写入“1”。这个id必须在集群环境中服务器标识中是唯一的,且大小在1~255之间。这一样配置中,zoo1代表第一台服务器的IP地址。第一个端口号(port)是从follower连接到leader机器的端口,第二个端口是用来进行leader选举时所用的端口。所以,在集群配置过程中有三个非常重要的端口:clientPort:2181、port:2888、port:3888。3.2.7 分发zookeeper到其他节点· scp –r /opt/zookeeper root@zk02:/opt· scp –r /opt/zookeeper root@zk03:/opt3.2.8 配置id到文件· ssh zk01 "echo '1' > /opt/zookeeper/data/myid"· ssh zk02 "echo '2' > /opt/zookeeper/data/myid"· ssh zk03 "echo '3' > /opt/zookeeper/data/myid"注意:此步骤极为重要,请务必保证myid中配置的值与zoo.cfg中server.id中的id对应。3.2.9 启动zookeeper(三台机器)启动zookeeper/opt/zookeeper/bin/zkServer.sh start检查是否正常启动Jps 出现QuorumPeerMain则证明java进程成功启动。/opt/zookeeper/bin/zkServer.sh status 出现此问题是由于我们部署的zookeeper为3个节点,只有当半数以上启动的时候,zookeeper才能正常运行,继续启动另外两台上的zookeeper,启动后,稍等片刻,再次查看:Zookeeper节点全部启动后,仍提示Error contacting,则需要查看zookeeper.out文件,针对具体问题进行具体解决。 3.3 安装go(三台机器)3.3.1 上传文件并解压· cd /usr/local/· tar -xf /opt/go1.9.2.linux-arm64.tar.gz3.3.2 配置环境变量vi /etc/profile,添加:export GOROOT=/usr/local/goexport GOPATH=/usr/local/go/goworkexport PATH=$PATH:$GOROOT/bin:$GOPATH/bin执行:source /etc/profile3.3.3 查看版本go version 3.4 安装codis3.4.1 编译codis(三台机器)创建$GOPATH/src/github.com/CodisLabs目录:· mkdir -p $GOPATH/src/github.com/CodisLabs· cd $GOPATH/src/github.com/CodisLabs解压codis文件:· tar -xf /opt/codis-3.2.2.tar.gz编译codis:· mv codis-3.2.2/ codis· cd codis/· make3.4.2 提取有用程序(三台机器)· cd $GOPATH/src/github.com/CodisLabs/codis· mkdir /usr/local/codis· cp -rp bin admin config /usr/local/codis/3.4.3 部署codis-dashboard(zk01)1.修改配置文件· vi /usr/local/codis/config/dashboard.toml#coordinator_name = "filesystem"#coordinator_addr = "/tmp/codis"coordinator_name = "zookeeper"coordinator_addr = "zk01:2181,zk02:2181,zk03:2181"2.启动dashboard· cd /usr/local/codis· ./admin/codis-dashboard-admin.sh start· ss -tpnl |grep 18080# 可以查看log确认状态 /usr/local/codis/log/codis-dashboard.log.3.dashboard地址admin_addr = "0.0.0.0:18080"3.4.4 部署codis-fe管理后台(zk01)1.修改启动文件· vi /usr/local/codis/admin/codis-fe-admin.sh#COORDINATOR_NAME="filesystem"#COORDINATOR_ADDR="/tmp/codis"COORDINATOR_NAME="zookeeper"COORDINATOR_ADDR=" zk01:2181,zk02:2181,zk03:2181"2.启动fe· cd /usr/local/codis· ./admin/codis-fe-admin.sh start· ss -tpnl|grep 9090# 可以查看log确认状态 /usr/local/codis/log/codis-fe.log.3.后台管理地址CODIS_FE_ADDR="0.0.0.0:9090"3.4.5 部署codis-server加入集群(三台机器)部署3个节点的server zk01/zk02/zk031.配置bindvi /usr/local/codis/config/redis.conf将 bind 127.0.0.1 改为 bind 本地ip注意:此步骤必须使用本地ip,若使用127.0.0.1将导致codis-server无法添加 到集群,若使用浮动ip则无法正常启动codis-server2.所有server机器启动codis-server/usr/local/codis/admin/codis-server-admin.sh start3.fe管理后台添加1个group,group分配3个机器输入:group_id为1,点击new group: 输入:Codis Server Address 为zk01:6379 Gourp 为 1,点击Add Server。 重复上述添加步骤,完成后结果如下: 3.4.6 部署codis-proxy代理服务(三台机器)部署3个节点的server zk01/02/031.修改配置文件proxy.toml,zookeeper地址vi /usr/local/codis/config/proxy.toml#jodis_name = ""#jodis_addr = ""jodis_name = "zookeeper"jodis_addr = " zk01:2181,zk02:2181,zk03:2181"2.修改启动文件并启动,指向dashboard IP:PORTvi /usr/local/codis/admin/codis-proxy-admin.sh#CODIS_DASHBOARD_ADDR="127.0.0.1:18080"CODIS_DASHBOARD_ADDR="zk01:18080"/usr/local/codis/admin/codis-proxy-admin.sh startss -tpnl |grep 190003.proxy启动默认会自动注册到dashboard中,也可以在fe中手动添加 4 参考信息 5 FAQ5.1 java.net.BindException: 无法指定被请求的地址 (Bind failed) 原因:出现此问题是由于进程无法指定被请求的地址。解决:修改每个zoo.cfg文件中对应的server.x=0.0.0.0:2888:3888,如: 修改后重启zookeeper,则报错消失。5.2 java.net.ConnectException: 拒绝连接 (Connection refused) 原因:对应节点的zookeeper未启动解决:启动对应节点的zookeeper,zookeeper的启动需要时间,稍等片刻,此报错消失。5.3 "Cause": "dial tcp 172.31.96.86:6379: getsockopt: connection refused" 现象:在fe管理界面添加codis-server节点时出现如上报错。在zk01服务器上查看codis-server进程,结果如下 解决:修改redis.conf文件,将 bind 127.0.0.1 改为 bind 本地ip。此步骤必须使用本地ip,若使用127.0.0.1将导致codis-server无法添加到集群,若使用浮动ip则无法正常启动codis-server。
-
从前,人们靠烽火传军情、鸿雁传书、鱼传尺素、飞鸽传书等通讯方式作为行走社交江湖的必备技能。如今,人们足不出户,满天飞的讯息通过手机、电脑的传递充斥在我们生活方方面面。社会进步的背后是科技的迅猛发展,我们也许无法看见这波澜壮阔的时代细节,但仍可透过一滴水窥见其发展脉络。作为一家提供语音数据平台及物联网设备的科技公司—赛云数据,一直致力于在万物智联领域提供移动设备智能连接的系统解决方案和运营管理服务。随着业务的发展,赛云数据原先主要服务全球虚拟运营商的MVNE平台已不能满足日益增长的业务需求。在经过多方查找和考量评估,赛云数据最终选择了牵手华为云。在2019年把MVNE平台全部数据迁移部署到华为云上,其中包括业务系统和云数据库。而华为云数据库结合华为云服务的优势,为其量身打造了一套高安全、高可用、高性能的整体解决方案。“左右手”联合把控细节 让数据无处可逃从传统Oracle数据库切换到华为云数据库,要求数据不丢失、不影响业务、工作量最小。据此华为云数据库多番思量给出的解决方案是:左手PostgreSQL增强版(简称PG增强版),右手数据复制服务DRS,左右手共同发力,把控每一个细节,真正做到让数据无处可逃。• 一方面,PG增强版90%兼容Oracle,且搭配华为评估工具,可自主对Oracle生产库进行评估,分析迁移对象,给出改造建议,省心省力;• 另一方面,使用DRS数据迁移服务,将Oracle数据迁移至华为云PG增强版,安全又可靠。这样一来,既为企业客户上云降低了成本,也保障了客户数据的安全,一举两得。多重部署监控 让数据高枕无忧整个迁移过程需要保证数据库服务具备之前的可靠性、安全和高性能,且整个系统要求能够随着业务量的增加而实现快速弹性扩展,并支持分布式部署,结合SD-WAN专线,实现全球客户的高效、便捷接入。面对如此多诉求,华为云一点也不在怕的。一套部署监控看清所有问题套路,还你一个健康数据华为云在PG增强版上部署实际应用,进行大量系统测试,测试中不断发现问题,解决问题,最终保证全部业务正常运行,最后正式部署业务,迁移上线。重重部署,层层把控,确保业务零中断。下面让我们听听客户怎么说据赛云数据相关负责人表示: 此次上云大大简化了系统的扩展和维护,通过分布式部署可以方便接入全球客户,且极大减少了人力、物力成本,很大程度上降低了企业成本。华为云PG增强版Oracle兼容度高,改造工作量小,同时具备可靠性、安全性、高性能和可扩展性,极大保障了数据的管理与安全。华为云PG增强版内核团队专业能干,反应迅速,为我们数据顺利迁移保驾护航。工欲善其事必先利其器,我们的生活和工作正在呈几何式增长,选择好的平台和工具能起到事半功倍的作用。华为云数据库精耕细作多年,凭借着深厚的技术积淀和优质的产品服务成功助力赛云数据数字化转型,实现业务的新一轮升级。专业的事交给专业的人,您只需聚焦业务的研究和创新即可,华为云数据库在背后为您保驾护航。
-
1 背景介绍传统的Hadoop和Spark大数据生态,主要是以本地硬盘或云硬盘承载HDFS文件系统进行数据存储,但是存在成本高,扩容难等问题。当前华为云对象存储服务OBS可以与Hadoop和Spark大数据生态进行对接,为用户提供计算存储分离的大数据解决方案。为了实现用户数据平滑上云,可以采用华为云CDM服务进行HDFS到OBS的数据迁移。2 迁移背景和目标已存在集群一采用EVS存储HDFS格式数据,新建集群二采用OBS存储数据,需要将数据从集群一的HDFS迁移至集群二的OBS。3 迁移方法1、已搭建集群一(北京一)和集群二(华东),集群一采用EVS存储数据,集群二采用OBS存储数据2、在集群一构造Spark或者Hive的数据,例如,构造Hive表数据如下(1)创建DATABASECREATE DATABASE top_ods;(2)创建TABLECREATE TABLE `top_ods.claim_6yue_pt`( `user_id` varchar(300), `ese_id` int, `task_id` varchar(100))partitioned by (tagdate int)ROW FORMAT DELIMITED FIELDS TERMINATED BY "|"STORED AS parquetfileTBLPROPERTIES ("orc.compression"="Snappy");insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '10' ,10,'10');insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '11' ,11,'11');insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '12' ,12,'12');insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '13' ,13,'13');insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '14' ,14,'14');insert into table top_ods.claim_6yue_pt partition(tagdate=1) values( '15' ,15,'15');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '20' ,20,'20');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '21' ,21,'21');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '22' ,22,'22');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '23' ,23,'23');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '24' ,24,'24');insert into table top_ods.claim_6yue_pt partition(tagdate=2) values( '25' ,25,'25');select * from top_ods.claim_6yue_pt;3、在集群二创建Spark或者Hive的新表,新表格式与源表的存储格式等属性要一致(1)创建DATABASECREATE DATABASE top_odstest location 'obs://obs-bigdata-hd-003/user/hive/warehouse/top_ods.db';(2)创建TABLE,新表格式与源表的存储格式等属性要一致CREATE TABLE `top_odstest.claim_6yue_pt`( `user_id` varchar(300), `ese_id` int, `task_id` varchar(100))partitioned by (tagdate int)ROW FORMAT DELIMITED FIELDS TERMINATED BY "|"STORED AS parquetfileTBLPROPERTIES ("orc.compression"="Snappy");4、创建CDM任务,将集群一的HDFS数据迁移至集群二的OBS(1)创建CDM集群(华东),跨Region需要绑定公网弹性IP(2)配置连接管理,一个连接使用Apache HDFS,另一个连接使用对象存储服务(OBS)备注:集群一的所有节点需配置公网弹性IP,并且Apache HDFS连接中的IP与主机名映射要填写所有集群一的主机XX.XX.XX.XX ecs-bigdata-hdtest-0000.novalocalXX.XX.XX.XX ecs-bigdata-hdtest-0001.novalocalXX.XX.XX.XX ecs-bigdata-hdtest-0002.novalocalXX.XX.XX.XX ecs-bigdata-hdtest-0003.novalocal(3)配置作业管理,源连接使用HDFS连接,目标连接使用OBS连接,文件格式使用二进制格式(4)配置完成后,运行作业进行数据迁移5、迁移完成后,在集群二恢复Hive表数据,即可查询数据成功。恢复Hive表数据:MSCK REPAIR TABLE top_odstest.claim_6yue_pt;查询Hive表数据:select * from top_odstest.claim_6yue_pt;
-
企业上云成为近年来的热门话题,很多企业甚至把企业上云看成是企业数字化转型的必经之路。然而企业上云从何处入手? 如何在业务不中断或者计划的时间窗口内成功迁云?如何降低数据迁移过程中的复杂性?究其根本企业上云最大的难题之一是数据库的数据迁移。为客户解决的这个难题,是华为云数据库服务团队持续不断地在数据迁移领域进行技术研究和创新的重要驱动力。数据复制服务DRS 的定位我们都知道,华为在云数据库领域的产品已形成了系列,包括SQL、NoSQL的等等。但是很多人不知道的是,华为云还有一款重量级的产品:华为云数据复制服务DRS(Data Replication Service,简称为 DRS)。什么是DRS?从概念来看,数据复制服务DRS是一种易用、稳定、高效,用于数据库在线迁移和数据库实时同步的云服务。DRS围绕云数据库,降低了数据库之间数据流通的复杂性,有效地帮助用户减少数据传输成本。简单理解,DRS是企业数据上云的“绿色管道”,能确保企业的关键数据一键迁云。具体而言,DRS有两个重要使命。第一,帮助企业DBA或者是CTO,以快速、简单的方式把数据库安全地迁移到云上。企业上云的第一个门槛就是数据迁移,在传统云下做数据库迁移会面临很多风险与挑战,例如业务中断、数据丢失、迁移失败等。虽然传统意义上来看数据库迁移通常很难,在云上有了很大的变化,借助华为云DRS,用户可有效避免云迁移带来的各种复杂问题,为客户成功迁云建立信心。用户只需要轻松几步,分钟级就可以创建好迁移任务;第二个使命,DRS可以解决数据孤岛、数据流、灾备保护等问题,让数据库之间的关键数据按照用户业务的需要驱动,实时流动起来,也就是服务于数据库的同步、灾备等场景下客户的各类需求,是云数据库整体方案成功落地的得力助手。 五大技术亮点降低数据流通的复杂性对于金融行业、政府机构以及自然灾害频发的沿海地区来说,对于异地灾备需求非常强烈。用户要进行两地三中心的容灾部署,最关心的问题就是会不会丢数据、异地传输多长时间能达到百里之外。围绕这些问题,DRS通过以下五个核心能力来更好地满足用户期望。智能压缩:长距离的异地传输或者备份时网络带宽不稳定是主要的问题,DRS采用智能压缩的思路,在传输数据量大小决定压缩与否,面对带宽不足时,有效保障数据可送达异地。批量发送:高频率的数据库操作,在局域网内性能可能不是问题。但远距离传输需要“多层握手”,网络延时从毫秒级变成几十毫秒级,这种时延差异在高频率操作的放大下,延时可能会由原来的几秒变成了几十秒,导致数据传输到异地实时性大幅下降,DRS可以通过批量发送功能减少反复握手的问题,有效提升异地数据传输的实时性。日志回放:DRS收到数据库的日志是有序串行的,按照原顺序回放将会形成瓶颈,使得异地数据远远落后于源数据,并行回放这些日志是提升数据传输实时性的关键技术。当然随意地并行会出现数据错乱问题。DRS采用并行判断模块,可以高效梳理哪些行级数据能并行执行,较大程度上提升了数据实时性。并行抓取:DRS并行地抓取变化的数据,最大程度保护数据在灾难发生时的损失。热点合并:在短时间之内频繁的对同一数据进行反复操作,DRS可以合并这些操作,这个过程可以简化为最终一致数据发送至异地数据,使得满足该类场景下的数据传输性得到提升。通过上述技术组合创新,华为云DRS给用户带来了综合的服务体验提升。 预检查功能确保企业迁云成功华为云DRS有许多具体的技术措施,其中关键的一个技术是预检查,华为云把所有成功项目的经验和要点积累固化到程序的检查项中,成熟完善的预检查系统,DRS可以明确提示客户哪一项环境设置会影响迁移,应该如何调整。成功通过一系列的精准检查后,可以确定迁云成功。值得一提的是,华为云DRS采用统一自动的逻辑,从整体上使得每个用户使用DRS迁移效果一致。例如:大量数据传输时,由网络异常造成的频繁地传输中断,DRS能为用户自动重连,快速定位识别到具体的断点,使得数据能够准确地续传。为了避免人为导致的误操作,华为云DRS在选择目标端的时候,会建议目标数据库只能读、不可写,这样能有效避免人为因素导致的数据不一致性、数据错乱、数据丢失等问题。为了使用户放心切换业务至云数据库,用户希望校验数据是否丢失,直观的方式是做对比,华为云DRS可以做对象级别的对比,包括有多少个表、多少个索引等,所有的对象都一致性一目了然。同时DRS还有两种数据对比能力:行级别和内容对比,行对比将对行总数进行两边一致性的校对,可以帮助用户清楚的看到数据行数是否一致; 内容对比是完整地将表与表全部的值校对一遍。 华为DRS将会持续的优化算法提升对比的效率。正是华为云DRS这一系列的措施,确保了企业成功迁云。企业上云,或者说在选择云平台的时候,可以从云平台三方面考量入手:数据库的技术与安全性、云平台的中立性和稳定性以及云平台的企业级业务成熟度。● 数据库技术和安全方面:华为在数据库领域有多年技术的沉淀,并一脉传承到云平台,国际化和企业级的安全合规设计上已践行多年,在专业的数据安全领域,华为云提供的数据库安全云服务,为云上数据库保驾护航。● 云平台的中立性和稳定性:华为云恪守“黑土地”思维,服务企业的基因驱动着云平台的长期发展。● 云平台的企业级业务成熟度:华为具有丰富的企业级服务经验积累。当然,对于广大CTO/DA/DBA等用户来说,成功走向云端有很多路径,无论通过非核心的外围业务系统来做一些尝试,还是先从没有历史负担的新业务开始,在这个过程中,DRS都能帮助用户更安心,更放心走向云端。
-
云开年采购季火热进行中!免费抽奖,人人有礼,消费满额送mate20,爆款数据库低至5.8 折 火热抢购,了解详情,请点击下面链接。https://activity.huaweicloud.com/2019Feb-promotion/index.html?utm_source=wechat&utm_medium=officialaccount&utm_campaign=2019feb_promotion_0322&utm_content=sjk_xcp
-
想了解更多内容,请扫码关注【HW云数据库】
上滑加载中
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签