mongodb --平衡器

本文介绍MongoDB中的分片及平衡器的工作原理,包括数据迁移过程、特大块处理、平衡器的启动与禁用等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mongodb 平衡器

        

1.      概念

         均衡器会周期的检查分片是否存在不平衡,每隔几秒,mongos就会尝试成为平衡器,s会对整个集群加锁,以防止配置服务器对集群进行修改。均衡并不会影响Mongos的正常路由,使用Mongos的客户端不会受到影响.

当Mongos成为均衡器之后,判断各个分片中使用块的数量,不关心数据量的大小。只有在分片数量不对称的时候,才会启动。移动过程发生在块数最大与最小的分片之间。

在数据的迁移过程中,所有的读写请求会被路由到旧的块中。一旦元数据更新之后,指向旧块的读操作将会失败,这个时候Mongos会将这些请求到新块中,即再次执行请求,这部分工作对于用户来说是透明的。

2.      数据迁移过程:

1.      平衡器进程发送movechunk命令到源分片中

2.      原分片开始启动moveChunk命令,在移动的过程中,所有的操作都还是会指向原来的分片。

3.      目标分片开始创建所需要的索引

4.      目标分片开始向原分片请求数据,并复制数据

5.      当数据全部写入到目标分片中,目标分片连接并更新config数据库中的对应块的元数据信息

6.      最后,原分片将这部分块删除。

 在3.4版本中,mongodb可以并行的移动块,如果有N个块的分片,可以同时进行n/2的块迁移任务。

为了将平衡器产生的影响降低到最小,根据块数的不同,阈值也会不同。当分片中的集合数目小于2或者移动出现失败,平衡器会停止。平衡器不会等待当前块删除之后开始新的块移动。在一些情况下,删除过程会持续很久,如果很多的删除过程在排队,没有完成,那么副本集中的主节点可能会出现问题。

因此在分片集群中经常会出现:

moveChunk failed to engage TO-shard in the data transfer: can'taccept new chunks because there are still XXX deletes from previous migration

可以采用_waitForDelete,等待上一个操作结束后,再进行下一个数据块的移动。但是这个参数的设置将会使得后面的操作被阻塞,如果等待删除的块比较多,最好的方式是那个可以解决很多问题的步骤:重启。

3.      影响

       均衡过程会增加系统负载:目标分片必须查询源分片块中的所有文档,将文档插入目标块中,需要删除源分片。向集群中添加新分片时,均衡器会试图向该分片写入数据,会有一个数据迁移的过程。那么对应的措施:

1、  为均衡器指定一个时间窗口,指定在某个特定的时间内执行数据移动操作。

2、  手动进行均衡,但是这种做法要非常小心。

4.      特大块

如果块中的文档数超过了250,000或者块的大小大于配置文件中的chunkSize大小的1.3倍。

5.      启动与禁止平衡器

         默认情况下,在任何需要移动块的时候,平衡器都会进行工作。可以使用sh.stopBalancer()来禁止平衡器,通过sh.getBalancerState()来观察当前平衡器的状态。启动平衡器:sh.setBalancerState(true)

        如果mongodb正在移动数据,不要尝试去改变分片集群中的元数据,不应该采取任何可能会修改元数据的操作。比如,创建或者删除数据库,创建或者删除集合,或者使用任何分片的命令,否则可能会得到不一致的快照结果。

         当平衡器在运行的时候也不要进行备份,应该将其禁止。可以设置平衡窗口,这样子在备份期间得到的数据才会是正确的。但是在禁止平衡器时,它不一定马上就停止,会等到当前的平衡过程终止。所以在备份之前一定要确保平衡器没有在运行。对应的命令为:sh.getBalancerState(),sh.isBalancerRunning()

         禁止平衡器的操作可以应用于某个特定的集合。Sh.enableBalancing()。利用这个操作是否可以实现在运行期间,将数据库禁止平衡,但是允许某个集合进行平衡,可以对正在运行的数据库进行备份,不影响整体的性能。那么是否可以设置某个集合禁止平衡。

### SeaTunnel 使用普通 MongoDB 连接方式同步数据到 MySQL 的配置方法 以下是关于如何使用 SeaTunnel 通过普通的 MongoDB 插件实现与 MySQL 的数据同步的具体说明: #### 配置环境 在 SeaTunnel 中,可以通过 `env` 块定义全局的执行参数。这些参数包括并行度、作业模式以及检查点间隔等设置。例如: ```properties env { parallelism = 1 job.mode = "BATCH" } ``` 上述配置表示该任务将以批处理模式运行,并发数设为 1[^1]。 --- #### 定义 MongoDB 数据源 对于 MongoDB 数据源,可以使用标准的 MongoDB 插件来替代 MongoDB-CDC 插件。以下是一个典型的 MongoDB 数据源配置示例: ```properties source { MongoDB { hosts = "mongo0:27017,mongo1:27017,mongo2:27017" # MongoDB 主机地址列表 database = "inventory" # 要连接的目标数据库名称 collection = "products" # 要操作的集合名称 username = "stuser" # 用户名(如果不需要认证可省略) password = "stpw" # 密码(如果不需要认证可省略) query = "{status: 'active'}" # 可选查询条件,默认为空则读取整个集合 batch.size = 100 # 批量大小 } } ``` 此部分指定了从哪个 MongoDB 实例中提取数据,并支持自定义查询过滤器以减少不必要的数据传输开销[^2]。 --- #### 定义 MySQL 数据目标 为了将数据写入 MySQL,需指定相应的 Sink 配置如下所示: ```properties sink { JDBC { driver = "com.mysql.cj.jdbc.Driver" # MySQL JDBC 驱动类名 url = "jdbc:mysql://mysql-host:3306/test_db" # MySQL 数据库 URL 地址 table-name = "target_table" # 目标表名称 username = "root" # MySQL 用户名 password = "password" # MySQL 密码 batch-size = 100 # 每次批量插入的数量 field-names = ["_id", "name", "description", "weight"] # 映射字段顺序 } } ``` 这里明确了目标存储位置及其访问凭证,同时设置了每批次提交记录的最大数量以便优化性能。 --- #### 整体配置实例 综合以上两部分内容后得到完整的 SeaTunnel 配置脚本如下: ```properties env { parallelism = 1 job.mode = "BATCH" } source { MongoDB { hosts = "mongo0:27017" database = "inventory" collection = "products" username = "stuser" password = "stpw" query = "{}" # 查询全部文档 batch.size = 100 } } sink { JDBC { driver = "com.mysql.cj.jdbc.Driver" url = "jdbc:mysql://mysql-host:3306/test_db" table-name = "target_table" username = "root" password = "password" batch-size = 100 field-names = ["_id", "name", "description", "weight"] } } ``` --- #### 注意事项 - **字段映射**:确保 MongoDB 和 MySQL 表之间的字段一一对应;如果不一致,则需要调整 `field-names` 参数或者修改 SQL DDL 结构。 - **驱动依赖**:确认已下载正确的 MySQL Connector/J 并将其放置于 SeaTunnel 的 classpath 下。 - **并发控制**:适当调节 `parallelism` 和其他相关参数以平衡吞吐率和资源消耗。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值