mongo 3.4分片集群系列之八:分片管理

这个系列大致想跟大家分享以下篇章:

1、mongo 3.4分片集群系列之一:浅谈分片集群

2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片

3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全

4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域

5、mongo 3.4分片集群系列之五:详解平衡器

6、mongo 3.4分片集群系列之六:详解配置数据库

7、mongo 3.4分片集群系列之七:配置数据库管理

8、mongo 3.4分片集群系列之八:分片管理

这篇为实践篇。

这篇主要分4部分:

1)  添加分片到一个集群中

2)  在现有的分片集群移除一个分片

3)  迁移一个分片集群到不同的硬盘上

4)  查看集群配置

在开展这篇实践篇之前,先说明一下现有集群的架构;

用两个虚拟机模仿两台服务器(真实服务器也按照这个方法实践,可以行得通)。

IP分别为192.168.209.155和192.168.209.156。其中,这两个IP之间必须互通。即192.168.209.155可以ping通192.168.209.156,192.168.209.156也可以ping通192.168.209.155。

配置大致如下:(此操作是建立在mongo3.4版本)


名称


主机


端口


副本集


Data路径


Log路径


Router1


192.168.209.155


6666


Router2


192.168.209.156


6666


lConfig1


192.168.209.155


6000


mongo_config


/mongo_config1/data


/mongo_config1/log


Config2


6001


/mongo_config2/data


/mongo_config2/log


Config3


6002


/mongo_config3/data


/mongo_config3/log


Shard1


192.168.209.155


6100


/mongo_shard1/data


/mongo_shard1/log


Shard2


192.168.209.155


6101


/mongo_shard2/data


/mongo_shard2/log


Shard4


192.168.209.156


6100


/mongo_shard4/data


/mongo_shard4/log

1、 添加分片到一个集群中(在192.168.209.155操作)

注意事项:

要添加的分片在192.168.209.155上,端口是6102

1)     为新分片创建文件夹,并创建配置文件

# mkdir –p /mongo_shard3/data

# mkdir –p /mongo_shard3/log

# vim /mongo_shard3/mongo_shard3_secure.conf

配置文件mongo_shard3_secure.conf内容如下:

    

2)     启动新分片

  # mongod –fork –config /mongo_shard3/mongo_shard3_secure.conf

3)     连接任何一个mongos实例

  # mongo –port 6666

4)     添加分片

  Use admin;

  Sh.addShard(“192.168.209.156:6100”);

2、 在现有的分片集群移除一个分片(在192.168.209.155操作)

注意事项:

删除分片,对于mongo,并不是简单的断开分片集群和分片之间的连接。而是,先把要删除的分片中的块,迁移到其他分片中,然后,才会断开分片与集群之间的连接。以上说的过程是通过一个命令运行,然后mongo系统性自动运行迁移的。这个过程根据网络容量和数据量,可能需要几分钟到几天才能完成。

假设,要移除的块是shard0002,主机:192.168.209.155:6102

1)     确保分片集群的平衡器是启用的

连接到mongos实例

# mongo –port 6666

Sh.status()

检查balancer: currently enabled: 是否是yes。

    

  若是no,则通过sh.setBalancerState(true)命令启动,启动后,再通过Sh.status()检查平衡器的状态。

2)     从分片中移除块

这里已经确定要移除的块的名称是shard0002。

若是不确定,可以通过db.adminCommand( { listShards: 1 } )命令查找出所有分片,然后明确要移除块的分片名称是什么。

Use admin;

db.runCommand( { removeShard: "shard0002" } )

注意:这个过程根据网络容量和数据量,可能需要几分钟到几天才能完成。

它会立即返回以下响应,但并不代表移除块已完成。

{

"msg" : "draining started successfully",

"state" : "started",

"shard" : "shard0002",

"ok" : 1

}

3)     检查迁移的状态,确保分片迁移块完成

请再次运行以下命令,知道迁移块完成

Use admin;

db.runCommand( { removeShard: "shard0002" } )

这时,该命令会返回以下的响应:

{

"msg" : "draining ongoing",

"state" : "ongoing",

"remaining" : {

"chunks" : 42,

"dbs" : 1

},

"ok" : 1

}

