数据库分类: RDBMS NoSQL NewSQL

**基础—-> **介绍

适合存储海量数据,非常适合存储 历史数据表,日志类,压缩比高。 MongoDB是一个基于分布式文件存储的开源文档数据库。旨在为WEB应用提供高性能、高可用性和高伸缩数据存储解决方案。
平滑升级,平滑添加节点,不需要人为干预。

数据结构:

insert({
id  :  1
name: zs
})

{
id  :  1
name: zs
}

第一章:逻辑结构

Mongodb 逻辑结构             		MySQL逻辑结构
库database								        库
集合(collection)							  	表
文档(document)									数据行
  • MongoDB数据关系图

第二章:安装部署

2.1 系统准备

(1)redhat或centos6.2以上系统
(2)系统开发包完整
(3)ip地址和hosts文件解析正常
(4)iptables防火墙&SElinux关闭
(5)关闭大页内存机制
########################################################################

#root用户下
在vi /etc/rc.local最后添加如下代码
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
		
cat  /sys/kernel/mm/transparent_hugepage/enabled		
cat /sys/kernel/mm/transparent_hugepage/defrag	

其他系统关闭参照官方文档:	
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
---------------

  
###############为什么要关闭?################
Transparent Huge Pages (THP) is a Linux memory management system 
that reduces the overhead of Translation Lookaside Buffer (TLB) 
lookups on machines with large amounts of memory by using larger memory pages.
However, database workloads often perform poorly with THP, 
because they tend to have sparse rather than contiguous memory access patterns. 
You should disable THP on Linux machines to ensure best performance with MongoDB.

2.2 mongodb安装

#创建所需用户和组
useradd mongod
passwd mongod

#创建mongodb所需目录结构
mkdir -p /mongodb/conf
mkdir -p /mongodb/log
mkdir -p /mongodb/data

#上传并解压软件到指定位置
[root@db01 opt]# tar xf mongodb-linux-x86_64-rhel70-4.2.8.tgz 
[root@db01 opt]# ln -s /opt/mongodb-linux-x86_64-rhel70-4.2.8 /usr/local/mongodb

#设置目录结构权限
chown -R mongod:mongod /mongodb

#设置用户环境变量
su - mongod
vi .bash_profile
export PATH=/usr/local/mongodb/bin:$PATH
source .bash_profile

#启动mongodb
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork

#登录mongodb
[mongod@server2  ~]$ mongo

2.3 使用配置文件

2.3.1 YAML格式要求

NOTE:
YAML does not support tab characters for indentation: use spaces instead.

--系统日志有关
systemLog:
destination: file
path: "/mongodb/log/mongodb.log"    --日志位置
logAppend: true					   --日志以追加模式记录

--数据存储有关
storage:
journal:
enabled: true
dbPath: "/mongodb/data"            --数据路径的位置

-- 进程控制
processManagement:
fork: true                         --后台守护进程
pidFilePath: 			  --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中

--网络配置有关
net:			
bindIp:                        -- 监听地址
port: 						  -- 端口号,默认不配置端口号,是27017

-- 安全验证有关配置
security:
authorization: enabled              --是否打开用户名密码验证

------------------以下是复制集与分片集群有关----------------------
replication:
 oplogSizeMB: <NUM>
 replSetName: "<REPSETNAME>"
 secondaryIndexPrefetch: "all"
 
sharding:
   clusterRole: <string>
   archiveMovedChunks: <boolean>
      
---for mongos only
replication:
   localPingThresholdMs: <int>

sharding:
   configDB: <string>
---

2.3.2 YAML配置示例

cat >  /mongodb/conf/mongo.conf <<EOF
systemLog:
   destination: file
   path: "/mongodb/log/mongodb.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data/"
processManagement:
   fork: true
net:
   port: 27017
   bindIp: 10.0.0.51,127.0.0.1
EOF

#重启
mongod -f /mongodb/conf/mongo.conf --shutdown   #mongodb的关闭方式
mongod -f /mongodb/conf/mongo.conf 

2.4 mongodb 配置systemd管理

[root@db01  ~]# cat > /etc/systemd/system/mongod.service <<EOF 
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongod
Type=forking
ExecStart=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF

