MongoDB安装部署

MongoDB安装部署

逻辑结构

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

系统准备

关闭大页内存机制
root用户下
在vi /etc/rc.local最后添加如下代码
[ ~]# vim /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
		
[ ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled 
[ ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag

修改/etc/security/limits.conf
[ ~]# echo ‘*               -       nofile          65535‘ >> /etc/security/limits.conf
reboot重启生效

mongodb安装

#创建用户
[ ~]# useradd mongodb
[ ~]# echo ‘123‘ |passwd --stdin mongodb

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

#下载并解压软件到指定位置
[ ~]# wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.12.tgz
[ ~]# tar xf mongodb-linux-x86_64-rhel70-3.6.12_.tgz 
[ ~]# cp -a mongodb-linux-x86_64-rhel70-3.6.12/bin /mongodb/
[ ~]# chown -R mongodb:mongodb /mongodb

#设置用户环境变量
[ ~]# su - mongodb
[ ~]$ echo ‘export PATH=/mongodb/bin:$PATH‘ >> .bash_profile 
[ ~]$ source .bash_profile

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

#登录mongodb
[ ~]$ mongo

配置文件

YAML模式
--系统日志有关  
systemLog:
   destination: file        
   path: "/mongodb/log/mongodb.log"    --日志位置
   logAppend: true                     --日志以追加模式记录
  
--数据存储有关   
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data"            --数据路径的位置

-- 进程控制  
processManagement:
   fork: true                         --后台守护进程
   pidFilePath: <string>              --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中
    
--网络配置有关   
net:            
   bindIp: <ip>                       -- 监听地址
   port: <port>                       -- 端口号,默认不配置端口号,是27017
   
-- 安全验证有关配置      
security:
  authorization: enabled              --是否打开用户名密码验证

#使用配置文件
[ ~]$ cat /mongodb/conf/mongo.conf 
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.1.110,127.0.0.1

#关闭mongodb
[ ~]$ mongod -f /mongodb/conf/mongo.conf --shutdown

#启动mongodb
[ ~]$ mongod -f /mongodb/conf/mongo.conf 

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

mongodb常用基本操作

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

#命令种类
#db 对象相关命令
db        当前在的库
db.[TAB]  类似于linux中的tab功能
db.help() db级别的命令使用帮助

#collection级别操作:
db.Collection_name.xxx

#document级别操作:
db.t1.insert()

#rs 复制集有关(replication set):
rs.[TAB][TAB]
rs.help()

#sh 分片集群(sharding cluster)
sh.[TAB][TAB]
sh.help()

#常用操作
#查看当前db版本
db.version()

#显示当前数据库
db
或
db.getName()

#查询所有数据库
> show dbs

#切换数据库
> use local

#查看所有的collection
show  tables;
show collections

#显示当前数据库状态
> use local
> db.stats()

#录入数据
use opesn
db.hello.insert({name:"a"})

#查看数据
> use opesn
> db.hello.find()
{ "_id" : ObjectId("5db2f8b47143defb9ed182d2"), "name" : "a" }

#删除表
use opesn
db.hello.drop()

#查看当前数据库的连接机器地址
> db.getMongo()
connection to 127.0.0.1
指定数据库进行连接
默认连接本机test数据库

mongodb对象操作

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

#库的操作
– 创建数据库:
当use的时候,系统就会自动创建一个数据库。
如果use之后没有创建任何集合。
系统就会删除这个数据库。
– 删除数据库 创建集合
如果没有选择任何数据库,会删除默认的test数据库

#删除test数据库
> use opesn
switched to db opesn
> db.dropDatabase()
{ "dropped" : "opesn", "ok" : 1 }
> 

#集合的操作:
#创建集合
#方法1
> use app
switched to db app
> db.createCollection(‘a‘)
{ "ok" : 1 }
> db.createCollection(‘b‘)
{ "ok" : 1 }
#查看当前数据下的所有集合
> show collections
a
b
> db.getCollectionNames()
[ "a", "b" ]
> 

#方法2:当插入一个文档的时候,一个集合就会自动创建。
> use opesn
switched to db opesn
> db.ops.insert({id : "1021" ,name : "zhssn" ,age : "22" ,gender : "female",address : "sz"})
WriteResult({ "nInserted" : 1 })
> db.ops.insert({id : "101" ,name : "lisi"})
WriteResult({ "nInserted" : 1 })

#查看数据
> db.ops.find()
{ "_id" : ObjectId("5db301b87143defb9ed182d3"), "id" : "1021", "name" : "zhssn", "age" : "22", "gender" : "female", "address" : "sz" }
{ "_id" : ObjectId("5db301cb7143defb9ed182d4"), "id" : "101", "name" : "lisi" }

> db.ops.find({id:"101"})
{ "_id" : ObjectId("5db301cb7143defb9ed182d4"), "id" : "101", "name" : "lisi" }

> db.ops.find().pretty()
{
	"_id" : ObjectId("5db301b87143defb9ed182d3"),
	"id" : "1021",
	"name" : "zhssn",
	"age" : "22",
	"gender" : "female",
	"address" : "sz"
}
{
	"_id" : ObjectId("5db301cb7143defb9ed182d4"),
	"id" : "101",
	"name" : "lisi"
} 

> db.ops.find({id:"101"}).pretty()
{
	"_id" : ObjectId("5db301cb7143defb9ed182d4"),
	"id" : "101",
	"name" : "lisi"
}
> 

#删除集合
> use app
> db.a.drop()

#重命名集合
> db.b.renameCollection(‘bb‘)
{ "ok" : 1 }
> show tables
bb
> 

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

#Mongodb数据查询语句:
#查询集合中的记录数
app> db.log.find() //查询所有记录

注:默认每页显示20条记录,当显示不下的的情况下,可以用it迭代命令查询下一页数据。
设置每页显示数据的大小:

> DBQuery.shellBatchSize=50; //每页显示50条记录

app> db.log.findOne() //查看第1条记录
app> db.log.count() //查询总的记录数

#删除集合中的记录数
app> db.log.remove({}) //删除集合中所有记录
> db.log.distinct("name") //查询去掉当前集合中某列的重复数据

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

用户管理

注意:
验证库,建立用户时use到的库,在使用用户时,要加上验证库才能登陆。
对于管理员用户,必须在admin下创建.
1. 建用户时,use到的库,就是此用户的验证库
2. 登录时,必须明确指定验证库才能登录
3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
4. 如果直接登录到数据库,不进行use,默认的验证库是test,不是我们生产建议的.

#基本语法说明:
user:用户名
pwd:密码
roles:
    role:角色名
    db:作用对象	
role:root, readWrite,read   
#验证数据库:
mongo -u oldboy -p 123 10.0.0.51/oldboy

#用户管理例子:
-- 1. 创建超级管理员:管理所有数据库(必须use admin再去创建)
$ mongo
use admin
db.createUser(
{
    user: "root",
    pwd: "root123",
    roles: [ { role: "root", db: "admin" } ]
}
)
#验证用户
db.auth(‘root‘,‘root123‘)
#配置文件中,加入以下配置
[ ~]$ vim /mongodb/conf/mongo.conf 
security:
  authorization: enabled
#重启mongodb
[ ~]$ mongod -f /mongodb/conf/mongo.conf --shutdown 
[ ~]$ mongod -f /mongodb/conf/mongo.conf 
#登录验证
[ ~]$ mongo -uroot -proot123
[ ~]$ mongo -uroot -proot123 10.0.1.110/admin
[ ~]$ mongo -uroot -proot123 admin
#查看用户:
use admin
db.system.users.find().pretty()

#创建库管理用户
[ ~]$ mongo -uroot -proot123  admin
use app
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "dbAdmin", db: "app" } ]
}
)
#验证用户
db.auth(‘admin‘,‘admin‘)
#登录测试
[ ~]$ mongo -uadmin -padmin 10.0.1.110/app