继续执行removeShard命令检查状态,直到剩余的块数量(remaining.chunks)为0为止。

4)     移动未分片的数据

如果分片是集群中一个或多个数据库的主分片,则分片将具有未分片的数据。如果分片不是任何数据库的主分片,请跳到下一个任务, 完成迁移。

在一个集群中,一个数据库带有未分片的集合,这些集合只会存储在一个分片上。该分片成为该数据库的主分片。(群集中的不同数据库可以有不同的主分片。)

警告: 在完成分片的块排除之前(即在剩余块的数量还没有为0之前),请勿执行此程序。

可以在数据库中,用sh,status()命令确定要移除的分片是否是主分片,在返回的结果文档中,databases字段列出了每个数据库及其主分片。

这里假设分片shard0002上,只有一个数据库products,并且该数据库的主分片刚好是shard0002。现在要将分片shard0002移动到shard0001上。

使用movePrimary 命令,将数据库移动到另一个分片,这个命令只能一个一个数据库移动。例如,将数据库”products”中所有剩余的未分片数据从 shard0002到shard0001:

  db.runCommand( { movePrimary: "products", to: "shard0001" })

在MongoDB完成移动所有数据之前,此命令不会返回结果,这可能需要很长时间。此命令的响应将类似于以下内容:

  { "primary" : "shard0001", "ok" : 1 }

5)     检查状态,确保迁移完全完成

请再次运行以下命令,确保迁移块完成

Use admin;

db.runCommand( { removeShard: "shard0002" } )

完成时会显示成功消息:

{

"msg" : "removeshard completed successfully",

"state" : "completed",

"shard" : "shard0002",

"ok" : 1

}

一旦state字段的值“completed”,您可以安全地停止包含mongodb0分片的进程。

3、迁移一个分片集群到不同的硬盘上(在192.168.209.155和192.168.209.156操作)

假设要将192.168.209.155上所有分片集群的组件(1个路由,3个配置服务器,2个分片)迁移到192.168.209.156上。(这里的分片是单实例,每一个分片都没有做副本集。分片是否做副本集区别于第(5)步)

原配置:


名称


主机


端口


副本集


Data路径


Log路径


Router1


192.168.209.155


6666


Router2


192.168.209.156


6666


Config1


192.168.209.155


6000


mongo_config


/mongo_config1/data


/mongo_config1/log


Config2


6001


/mongo_config2/data


/mongo_config2/log


Config3


6002


/mongo_config3/data


/mongo_config3/log


Shard1


192.168.209.155


6100


/mongo_shard1/data


/mongo_shard1/log


Shard2


192.168.209.155


6101


/mongo_shard2/data


/mongo_shard2/log


Shard4


192.168.209.156


6100


/mongo_shard4/data


/mongo_shard4/log

迁移后,绿色字体为有变动的


名称


主机


端口


副本集


Data路径


Log路径


Router1


192.168.209.156


6600


Router2


192.168.209.156


6666


Config1


192.168.209.156


6000


mongo_config


/mongo_config1/data


/mongo_config1/log


Config2


6001


/mongo_config2/data


/mongo_config2/log


Config3


6002


/mongo_config3/data


/mongo_config3/log


Shard1


192.168.209.156


6101


/mongo_shard1/data


/mongo_shard1/log


Shard2


192.168.209.156


6102


/mongo_shard2/data


/mongo_shard2/log


Shard4


192.168.209.156


6100


/mongo_shard4/data


/mongo_shard4/log

1)     在操作分片集群之前,请先在192.168.209.156上创建对应的文件夹和配置文件。(在192.168.209.156操作)

2)     禁用平衡器(在192.168.209.155操作)

连接到mongos实例

# mongo –port 6666

sh.stopBalancer()

3)     单独迁移每一个配置服务器(在192.168.209.155和192.168.209.156操作)

由于配置服务器有3个,config1(主成员),config2,config3,因此,请执行3次3.1)到3.4)4个步骤。先替换非主成员,最后一个才替换主成员。

这里用config2为例。