#启停命令
[root@db01  ~]# systemctl restart mongod 
[root@db01  ~]# systemctl stop mongod 
[root@db01  ~]# systemctl start mongod

第三章:mongodb常用基本操作

3.1 操作命令种类✨

mongodb 默认存在的库: 操作对象

###管理MongoDB有关的系统库
admin库:系统预留库,MongoDB系统管理库
local库:本地预留库,存储关键日志
config库:MongoDB配置信息库

###虚拟库
test:  用户登录时默认存在的库

###常用命令对比: 
show databases    /show dbs          #查看库
show tables      /show collections     #查看集合
use admin                        #进入表
db                               #常看当前所在位置(想到与mysql中的 select database();)

3.1.1 db对象相关命令

db.[TAB][TAB]
db.help()
db.oldboy.[TAB][TAB]
db.oldboy.help()

3.1.2 复制集群有关命令 (replication set):

rs.[TAB][TAB]
rs.help()

3.1.3 分片集群相关命令 (sharding cluster)

sh.[TAB][TAB]
sh.help()

3.2 mongodb对象操作✨

mongo        mysql
 库    ----->  库
 集合  ----->  表
 文档  ----->  数据行

3.2.1 库的操作

> use test
>
>db.dropDatabase()   
{ "dropped" : "test", "ok" : 1 }

3.2.2 集合的操作

#方法1: 创建集合
app> db.createCollection('a')
{ "ok" : 1 }
app> db.createCollection('b')


#方法2:当插入一个文档的时候,一个集合就会自动创建。
use oldboy
db.test.insert({name:"zhangsan"})
db.stu.insert({id:101,name:"zhangsan",age:20,gender:"m"})
show tables;
db.stu.insert({id:102,name:"lisi"})
db.stu.insert({a:"b",c:"d"})
db.stu.insert({a:1,c:2})
  • Monggodb中可以use到一个不存在的集合中,再插入数据,会先自动创建集合,再插入数据。非常灵活。

3.2.3 文档操作

#数据录入:
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()})}

#查询数据行数:
> db.log.count()

#全表查询:
> db.log.find()

#每页显示50条记录的设置:
> DBQuery.shellBatchSize=50; 

#按照条件查询
> db.log.find({uid:999})

#以标准的json格式显示数据 ----> 格式化显示
> db.log.find({uid:999}).pretty()
{
	"_id" : ObjectId("5cc516e60d13144c89dead33"),
	"uid" : 999,
	"name" : "mongodb",
	"age" : 6,
	"date" : ISODate("2019-04-28T02:58:46.109Z")
}

#删除集合中所有记录
app> db.log.remove({})

#查看集合存储信息
app> db.log.totalSize() //集合中索引+数据压缩存储之后的大小

3.3 用户及权限管理✨

3.3.1 用户说明

rule图.png

#验证库: 建立用户时use到的库,在使用用户时,要加上验证库才能登陆。*****

对于管理员用户,必须在admin下创建.
1. 建用户时,use到的库,就是此用户的验证库                     ******
2. 登录时,必须明确指定验证库才能登录                         ******
3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
4. 如果直接登录到数据库,不进行use,默认的验证库是test,不是我们生产建议的.     ***
5. 从3.6 版本开始,不添加bindIp参数,默认不让远程登录,只能本地管理员登录。   ***

3.3.2 用户创建模板

use admin 
db.createUser
{
    user: "root",
    pwd: "123",
    roles: [
       { role: "admin",
     db: "<database>" } | "<role>",
    ...
    ]
}

#基本语法说明:
user:用户名
pwd:密码
roles:
    role:角色名
    db:作用对象	
role:root, readWrite,read   

#验证数据库:
mongo -u oldboy -p 123 10.0.0.53/oldboy

3.3.3 用户管理示例

创建超级管理员:管理所有数据库(必须use admin再去创建)
$ mongo
> use admin
> db.createUser(
{
    user: "root",
    pwd: "root123",
    roles: [ { role: "root", db: "admin" } ]
}
)

-------------------------------------------------
  
## 验证用户
db.auth('root','root123')

