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-2mkdir /data/config-3mongod -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上。
一旦完成了集合的分片,分片集群就准备就绪了。现在可以向集群写入数据,数据将分布到各分片上。到此,分片集群的搭建完成。
- MongoDB分片集群实战
- MongoDB实战-分片集群实战
- MongoDB分片实战(一):集群搭建
- MongoDB分片实战(一):集群搭建
- MongoDB分片实战(一):集群搭建
- Nagios监控mongodb分片集群服务实战
- MongoDB分片实战(一):集群搭建
- MongoDB分片实战(一):集群搭建
- MongoDB分片实战(一):集群搭建
- MongoDB实战-分片集群的管理
- MongoDB分片实战
- MongoDB分片实战
- Mongodb分片实战
- MongoDB分片实战(一):集群搭建 环境准备
- mongodb 在单机上搭建分片集群 详细实战过程
- MongoDB实战-操作分片集群,向分片集群中写入数据
- MongoDB分片实战(二):Sharding
- MongoDB分片实战(二):Sharding
- 红黑树
- swift 闭包简写实际参数名$0、$1等理解
- C语言中的字符串和字符数组
- 基于linux vim环境python代码自动补全
- 条款6:阻止编译器自动生成拷贝构造函数和赋值函数
- MongoDB实战-分片集群实战
- Spring思维导图,让Spring不再难懂(mvc篇)
- 垃圾收集器与内存分配策略
- BZOJ3672:[Noi2014]购票 (斜率优化DP+二分+(树上CDQ分治/树链剖分))
- OCI接口简介及其在VC++中的应用(上)
- mybatis动态Sql(if-where)和sql片段
- CI框架集成微信APP支付
- 在VMware vSphere Client下使用Linux虚拟机安装CentOS6.4系统
- bzoj3454 家族(并查集)