数据的不同部分可利用索引分配给不同的服务器。例如,索引记录中的客户放在一组服务器上,供应商放在另一组服务器上。但是,若要完全随机分布,则需使用索引散列值。您也可以利用一系列值将数据分配给多个服务器。
分片集群
MongoDB基础架构如图所示。您可与路由器进行通信,它们可以轮询配置(config)服务器,以确定写入和读取数据的分片(shard)服务器,即数据存储位置。配置服务器也可作为复制集,即在此复制数据,以获得额外副本。
生产环境下应至少有3个配置服务器。这里,我们展示开发环境如何建立分片配置,其中至少使用1个路由器、1个配置服务器和1个分片服务器。
安装软件和设置虚拟机
我们需要三个虚拟机。如下所示,在/ etc / hosts中,我们设置了三个虚拟机。您可以设置任何想要的IP地址,但为了本教程的目的,我们使用下面相同的名称设置主机名。
我们采用:
mongomaster—这是路由器。
mongoshard—这是我们用来分片的数据库服务器,即在集群环境下运行。
mongoconfig—这是配置服务器和数据库副本。
192.168.20.150 mongomaster
192.168.20.149 mongoshard
192.168.20.170 mongoconfig
安装软件
我们在Ubuntu 16.04上使用Mongo 3.4.10。我说过,因为Mongo改变了软件,服务器不再只是配置服务器。相反,配置服务器可用作副本。其他副本只能是副本。
Mongo软件安装在所有三个服务器上。
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 -- recv 0C49F3730359A14518585931BC711F9BA15703C6
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
创建配置服务器复制集
rs是我们给这个复制集的命名。–-configsvr 切换表示这个复制集可以用作副本服务器和配置服务器。
ssh mongoconfig
sudo mongod --configsvr --dbpath /data/configdb --replSet rs
现在,通过任何服务器运行mongo。我们连接到端口27019,因为标准输出(stdout)中,启动mongod时,这是mongod显示正在监听的位置:
这个节点在配置中是mongoconfig:27019。
初始化。
mongo --host mongoconfig --port 27019
rs.initiate()
然后观察状态,确认是配置服务器:
rs.status()
{
"set" : "rs",
"date" : ISODate("2017-10-28T06:38:52.355Z"),
"myState" : 1,
"term" : NumberLong(1),
"configsvr" : true,
…
在分片服务器上启动Mongod
ssh mongoshard
sudo mongod --shardsvr --replSet
现在,使用mongo客户端连接并对其进行初始化:
mongo --host monogshard --port 2718
rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "mongoshard:27018",
"ok" : 1
}
在路由器上启动Mongos
ssh mongomaster
mongos --configdb rs/mongoconfig:27019
注意标准输出中的这个消息,它给我们提供下一步的端口号:
等待27017端口连接
在集群中添加分片
mongo --host mongomaster --port 27017
sh.addShard( "rs/mongoshard:27018")
{ "shardAdded" : "rs", "ok" : 1 }
启用数据库分片
可以使用任何数据库名。记住数据库名,以便不存在时创建。我们使用烟草,因为这是我们上一篇教程中使用的名称,即使用NodeJS和MongoDB时的数据库名。
sh.enableSharding("tobacco")
{ "ok" : 1 }
检查状态
看看数据库是否存在并且分片。
sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("59f425f12fdbabb0db68b690")
}
shards:
{ "_id" : "rs", "host" : "rs/mongoshard:27018", "state" : 1 }
active mongoses:
"3.4.10" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
NaN
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
{ "_id" : "tobacco", "primary" : "rs", "partitioned" : true }
原文地址:http://blog.51cto.com/13674496/2091569