#创建对app数据库,读、写权限的用户app01
(1)超级管理员用户登陆
[ ~]$ mongo -uroot -proot123 admin
(2)选择一个验证库
use app
(3)创建用户
db.createUser(
	{
		user: "app01",
		pwd: "app01",
		roles: [ { role: "readWrite" , db: "app" } ]
	}
)
[ ~]$ mongo  -uapp01 -papp01 10.0.1.110/app
#创建app数据库读写权限的用户并对test数据库具有读权限:
[ ~]$ mongo -uroot -proot123 10.0.1.110/admin
use app
db.createUser(
{
user: "app03",
pwd: "app03",
roles: [ { role: "readWrite", db: "app" },
{ role: "read", db: "test" }]})
#查询mongodb中的用户信息
[ ~]$ mongo -uroot -proot123 10.0.1.110/admin
db.system.users.find().pretty()

#删除用户(root身份登录,use到验证库)
#删除用户
# mongo -uroot -proot123 10.0.1.110/admin
use app
db.dropUser("app01")

MongoDB复制集RS

基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))
如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知
客户端程序,主库已经发生切换了。应用就会连接到新的主库。

Replication Set配置过程详解

#规划
三个以上的mongodb节点(或多实例)
多个端口:28017、28018、28019、28020

#多个目录:
[ ~]$ 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

