华为云用户手册

  • DRS增量同步怎样填启动位点 MySQL的单增量同步任务,在“设置同步”页面需要填写启动位点,任务源库日志从位点后开始获取(不含当前启动位点)。 图1 启动位点 当数据库的gtid_mode参数是on的情况下,位点信息由三部分构成:文件名(File)、位置(Position)和已执行的Global Transaction Identifiers Set(Executed_Gtid_Set),这些值可通过show master status命令获取(如果源库为MySQL 5.5版本,则不支持)。填写Executed_Gtid_Set的时候,需要删换其中的换行符再进行填入。 例如,社区版MySQL获取信息如下: 根据获取信息,任务的启动位点设置为如下,其中需要填入的Executed_Gtid_Set应为c8cd8ff7-da6f-11ec-a945-00d861ef1161:1-3,f4f9537f-0c8b-11ec-a284-00d861ef116a:1-10820402。 图2 设置启动位点 父主题: 实时同步
  • 录制回放 录制回放是指将源数据库发生的真实业务流量,在目标数据库模拟执行,从而观察和检验目标数据库的功能和性能表现。 录制回放主要分为录制、回放两个阶段,录制过程是从源数据库上将所需时间段内的全部SQL原语句(包括增、删、改、查)通过binlog下载、录制工具等进行采集,以文件形式缓存起来,并往目标数据库注入模拟数据,等待用户执行回放;用户可以在DRS任务上手工触发回放,观察目标数据库的性能表现。 常用场景: 数据库搬迁前,通过录制回放可以提前得知源业务在目标数据库的运行效果。 通过控制录制回放的线程及回放速度,来模拟源业务流量放大的效果,从而分析目标数据库对于未来业务激增时的稳定性表现。 图6 录制回放
  • 实时迁移 实时迁移是指在 数据复制服务 能够同时连通源数据库和目标数据库的情况下,只需要配置迁移的源、目标数据库实例及迁移对象即可完成整个数据迁移过程,再通过多项指标和数据的对比分析,帮助确定合适的业务割接时机,实现最小化业务中断的数据库迁移。 实时迁移支持多种网络迁移方式,如:公网网络、VPC网络、VPN网络和专线网络。通过多种网络链路,可快速实现跨云平台数据库迁移、云下数据库迁移上云或云上跨区域的数据库迁移等多种业务场景迁移。 特点:通过增量迁移技术,能够最大限度允许迁移过程中业务继续对外提供使用,有效的将业务系统中断时间和业务影响最小化,实现数据库平滑迁移上云,支持全部数据库对象的迁移。 图1 实时迁移
  • 实时同步 实时同步是指在不同的系统之间,将数据通过同步技术从一个数据源拷贝到其他数据库,并保持一致,实现关键业务的数据实时流动。 实时同步不同于迁移,迁移是以整体数据库搬迁为目的,而实时同步是维持不同业务之间的数据持续性流动。 常用场景:实时分析,报表系统,数仓环境。 特点:实时同步功能聚焦于表和数据,并满足多种灵活性的需求,例如多对一、一对多,动态增减同步表,不同表名之间同步数据等。 图3 多对一实时同步
  • 解决方案 方法一:使用主账号重新创建一次任务,主账号默认有Security Administrator权限,可在创建任务后将委托创建出来。 方法二:使用主账号在子账号所在的用户组添加Security Administrator权限后,重新创建任务。添加权限的具体操作请参见:创建用户并授权使用DRS。 方法三:手动添加“账户委托”,添加步骤如下: 使用主账号登录华为云,在右上角单击“控制台”。 在控制台页面,鼠标移动至右上方的账号名,在下拉列表中选择“ 统一身份认证 ”。 在统一身份认证页面,单击左侧导航窗格中“委托”,进入“委托”页面。 在“委托”页面,单击右上方的“+创建委托”进行委托创建。 填写委托名称为“DRS_AGENTCY” ,委托类型为 “普通账号”时, 委托的账号为 “op_svc_rds”;委托类型为“云服务”时,选择“关系型数据库MySQL”;持续时间为“永久”,完成后单击“下一步”。 图1 创建委托 在“选择策略”页面,选择DRS_AGENTCY的授权策略,委托权限需配置全局的 Tenant Administrator,完成后单击右下角的“下一步”。 图2 选择策略 在“设置最小授权范围”页面,先选择全局服务资源授权后,再基于指定区域设置最小授权范围,完成后单击右下角的“确定”。 图3 全局服务资源授权 图4 指定区域项目授权 授权完成后,单击委托名称,在“授权记录”中可看到全局服务和指定区域两条授权记录。 图5 授权记录 权限生效时间提醒,您选中的OBS权限由于系统设计的原因,授权后需等待15-30分钟才可生效,权限生效后重新创建即可。
  • 操作步骤 以下操作适用于目标数据库为RDS实例的情况。 登录关系型数据库服务控制台。 选择指定目标数据库实例。 单击实例名称。 页面跳转至“基本信息”页签,切换至“参数修改”页面。 在页面右上角搜索框,输入关键字“password”,查看搜索结果。 图1 修改密码 在5的搜索结果中,对于表1 密码参数列举的参数,需要根据密码复杂度要求进行修改,确保各参数在密码复杂度允许的范围内。 表1 密码参数 参数 允许值 说明 validate_password_length 0~2,147,483,647 validate_password插件校验的密码的最小字符数。 validate_password_mixed_case_count 0~2,147,483,647 指定当密码策略为MEDIUM(中)或更高时,为通过validate_password校验,密码至少需包含多少个大小写字符。 validate_password_number_count 0~2,147,483,647 指定当密码策略为MEDIUM(中)或更高时,为通过validate_password校验,密码至少需包含多少个数字。 validate_password_policy LOW, MEDIUM, STRONG validate_password插件执行的密码策略。 validate_password_special_char_count 0~2,147,483,647 指定当密码策略为MEDIUM(中)或更高时,为通过validate_password校验,密码至少需包含多少个非字母数字字符。 密码复杂度修改完成后,保存修改结果。 图2 保存修改结果 返回数据复制服务的“迁移模式”页面,继续执行下一步操作即可。
  • 关闭Balancer的步骤 通过Mongo Shell 登录数据库。 在mongos节点命令窗口中,使用如下命令,切换至config数据库。 use config 执行如下命令,判断是否可以关闭Balancer。 while( sh.isBalancerRunning() ) { print("waiting..."); sleep(1000); } 如果返回结果是waiting,则表示当前Balancer正在执行块(chunk)迁移,此时不能执行关闭Balancer的命令,否则可能引起数据不一致。 图1 查看输出结果 如果返回结果是空,则表示当前Balancer没有在进行块(chunk)迁移,此时可以执行下一步的关闭Balancer的命令。 关闭Balancer。 如果是整个实例的迁移,则执行如下命令,可以关闭整个实例的Balancer。 sh.stopBalancer() 如果要关闭待迁移且已经开启了分片的集合的Balancer,则执行如下命令: sh.disableBalancing("database.collection") 其中database.collection表示要关闭的集合的namespace。
  • MySQL账号迁移后权限显示多了反斜杠“\” 其他云MySQL使用DRS进行入云迁移后,迁移后的账号在RDS的控制台上显示带有反斜杠“\”。 迁移前在其他控制台查看,显示如下: 迁移后在RDS控制台查看,显示如下: 是因为MySQL GRANT语法支持通配符,详细可参考MySQL官网文档。DRS迁移逻辑是按照SQL查询结果进行权限迁移,实际目标端与源端账号权限是一致的,只是其他云控制台单独对“\_”做了处理,在界面上不显示转义字符“\”而已。 父主题: 实时迁移
  • 策略一 在测试连接页面的目标库信息中填写数据库用户名user1,所有Definer迁移到该用户下选“是”。 图1 策略一 这种策略下,源库所有存储过程和方法的Definer迁移到目标库后账号都会自动修改为user1,host改为% 。若在目标库上出现调用存储过程失败的情况,可执行如下操作: 使用uesr1账号登录到目标库RDS for MySQ L实例 。 如果需要使用其他账号调用存储过程,则该账号需要具有execute权限。 通过如下语句,使用user1授予其他账号执行存储过程的权限。 其中user表示需要调用存储过程的其他账号: GRANT EXECUTE ON db.* TO user; 如果需要通过Java调用存储过程,则需要通过如下语句,使用user1授予其他账号查询mysql.proc表的权限。 授权语句可参考如下语句,user表示需要调用存储过程的账号: GRANT SELECT ON mysql.proc TO 'user'@'%';
  • 策略二 在测试连接页面的目标库信息中填写数据库用户名user1,所有Definer迁移到该用户下选“否”。 图2 策略二 这种策略下,源库所有存储过程和方法的Definer迁移到目标库后账号和host保持不变,选择此选项,需要配合用户权限迁移功能,将源数据库的用户全部迁移,这样才能保持源数据库的权限体系完全不变。 如果您未选择用户权限迁移或者用户权限迁移时存在不支持迁移的账号,建议选择策略一来处理。
  • DRS支持跨账号云数据库迁移吗 图1 DRS产品架构 目前,DRS支持的网络类型有公网网络、VPC网络、VPN网络和专线网络,不同场景下,用户可根据情况进行选择。 原理上DRS采用JDBC连接,无需在用户的源数据库、目标数据库节点部署程序,只需用户的源数据库和目标数据库允许DRS实例节点通过所选择的网络访问和连接即可。 例如,用户需要将A账号的RDS-A实例迁移到B账号的RDS-B,可选择为RDS-A实例申请弹性公网IP并绑定,在B账号创建入云的DRS任务,选择通过公网网络进行迁移。 父主题: 网络及安全
  • MySQL 为了确保用户数据库成功迁移到本云关系型数据库MySQL实例,创建迁移任务时,数据复制服务自动为目标数据库实例创建drsFull和drsIncremental临时账户,任务结束后,数据复制服务会自动删除这两个账户。 禁止使用用户自建的drsFull和drsIncrementa账号作为DRS任务连接数据库的账号。 删除、重命名和修改这些账户的密码和权限,会导致任务出错。 表1 MySQL实例创建的数据库账户 账户 使用场景 Host 说明 drsFull 全量迁移 关系型数据库MySQL实例 用户启动全量迁移任务时,系统会在目标数据库中添加该账户,用于迁移数据。 drsIncremental 增量迁移 关系型数据库MySQL实例 用户启动增量迁移任务时,系统会在目标数据库中添加该账户,用于迁移数据。
  • 双主灾备子任务的正向和反向怎么理解 为了明确本云(本区)RDS在灾备中所扮演的角色,在创建双主灾备任务时,DRS使用主1、主2来区分角色。主1表示选择的本云RDS具有初始数据,主2则表示选择本云RDS为空库,等待接收数据。 如图1, 选择主2,表示创建任务时选择的本云数据库实例为空库,待接收数据,创建成功后,需先配置表示入云的正向任务,待正向任务进入“灾备中”状态时,再配置并启动反向任务。 选择主1,表示创建任务时选择的本云数据库实例具有初始数据,待同步数据,创建成功后,需先配置表示出云的反向任务,待反向任务进入“灾备中”状态时,配置并启动正向任务。 图1 双主灾备实例信息 父主题: 实时灾备
  • 如何确保业务数据库的全部业务已经停止 业务切换时可通过如下方法确保业务数据库的全部业务已经停止: 在源数据库端执行如下语句,查看当前是否还存在有业务连接 。 show processlist; 图1 查看是否存在业务连接 可选:如果源数据库有业务连接,则通过结果中Host列的值来查找对应的业务进程并将其停止。 在源库执行如下语句,查看binlog位置并记录该值(file列取值:position列取值 ),此处将该值记为ckpt1。 show master status; 图2 查看binlog位置 等待30s以上,在源库执行如下语句,查看binlog位置并记录该值(file列取值:position列取值 ),此处将该值记为ckpt2。ckpt1=ckpt2时,表示源数据库业务已基本停写。 show master status; 父主题: 实时迁移
  • 场景二:双主灾备,同时操作双边数据库,导致数据不一致 初始数据如下图所示(seqno为主键,column1为非主键)。 图3 初始数据 双方数据库同时分别执行如下操作: dr1库:insert into dr1 values(101,100); dr2库:insert into dr2 values(101,102); 执行操作后,双方数据库数据如下图所示。 图4 dr1库数据 图5 dr2库数据
  • 场景一:双主灾备,双边同时操作同一行操作,导致多数据 初始数据如下图所示(seqno为主键,column1为非主键)。 图1 dr1、dr2库初始数据 双方数据库同时分别执行如下操作: dr1库:update dr1 set seqno=5 where column1=8; dr2库:update dr2 set seqno=6 where column1=8; 执行操作后,双方数据库数据一致,并且多数据。 图2 dr1、dr2库数据
  • 如何选择区域? 选择区域时,您需要考虑以下几个因素: 地理位置 一般情况下,建议就近选择靠近您或者您的目标用户的区域,这样可以减少网络时延,提高访问速度。不过,在基础设施、BGP网络品质、资源的操作与配置等方面,中国大陆各个区域间区别不大,如果您或者您的目标用户在中国大陆,可以不用考虑不同区域造成的网络时延问题。 在除中国大陆以外的亚太地区有业务的用户,可以选择“亚太-曼谷”或“亚太-新加坡”区域。 在非洲地区有业务的用户,可以选择“南非-约翰内斯堡”区域。 在欧洲地区有业务的用户,可以选择“欧洲-巴黎”区域。 在拉丁美洲地区有业务的用户,可以选择“拉美-圣地亚哥”区域。 “拉美-圣地亚哥”区域位于智利。 资源的价格 不同区域的资源价格可能有差异,请参见华为云服务价格详情。
  • 什么是区域、可用区? 我们用区域和可用区来描述数据中心的位置,您可以在特定的区域、可用区创建资源。 区域(Region):从地理位置和网络时延维度划分,同一个Region内共享弹性计算、块存储、对象存储、VPC网络、弹性公网IP、镜像等公共服务。Region分为通用Region和专属Region,通用Region指面向公共租户提供通用云服务的Region;专属Region指只承载同一类业务或只面向特定租户提供业务服务的专用Region。 可用区(AZ,Availability Zone):一个AZ是一个或多个物理数据中心的集合,有独立的风火水电,AZ内逻辑上再将计算、网络、存储等资源划分成多个集群。一个Region中的多个AZ间通过高速光纤相连,以满足用户跨AZ构建高可用性系统的需求。 图1阐明了区域和可用区之间的关系。 图1 区域和可用区 目前,华为云已在全球多个地域开放云服务,您可以根据需求选择适合自己的区域和可用区。更多信息请参见华为云全球站点。
  • 内容对比不支持哪些数据类型 DRS提供的数据比对功能可以清晰反馈出源数据库和目标数据库的数据是否存在差异。 目前对于以下数据类型,DRS不支持内容对比,进行内容对比时会自动跳过。 表1 不支持内容对比的数据类型 源数据库类型 数据类型 MySQL TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT GaussDB TEXT、CLOB、BLOB、BYTEA、INTERVAL DAY TO SECOND、INTERVAL Oracle BLOB、NCLOB、CLOB、LONG RAW、LONG、INTERVAL DAY TO SECOND、INTERVAL YEAR TO MONTH、UROWID、BFILE、XMLTYPE、SDO_GEOMETRY MongoDB _id为BINDATA类型。 Microsoft SQL Server TEXT、NTEXT、IMAGE、BINARY、VARBINARY、HIERARCHYID、XML、TIMESTAMP 对于以下数据类型作为主键,DRS也不支持内容对比,进行内容对比时会归到无法比对的表中。 表2 不支持内容对比的主键类型 源数据库类型 数据类型 MySQL TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、FLOAT、TIMESTAMP、DATE、DATETIME、BINARY、VARBINARY GaussDB TEXT、CLOB、BLOB、BYTEA、INTERVAL DAY TO SECOND、INTERVAL、REAL、DOUBLE PRECISION、BOOL、TIME、TIMETZ、TIMESTAMP、TIMESTAMPTZ、DATE Oracle BLOB、NCLOB、CLOB、LONG RAW、LONG、INTERVAL DAY TO SECOND、INTERVAL YEAR TO MONTH、UROWID、BFILE、XMLTYPE、SDO_GEOMETRY、BINARY_FLOAT、BINARY_DOUBLE、FLOAT、RAW、TIMESTAMP、TIMESTAMP WITH TIME ZONE、TIMESTAMP WITH LOCAL TIME ZONE、DATE PostgreSQL REAL、DOUBLE PRECISION、MONEY、TEXT、BYTEA、TIMESTAMP WITHOUT TIME ZONE、TIMESTAMP WITH TIME ZONE、DATE、TIME WITHOUT TIME ZONE、TIME WITH TIME ZONE、INTERVAL、BOOLEAN、ENUMERATED TYPES、POINT、LINE、LSEG、BOX、PATH、POLYGON、CIRCLE、CIDR、INET、MACADDR、MACADDR8、BIT、BIT VARYING、TSVECTOR、TSQUERY、XML、JSON、ARRAY、COMPOSITE TYPES、INT4RANGE、INT8RANGE、NUMRANGE、TSRANGE、TSTZRANGE、DATERANGE Microsoft SQL Server FLOAT、REAL、DATE、DATETIME、DATETIME2、DATETIMEOFFSET、TIME、TIMESTAMP、TEXT、NTEXT、IMAGE、BINARY、VARBINARY、HIERARCHYID、XML、BIT 父主题: 数据对比
  • 双主灾备 双主灾备多用于灾备双方互为主备,共同承担业务流量的场景。其角色分为主1、主2,使用之前需要首先确立本云(本区)RDS的角色,才可以更好的完成实时灾备的搭建。完整的双主灾备是由正、反两条链路构成的,其创建顺序有着严格的要求。开始时,主1为可读写状态、主2为只读状态,正向灾备将初始化数据全量同步到主2后,方可启动反向灾备。此时,主1、主2均为可读写状态,正/反向灾备分别向主2、主1持续同步增量数据。 图2 双主灾备 特点及使用约束 重要! 双主灾备是对环境要求比较高的架构,实施部署双主灾备前请务必阅读约束和设计思考。 双主灾备的搭建过程对步骤是有严格要求的,请按照以下步骤进行部署,以确保双主任务顺利部署。 创建正向灾备任务,具体操作步骤请参见创建灾备任务。创建完成后,会生成两个子任务,即正向灾备和反向灾备任务,此时反向灾备任务为配置状态。 当正向灾备任务进入“灾备中”状态时(反向任务操作列出现编辑),配置并启动反向任务。 在“实时灾备管理”页面,选择该灾备任务的反向任务,单击操作列的编辑,进入“创建灾备任务”页面,继续完成创建反向任务。 建议您在主2进行验证,满足预期后,启动反向任务。 图3 双向灾备任务
  • DRS对比任务对数据库有什么影响 对象对比:会查询源库及目标库的系统表,占用10个左右的session的连接数,正常情况不会对数据库产生影响。但是如果对象数量巨大(比如几十万张表),可能会对数据库产生一定的查询压力。 行数对比:会查询源库及目标库的表行数,占用10个左右的session的连接数,正常的select count语句基本不会对数据库产生影响。但是如果表数据量巨大(亿级)会对数据库产生一定的查询压力,返回查询结果会比较慢。 内容对比:会查询源库及目标库的全部数据,涉及每个字段都会对比,所以会对数据库产生一定的查询压力,主要体现在IO上,查询速度受限于源库和目标库的IO和网络带宽。占用1-2个CPU,占用10个左右的session的连接数。 用户对比:会查询源库及目标库的账户和权限,基本不会对数据库产生影响。 父主题: 数据对比
  • 双主灾备的主1、主2如何选择 双主灾备要求灾备双方至少有一方为本云RDS实例,另一方可以为本云RDS实例、其他云数据库、E CS 自建库或本地自建数据库。为了明确本云(本区)RDS在灾备中所扮演的角色,DRS使用主1、主2来区分角色。选择了本云RDS角色后,也意味着确定了另一方的角色。 主1:一般具有业务数据,创建任务时选择主1则表示本云RDS具有初始数据。 主2:必须为空数据库,创建任务时选择主2则表示本云RDS为空库,等待接收数据。 创建灾备任务时,选择主1、主2应遵循以下原则 灾备双方均为本云RDS实例。 有一方为空实例,空实例作为主2,非空实例作为主1。 双方均为空实例,主1、主2角色无差别,推荐选主2。 灾备双方一方为本云RDS实例,另一方为其他云数据库、ECS自建库或本地自建数据库。 一方数据库存在初始数据,另一方为空库。 本云RDS实例为空库,则选择主2。 本云RDS实例有初始数据,另一方为空库,则选择主1。 双方均为空库,主1、主2角色无差别,推荐选主2。 父主题: 实时灾备
  • 暂停任务计费说明 数据复制服务支持“按需计费”和“包年/包月”两种计费模式,两种方式均针对DRS实例从以下方面收取费用: 表1 计费项 计费项 计费项说明 计费规则 配置费(必选) 指计算和存储资源及数据处理的费用。 “按需计费”配置费用是按照实际使用时长计费,以自然小时为单位整点计费,不足一小时按照实际使用时长计费。 “包年/包月”配置费用是一次性计费。 弹性公网IP费用(可选) 指公网访问产生的数据处理和数据流量费用。如果创建公网网络任务,您需要购买弹性公网IP。 详细说明请参考弹性公网IP计费说明。 所以已暂停的“按需计费”任务仍然会收取配置费用。 父主题: 计费相关
  • 可能原因 原因1:DRS在全量迁移阶段,为了保证迁移性能和传输的稳定性,采用了行级并行的迁移方式。当源数据库数据紧凑的情况下,通过DRS迁移到上云后,可能会出现数据膨胀现象,导致目标数据库磁盘空间使用量大于源数据库磁盘空间使用量。 并行时顺序插入原理可参考图1。 图1 顺序插入 当并行后有非顺序插入数据时,如图2,当最后数据4插入时,会导致数据3、5叶子节点分裂,分裂后的叶子节点存在磁盘空余空间。 图2 并行非顺序插入 原因2:目标库开启Binlog日志时,全量阶段数据的写入会在目标端产生Binlog日志文件,占用部分磁盘空间,导致目标数据库磁盘空间使用量大于源数据库磁盘空间使用量。
  • 目标数据库所在安全组 目标数据库所在VPC安全组入方向规则需要放DRS实例IP和目标数据库自身的端口,允许DRS实例通过端口访问。 在RDS的“实例管理”页面,单击目标实例名称。 进入“基本信息”页签,在“连接信息”模块下,单击安全组。 进入安全组基本信息页,选择“入方向规则”页签。 单击“添加规则”进行配置。 目标数据库所在VPC安全组入方向规则需要放DRS实例IP和目标数据库自身的端口(IP地址和端口只要包含DRS的IP和自身的端口即可)。
  • 源数据库所在安全组 源数据库所在VPC安全组入方向规则需要放DRS实例IP和源数据库自身的端口,允许DRS实例通过端口访问。 在RDS的“实例管理”页面,单击目标实例名称。 进入“基本信息”页签,在“连接信息”模块下,单击安全组。 进入安全组基本信息页,选择“入方向规则”页签。 单击“添加规则”进行配置。 源数据库所在VPC安全组入方向规则需要放DRS实例IP和源库自身的端口(IP地址和端口只要包含DRS的IP和自身的端口即可)。
  • DRS实例所在安全组设置 DRS实例所在VPC安全组出方向规则需要放通源数据库和目标数据库的IP、端口,允许DRS实例访问安全组外的数据库。 在任务列表中,单击DRS任务名称。 进入“基本信息”页签,在“实例信息”模块下,单击内网安全组。 进入安全组基本信息页,选择“出方向规则”页签。 单击“添加规则”进行配置。 DRS实例所在VPC安全组出方向规则需要放通源数据库和目标数据库的IP、端口(IP地址和端口只要包含目标数据库和源数据库的IP和端口即可)。
  • DDM灾备任务源库填写说明 DRS支持DDM灾备任务的源端通过输入IP方式进行连接,如图1。DDM灾备的原理是源端和目标端DDM中的DN一一对应灾备,因此需要正确填写源端和目标端的DN的对应关系。关于DDM逻辑库和逻辑库下的DN实例说明可参考DDM产品文档。 在创建DDM灾备任务前,建议在DDM实例目标端的控制台上,导入源端DDM的逻辑库信息,详细操作可参“导入逻辑库”。 DRS页面上“数据库实例”中按照DN对应关系填写DDM的DN信息,也就是挂载在DDM中的RDS for MySQL信息。例如源端DDM1有一个DN节点,挂载的RDS for MySQL实例1,IP为192.168.1.10;目标端DDM2中有一个DN节点,挂载RDS for MySQL实例2 , IP为192.168.6.150,则填写方式如图1,建立DN数据灾备的对应关系。 如果DDM下有多个DN,需要用户确保每个目标端的DN都和源端DN正确对应。 图1 源库信息 父主题: 实时灾备
  • java mongo客户端 前提条件 连接数据库的弹性云服务器必须和DDS实例之间网络互通,可以使用curl命令连接DDS实例服务端的IP和端口号,测试网络连通性。 curl ip:port 返回“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,说明网络互通。 参考MongoDB兼容性列表,下载兼容数据库实例版本的mongo jar包。 在弹性云服务器上安装jdk。 如果开启SSL,需要在界面上下载根证书,并上传到弹性云服务器。 连接代码 用keytool工具手动生成trustStore: // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); keytool -import -file /var/chroot/mongodb/CA/ca.crt -keystore /home/Mike/jdk1.8.0_112/jre/lib/security/mongostore -storetype pkcs12 -storepass ${password} “/var/chroot/mongodb/CA/ca.crt”为根证书路径。 “/home/Mike/jdk1.8.0_112/jre/lib/security/mongostore”为生成的trustStore的路径。 SSL开启 import java.util.ArrayList; import java.util.List; import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoCollection; import com.mongodb.MongoClientURI; import com.mongodb.MongoClientOptions; public class MongoDBJDBC { public static void main(String[] args){ try { System.setProperty("javax.net.ssl.trustStore", "/home/Mike/jdk1.8.0_112/jre/lib/security/mongostore"); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); System.setProperty("javax.net.ssl.trustStorePassword", password); ServerAddress serverAddress = new ServerAddress("ip", port); List addrs = new ArrayList(); addrs.add(serverAddress); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String rwuserPassword = System.getenv("EXAMPLE_PASSWORD_ENV"); MongoCredential credential = MongoCredential.createScramSha1Credential("rwuser", "admin", rwuserPassword.toCharArray()); List credentials = new ArrayList(); credentials.add(credential); MongoClientOptions opts= MongoClientOptions.builder() .sslEnabled(true) .sslInvalidHostNameAllowed(true) .build(); MongoClient mongoClient = new MongoClient(addrs,credentials,opts); MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb"); MongoCollection collection = mongoDatabase.getCollection("testCollection"); Document document = new Document("title", "MongoDB"). append("description", "database"). append("likes", 100). append("by", "Fly"); List documents = new ArrayList(); documents.add(document); collection.insertMany(documents); System.out.println("Connect to database successfully"); } catch (Exception e) { System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } } 样例代码: javac -cp .:mongo-java-driver-3.2.0.jar MongoDBJDBC.java java -cp .:mongo-java-driver-3.2.0.jar MongoDBJDBC SSL关闭 import java.util.ArrayList; import java.util.List; import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoCollection; import com.mongodb.MongoClientURI; import com.mongodb.MongoClientOptions; public class MongoDBJDBC { public static void main(String[] args){ try { ServerAddress serverAddress = new ServerAddress("ip", port); List addrs = new ArrayList(); addrs.add(serverAddress); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String rwuserPassword = System.getenv("EXAMPLE_PASSWORD_ENV"); MongoCredential credential = MongoCredential.createScramSha1Credential("rwuser", "admin", rwuserPassword.toCharArray()); List credentials = new ArrayList(); credentials.add(credential); MongoClient mongoClient = new MongoClient(addrs,credentials); MongoDatabase mongoDatabase = mongoClient.getDatabase("testdb"); MongoCollection collection = mongoDatabase.getCollection("testCollection"); Document document = new Document("title", "MongoDB"). append("description", "database"). append("likes", 100). append("by", "Fly"); List documents = new ArrayList(); documents.add(document); collection.insertMany(documents); System.out.println("Connect to database successfully"); } catch (Exception e) { System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }
  • 规避建议 MongoDB官方建议:在每次删除数据库或集合后,在所有mongos节点上,通过命令db.adminCommand("flushRouterConfig"),刷新路由。 参考链接: https://docs.mongodb.com/manual/reference/method/db.dropDatabase/index.html#replica-set-and-sharded-clusters https://jira.mongodb.org/browse/SERVER-17397 其他规避建议: 对于集群模式,建议开启数据库的分片功能,再对其中的集合进行分片。 对于未开启分片功能的数据库。在删除数据库或集合之后,不建议创建同名的数据库或集合。 如果因业务需求,需要创建同名的数据库或集合,请在删除数据库或集合之后,创建同名的数据库或集合之前,登录到所有的mongos节点上,执行刷新路由表的操作。
共100000条