## 配置文件中,加入以下配置
security:
  authorization: enabled

## 重启mongodb
mongod -f /mongodb/conf/mongo.conf --shutdown 
mongod -f /mongodb/conf/mongo.conf 


## 登录验证
mongo -uroot -proot123  admin
mongo -uroot -proot123  10.0.0.51/admin

或者
mongo
use admin
db.auth('root','root123')


## 查看用户:
use admin
db.system.users.find().pretty()

## 创建应用用户
use oldboy
db.createUser(
	{
		user: "app01",
		pwd: "app01",
		roles: [ { role: "readWrite" , db: "oldboy" } ]
	}
)

mongo  -uapp01 -papp01 oldboy


## 查询mongodb中的用户信息
mongo -uroot -proot123 10.0.0.53/admin
db.system.users.find().pretty()

3.3.4 删除用户示例

(root身份登录,use到验证库)

#删除用户
db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]})
mongo -uroot -proot123 10.0.0.53/admin
use oldboy1
db.dropUser("app02")

3.3.5 用户管理注意事项

1. 建用户要有验证库,管理员admin,普通用户是要管理的库  ***
2. 登录时,注意验证库                               ***
mongo -uapp01 -papp01 10.0.0.51:27017/oldboy

3. 重点参数                    ***
net:
   port: 27017
   bindIp: 10.0.0.51,127.0.0.1
security:
   authorization: enabled

第四章: MongoDB复制集 RS(ReplicationSet)

4.1 复制集基本原理

基本构成是1主2从的结构,自带互相监控投票机制 ***(Raft(MongoDB) Paxos(mysql MGR 用的是变种))
如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。 #自带高可用

同时复制集会自动通知客户端程序,主库已经发生切换了。应用就会连接到新的主库。 #应用通过api驱动,切换不同的接节点

4.2 Replication Set配置过程详解

4.2.1  规划

三个以上的mongodb节点(或多实例)

4.2.2 环境准备

### 环境准备
多个端口:  28017、28018、28019、28020

### 多套目录:
su - mongod	
mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log

多套配置文件
- /mongodb/28017/conf/mongod.conf
- /mongodb/28018/conf/mongod.conf
- /mongodb/28019/conf/mongod.conf
- /mongodb/28020/conf/mongod.conf

### 配置文件内容
cat > /mongodb/28017/conf/mongod.conf <<EOF
systemLog:
  destination: file
  path: /mongodb/28017/log/mongodb.log
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/28017/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
net:
  bindIp: 10.0.0.51,127.0.0.1
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
EOF

\cp  /mongodb/28017/conf/mongod.conf  /mongodb/28018/conf/
\cp  /mongodb/28017/conf/mongod.conf  /mongodb/28019/conf/
\cp  /mongodb/28017/conf/mongod.conf  /mongodb/28020/conf/

sed 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i
sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i
sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -i

### 启动多个实例备用
mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf
netstat -lnp|grep 280


4.2.3 1主2从,从库普通从库✨

- 配置普通复制集
$ mongo --port 28017 admin
> config = {_id: 'my_repl', members: [
                          {_id: 0, host: '10.0.0.52:28017'},
                          {_id: 1, host: '10.0.0.52:28018'},
                          {_id: 2, host: '10.0.0.52:28019'}]
          }          		  

> rs.initiate(config) 

查询复制集状态
> rs.status();

4.2.4 1主1从, 1个arbiter从库✨

$ mongo -port 28017 admin
> config = {_id: 'my_repl', members: [
                          {_id: 0, host: '10.0.0.51:28017'},
                          {_id: 1, host: '10.0.0.51:28018'},
                          {_id: 2, host: '10.0.0.51:28019',"arbiterOnly":true}]
          }    

> rs.initiate(config)

4.3 复制集管理操作

### 查看复制集状态
rs.status();    //查看整体复制集状态
rs.isMaster(); // 查看当前是否是主节点
rs.conf();   //查看复制集配置信息

### 添加删主节点
rs.remove("ip:port"); // 删除一个节点
rs.add("ip:port"); // 新增从节点
rs.addArb("ip:port"); // 新增仲裁节点

