MongoDB实战-分片集群实战

来源:互联网 发布:wind python高频数据库 编辑:程序博客网 时间:2024/05/22 14:53

     理解分片的最佳途径就是了解它实际是怎么工作的。幸运的是可以在一台机器上配置分片集群。

1. 配置

    配置是分片集群有两个步骤。第一步,启动所有需要的mongod和mongos进程。第二步,也是比较简单的一步,发出一系列命令来初始化集群。你将构建的分片集群由两个分片和三个配置服务器组成,另外还要启动一个mongos与集群通信。你要启动的全部进程如下图所示


   你需要运行一堆命令来启动集群,因此如果觉得自己比较困惑,不妨回头过来看看这个图。

(1)启动分片组件

首先在开始为两个副本集创建数据目录,它们将成为分片的一部分:本文中使用基于linux的mongoDB

mkdir /data/rs-a-1mkdir /data/rs-a-2mkdir /data/rs-a-3mkdir /data/rs-b-1mkdir /data/rs-b-2mkdir /data/rs-b-3
     接下来,启动每个进程mongod进程。因为要运行很多进程,所以可以使用--fork选项,让他们运行在后台。以下是启动第一个副本集的命令。

mongod --shardsvr --replSet shard-a -dbpath /data/rs-a-1 --port 30000 --logpath /data/rs-a-1.log --fork --nojournalmongod --shardsvr --replSet shard-a -dbpath /data/rs-a-2 --port 30001 --logpath /data/rs-a-2.log --fork --nojournalmongod --shardsvr --replSet shard-a -dbpath /data/rs-a-3 --port 30002 --logpath /data/rs-a-3.log --fork --nojournal
以下是启动第二个副本集的命令:

mongod --shardsvr --replSet shard-a -dbpath /data/rs-b-1 --port 30100 --logpath /data/rs-b-1.log --fork --nojournalmongod --shardsvr --replSet shard-a -dbpath /data/rs-b-2 --port 30101 --logpath /data/rs-b-2.log --fork --nojournalmongod --shardsvr --replSet shard-a -dbpath /data/rs-b-3 --port 30102 --logpath /data/rs-b-3.log --fork --nojournal
   如往常一样,现在要初始化这些副本集了。单独连上每个副本集,运行rs.initiate(),随后添加剩余的节点。第一个副本集上的命令是这样的:

mongo iZ2ze5yfpvmnb0sgd00igpZ:30000rs.initiate()

大概一分钟后,初始节点变为主节点,执行步骤如下图


节点自动变为了主节点
rs.add("iZ2ze5yfpvmnb0sgd00igpZ:30001")rs.add("iZ2ze5yfpvmnb0sgd00igpZ:30002",{arbiterOnly:true})

运行结果如下,后续运行rs.status()查看副本集中成员信息




初始化第二个副本集的方法与之类似。在运行了rs.initiate()命令后等待一分钟:

mongo iZ2ze5yfpvmnb0sgd00igpZ:30100rs.initiate()rs.add("iZ2ze5yfpvmnb0sgd00igpZ:30101")rs.add("iZ2ze5yfpvmnb0sgd00igpZ:30102",{arbiterOnly:true})


执行完上述语句后,执行rs.status()结果如下所示:



最后,在每个副本集上通过shell运行rs.status()命令,验证下两个副本集是否运行正常。如果一切顺利,就可以准备启动配置服务器了。现在,创建每个配置服务器的数据目录,通过configsrv选项启动各个配置服务器的mongod进程。

mkdir /data/config-1
mkdir /data/config-2
mkdir /data/config-3
mongod -configsrv --dbpath /data/config-1 --port 27019 --logpath /data/congfig-1.log --fork --nojournalmongod -configsrv --dbpath /data/config-2 --port 27020 --logpath /data/congfig-2.log --fork --nojournalmongod -configsrv --dbpath /data/config-3 --port 27021 --logpath /data/congfig-3.log --fork --nojournal
用shell连接或者查看日志文件,确保每台配置服务器都已启动并正常运行,并验证每个进程都在监听配置的端口。查看每台配置服务器的日志,应该能够看到这样的内容