3.1)  启动替换的配置服务器(在192.168.209.156操作)

  # mongod --fork --config /mongo_config1/mongo_config1_secure.conf

  以上文件是配置服务器的配置文件,如何设置可以参考mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 中3.2中(1)中2)。

3.2)  将新的配置服务器添加到副本集(在192.168.209.155操作)

连接到配置服务器的·主成员config1

# mongo --port 6000

rs.add(“192.168.209.156:6001”);

3.3)  关闭替换的成员(在192.168.209.155操作)

如果更换主成员config1,请先降级主成员,然后再关闭。

降级主成员(用3.2)的窗口继续操作):

rs.stepDown();

关闭替换的成员(例子还是config2):

# mongo --port 6001

use admin;

db.shutdownServer();

exit;

3.4)  从配置服务器副本集中删除要替换的成员(在192.168.209.155操作)

在完成替换配置服务器的初始同步后(也就是新的配置服务器已经完全同步了现在配置服务器)

连接到配置服务器的·主成员config1

# mongo --port 6000

rs.add(“192.168.209.155:6001”);

4)     重启mongos实例(在192.168.209.155和192.168.209.156操作)

修改mongos实例的配置服务器,将sharding.configDB设置为新的IP:port 。以192.168.209.156:6666为例。

原来配置

    

新配置

    

5)     迁移分片(在192.168.209.155和192.168.209.156操作)

这里提供两个方法,一个是参照官方文档的,一个是我用经验试出来的,后者是暴力的解决方法。不过我确实这么干过。在那个迫不得已的时刻,哎,一言道不尽啊。大家可以参考参考,请谨慎操作,仅供学习。

以移动shard1为例:

方法一(参照官方文档)

在192.168.209.156上添加分片shard1.可以参考上面1、添加分片到一个集群中;

在192.168.209.155上删除分片shard1. 可以参考上面2、在现有的分片集群移除一个分片;

总之,步骤很多。本人没有亲自实践过分片副本集的移动,这里就不阐述了,若是有需要,请参考官方文档https://docs.mongodb.com/v3.4/tutorial/migrate-sharded-cluster-to-new-hardware/#migrate-the-shards

方法二(很粗暴的方法,仅一家之言,仅供参考)

a)      在192.168.209.155上,先关闭shard1的服务;

b)     将192.168.209.155的shard1对应的文件夹(即/mongo_shard1/)整个文件夹复制到192.168.209.156中,放在/mongo_shard1/

c)      修改配置数据库

连接到配置数据库的主节点:

  # mongo –port 6000

  Use config

  db.shards.updateOne({‘_id‘:‘shard0000‘},{$set:{‘host‘:‘192.168.209.156:6101‘}})

d)     在192.168.209.156上,修改新shard1的配置文件

将原来155的分片的配置文件,从端口6100修改为6101

e)      在192.168.209.156上,启动新分片shard1

  # mongo --fork --config /mongo_shard1/mongo_shard1_secure.conf

6)     重启平衡器(在192.168.209.156操作)

连接到mongos实例

  # mongo –port 6666

  sh.startBalancer()

4、查看集群配置(在192.168.209.156操作)

1)     列出数据库,确认是否启用分片

# mongo –port 6666

use config

db.databases.find()

2)     列出分片

use admin

db.runCommand( { listShards : 1 } )

3)     查看集群详情

sh,status()

--------------------------------------- over ------------------------------------------------------

以上资料,大部分是参考官网的资料,在此表示感谢。

https://docs.mongodb.com/v3.4/tutorial/add-shards-to-shard-cluster/

https://docs.mongodb.com/v3.4/tutorial/remove-shards-from-cluster/

https://docs.mongodb.com/v3.4/tutorial/migrate-sharded-cluster-to-new-hardware/

https://docs.mongodb.com/v3.4/tutorial/view-sharded-cluster-configuration/

时间: 2024-08-08 14:35:53

mongo 3.4分片集群系列之八:分片管理的相关文章

mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域

这个系列大致想跟大家分享以下篇章(我会持续更新的(^ω^)): 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4.mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域 5.mongo 3.4分片集群系列之五:详解平衡器 6.mongo 3.4分片集群系列之六:详解配置数据库 7.mongo 3.4分片集群系列之七:配置数