例子:
#添加 arbiter节点
1、连接到主节点
[mongod@db03 ~]$ mongo --port 28018 admin
2、添加仲裁节点
my_repl:PRIMARY> rs.addArb("10.0.0.53:28020")

3、查看节点状态
my_repl:PRIMARY> rs.isMaster()
{
	"hosts" : [
		"10.0.0.53:28017",
		"10.0.0.53:28018",
		"10.0.0.53:28019"
	],
	"arbiters" : [
		"10.0.0.53:28020"
	],

#删除一个节点
rs.remove("ip:port"); 
例子:
my_repl:PRIMARY> rs.remove("10.0.0.53:28019");
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()

#新增从节点
rs.add("ip:port");
例子:
my_repl:PRIMARY> rs.add("10.0.0.53:28019")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()

4.4 特殊从节点

4.4.1 介绍:

#arbiter节点:
主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务

#hidden节点:
隐藏节点,不参与选主,也不对外提供服务。

#delay节点:
延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用

4.4.2 配置延时节点

(一般延时节点也配置成hidden)

cfg=rs.conf() 
cfg.members[3].priority=0
cfg.members[3].hidden=true
cfg.members[3].slaveDelay=120
rs.reconfig(cfg)    


取消以上配置
cfg=rs.conf() 
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[2].slaveDelay=0
rs.reconfig(cfg)    

配置成功后,通过以下命令查询配置后的属性
rs.conf(); 

**说明: **cfg.members[3] 的 [n] 代表节点的下标索引(节点中的第几个0开始计数)

4.4.3 副本集其他操作命令

#查看副本集的配置信息
admin> rs.conf()

#查看副本集各成员的状态
admin> rs.status()

++++++++++++++++++++++++++++++++++++++++++++++++
--副本集角色切换(不要人为随便操作)
admin> rs.stepDown()
注:
admin> rs.freeze(300) //锁定从,使其不会转变成主库
freeze()和stepDown单位都是秒。
+++++++++++++++++++++++++++++++++++++++++++++

#设置副本节点可读:在副本节点执行
admin> rs.slaveOk()
eg:
admin> use app
switched to db app
app> db.createCollection('a')
{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }

#查看副本节点(监控主从延时)
admin> rs.printSlaveReplicationInfo()
source: 192.168.1.22:27017
	syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST)
	0 secs (0 hrs) behind the primary

#OPlog日志(备份恢复章节)

**扩展: **

	P S A D  
  1 1 2 1 

cfg=rs.conf() 
cfg.members[2].priority=0
cfg.members[2].votes=0
rs.reconfig(cfg) 

第五章: 分片集群 MongoDB Sharding Cluster

5.1 规划

10个实例:38017-38026
(1)configserver:38018-38020
3台构成的复制集(1主两从,不支持arbiter)38018-38020(复制集名字configsvr)
(2)shard节点:
sh1:38021-23    (1主两从,其中一个节点为arbiter,复制集名字sh1)
sh2:38024-26    (1主两从,其中一个节点为arbiter,复制集名字sh2)
(3) mongos:
38017

5.2 Shard节点配置过程

5.2.1 目录创建:

mkdir -p /mongodb/38021/conf  /mongodb/38021/log  /mongodb/38021/data
mkdir -p /mongodb/38022/conf  /mongodb/38022/log  /mongodb/38022/data
mkdir -p /mongodb/38023/conf  /mongodb/38023/log  /mongodb/38023/data
mkdir -p /mongodb/38024/conf  /mongodb/38024/log  /mongodb/38024/data
mkdir -p /mongodb/38025/conf  /mongodb/38025/log  /mongodb/38025/data
mkdir -p /mongodb/38026/conf  /mongodb/38026/log  /mongodb/38026/data

5.2.2 修改配置文件:

  • 第一组复制集搭建:21-23(1主 1从 1Arb)
cat >  /mongodb/38021/conf/mongodb.conf  <<EOF
systemLog:
  destination: file
  path: /mongodb/38021/log/mongodb.log   
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/38021/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
net:
  bindIp: 10.0.0.51,127.0.0.1
  port: 38021