#多个配置文件
[ ~]$ cat /mongodb/28017/conf/mongod.conf
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.1.110,127.0.0.1
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
[ ~]$ 
[ ~]$ \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

#启动多个实例
[ 28017]$ mongod -f /mongodb/28017/conf/mongod.conf
[ 28017]$ mongod -f /mongodb/28018/conf/mongod.conf
[ 28017]$ mongod -f /mongodb/28019/conf/mongod.conf
[ 28017]$ mongod -f /mongodb/28020/conf/mongod.conf
[ 28017]$ netstat -lntup |grep 280

#配置普通复制集:
1主2从,从库普通从库
[ 28017]$ mongo --port 28017 admin
config = {_id: ‘my_repl‘, members: [
                          {_id: 0, host: ‘10.0.1.110:28017‘},
                          {_id: 1, host: ‘10.0.1.110:28018‘},
                          {_id: 2, host: ‘10.0.1.110:28019‘}]
          }    	  
rs.initiate(config) 

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

复制集管理操作

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

#添加删除节点
[ ~]$ mongo --port 28018 admin
my_repl:PRIMARY> rs.remove("10.0.1.110:28017")   // 删除一个节点
my_repl:PRIMARY> rs.addArb("10.0.1.110:28017")   // 新增仲裁节点
my_repl:PRIMARY> rs.add("10.0.1.110:28020")   // 新增从节点

特殊从节点

arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用

#配置延时节点(一般延时节点也配置成hidden)
cfg=rs.conf() 
cfg.members[3].priority=0
cfg.members[3].hidden=true
cfg.members[3].slaveDelay=120
rs.reconfig(cfg)
#配置成功后,通过以下命令查询配置后的属性
rs.conf(); 

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

#副本集其他操作命令
#查看副本集的配置信息
admin> rs.conf()
#查看副本集各成员的状态
admin> rs.status()
++++++++++++++++++++++++++++++++++++++++++++++++
#副本集角色切换(不要人为随便操作)
admin> rs.stepDown()
注:
admin> rs.freeze(300) //锁定从,使其不会转变成主库
freeze()和stepDown单位都是秒。
+++++++++++++++++++++++++++++++++++++++++++++
#设置副本节点可读:在副本节点执行
admin> rs.slaveOk()
admin> use app
app> db.createCollection(‘a‘)
{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }

#查看副本节点(监控主从延时)
rs.printSlaveReplicationInfo()

MongoDB Sharding Cluster 分片集群

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

#Shard节点配置过程
#目录创建:
[ ~]$ 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
#修改配置文件:
#sh1:
[ ~]$ cat /mongodb/38021/conf/mongodb.conf 
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.1.110,127.0.0.1
  port: 38021
replication:
  oplogSizeMB: 2048
  replSetName: sh1
sharding:
  clusterRole: shardsvr
