mongo 3.4分片集群系列之八:分片管理
这个系列大致想跟大家分享以下篇章:
2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片
3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
4、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操作)
注意事项:
- 这里只是简单的添加分片到一个集群,如果还要考虑安全和区域的内容,请参考mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
- 添加新分片后,平衡器会自动迁移块,迁移过程需要一段时间,可能会对集群性能造成影响。
要添加的分片在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 |
||||
Router2 |
192.168.209.156 |
6666 |
|||
Config1 |
192.168.209.155 |
mongo_config |
/mongo_config1/data |
/mongo_config1/log |
|
Config2 |
/mongo_config2/data |
/mongo_config2/log |
|||
Config3 |
/mongo_config3/data |
/mongo_config3/log |
|||
Shard1 |
192.168.209.155 |
/mongo_shard1/data |
/mongo_shard1/log |
||
Shard2 |
192.168.209.155 |
/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 |
||||
Router2 |
192.168.209.156 |
6666 |
|||
Config1 |
192.168.209.156 |
mongo_config |
/mongo_config1/data |
/mongo_config1/log |
|
Config2 |
/mongo_config2/data |
/mongo_config2/log |
|||
Config3 |
/mongo_config3/data |
/mongo_config3/log |
|||
Shard1 |
192.168.209.156 |
/mongo_shard1/data |
/mongo_shard1/log |
||
Shard2 |
192.168.209.156 |
/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/
mongo 3.4分片集群系列之八:分片管理的更多相关文章
- mongo 3.4分片集群系列之七:配置数据库管理
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之六:详解配置数据库
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之五:详解平衡器
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 + 安全
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之二:搭建分片集群--哈希分片
这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...
- mongo 3.4分片集群系列之一:浅谈分片集群
这篇为理论篇,稍后会有实践篇. 这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mong ...
- 【七】MongoDB管理之分片集群介绍
分片是横跨多台主机存储数据记录的过程,它是MongoDB针对日益增长的数据需求而采用的解决方案.随着数据的快速增长,单台服务器已经无法满足读写高吞吐量的需求.分片通过水平扩展的方式解决了这个问题.通过 ...
- MongoDB笔记: 分片集群
MongoDB分片集群由三个模块组成 shard: 分片(或者分区)模块, 每个分片分别存储一部分数据, 从MongoDB 3.6开始, 分片必须是replica set(副本集) mongos: m ...
随机推荐
- 牛腩新闻系统(一)——UML、数据库设计
牛腩新闻系统(一)--UML.数据库设计 一.初识牛腩系统 牛腩(Brisket)即牛腹部及靠近牛肋处的松软肌肉,是指带有筋.肉.油花的肉 块.这是一种统称. 若依部位来分,牛身上很多地方的肉都能够叫 ...
- Linux命令输出头(标题)、输出结果排序技巧
原文:http://blog.csdn.net/hongweigg/article/details/65446007 ----------------------------------------- ...
- tomcat用80port能够启动,可是浏览器不显示tomcat首页
一.打开执行(ctrl+r)->输入cmd->确定->输入netstat -ano 结果检測到 :80port被system 占用,如图所看到的 打开进程发现确实被 PID为 4 的 ...
- Python - 两个列表(list)组成字典(dict)
使用zip函数, 把key和value的list组合在一起, 再转成字典(dict). 代码: # -*- coding: utf-8 -*- keys = ['a', 'b', 'c'] value ...
- 使用Docker部署Gitlab
由于公司的代码server已使用Gitosis搭建,但由于用户和权限管理太麻烦. 如今想在原有server上再搭建Gitlab,使用Gitlab官方方法直接安装. 会导致与Gitosis冲突,使得Gi ...
- 【MySQL】Win7下修改MySQL5.5默认编码格式
一般安装MySQL程序过程中,有一步骤是选择MySQL的默认编码格式的,程序默认为Latin1编码格式,当然也可以选择第三个选项,手动选择gbk或utf8编码格式,以支持中文数据.如下图: 现在问题出 ...
- easyui datagrid 禁止选中行 EF的增删改查(转载) C# 获取用户IP地址(转载) MVC EF 执行SQL语句(转载) 在EF中执行SQL语句(转载) EF中使用SQL语句或存储过程 .net MVC使用Session验证用户登录 PowerDesigner 参照完整性约束(转载)
easyui datagrid 禁止选中行 没有找到可以直接禁止的属性,但是找到两个间接禁止的方式. 方式一: //onClickRow: function (rowIndex, rowData) ...
- linux服务器上的mysql允许远程连接
首先进入mysql: 输入GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; 这里是 ...
- 自己动手写shell命令之ls -R1fF
ls命令的R參数代表递归的列出全部子目录中的全部文件,1表示每一行仅仅显示一个文件或目录,f表示不排序即输出.F表示在每项的输出的最后依据其文件类型对应的加上*/=>@|字符.通过c语言实现ls ...
- navicat软件设置连接mysql数据库
navicat软件设置连接mysql数据库 适用范围及演示使用工具 适用范围:mysql全部系列(含Linux和Windows系统下的mysql) 演示使用工具:Navicat 8.0 MySQL 演 ...