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分片集群系列之八:分片管理
这一篇是实践篇。
1、说说分片集群的架构
这里要搭建的分片集群架构如下:
2个mongos,1个三个成员的副本集配置服务器,2个单实例的分片。图示如下:
简单介绍一下MongoDB分片集群由以下组件组成:
mongos:mongos作为查询路由器,提供客户端应用程序和分片集群之间的接口。 配置服务器:配置服务器存储集群的元数据和配置信息。从MongoDB 3.4开始,配置服务器必须部署为副本集(CSRS)。 分片:每个分片包含分片数据的一部分。每个分片可以部署为副本集。这里先做单实例,没有做副本集。2、分片前注意事项
关于分片集群的一些注意点,请参阅:mongo 3.4分片集群系列之一:浅谈分片集群 ,其中第4点,分片前考虑事项。
好啦。慎重考虑完分片前考虑事项的话,接下来就进入实践吧~~~
3、搭建哈希分片集群
下面是参照官网的 https://docs.mongodb.com/manual/tutorial/deploy-sharded-cluster-ranged-sharding/
3.1、搭建前准备:
物理环境:
我这边是用两个虚拟机模仿两台服务器的(真实服务器也按照这个方法实践,可以行得通)。
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 无 无 无 /etc/mongo_router1.conf router2 192.168.209.156 6666 无 无 无 /etc/mongo_router2.conf config1 192.168.209.155 6000 mongo_config /mongo_config1/data /mongo_config1/log /mongo_config1/mongo_config1.conf config2 6001 /mongo_config2/data /mongo_config2/log /mongo_config2/mongo_config2.conf config3 6002 /mongo_config3/data /mongo_config3/log /mongo_config3/mongo_config3.conf shard1 192.168.209.155 6100 无 /mongo_shard1/data /mongo_shard1/log /mongo_shard1/mongo_shard1.conf shard2 192.168.209.156 6100 无 /mongo_shard2/data /mongo_shard2/log /mongo_shard2/mongo_shard2.conf接下来就来搭建哈希分片集群咯~~~
3.2、创建配置服务器副本集
部署具有三个成员的配置服务器副本集。
(1) mongo_config1 (在192.168.209.155上操作)
1) 创建数据路径文件夹和日志路径文件夹
# sudo mkdir –p /mongo_config1/data
# sudo mkdir –p /mongo_config1/log
2) 创建配置文件
# sudo vim /mongo_config1/mongo_config1.conf
文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)
storage:
dbPath: “/mongo_config1/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config1/log/mongo_config1.log
net:
port: 6000
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
如下图:
关于mongo3.4的配置文件YAML格式,也可以参阅我的另一篇文章mongo3.4 配置文件 注意事项
3) 启动mongod实例
# mongod --fork --config /mongo_config1/mongo_config1.conf
--fork 是以线程方式启动mongod服务
--config 指定配置文件路径
(2) mongo_config2(在192.168.209.155上操作)
1) 创建数据路径文件夹和日志路径文件夹
# sudo mkdir –p /mongo_config2/data
# sudo mkdir –p /mongo_config2/log
2) 创建配置文件
# sudo vim /mongo_config2/mongo_config2.conf
文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)
storage:
dbPath: “/mongo_config2/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config2/log/mongo_config2.log
net:
port: 6001
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
如下图:
3) 启动mongod实例
# mongod --fork --config /mongo_config2/mongo_config2.conf
--fork 是以线程方式启动mongod服务
--config 指定配置文件路径
(3) mongo_config3 (在192.168.209.155上操作)
1) 创建数据路径文件夹和日志路径文件夹
# sudo mkdir –p /mongo_config3/data
# sudo mkdir –p /mongo_config3/log
2) 创建配置文件
# sudo vim /mongo_config3/mongo_config3.conf
文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)
storage:
dbPath: “/mongo_config3/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_config3/log/mongo_config3.log
net:
port: 6002
sharding:
clusterRole: configsvr
replication:
replSetName: mongo_config
如下图:
3) 启动mongod实例
# mongod --fork --config /mongo_config3/mongo_config3.conf
--fork 是以线程方式启动mongod服务
--config 指定配置文件路径
(4) 初始化副本集mongo_config(在192.168.209.155上操作)
1) 连接任意一个mongod实例
# sudo mongod --port 6000
2) 初始化副本集
输入以下命令:(这里只是为了方便理解,其实命令行打成一行即可)
rs.initiate(
{
_id: "mongo_config",
configsvr: true,
members: [
{ _id : 0, host : "192.168.209.155:6000" },
{ _id : 1, host : "192.168.209.155:6001" },
{ _id : 2, host : "192.168.209.155:6002" }
]
}
)
_id:必须匹配传递给mongod 的--replSet参数。
members:是一个数组,每个副本集成员都需要一个文档。
configsvr:必须设置true。
3.3、创建分片
(1) mongo_shard1 (在192.168.209.155上操作)
1) 为mongo_shard1创建配置文件
# sudo vim /mongo_shard1/mongo_shard1.conf
文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)
storage:
dbPath: “/mongo_shard1/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_shard1/log/mongo_shard1.log
net:
port: 6100
sharding:
clusterRole: shardsvr
如下图:
2) 启动mongod实例
# mongod --fork --config /mongo_shard1/mongo_shard1.conf
(2) mongo_shard2(在192.168.209.156上操作)
1) 为mongo_shard2创建配置文件
# sudo vim /mongo_shard2/mongo_shard2.conf
文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)
storage:
dbPath: “/mongo_shard2/data”
indexBuildRetry: false
systemLog:
destination: file
path: “/mongo_shard2/log/mongo_shard2.log
net:
port: 6101
sharding:
clusterRole: shardsvr
如下图:
2) 启动mongod实例
# mongod --fork --config /mongo_shard2/mongo_shard2.conf
3.3、创建路由
(1) mongo_router1(在192.168.209.155上操作)
1) 为mongo_router1创建配置文件
# sudo vim /etc/mongo_router1.conf
文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)
net:
port: 6666
sharding:
configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002
如下图:
2) 启动mongos实例
# mongos --config /etc/mongo_router1.conf
(2) mongo_router2(在192.168.209.156上操作)
1) 为mongo_router2创建配置文件
# sudo vim /etc/mongo_router2.conf
文件中的配置如下:(所有空位都是空格,不是TAB键哦,大小写是严格区分的)
net:
port: 6666
sharding:
configDB: mongo_config/192.168.209.155:6000,192.168.209.155:6001,192.168.209.155:6002
如下图:
2) 启动mongos实例
# mongos --config /etc/mongo_router2.conf
3.4、添加分片到集群
(1) 连接任意一个mongos,这里连接mongo_router1(在192.168.209.155上操作)
# mongo --port 6666
(2) 添加分片
1) 添加第一个分片mongo_shard1
sh.addShard(“192.168.209.155:6100”);
2) 添加第二个分片mongo_shard2
sh.addShard(“192.168.209.156:6100”);
3.5、为数据库启用分片(直接在3.4的窗口中运行即可)
sh.enableSharding(“databaseName”);
其中databaseName,为要分片的数据库。
3.6、使用哈希分片分片集合(直接在3.5的窗口中运行即可)
这里有两种情况,一种是空集合,另一种是有数据的集合,但对于这两种情况都建议用以下方法。
(1) 对于确定作为分片键的字段,建立哈希索引
use databaseName;
db.collectionName.createIndex(Name:”hashed”);
其中,databaseName是3.5启用的分片数据库名称;collectionName是要分片的集合;Name是作为分片键的字段。
(2) 哈希分片
sh.shardCollection(“databaseName.collectionName”,{Name:”hashed”})
其中,databaseName是3.5启用的分片数据库名称;collectionName是要分片的集合;Name是作为分片键的字段。
--------------------------------------- over ------------------------------------------------------
以上资料,大部分是参考官网的资料,在此表示感谢。
https://docs.mongodb.com/manual/tutorial/deploy-sharded-cluster-ranged-sharding/
下一篇: 如何更好的编写js async函数