processManagement: 
  fork: true
[ ~]$ 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

#sh2:
[ ~]$ cat /mongodb/38024/conf/mongodb.conf 
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.1.110,127.0.0.1
  port: 38024
replication:
  oplogSizeMB: 2048
  replSetName: sh2
sharding:
  clusterRole: shardsvr
processManagement: 
  fork: true
[ ~]$ 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

#启动所有节点,并搭建复制集:
[ ~]$ 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  

[ ~]$ mongo --port 38021 admin
config = {_id: ‘sh1‘, members: [
                          {_id: 0, host: ‘10.0.1.110:38021‘},
                          {_id: 1, host: ‘10.0.1.110:38022‘},
                          {_id: 2, host: ‘10.0.1.110:38023‘,"arbiterOnly":true}]
           }

rs.initiate(config)

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

#config节点配置:
[ ~]$ 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

#修改配置文件:
[ ~]$ cat /mongodb/38018/conf/mongodb.conf 
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.1.110,127.0.0.1
  port: 38018
replication:
  oplogSizeMB: 2048
  replSetName: configReplSet
sharding:
  clusterRole: configsvr
processManagement: 
  fork: true
[ ~]$ 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

#启动节点,并配置复制集
[ ~]$ mongod -f /mongodb/38018/conf/mongodb.conf 
[ ~]$ mongod -f /mongodb/38019/conf/mongodb.conf 
[ ~]$ mongod -f /mongodb/38020/conf/mongodb.conf 
[ ~]$ mongo --port 38018 admin
config = {_id: ‘configReplSet‘, members: [
                          {_id: 0, host: ‘10.0.1.110:38018‘},
                          {_id: 1, host: ‘10.0.1.110:38019‘},
                          {_id: 2, host: ‘10.0.1.110:38020‘}]
           }
rs.initiate(config) 

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

#mongos节点配置:
[ ~]$ mkdir -p /mongodb/38017/conf  /mongodb/38017/log 
[ ~]$ cat /mongodb/38017/conf/mongos.conf 
systemLog:
  destination: file
  path: /mongodb/38017/log/mongos.log
  logAppend: true
net:
  bindIp: 10.0.1.110,127.0.0.1
  port: 38017
sharding:
  configDB: configReplSet/10.0.1.110:38018,10.0.1.110:38019,10.0.1.110:38020
processManagement: 
  fork: true
[ ~]$ mongos -f /mongodb/38017/conf/mongos.conf

分片集群添加节点

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

使用分片集群

RANGE分片配置及测试
#激活数据库分片功能
[ ~]$ mongo --port 38017 admin
mongos> db.runCommand( { enablesharding : "test" } )

#指定分片键对集合分片
##创建索引
mongos> use test
mongos> db.vast.ensureIndex( { id: 1 } )

##开启分片
mongos> use admin
mongos> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )

#集合分片验证
mongos> use test
mongos> for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"opesn","age":70,"date":new Date()}); }

#分片结果测试
shard1:
mongo --port 38021
db.vast.count();

shard2:
mongo --port 38024
db.vast.count();
Hash分片例子
#创建哈希索引
#对于opesn开启分片功能
[ ~]$ mongo --port 38017 admin
mongos> use admin
mongos> db.runCommand( { enablesharding : "opesn" } )

#对于oldboy库下的vast表建立hash索引
mongos> use opesn
mongos> db.vast.ensureIndex( { id: "hashed" } )

#开启分片 
mongos> use admin
mongos> sh.shardCollection( "opesn.vast", { id: "hashed" } )

#录入10w行数据测试
mongos> use opesn
mongos> for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"opesn","age":70,"date":new Date()}); }

#hash分片结果测试
mongo --port 38021
use opesn
db.vast.count();

mongo --port 38024
use opesn
db.vast.count();

分片集群的查询及管理

