MongoDB分片到复制集改造实践

  • 时间:
  • 浏览:7
  • 来源:uu快3棋牌_uu快3讨论群_规律

一群人都歌词 歌词 取原先min._id和max._id的离米 上面值来进行split。

将会片键设计不合理很容易会原因分析分析分析某些chunk超出上面大小,原先 均衡器就无法移动某些块儿。执行sh.status(true)也能就看jumbo chunk,也也能通过查看config.chunks来获取jumbo chunk的信息:

最后,将会是分片场景,请务必重视: 设计合理片键设计合理的片键设计合理片键念之再三,铭之肺腑。

                                           

首先保证均衡器是开启的,将会在draining数据的过程中均衡器负责将该shard上面的数据迁移至其余的shard。

Each database in a sharded cluster has a primary shard that holds all the un-sharded collections for that database. Each database has its own primary shard. The primary shard has no relation to the primary in a replica set.

简单描述业务背景,起初业务评估需求一阵一阵高,为什么会么会一群人都歌词 歌词 歌词 采用了分片架构,设计了三个白shard,通过_id进行hash分片,但日后业务远远很难达到预期目标,再日后业务没人 萎缩,到现在分片集群反而成为了业务负担。为了减少其成本,业务决定将分片替换为好友克隆集,共同将物理机部署改为容器化。有日后,一群人都歌词 歌词 提供了如下迁移步骤:

执行完removeShard,一群人都歌词 歌词 再通过sh.status查看的完后 也能就看指定shard正在draining数据

待迁移完shard上所有chunk,执行removeShard会返回成功信息。

使用moveChunk命令移动块儿到指定的shard:

那为哪些要提前确认primary shard,将会将会是primary shard就无法remove,会有如下提示:

这完后 一群人都歌词 歌词 再去查config.chunks,将会看不也能该chunk信息。以此类推,某些chunk都split下,sh.status也能就看要删除shard上的chunk数量翻倍

本文,我主要讲第二种方案,其核心技术点为removeShard,但经验他不知道们,某些操作往往还会没人 顺利完成,一群人都歌词 歌词 将会会遇到primary shard提示,也将会会遇到jumbo chunk无法迁移的问提图片。下面我拿原先线上正式服务的案例来全版说明。

完后 ,一群人都歌词 歌词 就也能进行removeShard了,其操作说明官方文档也非常全版。

1)目前有原先shard,remove原先shard

3)好友克隆集做一次迁移,迁移到容器上

将会业务选泽了合理的片键,removeShard会顺利完成,但在一群人都歌词 歌词 业务中仅仅拿_id进行了hash分片,在removeShard过程中一群人都歌词 歌词 遇到了jumbo chunk,原因分析分析分析无法迁移

当然迁移过程中将会时需冒出 jumbo chunk,解法全都我重复上面splitChunk操作

从上也能就看,anav_team_2上面发生7个jumbo chunk

mongos以及shard的日志上面也也能就看相关迁移记录。

遇到jumbo chunk还会慌张,处理法律法律法律依据必然是有的。首先,一群人都歌词 歌词 也能想到的法律法律法律依据是也能直接给手动移动?官方也的确提供了moveChunk功能参考文档

2)业务从分片访问法律法律法律依据改为好友克隆集访问法律法律法律依据

MongoDB不允许移动大于chunksize的chunk,全都一群人都歌词 歌词 也能临时将chunk大小调大,法律法律法律依据为:

这完后 将会该shard为我要要删除的对象,没人 时需先删除将会移动哪些对象,删除还会解释,正式环境全都我允许你操作,下面看下movePrimary官方文档

生产线上使用 MongoDB Sharidng 的场景非常多,但将会业务初期评估不也能位将会业务发展不符合预期,为了管理起来更方便,将会时需将 Sharding 改造为 好友克隆集。

jumbo chunk怎么能不能产生呢?每个分片时需有最大chunk的大小,保发生config.settings上面:

我这里是moveChunk失败了,原因分析分析分析是MongoDB 3.4版本手动moveChunk命令做了个限制。但失败归失败,将会某些版本中使用该功能时,务必注意加进_secondaryThrottle,加进会强制要求迁移过程间歇进行,每迁移完某些数据,需等候集群中大多数分片成功完成数据好友克隆后再进入下一次迁移。尽管变慢迁移的过程,但共同减缓了对系统性能的影响。这在生产环境中还是尤为重要。当然,该选项仅仅适用于好友克隆集shard。

进入正题,目前一群人都歌词 歌词 系统有原先shard,第一步要提前确认primary shard,何为primary shard官方说明

                                           

简单理解全都我没人 进行分片的集合所在库的shard。那怎么能不能确认,嘴笨 也简单,笨某些法律法律法律依据全都我连接每个分片show collection查看即可。也也能执行sh.status查看

                                           

首先,我提供并不是可选方案:

1)将会有同步工具支持,也能选泽从分片全量+增量的法律法律法律依据同步到好友克隆集,有日后选个时间点切换;

通过该法律法律法律依据我成功remove了原先shard,只留下primary shard,有日后通知业务服务从mongos访问改为好友克隆集法律法律法律依据,上面物理机改容器某些都没人本文范围内,全都不再往下去讨论。

draining数据过程非常缓慢,也能继续通过执行removeShard命令来查看当前状况:

最后打开均衡器,这完后 一群人都歌词 歌词 庆幸的发现,均衡器又开始英文迁移chunk了。

2)从集群中减分片(removeShard),最后只保留原先shard(好友克隆集),业务接入从mongos改为好友克隆集

我能 针对生产级业务环境需求提供最小影响服务将分片改造为好友克隆集(含减分片场景)的处理方案。

另外也也能通过sh.status命令就看被删除shard上的chunk数量不断减少,其余shard的chunk数量增多。

当然,将会业务数据量一阵一阵少,有日后可接受一定程度上的业务停服,那也也能选泽逻辑导出导入的法律法律法律依据。尽管某些法律法律法律依据最为简便,但因影响服务时间过长,全都很少会在生产环境中使用。

思路全都我拆分jumbo chunk为更小的块儿,有日后通过均衡器来自动迁移。拿原先jumbo chunk来举例说明:

提供并不是法律法律法律依据来定位移动的对象,find后接文档查询query条件,bound则提供要移动块儿的边界,更为精准。

                                           

移动块儿不可行一群人都歌词 歌词 还有一招也能尝试,那全都我splitChunk,官方文档