replication:
  oplogSizeMB: 2048
  replSetName: sh1
sharding:
  clusterRole: shardsvr
processManagement: 
  fork: true
EOF


\cp  /mongodb/38021/conf/mongodb.conf  /mongodb/38022/conf/
\cp  /mongodb/38021/conf/mongodb.conf  /mongodb/38023/conf/
sed 's#38021#38022#g' /mongodb/38022/conf/mongodb.conf -i
sed 's#38021#38023#g' /mongodb/38023/conf/mongodb.conf -i
  • 第二组节点:24-26(1主1从1Arb)
cat > /mongodb/38024/conf/mongodb.conf <<EOF
systemLog:
  destination: file
  path: /mongodb/38024/log/mongodb.log   
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/38024/data
  directoryPerDB: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
net:
  bindIp: 10.0.0.51,127.0.0.1
  port: 38024
replication:
  oplogSizeMB: 2048
  replSetName: sh2
sharding:
  clusterRole: shardsvr
processManagement: 
  fork: true
EOF

\cp  /mongodb/38024/conf/mongodb.conf  /mongodb/38025/conf/
\cp  /mongodb/38024/conf/mongodb.conf  /mongodb/38026/conf/
sed 's#38024#38025#g' /mongodb/38025/conf/mongodb.conf -i
sed 's#38024#38026#g' /mongodb/38026/conf/mongodb.conf -i

5.2.3 启动所有节点,并搭建复制集

mongod -f  /mongodb/38021/conf/mongodb.conf 
mongod -f  /mongodb/38022/conf/mongodb.conf 
mongod -f  /mongodb/38023/conf/mongodb.conf 
mongod -f  /mongodb/38024/conf/mongodb.conf 
mongod -f  /mongodb/38025/conf/mongodb.conf 
mongod -f  /mongodb/38026/conf/mongodb.conf  
ps -ef |grep mongod

mongo --port 38021
use  admin
config = {_id: 'sh1', members: [
                          {_id: 0, host: '10.0.0.51:38021'},
                          {_id: 1, host: '10.0.0.51:38022'},
                          {_id: 2, host: '10.0.0.51:38023',"arbiterOnly":true}]
           }

rs.initiate(config)
  
 mongo --port 38024 
 use admin
config = {_id: 'sh2', members: [
                          {_id: 0, host: '10.0.0.51:38024'},
                          {_id: 1, host: '10.0.0.51:38025'},
                          {_id: 2, host: '10.0.0.51:38026',"arbiterOnly":true}]
           }
  
rs.initiate(config)

5.3 config节点配置(PSS)

5.3.1 目录创建

mkdir -p /mongodb/38018/conf  /mongodb/38018/log  /mongodb/38018/data
mkdir -p /mongodb/38019/conf  /mongodb/38019/log  /mongodb/38019/data
mkdir -p /mongodb/38020/conf  /mongodb/38020/log  /mongodb/38020/data

5.3.2修改配置文件:

cat > /mongodb/38018/conf/mongodb.conf <<EOF
systemLog:
  destination: file
  path: /mongodb/38018/log/mongodb.conf
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/38018/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
net:
  bindIp: 10.0.0.51,127.0.0.1
  port: 38018
replication:
  oplogSizeMB: 2048
  replSetName: configReplSet
sharding:
  clusterRole: configsvr
processManagement: 
  fork: true
EOF

\cp /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/
\cp /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/
sed 's#38018#38019#g' /mongodb/38019/conf/mongodb.conf -i
sed 's#38018#38020#g' /mongodb/38020/conf/mongodb.conf -i

5.3.3启动节点,并配置复制集

mongod -f /mongodb/38018/conf/mongodb.conf 
mongod -f /mongodb/38019/conf/mongodb.conf 
mongod -f /mongodb/38020/conf/mongodb.conf 

mongo --port 38018
use  admin
 config = {_id: 'configReplSet', members: [
                          {_id: 0, host: '10.0.0.51:38018'},
                          {_id: 1, host: '10.0.0.51:38019'},
                          {_id: 2, host: '10.0.0.51:38020'}]
           }
rs.initiate(config)  

