本文主要介绍 MongoDB 的安装,使用到的软件版本:MongoDB 5.0.5、Centos 7.6。
1、单机安装
1.1、下载并解压 MongoDB
下载地址:https://www.mongodb.com/try/download/community
解压:tar zxvf mongodb-linux-x86_64-rhel70-5.0.5.tgz
1.2、创建数据及日志目录
cd $MONGODB_HOME
mkdir data
mkidr logs
1.3、启动
cd $MONGODB_HOME/bin
./mongod --bind_id 10.40.96.10,127.0.0.1 --dbpath ../data --logpath ../logs/mongod.log --fork
--dbpath:数据存储目录
--logpath:日志文件
mongod 命令的更多参数可使用 mongod -h 来查看。
1.4、停止
通过 mongo 连接 MongoDB 的服务,然后执行停止的命令。
复制代码
cd $MONGODB_HOME/bin
./mongo
> use admin
switched to db admin
> db.shutdownServer()
复制代码
2、Master-Slave 主从方式安装
主从方式安装时先启动主机节点,再启动被备节点;启动方式如下:
./mongod --master --bind_ip <ip> --dbpath <dbpath> --logpath <logapth> #主节点
./mongod --slave --bind_ip <ip> --source <masterip:masterport> --dbpath <dbpath> --logfile <logfile> #备节点
新版的 MongoDB 已经不支持这种部署模式了(运行时会提示:Master/slave replication is no longer supported),这里就不详细介绍了。
3、Replica Set 副本集方式安装
3.1、规划
ip | 端口 | 角色 | MongoDB安装目录 |
10.49.196.10 | 27017 | Primary | /home/hadoop/app/mongodb-5.0.5 |
10.49.196.11 | 27017 | Secondary | /home/hadoop/app/mongodb-5.0.5 |
10.49.196.12 | 27017 | Secondary | /home/hadoop/app/mongodb-5.0.5 |
10.49.196.12 | 27018 | Arbiter | /home/hadoop/app/mongodb-5.0.5-27018 |
3.2、配置
使用配置文件来启动 MongoDB,各 MongoDB 实例的配置文件(mongod.conf)如下:
10.49.196.10:27017
dbpath=/home/hadoop/app/mongodb-5.0.5/data
logpath=/home/hadoop/app/mongodb-5.0.5/logs/mongo.log
fork=true
replSet=rs0
bind_ip=127.0.0.1,10.49.196.10
10.49.196.11:27017
dbpath=/home/hadoop/app/mongodb-5.0.5/data
logpath=/home/hadoop/app/mongodb-5.0.5/logs/mongo.log
fork=true
replSet=rs0
bind_ip=127.0.0.1,10.49.196.11
10.49.196.12:27018
dbpath=/home/hadoop/app/mongodb-5.0.5/data
logpath=/home/hadoop/app/mongodb-5.0.5/logs/mongo.log
fork=true
replSet=rs0
bind_ip=127.0.0.1,10.49.196.12
10.49.196.12:27018
复制代码
dbpath=/home/hadoop/app/mongodb-5.0.5-27018/data
logpath=/home/hadoop/app/mongodb-5.0.5-27018/logs/mongo.log
fork=true
replSet=rs0
port=27018
bind_ip=127.0.0.1,10.49.196.12
复制代码
注:数据目录和日志目录需要自己创建。
3.3、启动
在各机器机器上使用如下命令来启动 MongoDB:
cd $MONGODB_HMOE/bin
./mongod --config ./mongod.conf
3.4、初始化 Replica Set
连接 Primary,Secondary 的任一节点,执行初始化操作:
> use admin
> cfg = {_id: "rs0",members:[{_id: 0,host: '10.49.196.10:27017',priority: 3},{_id: 1,host: '10.49.196.11:27017',priority: 2},{_id: 2,host: '10.49.196.12:27017',priority: 1},{_id: 3,host: '10.49.196.12:27018',arbiterOnly: true}]};
> rs.initiate(cfg)
最外层的 _id 表示 Replica Set 的名字,members 里包含所有节点的地址以及优先级;优先级最高成为主节点。对于仲裁节点,需要设置:arbiterOnly:true。
3.5、查看状态
rs0:PRIMARY> rs.status()
3.6、使 Secondary 可读
默认情况下 Secondary 不可写,不可读;可通过执行 rs.slaveOk() (新版已过期) 或 rs.secondaryOk() 来使 Secondary 可读:
rs0:SECONDARY> rs.secondaryOk()
4、Sharding 分片方式安装
4.1、规划
ip | 端口 | 角色 | MongoDB安装目录 |
10.49.196.10 | 27011 | Router(mongos) | /home/hadoop/app/mongodb-5.0.5-27011-mongos |
27012 | Config Server(config Primary) | /home/hadoop/app/mongodb-5.0.5-27012-config | |
27013 | Shard(shard1 Secondary) | /home/hadoop/app/mongodb-5.0.5-27013-shard1 | |
27014 | Shard(shard2 Secondary) | /home/hadoop/app/mongodb-5.0.5-27014-shard2 | |
10.49.196.11 | 27011 | Router(mongos) | /home/hadoop/app/mongodb-5.0.5-27011-mongos |
27012 | Config Server(config Secondary) | /home/hadoop/app/mongodb-5.0.5-27012-config | |
27013 | Shard(shard1 Primary) | /home/hadoop/app/mongodb-5.0.5-27013-shard1 | |
27014 | Shard(shard2 Secondary) | /home/hadoop/app/mongodb-5.0.5-27014-shard2 | |
10.49.196.12 | 27011 | Router(mongos) | /home/hadoop/app/mongodb-5.0.5-27011-mongos |
27012 | Config Server(config Secondary) | /home/hadoop/app/mongodb-5.0.5-27012-config | |
27013 | Shard(shard1 Secondary) | /home/hadoop/app/mongodb-5.0.5-27013-shard1 | |
27014 | Shard(shard2 Primary) | /home/hadoop/app/mongodb-5.0.5-27014-shard2 |
4.2、启动 Config Server
A、使用如下命令启动 config 的各个节点:
./mongod --config ./mon.conf
各节点配置文件 mon.conf 的内容如下:
10.49.196.10:27012
复制代码
dbpath=/home/hadoop/app/mongodb-5.0.5-27013-config/data
logpath=/home/hadoop/app/mongodb-5.0.5-27012-config/logs/mon.log
fork=true
replSet=config
bind_ip=127.0.0.1,10.49.196.10
port=27012
configsvr=true
复制代码
10.49.196.11:27012
复制代码
dbpath=/home/hadoop/app/mongodb-5.0.5-27013-config/data
logpath=/home/hadoop/app/mongodb-5.0.5-27012-config/logs/mon.log
fork=true
replSet=config
bind_ip=127.0.0.1,10.49.196.11
port=27012
configsvr=true
复制代码
10.49.196.12:27012
复制代码
dbpath=/home/hadoop/app/mongodb-5.0.5-27013-config/data
logpath=/home/hadoop/app/mongodb-5.0.5-27013-config/logs/mon.log
fork=true
replSet=config
bind_ip=127.0.0.1,10.49.196.12
port=27012
configsvr=true
复制代码
B、初始化副本集 config
登录任一节点(./mong --port 27012)执行如下命令:
> use admin
> cfg = {_id: "config",members:[{_id: 1,host: '10.49.196.10:27012',priority: 3},{_id: 2,host: '10.49.196.11:27012',priority: 1},{_id: 3,host: '10.49.196.12:27012',priority: 2}]};
> rs.initiate(cfg)
4.3、启动 Shard
4.3.1、启动 shard1
A、使用如下命令启动 shard1 的各个节点:
./mongod --config ./mon.conf
各节点配置文件 mon.conf 的内容如下:
10.49.196.10:27013
复制代码
dbpath=/home/hadoop/app/mongodb-5.0.5-27013-shard1/data
logpath=/home/hadoop/app/mongodb-5.0.5-27013-shard1/logs/mon.log
fork=true
replSet=shard1
bind_ip=127.0.0.1,10.49.196.10
port=27013
shardsvr=true
复制代码
10.49.196.11:27013
复制代码
dbpath=/home/hadoop/app/mongodb-5.0.5-27013-shard1/data
logpath=/home/hadoop/app/mongodb-5.0.5-27013-shard1/logs/mon.log
fork=true
replSet=shard1
bind_ip=127.0.0.1,10.49.196.11
port=27013
shardsvr=true
复制代码
10.49.196.12:27013
复制代码
dbpath=/home/hadoop/app/mongodb-5.0.5-27013-shard1/data
logpath=/home/hadoop/app/mongodb-5.0.5-27013-shard1/logs/mon.log
fork=true
replSet=shard1
bind_ip=127.0.0.1,10.49.196.12
port=27013
shardsvr=true
复制代码
B、初始化 shard1
登录任一节点(./mong --port 27013)执行如下命令:
> use admin
> cfg = {_id: "shard1",members:[{_id: 1,host: '10.49.196.10:27013',priority: 2},{_id: 2,host: '10.49.196.11:27013',priority: 3},{_id: 3,host: '10.49.196.12:27013',priority: 1}]};
> rs.initiate(cfg)
4.3.2、启动 shard2
A、使用如下命令启动 shard2 的各个节点:
./mongod --config ./mon.conf
各节点配置文件 mon.conf 的内容如下:
10.49.196.10:27014
复制代码
dbpath=/home/hadoop/app/mongodb-5.0.5-27014-shard2/data
logpath=/home/hadoop/app/mongodb-5.0.5-27014-shard2/logs/mon.log
fork=true
replSet=shard2
bind_ip=127.0.0.1,10.49.196.10
port=27014
shardsvr=true
复制代码
10.49.196.11:27014
复制代码
dbpath=/home/hadoop/app/mongodb-5.0.5-27014-shard2/data
logpath=/home/hadoop/app/mongodb-5.0.5-27014-shard2/logs/mon.log
fork=true
replSet=shard2
bind_ip=127.0.0.1,10.49.196.11
port=27014
shardsvr=true
复制代码
10.49.196.12:27014
复制代码
dbpath=/home/hadoop/app/mongodb-5.0.5-27014-shard2/data
logpath=/home/hadoop/app/mongodb-5.0.5-27014-shard2/logs/mon.log
fork=true
replSet=shard2
bind_ip=127.0.0.1,10.49.196.12
port=27014
shardsvr=true
复制代码
B、初始化 shard2
登录任一节点(./mong --port 27014)执行如下命令:
> use admin
> cfg = {_id: "shard2",members:[{_id: 1,host: '10.49.196.10:27014',priority: 1},{_id: 2,host: '10.49.196.11:27014',priority: 2},{_id: 3,host: '10.49.196.12:27014',priority: 3}]};
> rs.initiate(cfg)
4.3、启动 Route
这里以启动一个 Route 为例来演示,其他的 Route 都是类似的操作。
1、使用如下命令启动 Route:
./mongos -f ./mon.conf
配置文件 mon.conf 的内容如下:
logpath=/home/hadoop/app/mongodb-5.0.5-27011-mongos/logs/mon.log
fork=true
bind_ip=127.0.0.1,10.49.196.10
port=27011
configdb=config/10.49.196.10:27012,10.49.196.11:27012,10.49.196.12:27012 #对应配置的副本集
2、配置 Sharding
./mongo --port 27011
mongos> use admin
mongos> sh.addShard("shard1/10.49.196.10:27013,10.49.196.12:27013,10.49.196.12:27013");
mongos> sh.addShard("shard2/10.49.196.10:27014,10.49.196.12:27014,10.49.196.12:27014");
3、查看集群状态
mongos> sh.status()
4、查看分片信息
mongos> use config
mongos> db.shards.find()
5、查看 chunk 信息
mongos> use config
mongos> db.chunks.find()
6、指定使用分片的数据库
mongos> sh.enableSharding("testdb")
7、hash 分片例子
先指定分片的集合和片键
mongos> use testdb
mongos> db.createCollection('col1')
mongos> sh.enableSharding("testdb")
mongos> sh.shardCollection("testdb.col1", {"name":"hashed"})
往集合中插入数据:
mongos> for(i=1;i<=1000;i++){db.col1.insert({"id":i,"name":"test" + i})};
查看集合的统计信息:
复制代码
mongos> db.col1.find()
...
"shards" : {
"shard2" : {
"ns" : "testdb.col1",
"size" : 24274,
"count" : 468,
"avgObjSize" : 51,
"storageSize" : 28672,
"freeStorageSize" : 0,
"capped" : false,
...
"shard1" : {
"ns" : "testdb.col1",
"size" : 27619,
"count" : 532,
"avgObjSize" : 51,
"storageSize" : 32768,
...
复制代码
可以看到分片 shard2 上有 468 条记录,shard1 上有 532 条记录。
8、范围分片例子
先指定分片的集合和片键
mongos> use testdb
mongos> db.createCollection('col2')
mongos> sh.enableSharding("testdb")
mongos> sh.shardCollection("testdb.col2", {"x":1})
往集合中插入数据:
mongos> for(i=1;i<=1000;i++){db.col2.insert({"x":i,"name":"test" + i})};