分片技术,可以满足MongoDB数据量大量增长的需求。当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
上图中主要有如下所述三个主要组件:
Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
Config Server:mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
部署monggodb三节点分片集群
首先修改主机名
192.168.197.136 hostnamectl set-hostname monggodb-1
192.168.197.137 hostnamectl set-hostname monggodb-2
192.168.197.138 hostnamectl set-hostname monggodb-3
安装monggodb(三个节点都做)
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.18.tgz --no-check-certificate
tar -zxvf mongodb-linux-x86_64-rhel70-5.0.18.tgz 解压安装包
mv mongodb-linux-x86_64-rhel70-5.0.18 /data/mongodb 移动到指定目录
配置环境变量
vim /etc/profile 最底部添加
MONGODB_HOME=/data/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
source /etc/profile
创建数据库目录
mkdir /data/mongodb/{data,data-2,log} 数据存储目录,日志存储目录
部署config server(三台机器都操作)
mkdir /data/mongodb/config
启动config serve
mongod --bind_ip localhost,192.168.197.136 --configsvr --replSet config --dbpath /data/mongodb/config/ --logpath /data/mongodb/log/config.log --fork --port 27000
mongod --bind_ip localhost,192.168.197.137 --configsvr --replSet config --dbpath /data/mongodb/config/ --logpath /data/mongodb/log/config.log --fork --port 27000
mongod --bind_ip localhost,192.168.197.138 --configsvr --replSet config --dbpath /data/mongodb/config/ --logpath /data/mongodb/log/config.log --fork --port 27000
mongo --host 192.168.197.136 --port 27000 登录到136创建config的副本集
rs.initiate( { _id: "config", configsvr: true, members: [ { _id : 0, host : "192.168.197.136:27000" }, { _id : 1, host : "192.168.197.137:27000" }, { _id : 2, host : "192.168.197.138:27000" } ] } )
创建完成后查看一下副本集状态 rs.status()
可以看到stateStr状态栏有1个 PRIMARY角色 和 2个 SECONDARY角色集群创建正常,如果是三个SECONDARY角色可以退出mongo重新登录在查看一下。
启动分片集群实例(三个节点都操作)
136节点操作
mongod --bind_ip localhost,192.168.197.136 --shardsvr --replSet mongodb --dbpath /data/mongodb/data/ --logpath /data/mongodb/log/mongod.log --fork --port 27027
mongod --bind_ip localhost,192.168.197.136 --shardsvr --replSet mongodb-2 --dbpath /data/mongodb/data-2/ --logpath /data/mongodb/log/mongod-2.log --fork --port 27028
137节点操作
mongod --bind_ip localhost,192.168.197.137 --shardsvr --replSet mongodb --dbpath /data/mongodb/data/ --logpath /data/mongodb/log/mongod.log --fork --port 27027
mongod --bind_ip localhost,192.168.197.137 --shardsvr --replSet mongodb-2 --dbpath /data/mongodb/data-2/ --logpath /data/mongodb/log/mongod-2.log --fork --port 27028
138节点操作
mongod --bind_ip localhost,192.168.197.138 --shardsvr --replSet mongodb --dbpath /data/mongodb/data/ --logpath /data/mongodb/log/mongod.log --fork --port 27027
mongod --bind_ip localhost,192.168.197.138 --shardsvr --replSet mongodb-2 --dbpath /data/mongodb/data-2/ --logpath /data/mongodb/log/mongod-2.log --fork --port 27028
mongo --host 192.168.197.136 --port 27027 登录到136创建mongodb的副本集1
rs.initiate( { _id: "mongodb", members: [ { _id : 0, host : "192.168.197.136:27027" }, { _id : 1, host : "192.168.197.137:27027" }, { _id : 2, host : "192.168.197.138:27027" } ] } )
创建完成后查看一下副本集状态 rs.status()
可以看到1个 PRIMARY角色 和 2个 SECONDARY角色集群创建正常,如果是三个SECONDARY角色可以退出mongo重新登录在查看一下。
mongo --host 192.168.197.136 --port 27028 登录到136创建mongodb-2的副本集
rs.initiate( { _id: "mongodb-2", members: [ { _id : 0, host : "192.168.197.136:27028" }, { _id : 1, host : "192.168.197.137:27028" }, { _id : 2, host : "192.168.197.138:27028" } ] } )
创建完成后查看一下副本集状态 rs.status()
看到1个 PRIMARY角色 和 2个 SECONDARY角色集群创建正常,如果是三个SECONDARY角色可以退出mongo重新登录在查看一下。
为分片集群启动mongos(在136节点操作)
mkdir mongos 创建数据存储目录
vim /data/mongodb/mongos/mongod.conf 创建monggodb的配置文件添加一些参数
net:
port: 27017 #monggodb使用的端口
bindIp: 0.0.0.0 #支持任意ipv4地址访问
ipv6: true #开启ipv6
启动 mongos 指定之前部署的 config 副本集
mongos --configdb config/192.168.197.136:27000,192.168.197.137:27000,192.168.197.138:27000 --config /data/mongodb/mongos/mongod.conf --logpath /data/mongodb/log/mongos.log --fork --port 27017
连接分片集群 mongo --host 192.168.197.136 --port 27017
将分片添加到集群
sh.addShard( "mongodb/192.168.197.136:27027,192.168.197.137:27027,192.168.197.138:27027")
sh.addShard( "mongodb-2/192.168.197.136:27028,192.168.197.138:27028,192.168.197.138:27028")
如果有多个分片可以重复此步骤
use test
sh.enableSharding("test") 给test库启动分片
sh.shardCollection("test.userid", {_id: "hashed" } ) 根据"_id"字段做 hash 分片
sh.status(); 查看分片详情
database._id 表示开启分片的库。
database.primary 表示主 shard。
database.partitioned 表示这个库是否开启分片,true 表示开启。
collections 中表示分片的表。
collections.shardKey 表示分片健。
collections.balancing 为 true 表示平衡。
collections.chunks 数据分布情况。
use test 测试插入数据
for (var i=1; i<=10; i++ ) db.userid.save({userid:i,username:'a'});
插入完数据库来到136的两个主节点查看一下数据是否已经分片存储
mongo --host 192.168.197.136 --port 27027
mongo --host 192.168.197.136 --port 27028
可以看到输入的数据分别存储到了两个分片当中,到这里我们的分片集群就做好了。