云服务器内容精选

  • DDS的备份是如何收费的 文档数据库服务所有的全量备份和增量备份都存储在 对象存储服务 上,不占用用户购买实例的存储空间,DDS提供了和实例磁盘大小相同的部分免费存储空间,用于存放您的备份数据。 自动备份的生命周期和实例的生命周期相同。如果实例删除,那么自动备份也会同时被删除,如果您有手动备份,手动备份不会自动删除,具体请参见删除手动备份。 举个例子,假如用户购买实例时,存储空间选择了200GB,那么所有的备份空间合计,只有超过200GB才开始计费,前200GB是免费的。对于超过免费容量的存储空间,目前仅支持按需计费,用多少收取多少费用,具体收费请参见计费说明。 免费的存储空间是在收取了数据盘的存储空间费用后赠送的,数据盘存储空间冻结以后不再收费,因此不再享受备份赠送空间。 用户实例冻结后,将没有免费的存储空间,会导致实例原有备份收费。 如果选择解冻实例,将恢复免费的存储空间。 如果直接删除冻结的实例,原有的自动备份将会同时被删除,原有的手动备份需要手动删除,删除后备份空间不会继续收费。 父主题: 备份与恢复
  • DDS是否支持添加节点 DDS的集群和副本集实例均支持添加节点,单节点由于架构比较特殊,不支持添加节点。 集群实例 集群实例由dds mongos(路由)、Config(配置)和Shard(分片)节点组成。其中,Shard节点和dds mongos节点支持添加节点,Config节点不支持添加节点。 具体操作请参见添加集群实例的节点。 副本集实例 副本集实例由主节点、备节点和隐藏节点组成。系统默认提供的是三节点的实例,您可以根据需要新增节点至五节点或七节点副本集,新增的节点均为Secondary节点。 具体操作请参见添加副本集实例的节点。 父主题: 扩容及规格变更
  • 关闭Balancer 通过Mongo Shell连接集群实例。 在dds mongos节点命令行中,切换至config数据库。 use config 执行如下命令,查看Balancer运行状态。 while( sh.isBalancerRunning() ) { print("waiting..."); sleep(500); } 如返回值为空,则表示Balancer没有处于执行任务的状态,此时可执行下一步的操作,关闭Balancer 。 如返回值为waiting,则表示Balancer正在执行块迁移,此时不能执行关闭Balancer的命令,否则可能引起数据不一致。 如执行步骤 3的命令后返回的值为空,可执行关闭Balancer命令。 sh.stopBalancer()
  • 创建DDS实例时,如何选择规格和节点 实例规格越高,性能越好。DDS支持的实例规格请参见数据库实例规格。 相同实例规格下,节点数越多,性能越好。性能相关信息请参见性能白皮书。 建议根据业务实际的测试数据选择规格,并考虑可靠性冗余,和未来业务增长,适当预留一些资源。 对于集群实例,根据经验,单核CPU支持16GB数据时性能较好。 对于副本集实例,使用快速购买方式,里面会向您推荐多数用户选择的配置。详情请参见快速购买副本集实例。 父主题: 创建与删除
  • 解决方案 DDS支持实例级别和节点级别的指标监控,需要根据监控指标支持的维度在告警规则页面设置对应的维度。不同的指标他的维度是不同,详情请参见文档数据库支持的监控指标。 例如:CPU使用率支持的监控对象类型为:文档数据库集群实例下的dds mongos节点、文档数据库实例下的主节点和文档数据库实例下的备节点。 那么在 云监控服务 界面配置告警规则时,维度需要选择“文档数据库实例-文档数据库节点”,就可以在“告警策略”中查看到CPU使用率了。 图1 配置监控维度
  • 什么是DDS实例的只读状态? 为保护DDS实例的正常运行,在存储空间即将被写满的时候,数据库会被设置成磁盘满只读状态,该状态下只支持数据的读取,不支持写入和更新,可以通过扩容存储空间来解除该状态,重新获得写入和更新的能力。 具体规则如下: 用户购买的存储空间超过600GB,当剩余的可用存储空间为18GB时,实例状态将被设置为只读。 用户购买的存储空间小于等于600GB,当实际使用量到总存储空间的97%时,实例状态将被设置为只读。 用户购买的存储空间超过600GB,当剩余的可用存储空间大于90GB时,只读状态会自动解除。 用户购买的存储空间小于等于600GB,当实际使用量小于总存储空间的85%时,只读状态会自动解除。 此时建议您清理多余的资源或进行存储空间扩容。 父主题: 数据库存储
  • 会话的生命周期 会话的创建 会话的显式创建 会话在客户端请求时由服务端创建。会话通常由驱动程序通过API创建。例如,使用mongo shell创建session: // Start a session. session = db.getMongo().startSession( { readPreference: { mode: "primary" } } ); 创建的会话将在服务端维护一个独特的会话ID,用于识别和管理会话。 session { "id" : UUID("1c6480a3-8e8d-4726-9f1b-6bf2f6b2b606") } 会话的隐式创建 隐式会话是指在执行某些操作时,驱动程序自动创建会话而无需显式地调用startSession方法。隐式会话主要用于简化开发者的代码,使操作更加便捷。当客户执行数据库操作而没有显式地提供会话参数时,驱动程序会自动创建一个会话。例如,在插入文档或查询数据时,驱动程序会在后台创建一个隐式会话,并在操作完成后自动结束会话。 服务端可以缓存的最大会话数默认为1000000,当会话数大于该值时,将无法显式或者隐式创建会话。 会话达到上限时的行为 拒绝新的会话:如果会话资源达到上限,DDS将无法创建新的会话。这意味着新的操作请求将会被拒绝或阻塞,直到现有的会话释放资源。 资源争用:大量的会话可能会导致资源争用,例如内存和CPU利用率增加。这可能会影响数据库的性能和响应时间。 事务失败:如果在会话达到上限时尝试启动新事务,可能会导致事务失败。客户端会收到错误消息,指示会话资源已耗尽。 会话的使用 会话在使用过程中可以进行多种数据库操作,包括读写操作和事务操作。所有在会话上下文中的操作都会绑定到该会话。例如: coll1 = session.getDatabase("mydb1").foo; coll2 = session.getDatabase("mydb2").bar; coll1.insertOne( { abc: 1 } ); coll2.insertOne( { xyz: 999 } )。 会话的终止 会话可以显式终止,也可以在超时后自动终止。显式终止通过调用endSession方法: session.endSession(); 服务器会自动清理终止会话所占用的资源。 会话的管理 事务管理 会话是事务管理的核心。在事务开始时,服务器会在会话上下文中记录事务操作,确保这些操作要么全部提交,要么全部回滚。例如: db.getSiblingDB("mydb1").foo.insertOne( {abc: 0}, { writeConcern: { w: "majority", wtimeout: 2000 } } ) db.getSiblingDB("mydb2").bar.insertOne( {xyz: 0}, { writeConcern: { w: "majority", wtimeout: 2000 } } ) // Start a session. session = db.getMongo().startSession( { readPreference: { mode: "primary" } } ); coll1 = session.getDatabase("mydb1").foo; coll2 = session.getDatabase("mydb2").bar; // Start a transaction session.startTransaction( { readConcern: { level: "local" }, writeConcern: { w: "majority" } } ); // Operations inside the transaction try { coll1.insertOne( { abc: 1 } ); coll2.insertOne( { xyz: 999 } ); } catch (error) { // Abort transaction on error session.abortTransaction(); throw error; } // Commit the transaction using write concern set at transaction start session.commitTransaction(); session.endSession(); 会话超时 会话有默认的超时时间,默认超时时间为30分钟。服务器会在超时后自动终止未活动的会话,以释放资源。
  • 逻辑会话的实现细节 会话ID 每个会话都有一个唯一的会话ID,该ID在会话的整个生命周期中保持不变。会话ID用于跟踪和管理会话内的操作。 会话资源管理 服务端根据会话的活动情况动态分配资源。未使用的会话元数据会被自动清理,会话元数据清理的writeConcern是majority,这意味着如果majority个数的备机都有时延,则无法清理会话残留的元数据,即使会话结束,服务端的会话元数据也会累积,并且占用会话数量。对于长时间运行的会话,服务端会定期检查其状态,确保不会占用过多资源。
  • 使用MapReduce命令失败时常见报错处理 报错信息:cannot run map reduce without the js engine或map is not defined 图1 案例一 图2 案例二 可能原因:MapReduce命令被限制不能使用。 处理方法:将实例参数模板中参数“security.javascriptEnabled”的值修改为“true”,并重启实例生效,即可使用该命令。 如果实例参数模板为默认参数模板,由于默认参数模板中不允许修改参数值,您可以创建一个参数模板,并修改对应参数值,修改后将新参数模板关联到该实例,具体请参见应用参数模板。
  • 如何启用MapReduce命令 MapReduce命令由DDS参数模板参数“security.javascriptEnabled”控制,默认值为“false”,表示mapreduce和group命令将无法使用。如果需要使用MapReduce命令,将参数值修改为“true”,修改后需要重启实例才生效。 对于集群实例,需要变更全部shard节点关联参数模板中对应参数值,再重启实例生效。 对于副本集或单节点实例,直接变更实例关联参数模板中对应参数值,再重启实例生效。 如何变更参数值请参见编辑参数模板。
  • RocksDB和WiredTiger两者有什么区别? 写机制的区别 WiredTiger存储引擎的数据结构为B+ tree,落盘数据中一个键(key)对应一个版本号(version),对某一个键(key)进行插入、更新或删除操作都是直接操作对应的数据节点。 Rocksdb存储引擎的数据结构为LSM-tree,写数据就像写日志,以追加写的方式进行。落盘数据除了一个键(key),值(value)之外,还有对应的版本号(version)。同一个键(key)在磁盘上有多个版本(version)的数据。业务层的插入、更新、删除操作,在Rocksdb侧都是写操作。这些多版本数据积压到一定阈值后,会触发后台自动归并,对多版本(version)的数据进行合并,这个行为就是RocksDB的Compaction。 数据组织的区别 WiredTiger存储引擎中一个集合(collection)的数据或者一个索引的数据对应一个磁盘文件,集合是多大,对应的文件就是多大。 RocksDB存储引擎下则没有集合(collection)维度,而是64M一个文件分布在磁盘上。
  • 华为云DDS 4.2及其以上版本将存储引擎切换为RocksDB会对业务产生影响吗? 功能方面:存储引擎是数据库的一个组件,负责管理数据在内存和磁盘中的存储方式。RocksDB和WiredTiger虽然是不同的存储引擎,数据库服务会封装存储引擎,极大兼容社区接口使用方式,开发者使用层面无使用差异感知,业务无差异影响。 性能方面:当前RocksDB存储引擎已经经过长期的社区演进,结合DDS团队对其定制化的开发,性能方面二者切换无明显差异,部分查询场景下RocksDB存储引擎表现更优,存储或计算资源使用方面或存在少量差异。
  • 使用RocksDB存储引擎在典型业务场景下有哪些表现差异与优化建议? 表2描述了RocksDB相较于WiredTiger在一些典型业务场景下的表现差异与优化建议。 表2 典型业务场景下RocksDB的表现差异与优化建议 业务场景 RocksDB的表现差异 优化建议 示例 多文档扫描 RocksDB在文档扫描(docsExamined)多的业务场景下对CPU、IO等资源消耗相较于WiredTiger更多。 建议通过添加适当的索引进行优化,提高扫描效率,降低CPU、IO等资源的消耗。 例如,在coll表A字段没有添加索引的情况下以该字段为条件进行查询:db.coll.find({A: 1})。
  • RocksDB优势在哪里? 表1从开源生态、存储空间、可定制化、内存高压场景、频繁更新删除场景、多表场景六个方面描述了RocksDB对比WiredTiger的优势。 表1 RocksDB与WiredTiger对比 存储引擎 RocksDB WiredTiger 开源生态 RocksDB相比WiredTiger有更好的开源生态(github stars),一些知名数据库比如TIDB/CRDB/YUGADB都采用了RocksDB为存储引擎。 开源社区生态不如RocksDB。 存储空间 RocksDB数据写入过程中,部分业务场景会临时保存多个版本的数据,多版本数据会在后续做异步归并为最终版本,因此存储空间可能会存在临时上涨。 WiredTiger落盘只保留最新版本的数据,存储空间消耗相对少。 可定制化 RocksDB性能调优参数较多,支持根据业务的读写能力要求做定制化的参数修改。 WiredTiger性能调优参数较少。 内存高压场景 RocksDB读写性能稳定,不会随着内存压力变化。 WiredTiger需要频繁地刷脏页,进行内存与磁盘数据置换,引起读写性能波动比较大。 频繁更新删除场景 RocksDB在积攒了一定量的新写数据后,会自动异步触发后台compact线程对同一数据的多版本进行归并聚合,释放多余的磁盘空间,因此基本上不会出现磁盘碎片化问题。 WiredTiger在删除数据进行数据多版本归并聚合后,会空余出磁盘空间碎片,并且不会将这部分磁盘空间返回给操作系统,而是留待后续写入使用,磁盘碎片化问题较为明显。 多表场景 RocksDB支持10K以上的表及索引数量。 WiredTiger在表及索引数量达到1K以上时,读写性能会受到影响。
  • 使用RocksDB存储引擎的华为云DDS在执行大量增删改操作时,发现监控中出现磁盘来回波动、CPU毛刺的现象,这是为什么? RocksDB存储引擎下,所有的写入均为追加写,不管是更新还是删除,都不会直接修改原数据,而是追加写在尾端,因此同key可能会在磁盘上存在不同版本的值。追加写过程中,同一条数据的多版本同时存在,磁盘容量会上升。 不同版本的值最终会在新写入的数据量到达一定量后触发后台归并,即RocksDB的Compaction动作。归并数据动作是异步操作,当一轮运行结束后会将本轮涉及到的多版本数据进行归并合一,归并后会生成新的单版本数据数据文件,删除旧的多版本数据文件,在生成新文件和删除老文件这段过渡期,新老文件会同时存在,即磁盘此时会短暂上涨,归并数据结束后,磁盘容量会即时下降。 归并数据操作本身会占用少量CPU资源,因此可能会出现轻微的CPU毛刺现象。 如果发现磁盘和CPU占用持续过高,请联系华为工程师处理。