Tus Sep 5 15:43:28  [initandlisten] waiting for connections on port 27020

Tus Sep 5 15:43:28  [websrv] web admin interface listening on port 27020

使用shell连接对应端口,执行结果如下:


如果每个配置服务器都在运行了,那么就能进行下一步,启动mongos。必须用configdb选项来启动mongos,它接受一个用逗号分隔的配置服务器地址列表:

./software/bin/mongos -configdb config/iZ2ze5yfpvmnb0sgd00igpZ:27019,iZ2ze5yfpvmnb0sgd00igpZ:27020,iZ2ze5yfpvmnb0sgd00igpZ:27021 -logpath logs/mongos.log -fork -port 40000


(2) 配置集群

     现在已经准备好了所有组件,是时候配置集群了。先从连接mongos开始。为了简化任务,可以使用分片辅助方法,他们是全局sh对象上的方法。要查看可用辅助方法的列表,请运行sh.help().你将键入一系列配置命令,先从addshard命令。该命令的辅助方法时sh.addShard(),它接受一个字符串,其中包含副本集名称,随后是两个或多个要连接的种子节点地址。这里你指定了先前创建的两个副本集合,用的是每隔副本集中非仲裁节点的地址:

mongo iZ2ze5yfpvmnb0sgd00igpZ:40000sh.addShard("shard-a/iZ2ze5yfpvmnb0sgd00igpZ:30000,iZ2ze5yfpvmnb0sgd00igpZ:30001")sh.addShard("shard-b/iZ2ze5yfpvmnb0sgd00igpZ:30100,iZ2ze5yfpvmnb0sgd00igpZ:30101")
执行后每个addShard方法会返回结果,成功状态的ok值为1

   

 如果命令执行成功,命令的响应中你会看到刚刚添加的分片名称。可以检查config数据库的shards集合,看看命令的执行结果。使用getSiblingDB()方法来切换数据库,而不是使用use命令:

db.getSiblingDB("config").shards.find()
执行结果如下图所示:


listShards命令会返回相同的信息,这是一个快捷方式:

use admindb.runCommand({listShards:1})
     在报告分片配置时,Shell的sh.status()方法能够很好地总结集群的情况。执行结果如下:


     下一步配置时开启一个数据库上的分片,这是对任何集合进行分片的先决条件。应用程序的数据库名为cloud-docs,可以像下面这样开始分片:

sh.enableSharding("cloud-docs")
    和以前一样,可以检查config里的数据查看刚才所做的变更。config数据库里一个名为databases的集合,其中包含了一个数据库列表。每个文档都标注明了数据库主分片的位置,以及它是否分区(是否开启了分片)

db.getSiblingDB("config").databases.find()
执行结果如下:

     现在你要做就是分片spreadsheets集合。在对集合进行分片时,要定义一个分片键。这里将使用组合分片键(username:1,_id:1),因为它能很好地分布数据,还能方便查看和理解块的范围:

sh.shardCollection("cloud-docs.spreadsheets",{username:1,_id:1})
     同样也可以检查config数据库来验证分片集合的配置:
db.getSiblingDB("config").collections.find()
执行结果如下:

     分片集合的定义可能会提醒你几点,它看起来和索引定义有几分相似之处,尤其是有那个unique键。在对一个空集合进行分片时,MongoDB会在每个分片上创建一个与分片键对应的索引。可以直接连上分片,运行getIndexes()方法验证。由于当前版本中

db.getSiblingDB("config").databases.find()
出现了一个primary:“shard-b”,所以上述索引建立在shard-b上。


   一旦完成了集合的分片,分片集群就准备就绪了。现在可以向集群写入数据,数据将分布到各分片上。到此,分片集群的搭建完成。














原创粉丝点击