注:configserver 可以是一个节点,官方建议复制集。configserver不能有arbiter。
新版本中,要求必须是复制集。
注:mongodb 3.4之后,虽然要求config server为replica set,但是不支持arbiter

5.4 mongos节点配置:

5.4.1创建目录:

mkdir -p /mongodb/38017/conf  /mongodb/38017/log 

7.4.2 配置文件:

cat > /mongodb/38017/conf/mongos.conf <<EOF
	systemLog:
	  destination: file
	  path: /mongodb/38017/log/mongos.log
	  logAppend: true
	net:
	  bindIp: 10.0.0.51,127.0.0.1
	  port: 38017
	sharding:
	  configDB: configReplSet/10.0.0.51:38018,10.0.0.51:38019,10.0.0.51:38020
	processManagement: 
	  fork: true
	EOF

5.4.3启动mongos

 mongos -f /mongodb/38017/conf/mongos.conf 

5.5 分片集群添加节点

 连接到其中一个mongos(10.0.0.51),做以下配置
(1)连接到mongs的admin数据库
# su - mongod
$ mongo 10.0.0.51:38017/admin
(2)添加分片
db.runCommand( { addshard : "sh1/10.0.0.51:38021,10.0.0.51:38022,10.0.0.51:38023",name:"shard1"} )
db.runCommand( { addshard : "sh2/10.0.0.51:38024,10.0.0.51:38025,10.0.0.51:38026",name:"shard2"} )
(3)列出分片
mongos> db.runCommand( { listshards : 1 } )
(4)整体状态查看
mongos> sh.status();

5.6 使用分片集群

5.6.1 RANGE分片配置及测试

  • RANG自动分片
mongo --port 38017 admin
use admin 
db.runCommand( { enablesharding : "autoshard" } )

use autoshard
db.autotab.ensureIndex( { id: 1 } )

use admin
db.runCommand( { shardcollection : "autoshard.autotab",key : {id: 1} } )


use autoshard
for(i=1;i<100000;i++){ db.autotab.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
db.autotab.stats()
  • _ zone方式进行range手工定制分片_
mongo --port 38017 admin
use zonedb
db.vast.ensureIndex( {order_id: 1 } )


use admin
db.runCommand( { enablesharding : "zonedb" } )
sh.shardCollection("zonedb.vast", {order_id: 1});


sh.addShardTag("shard1", "shard00")
sh.addShardTag("shard2", "shard01")


sh.addTagRange( 
"zonedb.vast", 
{  "order_id" : MinKey },
{  "order_id" : 500 },"shard00" )

sh.addTagRange( 
"zonedb.vast",
{"order_id" : 501 },
{"order_id" : MaxKey},"shard01" )


use zonedb
for(i=1;i<1000;i++){ db.vast.insert({"order_id":i,"name":"shenzheng","age":70,"date":new Date()}); }


db.vast.getShardDistribution()

5.6.2 Hash分片例子:

  • 对oldboy库下的vast大表进行hash
mongo --port 38017 admin
use admin
db.runCommand( { enablesharding : "oldboy" } )

use oldboy
db.vast.ensureIndex( { id: "hashed" } )

use admin
sh.shardCollection( "oldboy.vast", { id: "hashed" } )

use oldboy
for(i=1;i<1000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }

5.7 分片集群的查询及管理

5.7.1 判断是否Shard集群

admin> db.runCommand({ isdbgrid : 1})

5.7.2 列出所有分片信息

admin> db.runCommand({ listshards : 1})

5.7.3 列出开启分片的数据库

admin> use config
config> db.databases.find( { "partitioned": true } )
或者:
config> db.databases.find() //列出所有数据库分片情况

5.7.4 查看分片的片键

config> db.collections.find().pretty()
{
	"_id" : "test.vast",
	"lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"),
	"lastmod" : ISODate("1970-02-19T17:02:47.296Z"),
	"dropped" : false,
	"key" : {
		"id" : 1
	},
	"unique" : false
}

5.7.5 查看分片的详细信息

admin> sh.status()

5.7.6 删除分片节点(谨慎)

