云服务器内容精选

  • 使用场景 文档数据库服务按照设置的自动备份策略,对数据库进行自动备份。建议您定期对数据库进行备份,当数据库故障或数据损坏时,可以通过备份恢复数据库,从而保证数据可靠性。 创建文档数据库实例时,默认开启自动备份策略。待实例创建成功后,您可以根据业务需要修改自动备份策略或关闭自动备份策略。 开启自动备份策略后,会立即自动触发一次全量备份。之后会按照自动备份策略中设置的备份时间段和备份周期进行全量备份。实例在执行备份时,会将数据从实例上拷贝并压缩后上传到OBS备份空间,按照自动备份策略中的保留天数进行存放,备份时长和实例的数据量有关,平均备份速率为60MB/s。自动备份策略开启后,副本集实例每五分钟会自动进行一次增量备份,以保证数据的可靠性。集群实例如果使用增量备份功能,则需要手动开启。
  • 删除时间漫游快照 在dds副本集的主节点,或者dds集群的mongos节点命令行中,切换至用户库。 use test //可以是任意用户库,不影响最终命令结果 执行如下命令,删除已有时间漫游快照。 db.runCommand({snapshot:1, op:"delete", name:"s1"}) //删除名为s1的时间漫游快照 db.runCommand({snapshot:1, op:"delete"}) //如果未指定name参数,默认删除名为stable的时间漫游快照 db.runCommand({snapshot:1, op:"delete", name:"*"}) //指定name参数为*,删除所有时间漫游快照
  • 创建时间漫游快照 在dds副本集的主节点,或者dds集群的mongos节点命令行中,切换至用户库。 use test //可以是任意用户库,不影响最终快照结果 执行如下命令,创建时间漫游快照。 db.runCommand({snapshot: 1, op: "create", name: "s1"}) //创建名为s1的时间漫游快照 db.runCommand({snapshot: 1, op: "create"}) //如果未指定name参数,那么默认使用stable作为快照名称
  • 使用须知 当前只有最新版本的4.2、4.4文档数据库实例支持该能力,如果您的实例版本较低,请参考文档《补丁升级》; 时间漫游快照为持久化快照,实例重启后依然保留; 对于同一实例您最多可以创建8个时间漫游快照,快照名称支持字符0~9、a~z、A~Z 和 _ ,例如:"Snapshot_2024_09_30_15_18"; 因为时间漫游快照是针对当前时刻所有用户库的数据快照,因此下发命令的数据库账户至少应该具备{role: "dbAdminAnyDatabase"}权限,创建数据库账户请参考文档《创建用户》; 时间漫游快照命令只能在主节点(集群中则为mongos节点)下发,同时会以oplog的形式同步到备节点,所以如果想要有效避免主备倒换可能发生的回滚,那么应该将writeConcern设置为majority来创建、删除时间漫游快照; 请确保在时间漫游快照生效期间,不要对相关集合进行元数据变更(包括删除、重命名集合,创建、删除索引等),对于元数据的操作会使得对应集合的快照失效,但其他集合的快照不受影响; 读取时间漫游快照过程中请勿删除对应快照; 创建时间漫游快照本身并不会占用额外的磁盘空间,但这个动作会使得快照相关的数据不参与存储引擎的compact,因此在创建时间漫游快照后如果有新的写入动作,请及时关注实例的磁盘占用情况。存储引擎相关说明请参考文档《DDS 4.2及其以上版本切RocksDB存储引擎相关问题Q&A》; 因为时间漫游快照的相关数据不参与存储引擎compact,因此如果创建较多时间漫游快照,那么会对实例的写入性能造成5~10%左右的影响; 在集群实例上使用时间漫游快照时,需关闭均衡器Balancer,管理均衡器请参考文档《如何管理均衡器Balancer》。
  • 查看时间漫游快照 在dds副本集的主节点,或者dds集群的mongos节点命令行中,切换至用户库。 use test //可以是任意用户库,不影响最终命令结果 执行如下命令,查看当前时间漫游快照。 db.runCommand({snapshot: 1, op: "list"}) // {snapshot: 1, op: "list"} // {snapshot: 1, op: "list"} 执行结果 { "snapshotList" : [ "s1", "stable" ], "ok" : 1, "operationTime" : Timestamp(1727683917, 1), "$clusterTime" : { "clusterTime" : Timestamp(1727683917, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } } }
  • 数据库连接 使用DDS时,可能会遇到因为Mongod/dds mongos的连接数满了,导致客户端无法连接的问题。在Mongod/dds mongos的服务端,收到一个新的连接由一个单独的线程来处理,每个线程配置了1MB的栈空间,当网络连接数太多时,过多的线程会导致上下文切换开销变大,同时内存开销也会上涨。 客户端连接数据库的时候,要计算业务一共有多少个客户端,每个客户端配置的连接池大小是多少,总的连接数不要超过当前实例能承受的最大连接数的80%。 客户端与数据库的连接应尽量保持相对稳定的状态,每秒新增连接数建议保持在10以下。 建议客户端的连接超时时间至少设置为最大业务执行时长的3倍。 对于副本集实例,客户端需要同时配置主备节点的IP地址;对于集群实例,至少配置两个dds mongos的IP地址。 DDS默认提供rwuser用户,使用rwuser用户登录时认证库必须是admin。
  • 性能相关 规范 业务程序禁止执行全表扫描的查询。 执行查询时,只选择需要返回的字段,不需要的字段不要返回。从而减少网络和进程处理的负载,修改数据时,只修改变化需要修改的字段,不要整个对象直接存储全部修改。 避免使用$not。DDS并不会对缺失的数据进行索引,因此$not的查询条件将会要求在一个结果集中扫描所有记录。如果$not是唯一的查询条件,会对集合执行全表扫描。 用$and时把匹配最少结果的条件放在最前面,用$or时把匹配最多结果的条件放在最前面。 单个实例中,数据库的总的个数不要超过200个,总的集合个数不要超过500个。集合数量过多会导致内存压力变高,并且集合数量多会导致重启以及主备倒换性能变差,影响紧急情况下的高可用性能。 业务上线前,一定要对数据库进行性能压测,评估业务峰值场景下,对数据库的负载情况。 禁止同时执行大量并发事务,且长时间不提交。 业务正式上线前, 所有的查询类别,都应该先执行查询计划检查查询性能。 建议 每个连接在后台都是由一个单独线程处理,每个线程会分配1MB的栈内存。所以连接数不宜过多,否则会占用过多的内存。 使用连接池,避免频繁的建立连接和断开连接,否则会导致CPU过高。 减少磁盘读写:避免使用不必要的upsert命令,避免查询不必要的数据。 优化数据分布:对数据进行分片,同时分散热点数据,均衡地使用实例资源。如何进行数据分片,请参见设置数据分片。 减少锁冲突:避免对同一个Key过于频繁地操作。 减少锁等待:避免前台创建索引。 注意 开发过程中对集合的每一个操作都要通过执行explain()检查其执行计划,如: db.T_DeviceData.find({"deviceId":"ae4b5769-896f"}).explain(); db.T_DeviceData.find({"deviceId":"77557c2-31b4"}).explain("executionStats"); 对于查询而言,因为覆盖查询不需要读取文档,而是直接从索引中返回结果,这样的查询性能好,所以尽可能使用索引覆盖查询。如果explain()的输出显示indexOnly字段为真,则说明这个查询就被一个索引覆盖。 执行计划解析: 看执行时间:executionStats.executionStages.executionTimeMillisEstimate和executionStats.executionStages.inputStage. executionTimeMillisEstimate时间越短越好。 executionStats.executionTimeMillis表示执行计划选择和执行的所有时间。 executionStats.executionStages.executionTimeMillisEstimate表示执行计划的执行完成时间。 executionStats.executionStages.inputStage. executionTimeMillisEstimate表示执行计划下的子阶段执行完成时间。 看扫描条数:三个条目数相同为最佳。 executionStats. nReturned表示匹配查询条件的文档数。 executionStats .totalKeysExamined表示索引扫描条目数。 executionStats .totalDocsExamined表示文档扫描条目数。 看Stage状态,性能较好的Stage状态组合如下。 Fetch+IDHACK Fetch+ixscan Limit+(Fetch+ixscan) PROJECTION+ixscan 表1 状态说明 状态名称 描述 COLLSCAN 全表扫描 SORT 内存中进行排序 IDHACK 根据_id进行查询 TEXT 全文索引 COUNTSCAN 未用索引计数 FETCH 索引扫描 LIMIT 使用Limit限制返回数 SUBPLA 未用索引的$or查询阶段 PROJECTION 限定返回字段时stage的返回 COUNT_SCAN 使用索引计数
  • 分片设计规范 对于使用DDS分片集群,建议尽可能的使用分片集合以充分利用性能,详情请参见设置数据分片以充分利用分片性能。 分片集合使用上建议如下: 对于大数据量(数据量过百万),并有较高读写请求的业务场景,数据量随着业务量增大而增大的,建议采用分片。 对于采用hash分片的集合,需要根据业务后面实际数据量大小,采用预分片,提前预置chunk数量,减少自动均衡和分裂对业务运行造成影响。 对于非空集合开启分片,应将均衡器的开启时间窗放在业务空闲时,避免分片间均衡数据与业务冲突影响性能。设置时间窗口的API接口详情请参见设置集群均衡活动时间窗。 需要基于分片键排序查询且增加数据时可以分布均匀建议使用范围分片,其他使用哈希分片。 合理设计shard key,防止出现大量的数据使用相同shard key,导致出现jumbo chunk。 使用分片集群,执行dropDatabase后,一定要执行flushRouterConfig命令,详情请参见如何规避dds mongos路由缓存缺陷。 业务的update请求需要注意与片键相适配。在使用分片表时,如果出现如下场景则update请求会报错,并返回“An upsert on a sharded collection must contain the shard key and have the simple collation”。 update请求的filter中未携带片键字段且选项multi:false set中未携带片键字段且选项upsert:true
  • 迁移方案概览 DDS提供了多种数据迁移方案,可满足不同业务场景下的MongoDB数据库迁移。 表1 迁移方案 迁移场景 支持的迁移类型 文档链接 使用导出导入工具迁移数据 全量迁移 通过mongoexport和mongoimport工具迁移数据 通过mongodump和mongorestore工具迁移数据 其他云数据库MongoDB迁移至华为云DDS 全量+增量迁移 其他云数据库 MongoDB迁移至华为云DDS 本地自建MongoDB数据库迁移至华为云DDS 全量+增量迁移 本地自建MongoDB数据库迁移至华为云DDS E CS 自建MongoDB数据库迁移至华为云DDS 全量+增量迁移 ECS自建MongoDB数据库迁移至华为云DDS 华为云DDS迁移至用户端MongoDB数据库 全量+增量迁移 华为云DDS迁移至用户端MongoDB数据库 父主题: 数据迁移
  • 备份原理 集群实例 集群实例由dds mongos(路由)、Config(配置)和Shard(分片)组件构成。其中,Config主要用于存储集群实例的配置信息,Shard节点主要用于存储集群实例的数据信息。所以集群实例在备份时,需要分别备份Config节点和Shard节点上的数据,且Config节点和Shard节点是分开进行备份的。如图1所示,集群实例的备份是由Config节点和Shard节点分别在各自的Hidden节点上进行,备份过程会占用Hidden节点一定的CPU内存资源。因此,在备份期间,实例的Hidden节点的CPU使用率、内存使用率、主备延时指标会有一点升高,属于正常现象。但最终的备份文件将以压缩包的形式存储在 对象存储服务 (OBS)中,不会占用实例的磁盘空间。 图1 集群备份原理图 副本集实例 如图2所示,副本集实例的备份在Hidden节点上进行。备份过程会占用Hidden节点一定的CPU内存资源。因此,在备份期间,实例的Hidden节点的CPU使用率、内存使用率、主备延时指标会有一点升高,属于正常现象。但最终的备份文件将以压缩包的形式存储在对象存储服务(OBS)中,不会占用实例的磁盘空间。 图2 副本集备份原理图 单节点实例 单节点的备份是在仅有的一个节点上进行的,最终的备份文件将以压缩包的形式存储在对象存储服务(OBS)中,不会占用实例的磁盘空间。 单节点的备份基于mongodump实现,备份过程中会额外占用节点的CPU、内存等资源,资源不足时会出现备份失败的情况。建议迁移到副本集实例进行备份。 图3 单节点备份原理图
  • 备份与恢复方案 表1提供了常见的数据备份和下载备份文件的方法。 支持版本号没有说明的,默认支持全部版本:3.2、3.4、4.0、4.2和4.4版本。 表1 备份方案 任务类型 备份或恢复类型 支持的实例类型和版本 使用场景 数据备份 自动备份 集群 副本集 单节点 您可以通过控制台对DDS进行自动备份。 增量备份 集群(4.0、4.2版本支持) 副本集(4.0、4.2版本支持) 您可以通过控制台对DDS进行增量备份。 跨区域备份 集群 副本集 单节点 您可以通过控制台对DDS进行跨区域备份。 手动备份 集群 副本集 单节点 您可以通过控制台对DDS进行手动备份。 通过mongodump工具备份 集群 副本集 单节点 您可以通过MongoDB客户端自带的备份恢复工具对自建MongoDB或云上MongoDB数据库进行手动备份。 通过mongoexport工具备份 集群 副本集 单节点 您可以通过MongoDB客户端自带的备份恢复工具对自建MongoDB或云上MongoDB数据库进行手动备份。 下载备份文件 使用OBS Browser+下载 集群 副本集 单节点 备份文件大于400MB时,适合使用OBS Browser+下载。 使用浏览器直接下载 副本集 单节点 适合通过浏览器直接下载备份文件。 按地址下载 集群 副本集 单节点 适用于通过浏览器新窗口、迅雷或者wget等方式下载备份文件。 DDS详细的恢复方案请参见恢复方案。
  • 使用须知 在进行正式维护前,DDS会给华为账号中设置的联系人发送短信和邮件,请注意查收。 在可维护时间段内,实例会发生1到2次连接闪断,请确保应用程序具备重连机制,闪断后,实例即可恢复到正常状态。 实例维护期间,除账号管理、数据库管理和添加安全组外,其他涉及变更类的操作(如升级、重启等)暂时无法使用。当实例处于该状态时,对数据库本身正常的数据访问以及查询类操作不会受到任何影响。 修改可维护时间段,不影响原有可维护时间段内定时任务的执行时间。 目前只有实例重启、规格变更和补丁升级支持可维护时间段。 您可以在任务中心取消待执行的定时任务。 可维护时间段不要和备份的时间冲突,否则可能会导致定时任务失败。 临近可维护时间段结束时下发的任务,有可能扫描不到,取消执行。
  • 使用须知 以下情况不可重置密码: 租户被冻结 创建中 重启中 节点扩容中 切换SSL中 修改端口号中 规格变更中 删除节点中 内核版本升级中 主备切换中 可用区迁移中 只读节点扩容中 开启操作保护的用户,在进行敏感操作时,通过进行二次认证再次确认您的身份,进一步提高账号安全性,有效保护您安全使用云产品。关于如何开启操作保护,具体请参考《 统一身份认证 服务用户指南》中敏感操作的内容。 修改密码可能会导致业务断连。
  • 前提条件 连接数据库的弹性云服务器必须和DDS实例之间网络互通,可以使用curl命令连接DDS实例服务端的IP和端口号,测试网络连通性。 curl ip:port 返回“It looks like you are trying to access MongoDB over HTTP on the native driver port.”,说明网络互通。 如果开启SSL,需要在界面上下载根证书,并上传到弹性云服务器。
  • 连接代码 SSL开启 import ssl from pymongo import MongoClient conn_urls="mongodb://rwuser:rwuserpassword@ip:port/{mydb}?authSource=admin" connection = MongoClient(conn_urls,connectTimeoutMS=5000,ssl=True, ssl_cert_reqs=ssl.CERT_REQUIRED,ssl_match_hostname=False,ssl_ca_certs=${path to certificate authority file}) dbs = connection.database_names() print "connect database success! database names is %s" % dbs SSL关闭 import ssl from pymongo import MongoClient conn_urls="mongodb://rwuser:rwuserpassword@ip:port/{mydb}?authSource=admin" connection = MongoClient(conn_urls,connectTimeoutMS=5000) dbs = connection.database_names() print "connect database success! database names is %s" % dbs