mongo 3.4分片集群系列之六:详解配置数据库

这个系列大致想跟大家分享以下篇章(我会持续更新的(^ω^)): 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全 4.mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域 5.mongo 3.4分片集群系列之五:详解平衡器 6.mongo 3.4分片集群系列之六:详解配置数据库 7.mongo 3.4分片集群系列之七:配置数

MongoDB 3 分片集群安装配置

操作系统:CentOS 6   x86_64 MongoDB版本:3.4.3 集群主机拓扑: 主机 mongo shardsvr & ReplSetName mongo configsvr & ReplSetName mongos test1.lan shard-a    shard-b test2.lan shard-a    shard-b test3.lan shard-a    shard-b test4.lan cfgshard test5.lan cfgshard test6.

mongodb的分布式集群(4、分片和副本集的结合)

概述 前面3篇博客讲了mongodb的分布式和集群,其中第一种的主从复制我们几乎不用,没有什么意义,剩下的两种,我们不论单独的使用哪一个,都会出现相应的问题,比较好的一种解决方案就是,分片和副本集的集合使用,这样就比较完美了. 部署图 在这里,我们需要注意,我们mongos服务器配置成了集群,所以,我们需要在客户端上分别得添加相应的地址,这个和在副本集的那篇博客中将的内容一样,在java客户端程序的具体核心代码,在那篇博客中也给了大家,如果这点不清楚的,可以看看那篇博客. 分片集群的配置 分片集

MongoDB 搭建分片集群

在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群.分片集群(Sharded Clustered)的服务器分为三中类型:Router(mongos),Config Server 和 Shard(Replica Set 或 Standalone mongod).使用分片集群,不需要使用强大的计算机,就能存储更多的数据,处理更大的负载.分布式数据库系统的设计目的是:

MongoDB分片集群配置实例

环境: windows操作系统 mongodb 3.4社区版 目标: 配置包含两个分片一个配置服务器的分片集群.其中每一个分片和一个配置服务器都被配置为一个单独的副本集.如下图所示: 注:每一个分片都应该被配置在一个单独的服务器设备上.方便起见,本文在同一台机器通过不同端口模拟不同服务器上的组件,实现分片集群的配置.(生产环境的配置与此相同,只需使用自己的主机名.端口.路径等即可). 下图为本文配置的分片集群架构,其中的任意节点(副本集节点和分片节点)都是可扩展的. 1.分别为config se

剖析Elasticsearch集群系列第一篇 Elasticsearch的存储模型和读写操作

剖析Elasticsearch集群系列涵盖了当今最流行的分布式搜索引擎Elasticsearch的底层架构和原型实例. 本文是这个系列的第一篇,在本文中,我们将讨论的Elasticsearch的底层存储模型及CRUD(创建.读取.更新和删除)操作的工作原理. Elasticsearch是当今最流行的分布式搜索引擎,GitHub. SalesforceIQ.Netflix等公司将其用于全文检索和分析应用.在Insight,我们用到了Elasticsearch的诸多不同功能,比如: 全文检索 比如找

[ MongoDB ] 分片集群及测试

分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量.这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据. 为什么使用分片? 1. 复制所有的写入操作到主节点    2. 延迟的敏感数据会在主节点查询    3. 单个副本集限制在12个节点    4. 当请求量巨大时会出现内存不足.    5. 本地磁盘不足    6. 垂

Bugsnag的MongoDB分片集群使用经验

Bugsnag是一家为移动应用开发者提供实时的Bug追踪及检测服务的创业公司,Bugsnag已经使用MongoDB存储超过TB级的文档数据.从Bugsnag的第一个版本开始他们就使用MongoDB存储业务数据.近日,Bugsnag的工程师Simon Maynard在博客上分享了他们的MongoDB分片集群经验,并开源了几个他们常使用的脚本. 带标签的分片(Tag Aware Sharding) 带标签的分片是MongoDB 2.2版本中引入的新特性,此特性支持人为控制数据的分片方式,从而使数据存