(1)确认blance是否在工作
sh.getBalancerState()
(2)删除shard2节点(谨慎)
mongos> db.runCommand( { removeShard: "shard2" } )
注意:删除操作一定会立即触发blancer。

5.8 balancer操作*****

5.8.1 介绍

mongos的一个重要功能,自动巡查所有shard节点上的chunk的情况,自动做chunk迁移。
什么时候工作?
1、自动运行,会检测系统不繁忙的时候做迁移
2、在做节点删除的时候,立即开始迁移工作
3、balancer只能在预设定的时间窗口内运行

有需要时可以关闭和开启blancer(备份的时候)
mongos> sh.stopBalancer()
mongos> sh.startBalancer()

5.8.2 自定义 自动平衡进行的时间段

https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#schedule-the-balancing-window
// connect to mongos

use config
sh.setBalancerState( true )
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )

sh.getBalancerWindow()
sh.status()

关于集合的balancer(了解下)
关闭某个集合的balance
sh.disableBalancing("students.grades")
打开某个集合的balancer
sh.enableBalancing("students.grades")
确定某个集合的balance是开启或者关闭
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;

第六章: 备份恢复

6.1 mongoexport

#  单表备份至json格式
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
注:备份文件的名字可以自定义,默认导出了JSON格式的数据。

# 单表备份至csv格式
如果我们需要导出CSV格式的数据,则需要使用----type=csv参数:
 mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log --type=csv -f uid,name,age,date  -o /mongodb/log.csv

6.2 mongoimport

# 恢复json格式表数据到log1
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json



# 恢复csv格式的文件到log2
--headerline:指明第一行是列名,不需要导入。
(1)csv格式的文件头行,有列名字
mongoimport   -uroot -proot123 --port 27017 --authenticationDatabase admin   -d oldboy -c log2 --type=csv --headerline --file  /mongodb/log.csv

(2)csv格式的文件头行,没有列名字
mongoimport   -uroot -proot123 --port 27017 --authenticationDatabase admin   -d oldboy -c log3 --type=csv -f id,name,age,date --file  /mongodb/log.csv

6.3 MySQL —> Mongodb迁移

a. 导出MySQL数据为CSV格式 
select * from test.t100w  limit 100  into outfile '/tmp/t100w.csv' fields terminated by ',';

b. 导入MongoDB 
[mongod@db01 mongodb]$ mongoimport   -uroot -proot123 --port 27017 --authenticationDatabase admin   -d test -c t100w --type=csv  -f id,num,k1,k2,dt  --file /mongodb/t100w.csv

6.4 mongodump

# 全库备份
mkdir /mongodb/backup
mongodump  -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup

# 备份test库
mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -o /mongodb/backup/

# 备份oldboy库下的log集合
mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/backup/

# 压缩备份
mongodump   -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -o /mongodb/backup/ --gzip

8.5 mongorestore

  • [mongod@db01 ~]$ mongorestore -uroot -proot123 –port 27017 –authenticationDatabase admin /mongodb/backup/ –gzip
# 全库恢复 
[mongod@db01 ~]$ mongorestore   -uroot -proot123 --port 27017 --authenticationDatabase admin  /mongodb/backup/ --gzip --drop 

# 恢复test库
[mongod@db01 ~]$ mongorestore   -uroot -proot123 --port 27017 --authenticationDatabase admin  -d oldguo /mongodb/backup/test  --gzip --drop 

#恢复test库下的t100w集合
[mongod@db01 ~]$ mongorestore   -uroot -proot123 --port 27017 --authenticationDatabase admin  -d oldguo  -c t1  /mongodb/backup/test/t100w.bson.gz  --gzip 

注意: drop表示恢复的时候把之前的集合drop掉(危险)
$ mongorestore  -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop  

6.6 mongodump和mongorestore高级企业应用(–oplog)

6.6.1 oplog介绍

  • _注意:_这是replica set 模式专用

–oplog
use oplog for taking a point-in-time snapshot