#判断是否Shard集群
db.runCommand({ isdbgrid : 1})
#列出所有分片信息
db.runCommand({ listshards : 1})
#列出开启分片的数据库
mongos> db.databases.find( { "partitioned": true } )
或者:
mongos> db.databases.find() //列出所有数据库分片情况
#查看分片的片键
db.collections.find().pretty()
#查看分片的详细信息
sh.status()
#删除分片节点(谨慎)
(1)确认blance是否在工作
sh.getBalancerState()
(2)删除shard2节点(谨慎)
db.runCommand( { removeShard: "shard2" } )
注意:删除操作一定会立即触发blancer。

balancer操作

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

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

#自定义 自动平衡进行的时间段
[ ~]$ mongo --port 38017 admin
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;

备份恢复

#备份恢复工具
(1)mongoexport/mongoimport    //导出/导入的是JSON格式或者CSV格式
(2)mongodump/mongorestore     //导出/导入的是BSON格式
#JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性。
在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性。当无法使用BSON进行跨版本的数据迁移的时候,
使用JSON格式即mongoexport/mongoimport是一个可选项。

#应用场景总结:
mongoexport/mongoimport:json csv 
1、异构平台迁移  mysql  <---> mongodb
2、同平台,跨大版本:mongodb 2  ----> mongodb 3

mongodump/mongorestore
日常备份恢复时使用.

#导出工具mongoexport
mongoexport具体用法如下所示:
[ ~]$ mongoexport --help  
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导出那些列
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
--authenticationDatabase admin

#单表备份至json格式
[ ~]$ mongoexport -uroot -proot123 -d opesn -c ops --authenticationDatabase admin -o /mongodb/backup/ops.json
#注:备份文件的名字可以自定义,默认导出了JSON格式的数据

#单表备份至csv格式
如果需要导出CSV格式的数据,则需要使用----type=csv参数:
[ ~]$ mongoexport -uroot -proot123 -d opesn -c ops --type=csv -f id,name --authenticationDatabase admin -o /mongodb/backup/ops.csv

#导入工具mongoimport
Mongodb中的mongoimport工具可以把一个特定格式文件中的内容导入到指定的collection中。该工具可以导入JSON格式数据,也可以导入CSV格式数据。具体使用如下所示:
$ mongoimport --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导入那些列
-j, --numInsertionWorkers=<number>  number of insert operations to run concurrently  //并行

#数据恢复:
#恢复json格式表数据到ops01
[ ~]$ mongoimport -uroot -proot123 -d opesn -c ops01 --authenticationDatabase admin /mongodb/backup/ops.json

#恢复csv格式的文件到ops02
上面演示的是导入JSON格式的文件中的内容,如果要导入CSV格式文件中的内容,则需要通过--type参数指定导入格式
(1)csv格式的文件头行,有列名字
[ ~]$ mongoimport -uroot -proot123 -d opesn -c ops02 --type=csv --headerline  --authenticationDatabase admin /mongodb/backup/ops.csv
# --headerline:指明第一行是列名,不需要导入。
(2)csv格式的文件头行,没有列名字
[ ~]$ mongoimport -uroot -proot123 -d opesn -c ops04 --type=csv -f id,name --authenticationDatabase admin /mongodb/backup/ops02.csv

#异构平台迁移
mysql   -----> mongodb  
(1)mysql开启安全路径
[ ~]# vim /etc/my.cnf 
secure-file-priv=/tmp
[ ~]# /etc/init.d/mysqld restart
(2)导出mysql的表数据
mysql> select * from test.t100w into outfile ‘/tmp/t100w.csv‘ fields terminated by ‘,‘;
(3)处理备份文件
[ ~]# head -1 /tmp/t100w.csv 
id,num,k1,k2,dt     //添加第一行列名信息
[ ~]# scp  /tmp/t100w.csv :/mongodb/backup/
(4)在mongodb中导入备份
[ ~]$ mongoimport -uroot -proot123 -d opesn -c t100w --type=csv --headerline  --authenticationDatabase admin /mongodb/backup/t100w.csv

mongodump/mongorestore

mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘。但是存在的问题时使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,则备份出来的文件可能不完全和Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。

#mongodump用法如下:
$ mongodump --help
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
-j, --numParallelCollections=  number of collections to dump in parallel (4 by default)
--oplog  备份的同时备份oplog

