MongoDB

原创
2018/08/28 21:04
阅读数 148

MongoDB

mongodb介绍
之前讲的memcached redis都是属于k-v类型的数据库,而mongodb是文档型数据库。一个json就是一个文档。json类似与一个k-v value里面有多多个数组(k-v对)。关于json http://www.w3school.com.cn/json/index.asp
mongodb官网 www.mongodb.com 当前最新版4.0。它是由C++编写,基于分布式的,属于NoSQL的一种。
在NoSQL中是最像关系型数据库的。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON对象。字段值可以包含其他文档,数组及文档数组。因为基于分布式,所以MongoDB很容易扩展。

MongoDB中的集合相当于MySQL中的表。文档相当于MySQL中的行。文档里面的k-y(域)相当于MySQL中的列(字段)

MongoDB安装

epel自带的mongodb版本为2.6,我们需要安装4.0版本
可以参考官方安装文档来下载最新版的MongoDB https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

进入 yum.repos.d目录

[root[@abc](https://my.oschina.net/aaaaaa) ~]# cd /etc/yum.repos.d/

创建mongodb库并添加一些内容

[root[@abc](https://my.oschina.net/aaaaaa) yum.repos.d]# vim mongodb-org-4.0.repo
[root[@abc](https://my.oschina.net/aaaaaa) yum.repos.d]# cat !$
cat mongodb-org-4.0.repo
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

[root[@abc](https://my.oschina.net/aaaaaa) yum.repos.d]# 

查看有关mongodb相关的包

[root[@abc](https://my.oschina.net/aaaaaa) yum.repos.d]# yum list | grep mongodb
collectd-write_mongodb.x86_64            5.8.0-4.el7                   epel     
mongodb.x86_64                           2.6.12-6.el7                  epel     
mongodb-org.x86_64                       4.0.1-1.el7                   mongodb-org-4.0
mongodb-org-mongos.x86_64                4.0.1-1.el7                   mongodb-org-4.0
mongodb-org-server.x86_64                4.0.1-1.el7                   mongodb-org-4.0
mongodb-org-shell.x86_64                 4.0.1-1.el7                   mongodb-org-4.0
mongodb-org-tools.x86_64                 4.0.1-1.el7                   mongodb-org-4.0

安装

[root@abc yum.repos.d]# yum install -y mongodb-org

连接MongoDB

配置文件解析

[root@abc yum.repos.d]# cat /etc/mongod.conf

定义log路径
# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

定义datadir路径
# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

定义监听IP和端口 多个IP用,分开
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.1.180  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.


#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:
[root@abc yum.repos.d]# 

启动MongoDB服务

[root@abc yum.repos.d]# systemctl start mongod
[root@abc yum.repos.d]# !ps
ps aux | grep mongod
mongod   20070 60.0  4.4 1068320 45284 ?       Sl   21:54   0:04 /usr/bin/mongod -f /etc/mongod.conf
root     20108  0.0  0.0 112720   984 pts/0    R+   21:54   0:00 grep --color=auto mongod
[root@abc yum.repos.d]# !netstat
netstat -tlnp | grep mongod
tcp        0      0 192.168.1.180:27017     0.0.0.0:*               LISTEN      20070/mongod        
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      20070/mongod        
[root@abc yum.repos.d]# 

连接mongodb

格式:  mongo --host IP --port 端口

连接时警告

2018-08-26T21:54:11.404+0800 I CONTROL  [initandlisten] 
2018-08-26T21:54:11.404+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-08-26T21:54:11.404+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-08-26T21:54:11.404+0800 I CONTROL  [initandlisten] 
2018-08-26T21:54:11.405+0800 I CONTROL  [initandlisten] 
2018-08-26T21:54:11.405+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-08-26T21:54:11.405+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-08-26T21:54:11.405+0800 I CONTROL  [initandlisten] 

解决

[root@abc yum.repos.d]# echo never >> /sys/kernel/mm/transparent_hugepage/enabled
[root@abc yum.repos.d]# echo never >> /sys/kernel/mm/transparent_hugepage/defrag
[root@abc yum.repos.d]# systemctl restart mongod

之后在登录即可

[root@abc yum.repos.d]# mongo
直接输入mongo登录也行 或者 
[root@abc yum.repos.d]# mongo --host 127.0.0.1 --port 27017

MongoDB用户管理

要创建用户来登录MongoDB,先进入到admin库里再创建新用户

切换库 至 admin库

> use admin
switched to db admin

创建新用户

格式:db.createUser( { user: 用户, pwd: 密码, roles: [ { role: 角色", db: "针对的库" } ] } )

> db.createUser( { user: "lan", pwd: "970823", roles: [ { role: "read", db: "landb" } ] } )
Successfully added user: {
	"user" : "lan",
	"roles" : [
		{
			"role" : "read",
			"db" : "landb"
		}
	]
}
> 

user指定用户,customData为说明字段,可以省略,pwd为密码,roles指定用户的角色,db指定库名

列出当前库下所有用户

> show users
{
	"_id" : "test.admin",
	"user" : "admin",
	"db" : "test",
	"customData" : {
		"description" : "superuser"
	},
	"roles" : [
		{
			"role" : "root",
			"db" : "admin"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
{
	"_id" : "test.lan",
	"user" : "lan",
	"db" : "test",
	"roles" : [
		{
			"role" : "read",
			"db" : "landb"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
> 

列出所有用户,须切换admin库下使用

格式:db.system.users.find()

> use admin    切换到admin库下
switched to db admin

> db.system.users.find()  
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "AH6WtMoX2KTU2+XqkHAUsA==", "storedKey" : "pqgYQv1TAWdqeIcu3NTrTS3TxGw=", "serverKey" : "DjF/zdOrcVwwogJMIRwgdDbyIJY=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "RNLMzq80VCtbb5AGM2H7X1FP6Wb6HQRYnCHbhQ==", "storedKey" : "ezXm0EB3lmKgCG/5O7U9N9HtC0VyEx5z+2lQVC0yRYs=", "serverKey" : "YZdZ5grEw01W/bA6/mn49rg9g9+YpKCYWquugutB3cs=" } }, "customData" : { "description" : "superuser" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

删除用户

格式:db.dropUser('用户名')

> db.createUser({user:"test1",pwd:"123",roles:[{role:"read",db:"db1"}]}) 
Successfully added user: {
    "user" : "test1",
    "roles" : [
        {
            "role" : "read",
            "db" : "db1"
        }
    ]
}

> db.dropUser('test1')
true

创建了一个test1针对db1库的新用户 

命令行来验证用户身份

格式:db.auth("用户", "密码")

> db.auth("lan","970823")
1
>

切换到db1,没有该库会创建

> use db1
switched to db db1

创建tes1用户 对db1库读写,对db2库只读

 db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )
Successfully added user: {
    "user" : "test1",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "db1"
        },
        {
            "role" : "read",
            "db" : "db2"
        }
    ]
}

验证身份后test1用户才可以去db2来创建数据

MongoDB用户角色

参数					  含义
Read					允许用户读取指定数据库
readWrite				允许用户读写指定数据库
dbAdmin					允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin				允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin			只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase			只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase	只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase	只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase		只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
root					只在admin数据库中可用。超级账号,超级权限

编辑启动脚本

[root@abc yum.repos.d]# vim /usr/lib/systemd/system/mongod.service

定位OPTIONS=那行
修改前  Environment="OPTIONS=-f /etc/mongod.conf"
修改后  Environment="OPTIONS=--auth -f /etc/mongod.conf"

重启服务
[root@abc yum.repos.d]# systemctl daemon-reload
[root@abc yum.repos.d]# systemctl restart mongod

用户验证登录

格式:mongo -u用户名 -p密码 --authenticationDatabase 登录的数据库

[root@abc yum.repos.d]# mongo -u 'admin' -p '970823' --authenticationDatabase "admin"
MongoDB shell version v4.0.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.1

MongoDB创建集合、数据管理

创建集合

格式:db.createCollection(name,options)

> db.createCollection("mycol", { capped : true, size : 6142800, max : 10000 } )
{ "ok" : 1 }

name就是集合的名字,options可选,用来配置集合的参数,参数如下
capped true/false (可选)如果为true,则启用封顶集合。封顶集合是固定大小的集合,当它达到其最大大小,会自动覆盖最早的条目。如果指定true,则也需要指定尺寸参数。
autoindexID true/false (可选)如果为true,自动创建索引_id字段的默认值是false。
size (可选)指定最大大小字节封顶集合。如果封顶如果是 true,那么你还需要指定这个字段。单位B
max (可选)指定封顶集合允许在文件的最大数量。

查看集合

格式:show tables 或者 show collections

> show tables
mycol
> show collections
mycol

添加文档

格式:db.集合名.insert({key:value,...})

> db.mycol1.insert({AccountID:1,UserName:"123",password:"123456"})
WriteResult({ "nInserted" : 1 })
如果集合不存在,直接插入数据,则mongodb会自动创建集合

更新文档

格式:db.mycol1.update({key:value},{"$set":{key:value}})

> db.mycol1.update({"AccountID":1},{"$set":{"Age":20}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

查看所有文档

格式:db.集合名.find()

> db.mycol1.find()
{ "_id" : ObjectId("5b82d04837486aa401067398"), "AccountID" : 1, "UserName" : "123", "password" : "123456", "Age" : 20 }

根据条件查询文档

格式:db.集合名.find({key:value})

> db.mycol1.find({"password" : "123456"})
{ "_id" : ObjectId("5b82d04837486aa401067398"), "AccountID" : 1, "UserName" : "123", "password" : "123456", "Age" : 20 }

根据条件删除文档

格式:db.集合名.remove({key:value})

> db.mycol1.remove({AccountID:1}) 
WriteResult({ "nRemoved" : 1 })

删除该集合

格式:db.集合名.drop()

> db.mycol1.drop()
true

> show tables  
mycol

mycol1集合没有了

查看所有集合的状态

格式:db.printCollectionStats()

> db.printCollectionStats()  
mycol
{
    "ns" : "db1.mycol",
    "size" : 80,
    "count" : 1,
    "avgObjSize" : 80,
    "storageSize" : 16384,
    "capped" : true,
    "max" : 10000,
    "maxSize" : 6142976,
    "sleepCount" : 0,
    "sleepMS" : 0,
    "wiredTiger" : {
        "metadata" : {
            "formatVersion" : 1
        },

查看版本

格式:  db.version()

> db.version()
4.0.1

切换数据库

如不存在,即创建此库
格式: user  数据库  

> use db2
switched to db db2

列出所有数据库

格式: show dbs

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> 

查看当前库的信息

格式:db.stats()

> db.stats()
{
    "db" : "db1",
    "collections" : 1,
    "views" : 0,
    "objects" : 1,
    "avgObjSize" : 80,
    "dataSize" : 80,
    "storageSize" : 16384,
    "numExtents" : 0,
    "indexes" : 1,
    "indexSize" : 16384,
    "fsUsedSize" : 6458290176,
    "fsTotalSize" : 19102957568,
    "ok" : 1
}

删除当前库 使用root角色登录

格式:db.dropDatabase()

> use db2
switched to db db2
> db.dropDatabase()
{ "ok" : 1 }

查看MongoDB服务器状态 使用root角色登录

> db.serverStatus()  
{
    "host" : "kun03",
    "version" : "4.0.1",
    "process" : "mongod",
    "pid" : NumberLong(1494),
    "uptime" : 7621,
    "uptimeMillis" : NumberLong(7620755),
    "uptimeEstimate" : NumberLong(7620),
    "localTime" : ISODate("2018-08-23T15:01:27.002Z"),
    "asserts" : {
        "regular" : 0,
        "warning" : 0,
        "msg" : 0,
        "user" : 38,
        "rollovers" : 0
    },

php的MongoDB扩展

php要连接MongoDB是需要安装模块的,和memcached,redis一样。但MongoDB的模块有两个,一个是mongodb.so,另一个是mongo.so。两个的区别是mongo.so是旧版本,只支持php5版本。mongodb.so会逐步代替mongo.so。参考文档 https://docs.mongodb.com/ecosystem/drivers/php/
这里安装mongodb.so有两个途径,一是去官方下载源码包,另一种是去github上克隆mongodb的库到本地来下载。

下载并解压包

[root@abc src]#  wget https://pecl.php.net/get/mongodb-1.3.0.tgz
[root@abc src]# tar zxvf mongodb-1.3.0.tgz 

进入目录 生成configure

[root@abc src]# cd mongodb-1.3.0
[root@abc mongodb-1.3.0]# /usr/local/php-fpm/bin/phpize 
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226

初始化

[root@abc src]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config

安装编译

[root@abc mongodb-1.3.0]# make
[root@abc mongodb-1.3.0]# make install

加载扩展模块

[root@abc mongodb-1.3.0]# vim /usr/local/php-fpm/etc/php.ini 

extension=mongodb.so

查看是否加载成功

[root@abc mongodb-1.3.0]# /usr/local/php-fpm/bin/php -m | grep mongodb
mongodb
[root@abc mongodb-1.3.0]# 

重启服务

[root@abc mongodb-1.3.0]# /etc/init.d/php-fpm restart

php的mongo扩展

下载包并解压

[root@abc src]# wget https://pecl.php.net/get/mongo-1.6.16.tgz
[root@abc src]# tar zxvf mongo-1.6.16.tgz

生成configure

[root@abc mongo-1.6.16]# /usr/local/php-fpm/bin/phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[root@abc mongo-1.6.16]# 

初始化

[root@abc mongo-1.6.16]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config 

安装编译

[root@abc mongo-1.6.16]# make
[root@abc mongo-1.6.16]# make install

加载扩展模块

[root@abc mongo-1.6.16]# vim /usr/local/php-fpm/etc/php.ini 
[root@abc mongo-1.6.16]# cat !$ | grep mongo.so
cat /usr/local/php-fpm/etc/php.ini | grep mongo.so
extension=mongo.so
[root@abc mongo-1.6.16]# 

是否加载成功

[root@abc mongo-1.6.16]# /usr/local/php-fpm/bin/php -m | grep mongo
mongo
mongodb
[root@abc mongo-1.6.16]# 

重启服务

[root@abc mongo-1.6.16]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done
[root@abc mongo-1.6.16]# 

测试:

新建代码

[root@abc extra]# cat  /data/wwwroot/abc.com/mongodb-php.html 
<?php
$m = new MongoClient(); // 连接
$db = $m->test; // 获取名称为 "test" 的数据库
$collection = $db->createCollection("runoob");
echo "集合创建成功";
?>
[root@abc extra]# 

[root@abc extra]# curl localhost/mongo.php
集合创建成功

[root@abc extra]# mongo

> use test
switched to db test
> show tables
runoob

MongoDB副本集介绍

mongodb早期版本是使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主。
目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主。在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据。主要让它来判断谁来替代主,防止脑裂。
在此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server。

mongodb副本集类似于MySQL主从,MySQL主从主宕机后要手动配置,mongodb副本集主宕机后从会自动顶上。

副本集搭建

主:abc 192.168.1.180 primary
从:abc2 192.168.1.190 secondary
从:abc3 192.168.1.191 secondary

需要三台机器安装好MongoDB 并修改参数

[root@abc ~]# vim /etc/mongod.conf

bindIp: 127.0.0.1,192.168.1.180

replication:
  oplogSizeMB: 20
  replSetName: lan
  
bindIp后面添加本机内网ip,用逗号分开
oplogSizeMB定义oplog大小 前面空两格
replSetName定义副本集名字 前面空两格

三台机器启动MongoDB

systemctl start mongod

在 主 上连接MongoDB

mongo

配置副本集数据

> config={_id:"lan",members:[{_id:0,host:"192.168.1.180:27017"},{_id:1,host:"192.168.1.190:27017"},{_id:2,host:"192.168.1.191:27017"}]}

初始化数据

> rs.initiate(config)

查看副本集

命令: rs.status()

>rs.status()
{
    "set" : "lan",
    "date" : ISODate("2018-08-28 T19:19:06.348Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "syncingTo" : "",

MongoDB副本集测试

在 主 上建库 建立集合

lan:PRIMARY> use dbtest  ##建立dbtest库

lan:PRIMARY> db.test.insert({AccountID:1,UserName:"123",password:"123456"})  ##创建test集合

去从上登录MongoDB并查看库

lan:SECONDARY> show dbs
"errmsg" : "not master and slaveOk=false", ##显示slaveOk=false的错误

lan:SECONDARY> rs.slaveOk()

lan:SECONDARY> show dbs
admin   0.000GB
config  0.000GB
dbtest  0.000GB
local   0.000GB
test    0.000GB

查看集合及数据

lan:SECONDARY> use dbtest
switched to db dbtest
lan:SECONDARY> show tables
test

可见从库有主库的数据  搭建成功

副本集更改权重模拟主宕机

在刚刚配置完副本集时所有机器的权重都是1,我们可以设置权重最高的为主,还能够让主宕机后,第二高的权重来顶替主

在主机器上登录MongoDB

lan:PRIMARY> cfg = rs.conf()

lan:PRIMARY> cfg.members[0].priority = 3  

lan:PRIMARY> cfg.members[1].priority = 2

lan:PRIMARY> cfg.members[2].priority = 1

lan:PRIMARY> rs.reconfig(cfg)  ##初始化数据

输入如上命令

查看权重

lan:PRIMARY> cfg
{
    "_id" : "lan",
    "version" : 2,
    "protocolVersion" : NumberLong(1),
    "writeConcernMajorityJournalDefault" : true,
    "members" : [
        {
            "_id" : 0,
            "host" : "192.168.1.180:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 3,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 1,
            "host" : "192.168.1.190:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 2,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 2,
            "host" : "192.168.1.191:27017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        }
    ],
abc权重为3  abc2权重为2  abc3 权重为1

模拟abc宕机 观察主是否切换到 abc2 上

[root@abc ~]# iptables -I INPUT -p tcp --dport 27017 -j DROP

在abc2上登录MongoDB

lan:PRIMARY>

已变为 主

MongoDB分片介绍

分片就是将数据库进行拆分,将大型集合分隔到不同服务器上。比如,本来100G的数据,可以分割成10份存储到10台服务器上,这样每台机器只有10G的数据。
通过一个mongos的进程(路由)实现分片后的数据存储与访问,也就是说mongos是整个分片架构的核心,对客户端而言是不知道是否有分片的,客户端只需要把读写操作转达给mongos即可。
虽然分片会把数据分隔到很多台服务器上,但是每一个节点都是需要有一个备用角色的,这样能保证数据的高可用。
当系统需要更多空间或者资源的时候,分片可以让我们按需方便扩展,只需要把mongodb服务的机器加入到分片集群中即可。

mongos: 数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
config server: 配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,防止数据丢失!
shard: 存储了一个集合部分数据的MongoDB实例,每个分片是单独的mongodb服务或者副本集,在生产环境中,所有的分片都应该是副本集。

分片就是把数据进行拆分,分片的下级就是副本集。分片中三个成员,mongos请求入口,把请求分发给shard上。config server存储配置数据。shard存储MongoDB实例的数据。为了安全三者都应该作副本集。

MongoDB分片搭建

准备工作

三台机器 
abc 192.168.1.180 
abc2 192.168.1.190 
abc3 192.168.1.191 
abc搭建:mongos、config server、副本集1主节点、副本集2仲裁、副本集3从节点
abc2搭建:mongos、config server、副本集1从节点、副本集2主节点、副本集3仲裁
abc3搭建:mongos、config server、副本集1仲裁、副本集2从节点、副本集3主节点
端口分配:mongos 20000、config 21000、副本集1 27001、副本集2 27002、副本集3 27003
三台机器全部关闭firewalld服务和selinux,或者增加对应端口的规则

三台机器分别创建目录

[root@abc ~]# mkdir -p /data/mongodb/mongos/log
[root@abc ~]# mkdir -p /data/mongodb/config/{data,log}
[root@abc ~]# mkdir -p /data/mongodb/shard1/{data,log}
[root@abc ~]# mkdir -p /data/mongodb/shard2/{data,log}
[root@abc ~]# mkdir -p /data/mongodb/shard3/{data,log}

配置 config server

以下操作需要三台机器都操作一遍

创建mongodb目录

[root@abc ~]# mkdir /etc/mongod/

创建config.conf配置文件

[root@abc ~]# vim /etc/mongod/config.conf

pidfilepath = /var/run/mongodb/configsrv.pid
dbpath = /data/mongodb/config/data
logpath = /data/mongodb/config/log/congigsrv.log
logappend = true
bind_ip = 192.168.1.180 ##0.0.0.0可以监听全网ip,不完全
port = 21000
fork = true
configsvr = true #declare this is a config db of a cluster;
replSet=configs  #副本集名称
maxConns=20000  #设置最大连接数

启动config server 服务

[root@abc ~]# mongod -f /etc/mongod/config.conf

[root@abc ~]# netstat -lntp |grep mongo  ##查看是否监听21000
tcp        0      0 192.168.1.180:21000    0.0.0.0:*               LISTEN      1427/mongod

在任意一台机器登录mongodb的21000端口

[root@abc ~]# mongo --host 192.168.1.180 --port 21000

建立config server 副本集

> config = { _id: "configs", members: [ {_id : 0, host : "192.168.1.180:21000"},{_id : 1, host : "192.168.1.190:21000"},{_id : 2, host : "192.168.1.191:21000"}] }

初始化数据

> rs.initiate(config)

配置shard

三台机器都需做如下操作

分别创建 shard1.conf shard2.conf shard3.conf 配置文件

[root@abc ~]# vim /etc/mongod/shard1.conf

pidfilepath = /var/run/mongodb/shard1.pid
dbpath = /data/mongodb/shard1/data
logpath = /data/mongodb/shard1/log/shard1.log
logappend = true
bind_ip = 192.168.1.180
port = 27001
fork = true
replSet=shard1 #副本集名称
shardsvr = true #declare this is a shard db of a cluster;
maxConns=20000 #设置最大连接数

[root@abc ~]# vim /etc/mongod/shard2.conf

pidfilepath = /var/run/mongodb/shard2.pid
dbpath = /data/mongodb/shard2/data
logpath = /data/mongodb/shard2/log/shard2.log
logappend = true
bind_ip = 192.168.1.180
port = 27002
fork = true
replSet=shard2 #副本集名称
shardsvr = true #declare this is a shard db of a cluster;
maxConns=20000 #设置最大连接数

[root@abc ~]# vim /etc/mongod/shard3.conf

pidfilepath = /var/run/mongodb/shard3.pid
dbpath = /data/mongodb/shard3/data
logpath = /data/mongodb/shard3/log/shard3.log
logappend = true
bind_ip = 192.168.1.180
port = 27003
fork = true
replSet=shard3 #副本集名称
shardsvr = true #declare this is a shard db of a cluster;
maxConns=20000 #设置最大连接数

启动shard1服务

[root@abc ~]# mongod -f /etc/mongod/shard1.conf

在abc机器登录mongodb

[root@abc ~]# mongo --host 192.168.1.180 --port 27001

建立shard1的副本集

> use admin

> config = { _id: "shard1", members: [ {_id : 0, host : "192.168.1.180:27001"}, {_id: 1,host : "192.168.1.190:27001"},{_id : 2, host : "192.168.1.191:27001",arbiterOnly:true}] }

> rs.initiate(config)

abc为主节点 abc2为从节点 abc3为仲裁

启动shard2服务

[root@abc ~]# mongod -f /etc/mongod/shard2.conf

在abc2中登录mongodb

[root@abc2 ~]# mongo --host 192.168.1.190 --port 27002

建立shard2的副本集

> use admin

> config = { _id: "shard2", members: [ {_id : 0, host : "192.168.1.180:27002",arbiterOnly:true}, {_id: 1,host : "192.168.1.190:27002"},{_id : 2, host : "192.168.1.191:27002"}] }

> rs.initiate(config)

abc为仲裁 abc2为主节点 abc3为从节点

启动shard3服务

[root@abc ~]# mongod -f /etc/mongod/shard3.conf

在abc3上登录mongodb

[root@abc3 ~]# mongo --host 192.168.1.191 --port 27003

建立shard3的副本集

> use admin

> config = { _id: "shard3", members: [ {_id : 0, host : "192.168.1.180:27003"}, {_id: 1,host : "192.168.1.190:27003",arbiterOnly:true},{_id : 2, host : "192.168.1.191:27003"}] }

> rs.initiate(config)

abc为从节点 abc2为仲裁 abc3为主节点

配置mongos

三台机器都需做如下操作

创建mongos.conf配置文件并添加参数

vim /etc/mongod/mongos.conf

pidfilepath = /var/run/mongodb/mongos.pid
logpath = /data/mongodb/mongos/log/mongos.log
logappend = true
bind_ip = 192.168.1.180
port = 20000
fork = true
configdb = configs/192.168.1.180:21000,192.168.1.190:21000,192.168.1.191:21000 #监听的配置服务器,只能有1>个或>者3个,configs为配置服务器的副本集名字
maxConns=20000 #设置最大连接数

启动mongos服务

[root@abc ~]# mongos -f /etc/mongod/mongos.conf

登录mongodb 2000端口

[root@abc ~]# mongo --host 192.168.1.180 --port 20000

串联所有分片和路由

mongos> sh.addShard("shard1/192.168.1.180:27001,192.168.1.190:27001,192.168.1.191:27001")

mongos> sh.addShard("shard2/192.168.1.180:27002,192.168.1.190:27002,192.168.1.191:27002")

mongos> sh.addShard("shard3/192.168.1.180:27003,192.168.1.190:27003,192.168.1.191:27003")

查看分片状态

命令:sh.status()

mongos> sh.status()
--- Sharding Status ---
  sharding version: {
      "_id" : 1,
      "minCompatibleVersion" : 5,
      "currentVersion" : 6,
      "clusterId" : ObjectId("5b820k7g3b7dc181df78qn9a")
  }
  shards:
        {  "_id" : "shard1",  "host" : "shard1/192.168.1.180:27001,192.168.1.190:27001",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/192.168.1.190:27002,192.168.1.191:27002",  "state" : 1 }
        {  "_id" : "shard3",  "host" : "shard3/192.168.1.180:27003,192.168.1.191:27003",  "state" : 1 }

MongoDB分片测试

建立数据在分片中,看看是否平均分配至各个节点(分片)中

登录mongodb 2000端口

[root@abc ~]# mongo --host 192.168.1.180 --port 20000

mongos> use admin

指定分片的数据库

mongos> sh.enableSharding("landb")

指定分片的集合

mongos> sh.shardCollection("landb.table1",{"id":1} )

插入数据

mongos> use  landb

mongos>  for (var i = 1; i <= 10000; i++) db.table1.save({id:i,"test1":"testval1"})

查看分片情况

mongos> sh.status()

db.table1.stats()   
查看table1状态

MongoDB备份恢复

备份指定库

命令:mongodump --host IP地址 --port 端口 -d 指定备份的库 -o 备份到的目录

[root@abc ~]# mongodump --host 192.168.1.180 --port 20000 -d testdb -o /tmp/mongodbbak

备份后的目录中会生成要备份指定库的目录,库的目录中会有该库中集合的数据,每个集合都会有两个文件,其中bson文件是真正的数据。json文件是可以查看的数据。

[root@abc ~]# ls /tmp/mongodbbak/
testdb
[root@abc ~]# ls /tmp/mongodbbak/testdb/
table1.bson  table1.metadata.json

备份所有库

命令:mongodump --host IP地址 --port 端口 -o 备份到的目录

[root@abc ~]# mongodump --host 192.168.1.180 --port 20000 -o /tmp/mongodbbak1

备份指定集合

命令:mongodump --host IP地址 --port 端口 -d 指定备份的库 -c 指定备份的库 -o 备份到的目录

[root@abc ~]# mongodump --host 192.168.1.180 --port 20000 -d testdb -c table1 -o /tmp/mongodbbak2

备份指定集合为json文件

命令:mongoexport --host IP地址 --port 端口 -d 指定备份的库 -c 指定备份的库 -o 备份为的json文件

[root@abc ~]# mongoexport --host 192.168.1.180 --port 20000 -d testdb -c table1 -o /tmp/table.json

恢复所有库

命令:mongorestore --host IP地址 --port 端口 备份好的目录

mongorestore --host IP地址 --port 端口 [--drop] 备份好的目录
--drop可选,意思是当恢复之前先把之前的数据删除,不建议使用

[root@abc ~]# mongorestore --host 192.168.1.180 --port 20000 /tmp/mongodbbak1/

恢复指定库

命令:mongorestore --host IP地址 --port 端口 -d 指定恢复的库 备份好的库目录

[root@abc ~]# mongorestore --host 192.168.1.180 --port 20000 -d testdb /tmp/mongodbbak1/testdb/

恢复指定集合

命令:mongorestore --host IP地址 --port 端口 -d 指定恢复的库 -c 指定恢复的集合 备份好的目录中的bson文件

[root@abc ~]# mongorestore --host 192.168.1.180 --port 20000 -d testdb -c table1 /tmp/mongodbbak1/testdb/table1.bson

使用json文件来恢复集合

命令:mongoimport --host IP地址 --port 端口 -d 指定恢复的库 -c 指定恢复的集合 --file 指定备份好的json文件

[root@abc ~]# mongoimport --host 192.168.1.180 --port 20000 -d testdb -c table1 --file /tmp/table.json

扩展

mongodb安全设置 http://www.mongoing.com/archives/631
mongodb执行js脚本 http://www.jianshu.com/p/6bd8934bd1ca
展开阅读全文
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部