在replica set中oplog是一个定容集合(capped collection),它的默认大小是磁盘空间的5%(可以通过--oplogSizeMB参数修改).
位于local库的db.oplog.rs,有兴趣可以看看里面到底有些什么内容。
其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。
当空间用完时新记录自动覆盖最老的记录。
其覆盖范围被称作oplog时间窗口。需要注意的是,因为oplog是一个定容集合,
所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化。
想要查看当前的oplog时间窗口预计值,可以使用以下命令:

 mongod -f /mongodb/28017/conf/mongod.conf 
 mongod -f /mongodb/28018/conf/mongod.conf 
 mongod -f /mongodb/28019/conf/mongod.conf 
 mongod -f /mongodb/28020/conf/mongod.conf 
use local 
 db.oplog.rs.find().pretty()
"ts" : Timestamp(1553597844, 1),
"op" : "n"
"o"  :

"i": insert
"u": update
"d": delete
"c": db cmd

test:PRIMARY> rs.printReplicationInfo()
configured oplog size:   1561.5615234375MB <--集合大小
log length start to end: 423849secs (117.74hrs) <--预计窗口覆盖时间
oplog first event time:  Wed Sep 09 2015 17:39:50 GMT+0800 (CST)
oplog last event time:   Mon Sep 14 2015 15:23:59 GMT+0800 (CST)
now:                     Mon Sep 14 2015 16:37:30 GMT+0800 (CST)

6.6.2 oplog企业级应用

(1)实现热备,在备份时使用--oplog选项

(2)准备测试数据
[mongod@db01 conf]$ mongo --port 28018
use oldboy
for(var i = 1 ;i < 100; i++) {
    db.foo.insert({a:i});
}

my_repl:PRIMARY> db.oplog.rs.find({"op":"i"}).pretty()

oplog 配合mongodump实现热备
mongodump --port 28018 --oplog -o /mongodb/backup
作用介绍:--oplog 会记录备份过程中的数据变化。会以oplog.bson保存下来

(3)恢复
mongorestore  --port 28017 --oplogReplay /mongodb/bak --drop

6.7 oplog高级应用

背景:每天11点全备,oplog恢复窗口为48小时
某天,上午10点world.city 业务表被误删除。
恢复思路:
0、停应用
2、找测试库
3、恢复昨天晚上全备
4、截取全备之后到world.city误删除时间点的oplog,并恢复到测试库
5、将误删除表导出,恢复到生产库

  • 恢复步骤:
一,模拟故障环境: 
# 1、全备数据库 模拟原始数据
mongo --port 28017
use test
for(var i = 1 ;i < 100; i++) {
    db.a.insert({a: i});
}

全备:
rm -rf /mongodb/backup/*
mongodump --port 28017 --oplog -o /mongodb/backup

--oplog功能:在备份同时,将备份过程中产生的日志进行备份
文件必须存放在/mongodb/backup下,自动命令为oplog.bson

再次模拟数据
db.b.insert({id:1})
db.c.insert({id:2})

二, 业务误删除操作:  上午10点:删除wo库下的ci表
10:00时刻,误删除

备份现有的oplog.rs表
mongodump --port 28017 -d local -c oplog.rs  -o /mongodb/bak

截取oplog并恢复到drop之前的位置

更合理的方法:登陆到原数据库
[mongod@db03 local]$	
my_repl:PRIMARY> use local
db.oplog.rs.find({op:"c"}).pretty();

{
	"ts" : Timestamp(1606212278, 1),
	"t" : NumberLong(3),
	"h" : NumberLong(0),
	"v" : 2,
	"op" : "c",
	"ns" : "test.$cmd",
	"ui" : UUID("091af5ca-20c2-4ea4-a015-7b42de975220"),
	"o2" : {
		"numRecords" : 1
	},
	"wall" : ISODate("2020-11-24T10:04:38.310Z"),
	"o" : {
		"drop" : "b"
	}
}

    
三, 获取到oplog误删除时间点位置:
	"ts" : Timestamp(1606212278, 1),
	
	

四, 恢复备份+应用oplog
[mongod@db01 backup]$ cp /mongodb/bak/local/oplog.rs.bson ./oplog.bson 
mongorestore --port 28017  --oplogReplay --oplogLimit "1606212278:1"  --drop   /mongodb/backup/

MongoDB运维.txt

原文地址:http://www.cnblogs.com/hypj/p/16930319.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性