#全库备份
[ ~]$ mongodump -uroot -proot123 --authenticationDatabase admin -o /mongodb/backup/
#备份opesn库
[ ~]$ mongodump -uroot -proot123 --authenticationDatabase admin -d opesn -o /mongodb/backup/
#备份opesn库下的t100w集合
[ ~]$ mongodump -uroot -proot123 --authenticationDatabase admin -d opesn -c t100w -o /mongodb/backup/
#压缩备份
[ ~]$ mongodump -uroot -proot123 --authenticationDatabase admin -d opesn -c t100w -o /mongodb/backup/ --gzip

#恢复opesn库
[ ~]$ mongorestore  -uroot -proot123 --authenticationDatabase admin -d opesn /mongodb/backup/opesn/
#恢复opesn库下的t100w集合
[ ~]$ mongorestore  -uroot -proot123 --authenticationDatabase admin -d opesn -c t100w /mongodb/backup/opesn/t100w.bson 
或者
[ ~]$ mongorestore  -uroot -proot123 --authenticationDatabase admin -d opesn -c t100w --gzip /mongodb/backup/opesn/t100w.bson.gz 
#--drop表示恢复的时候把之前的集合drop掉(危险)
[ ~]$ mongorestore  -uroot -proot123 --authenticationDatabase admin -d opesn --drop  /mongodb/backup/opesn

oplog

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

#想要查看当前的oplog时间窗口预计值,可以使用以下命令:
my_repl:PRIMARY> db.oplog.rs.find().pretty()
"ts" : Timestamp(1572276634, 1),
"op" : "n"
"o"  :

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

my_repl:PRIMARY> rs.printReplicationInfo()
configured oplog size:   2048MB <--集合大小
log length start to end: 132876secs (36.91hrs) <--预计窗口覆盖时间
oplog first event time:  Mon Oct 28 2019 23:28:02 GMT+0800 (CST)
oplog last event time:   Wed Oct 30 2019 12:22:38 GMT+0800 (CST)
now:                     Wed Oct 30 2019 12:22:45 GMT+0800 (CST)
my_repl:PRIMARY> 

#oplog企业级应用
(1)实现热备,在备份时使用--oplog选项
注:为了演示效果我们在备份过程,模拟数据插入
(2)准备测试数据
[ ~]$ mongo --port 28018
my_repl:PRIMARY> use opesn
for(var i = 1 ;i < 100; i++) {
    db.foo.insert({a:i});
}
#查看插入的oplog
my_repl:PRIMARY> use local
my_repl:PRIMARY> db.oplog.rs.find({"op":"i"}).pretty()

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

#oplog高级应用
#全备数据库
#模拟原始数据
[ ~]$ mongo --port 28018
my_repl:PRIMARY> use wo
for(var i = 1 ;i < 20; i++) {
    db.ci.insert({a: i});
}
[ ~]$ mongodump --port 28018 --oplog -o /mongodb/backup
--oplog功能:在备份同时,将备份过程中产生的日志进行备份文件必须存放在/mongodb/backup下,自动命令为oplog.bson

#再次模拟数据
my_repl:PRIMARY> use wo
db.ci1.insert({id:1})
db.ci2.insert({id:2})
#删除wo库下的ci表
my_repl:PRIMARY> use wo
db.ci.drop()
#备份现有的oplog.rs表
[ ~]$ mongodump --port 28018 -d local -c oplog.rs -o /mongodb/backup/
#截取oplog并恢复到drop之前的位置
[ ~]$ mongo --port 28018
my_repl:PRIMARY> use local
#获取到oplog误删除时间点位置:
	"ts" : Timestamp(1572435602, 1),
#恢复备份+应用oplog
[ ~]$ cd /mongodb/backup/local/
[ local]$ cp oplog.rs.bson ../oplog.bson  
[ local]$ rm -rf /mongodb/backup/local/
[ local]$ mongorestore --port 28018 --oplogReplay --oplogLimit "1572435602:1" --drop /mongodb/backup/

相关推荐