专职DBA-NoSQL-MongoDB核心技术

专职DBA-NoSQL-MongoDB核心技术mysql

专职DBA-NoSQL-Mongodb核心技术

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

选择之因此叫选择,确定是痛苦的!------郭加磊


MongoDB安装部署
系统准备:
(1).redhat或cnetos6.2以上系统
    [root@db01 ~]# cat /etc/redhat-release
(2).系统开发包完整
    md5值校验
(3).ip地址和hosts文件解析正常
    [root@db01 ~]# cat /etc/hosts
(4).iptables防火墙和SELinux关闭
    [root@db01 ~]# sestatus
    [root@db01 ~]# systemctl status firewalld.service
(5).关闭大页内存机制

[root@db01 ~]# 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
[root@db01 ~]# chmod +x /etc/rc.d/rc.local
[root@db01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@db01 ~]# echo never > /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.


/etc/systemd/system.conf
[root@db01 ~]# vim /etc/security/limits.conf
# MongoDB
mongodb    -    nofile    65535

修改  vim /etc/security/limits.conf
#*               -       nofile          65535


MongoDB安装
建立所需用户和组
[root@db01 ~]# useradd mongod
[root@db01 ~]# echo "123" | passwd --stdin mongod

建立mongodb所需目录结构
[root@db01 ~]# mkdir -p /mongodb/{conf,data,log}

上传并解压软件到指定位置
[root@db01 ~]# wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.12.tgz
[root@db01 ~]# wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.12.tgz.md5
[root@db01 ~]# md5sum -c mongodb-linux-x86_64-rhel70-3.6.12.tgz.md5
mongodb-linux-x86_64-rhel70-3.6.12.tgz: OK

[root@db01 ~]# mkdir -p /u01/app/mongodb
[root@db01 ~]# tar -xf mongodb-linux-x86_64-rhel70-3.6.12.tgz -C /u01/app/mongodb/

拷贝目录下bin程序到/mongodb/bin
[root@db01 ~]# cp -a /u01/app/mongodb/mongodb-linux-x86_64-rhel70-3.6.12/bin/ /mongodb/

设置目录结构权限
[root@db01 ~]# chown -R mongod:mongod /mongodb

设置用户环境变量
[root@db01 ~]# su - mongod
[mongod@db01 ~]$ vim .bash_profile
export PATH=/mongodb/bin:$PATH
[mongod@db01 ~]$ source .bash_profile

启动mongodb
[mongod@db01 ~]$ mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
[root@db01 ~]# ps -ef | grep mongod
[root@db01 ~]# netstat -lnp | grep mongod

登陆mongodb
[mongod@db01 ~]$ mongo
> exit

注:链接以后会有warning,须要修改(使用root用户)
vim /etc/security/limits.conf 
#*       -       nofile       65535
reboot重启生效


使用配置文件启动
[mongod@db01 ~]$ vim /mongodb/conf/mongodb.conf
logpath=/mongodb/log/mongodb.log
dbpath=/mongodb/data
port=27017
logappend=true
fork=true


关闭mongodb
[mongod@db01 ~]$ mongod -f /mongodb/conf/mongodb.conf --shutdown

使用配置文件启动mongodb
[mongod@db01 ~]$ mongod -f /mongodb/conf/mongodb.conf


YAML模式:不能使用Tab键补齐
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: <string>  --pid文件的位置,通常不用配置,能够去掉这行,自动生成到data中


网络配置有关
net:
   bindIp: <ip>  --监听地址,若是不配置这行是监听在0.0.0.0
   port: <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>
.........


YAML例子
[mongod@db01 ~]$ vim /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.0.11,127.0.0.1

[mongod@db01 ~]$ mongod -f /mongodb/conf/mongo.conf --shutdown
[mongod@db01 ~]$ mongod -f /mongodb/conf/mongo.conf



mongodb经常使用基本操做
[mongod@db01 ~]$ mongo
和MySQL通用的命令
> show databases;
> show dbs;
> use admin;
> show tables;


命令分类
对象相关
库: 
db.[TAB][TAB]
db.help()
集合: 
> db.t1.[TAB][TAB]

复制集相关(Replication set)
rs.[TAB][TAB]
rs.help()

分片集群相关(Sharding Cluster)
sh.[TAB][TAB]
sh.help()


mongodb对象操做:
库的操做:
show dbs
use test
db
说明:每次mongo登陆时,都须要指定一个库为登陆库(验证库),不设置的话默认是test。


集合的操做:
建立集合
方法1:
> use app01
switched to db app01
> db
app01
> db.createCollection('a')
{ "ok" : 1 }
> db.createCollection('b')
{ "ok" : 1 }
> show tables
a
b

方法2:当插入一个文档的时候,一个集合就会自动建立。
use app02
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})

查询数据:
db.stu.find({}).pretty()
db.stu.find({id:101}).pretty();

删除集合
use app01
db.a.drop()

重命名集合
db.b.renameCollection("bb")
show tables

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


Mongodb数据查询语句:
全表扫描
查询全部记录
db.log.find()
注:默认每页显示20条记录,当显示不下的的状况下,能够用it迭代命令查询下一页数据。
> it

设置每页显示数据的大小:
> DBQuery.shellBatchSize=50; //每页显示50条记录
> db.log.find()

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


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

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



用户管理
注意:验证库,创建用户时use到的库,在使用用户时,要加上验证库才能登陆。
对于管理员用户,必须在admin下建立。

1.建用户时,use到的库,就是此用户的验证库。******
2.登陆时,必须明确指定验证库才能登陆。******
3.一般,管理员用的验证库是admin,普通用户的验证库通常是所管理的库设置为验证库。******
4.若是直接登陆到数据库,不进行use,默认的验证库是test,不是咱们生产建议的。******

总结:
管理员用户,验证库admin。
普通用户,验证库就是业务库。
建用户前,use进去。
登陆时,必须加验证库。

use admin
mongo 10.0.0.11/admin
db


db.createUser
(
{
    user: "<name>",
    pwd: "<cleartext password>",
    roles: [
       { role: "<role>",
     db: "<database>" } | "<role>",
    ...
    ]
}
)

基本语法说明:
user:用户名
pwd:密码
roles:
    role:角色名
    db:做用对象    
role:root, readWrite,read
验证数据库:
mongo -u app01 -p 123 10.0.0.11/app01
-------------
用户管理例子:
建立超级管理员:管理全部数据库(必须use admin再去建立)
[mongod@db01 ~]$ mongo
use admin
db.createUser(
{
    user: "root",
    pwd: "123",
    roles: [ { role: "root", db: "admin" } ]
}
)

验证用户
db.auth('root','123')
配置文件中,加入如下配置
[mongod@db01 ~]$ vim /mongodb/conf/mongo.conf
security:
   authorization: enabled
重启mongodb
[mongod@db01 ~]$ mongod -f /mongodb/conf/mongo.conf --shutdown
[mongod@db01 ~]$ mongod -f /mongodb/conf/mongo.conf


登陆验证
[mongod@db01 ~]$ mongo -uroot -p123 admin
[mongod@db01 ~]$ mongo -uroot -p123 10.0.0.11/admin

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

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



建立库管理用户
mongo -uroot -p123 admin
use app01
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "dbAdmin", db: "app01" } ]
}
)
db.auth('admin','admin')

登陆测试
[mongod@db01 ~]$ mongo -uadmin -padmin 10.0.0.11/app01


建立对app01数据库,读写权限的用户app01:
(1).超级管理员用户登录
mongo -uroot -p123 admin
(2).选择一个验证库
use app01
(3).建立用户
db.createUser(
    {
        user: "app01",
        pwd: "app01",
        roles: [ { role: "readWrite" , db: "app01" } ]
    }
)

[mongod@db01 ~]$ mongo -uapp01 -papp01 app01

(4).建立app01数据库读写权限的用户并对test数据库具备读权限:
mongo -uroot -p123 10.0.0.11/admin
use app01
db.createUser(
{
user: "app03",
pwd: "app03",
roles: [ { role: "readWrite", db: "app01" },
{ role: "read", db: "test" }
]
}
)

(5).查询mongodb中的用户信息
mongo -uroot -p123 10.0.0.11/admin
db.system.users.find().pretty()

(6).删除用户(root身份登陆,use到验证库)
[mongod@db01 ~]$ mongo -uroot -p123 10.0.0.11/admin
use app01
db.dropUser("app01")





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

Replication Set配置过程详解
1.规划
三个以上的mongodb节点(或多实例)
多实例:
(1).多个端口:28017280182801928020
(2).多套目录:
mkdir -p /mongodb/28017/{conf,data,log}
mkdir -p /mongodb/28018/{conf,data,log}
mkdir -p /mongodb/28019/{conf,data,log}
mkdir -p /mongodb/28020/{conf,data,log}

(3).多套配置文件
/mongodb/28017/conf/mongod.conf
/mongodb/28018/conf/mongod.conf
/mongodb/28019/conf/mongod.conf
/mongodb/28020/conf/mongod.conf

(4)配置文件内容
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.11,127.0.0.1
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
EOF

cp -a /mongodb/28017/conf/mongod.conf  /mongodb/28018/conf/
cp -a /mongodb/28017/conf/mongod.conf  /mongodb/28019/conf/
cp -a /mongodb/28017/conf/mongod.conf  /mongodb/28020/conf/

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


(5).启动多个实例备用
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
[mongod@db01 ~]$ netstat -lnp | grep mongod


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

rs.initiate(config)

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


(2).1主1从1个arbiter
mongo -port 28017 admin
config = {_id: 'my_repl', members: [
                          {_id: 0, host: '10.0.0.11:28017'},
                          {_id: 1, host: '10.0.0.11:28018'},
                          {_id: 2, host: '10.0.0.11:28019',"arbiterOnly":true}]
          }
rs.initiate(config)


3.复制集管理操做:
(1).查看复制集状态:
rs.status();    // 查看总体复制集状态
rs.isMaster();  // 查看当前是不是主节点

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

(3).添加 arbiter节点
1.链接到主节点
[mongod@db03 ~]$ mongo --port 28018 admin
2.添加仲裁节点
my_repl:PRIMARY> rs.addArb("10.0.0.11:28020")
3.查看节点状态
my_repl:PRIMARY> rs.isMaster()
{
    "hosts" : [
        "10.0.0.11:28017",
        "10.0.0.11:28018",
        "10.0.0.11:28019"
    ],
    "arbiters" : [
        "10.0.0.11:28020"
    ],


rs.remove("ip:port");  // 删除一个节点

例子:
my_repl:PRIMARY> rs.remove("10.0.0.11:28019");
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()


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


(4).特殊节点:
arbiter节点:主要负责选主过程当中的投票,可是不存储任何数据,也不提供任何服务。
hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,由于数据是延时的,也不该该提供服务或参与选主,因此一般会配合hidden(隐藏)
通常状况下会将delay+hidden一块儿配置使用。

(5).配置延时节点(通常延时节点也配置成hidden)
"members" : [
        {
            "_id" : 0,
            "host" : "10.0.0.11:28017",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 1,
            "host" : "10.0.0.11:28018",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 3,
            "host" : "10.0.0.11:28020",
            "arbiterOnly" : true,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 0,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        },
        {
            "_id" : 4,
            "host" : "10.0.0.11:28019",
            "arbiterOnly" : false,
            "buildIndexes" : true,
            "hidden" : false,
            "priority" : 1,
            "tags" : {
                
            },
            "slaveDelay" : NumberLong(0),
            "votes" : 1
        }
]
--------------------------------------------
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[3].priority=1
cfg.members[3].hidden=false
cfg.members[3].slaveDelay=0
rs.reconfig(cfg)
--------------------------------------------
配置成功后,经过如下命令查询配置后的属性
rs.conf();


5.副本集其余操做命令:
查看副本集的配置信息
admin> rs.config()
或者
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日志(备份恢复章节)

rs.status()
rs.conf()
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)

配置过程
shard复制集配置:
目录建立:
mkdir -p /mongodb/38021/{conf,data,log}
mkdir -p /mongodb/38022/{conf,data,log}
mkdir -p /mongodb/38023/{conf,data,log}
mkdir -p /mongodb/38024/{conf,data,log}
mkdir -p /mongodb/38025/{conf,data,log}
mkdir -p /mongodb/38026/{conf,data,log}

修改配置文件:
sh1:
vim /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.0.11,127.0.0.1
  port: 38021
replication:
  oplogSizeMB: 2048
  replSetName: sh1
sharding:
  clusterRole: shardsvr
processManagement: 
  fork: true

cp -a /mongodb/38021/conf/mongodb.conf /mongodb/38022/conf/
cp -a /mongodb/38021/conf/mongodb.conf /mongodb/38023/conf/

sed -i 's#38021#38022#g' /mongodb/38022/conf/mongodb.conf
sed -i 's#38021#38023#g' /mongodb/38023/conf/mongodb.conf



sh2:
vim /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.0.11,127.0.0.1
  port: 38024
replication:
  oplogSizeMB: 2048
  replSetName: sh2
sharding:
  clusterRole: shardsvr
processManagement: 
  fork: true


cp -a /mongodb/38024/conf/mongodb.conf /mongodb/38025/conf/
cp -a /mongodb/38024/conf/mongodb.conf /mongodb/38026/conf/

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

启动全部节点,并搭建复制集:
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
[mongod@db01 ~]$ netstat -lnp | grep mongod


如下构建复制集不作,配置文件里已经有了
mongo --port 38021
use  admin
config = {_id: 'sh1', members: [
                          {_id: 0, host: '10.0.0.11:38021'},
                          {_id: 1, host: '10.0.0.11:38022'},
                          {_id: 2, host: '10.0.0.11:38023',"arbiterOnly":true}]
           }

rs.initiate(config)


mongo --port 38024 
use admin
config = {_id: 'sh2', members: [
                          {_id: 0, host: '10.0.0.11:38024'},
                          {_id: 1, host: '10.0.0.11:38025'},
                          {_id: 2, host: '10.0.0.11: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

修改配置文件:
[mongod@db01 ~]$ vim /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.0.11,127.0.0.1
  port: 38018
replication:
  oplogSizeMB: 2048
  replSetName: configReplSet
sharding:
  clusterRole: configsvr
processManagement:
  fork: true


cp -a /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/
cp -a /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/

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


启动节点,并配置复制集
mongod -f /mongodb/38018/conf/mongodb.conf
mongod -f /mongodb/38019/conf/mongodb.conf
mongod -f /mongodb/38020/conf/mongodb.conf
[mongod@db01 ~]$ netstat -lnp | grep mongod


构建过程不作了
mongo --port 38018
use  admin
config = {_id: 'configReplSet', members: [
                          {_id: 0, host: '10.0.0.11:38018'},
                          {_id: 1, host: '10.0.0.11:38019'},
                          {_id: 2, host: '10.0.0.11:38020'}]
           }
rs.initiate(config)


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


mongos节点配置:
建立目录:
mkdir -p /mongodb/38017/conf /mongodb/38017/log

配置文件:
vim /mongodb/38017/conf/mongos.conf
systemLog:
  destination: file
  path: /mongodb/38017/log/mongos.log
  logAppend: true
net:
  bindIp: 10.0.0.11,127.0.0.1
  port: 38017
sharding:
  configDB: configReplSet/10.0.0.11:38018,10.0.0.11:38019,10.0.0.11:38020
processManagement:
  fork: true

启动mongos
mongos -f /mongodb/38017/conf/mongos.conf
[mongod@db01 ~]$ netstat -lnp | grep mongos
[mongod@db01 ~]$ mongo --port 38017
mongos> sh.status()



分片集群操做:
链接到其中一个mongos(10.0.0.51),作如下配置
(1).链接到mongs的admin数据库
[root@db01 ~]# su - mongod
[mongod@db01 ~]$ mongo 10.0.0.11:38017/admin

(2).添加分片
mongos> db.runCommand( { addshard : "sh1/10.0.0.11:38021,10.0.0.11:38022,10.0.0.11:38023",name:"shard1"} )
mongos> db.runCommand( { addshard : "sh2/10.0.0.11:38024,10.0.0.11:38025,10.0.0.11:38026",name:"shard2"} )
(3).列出分片
mongos> db.runCommand( { listshards : 1 } )
(4).总体状态查看
mongos> sh.status();





使用分片集群
range分片配置及测试
test库下的vast大表进行手工分片
1.激活数据库分片功能
[mongod@db01 ~]$ mongo --port 38017 admin
admin> db.runCommand( { enablesharding : "test" } )


2.指定分片建对集合分片
建立索引
use test
db.vast.ensureIndex( { id: 1 } )

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

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

4.分片结果测试
shard1:
[mongod@db01 ~]$ mongo --port 38021
sh1:PRIMARY> use test
sh1:PRIMARY> db.vast.count();

shard2:
[mongod@db01 ~]$ mongo --port 38024
sh2:PRIMARY> use test
sh2:PRIMARY> db.vast.count();
499999

---==============================================================================================================



Hash分片例子:
对app01库下的vast大表进行hash
建立哈希索引
(1).对于app01开启分片功能
[root@db01 ~]# su - mongod
mongo --port 38017 admin
use admin
db.runCommand( { enablesharding : "app01" } )

(2).对于oldboy库下的vast表创建hash索引
use app01
db.vast.ensureIndex( { id: "hashed" } )

(3).开启分片 
use admin
sh.shardCollection( "app01.vast", { id: "hashed" } )

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

(5).hash分片结果测试
[mongod@db01 ~]$ mongo --port 38021
sh1:PRIMARY> use app01
sh1:PRIMARY> db.vast.count();
50393

[mongod@db01 ~]$ mongo --port 38024
sh2:PRIMARY> use app01
sh2:PRIMARY> db.vast.count();
49606

---------------------------

5.判断是否Shard集群
[mongod@db01 ~]$ mongo --port 38017 admin
admin> db.runCommand({ isdbgrid : 1})

6.列出全部分片信息
admin> db.runCommand({ listshards : 1})

7.列出开启分片的数据库
admin> use config
config> db.databases.find( { "partitioned": true } )
或者:
config> db.databases.find() //列出全部数据库分片状况

8.查看分片的片键
config> db.collections.find().pretty()
{
        "_id" : "test.vast",
        "lastmodEpoch" : ObjectId("5da5762cdc7af971caddf55b"),
        "lastmod" : ISODate("1970-02-19T17:02:47.296Z"),
        "dropped" : false,
        "key" : {
                "id" : 1
        },
        "unique" : false,
        "uuid" : UUID("32def106-7866-403e-bca3-63306f960f09")
}


9.查看分片的详细信息
admin> sh.status()

删除不执行了,先迁移,去节点,特别慢。
10.删除分片节点(谨慎)
(1).确认blance是否在工做
sh.getBalancerState()

(2).删除shard2节点(谨慎)
mongos> db.runCommand( { removeShard: "shard2" } )
注意:删除操做必定会当即触发balancer。


11.balancer操做
介绍:
mongos的一个重要功能,自动巡查全部shard节点上的chunk的状况,自动作chunk迁移。
何时工做?
1、自动运行,会检测系统不繁忙的时候作迁移
2、在作节点删除的时候,当即开始迁移工做
3、balancer只能在预设定的时间窗口内运行

有须要时能够关闭和开启blancer(备份的时候)
mongos> sh.stopBalancer()
mongos> sh.startBalancer()


12.自定义 自动平衡进行的时间段
https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#schedule-the-balancing-window
// connect to mongos

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

mongos> sh.getBalancerWindow()
mongos> sh.status()

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

小结:
集群基本结构
搭建
分片策略应用
balancer管理






备份恢复
备份恢复工具介绍:
(1).mongoexport/mongoimport  **
(2).mongodump/mongorestore   *****
应用场景:
mongoexport/mongoimport:json csv
1.异构平台迁移  mysql  <---> mongodb
2.同平台,跨大版本:mongodb 2  ----> mongodb 3

mongodump/mongorestore 平常备份恢复时使用

导出工具mongoexport
介绍:Mongodb中的mongoexport工具能够把一个collection导出成JSON格式或CSV格式的文件。能够经过参数指定导出的数据项,也能够根据指定的条件导出数据。
(1).版本差别较大
(2).异构平台数据迁移
$ mongoexport --help  
参数说明:
-h:指明数据库宿主机的IP
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明collection的名字
-f:指明要导出那些列
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
--authenticationDatabase admin



找个单实例作测试
[mongod@db01 ~]$ mongod -f /mongodb/conf/mongo.conf
[mongod@db01 ~]$ mkdir -p /mongodb/backup

exp/imp json导入导出
[mongod@db01 ~]$ mongoexport -uroot -p123 --port 27017 --authenticationDatabase admin -d app01 -c log -o     /mongodb/backup/log.json
[mongod@db01 ~]$ mongoimport -uroot -p123 --port 27017 --authenticationDatabase admin -d app02 -c t1         /mongodb/backup/log.json
[mongod@db01 ~]$ mongoimport -uroot -p123 --port 27017 --authenticationDatabase admin -d app01 -c log --drop /mongodb/backup/stu.json


exp/imp csv导入导出
[mongod@db01 ~]$ mongoexport -uroot -p123 --port 27017 --authenticationDatabase admin -d app01 -c log --type=csv -f uid,name,age,date  -o /mongodb/backup/log.csv
[mongod@db01 backup]$ sz /mongodb/backup/log.csv
[mongod@db01 ~]$ mongoimport -uroot -p123 --port 27017 --authenticationDatabase admin -d app02 -c log1 --type csv --headerline /mongodb/backup/log.csv



异构平台迁移案例(项目)MySQL数据迁移到MongoDB
MySQL-----> MongoDB
导出MySQL数据为CSV格式,并以","为分隔符
select * from shenzhen.t100w into outfile '/tmp/t100w.csv' fields terminated by ',';

mongodb导入csv格式数据
mongoimport -uroot -p123 --port 27017 --authenticationDatabase admin -d app01 -c t100w --type csv -f id,num,k1,k2,dt /tmp/t100w.csv

测试查看数据
[mongod@db01 ~]$ mongo -uroot -p123 --port 27017
db.t100w.count()
db.t100w.find()


扩展1:mongo迁移到MySQL
mysql导出csv:
select * from test_info 
into outfile '/tmp/test.csv' 
fields terminated by ','    ------字段间以,号分隔
optionally enclosed by '"'   ------字段用"号括起
escaped by '"'           ------字段中使用的转义符为"
lines terminated by '\r\n';  ------行以\r\n结束
mysql导入csv:
load data infile '/tmp/test.csv' 
into table test_info 
fields terminated by ',' 
optionally enclosed by '"' 
escaped by '"' 
lines terminated by '\r\n'; 


扩展2:有100张表都要作迁移?information_schema





mongodump和mongorestore
介绍:
mongodump可以在Mongodb运行时进行备份,它的工做原理是对运行的Mongodb作查询,而后将全部查到的文档写入磁盘。
可是存在的问题时使用mongodump产生的备份不必定是数据库的实时快照,若是咱们在备份时对数据库进行了写入操做,
则备份出来的文件可能不彻底和Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。

mongodump和mongorestore基本使用
全库备份
mkdir -p /mongodb/backup
mongodump -uroot -p123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
[mongod@db01 /mongodb/backup/app01]$ bsondump t1.bson >/tmp/t1.json

备份world库
mongodump -uroot -p123 --port 27017 --authenticationDatabase admin -d app01 -o /mongodb/backup/

备份app01库下的log集合
mongodump -uroot -p123 --port 27017 --authenticationDatabase admin -d app01 -c t100w -o /mongodb/backup/

压缩备份
mongodump -uroot -p123 --port 27017 --authenticationDatabase admin -o /mongodb/backup/ --gzip



恢复world库
mongorestore -uroot -p123 --port 27017 --authenticationDatabase admin -d world1 /mongodb/backup/world

恢复app01库下的t1集合
mongorestore -uroot -p123 --port 27017 --authenticationDatabase admin -d world -c t1 /mongodb/backup/app01/log1.bson.gz --gzip

--drop表示恢复的时候把以前的集合drop掉(危险)
mongorestore -uroot -p123 --port 27017 --authenticationDatabase admin -d app01 --drop /mongodb/backup/app01

企业里面仍是全备较多
mongorestore -uroot -p123 --port 27017 --authenticationDatabase admin --drop /mongodb/backup/ --gzip
============================================================================================================================================================


mongodump和mongorestore高级企业应用(--oplog)
注意:这是replica set或者master/slave模式专用
--oplog
use oplog for taking a point-in-time snapshot

oplog介绍
在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
 
oplog内容查看
mongo --port 28017 主库
use local
show tables
db.oplog.rs.find().pretty()
        "ts" : Timestamp(1553597844, 1),
        "op" : "n"
        "o"  :

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

my_repl: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)


模拟数据mongo --port 28017
use oldboy
for(var i = 1 ;i < 100; i++) {
    db.foo.insert({a:i});
}
db.foo.count()
use local
my_repl:PRIMARY> db.oplog.rs.find({"op":"i"}).pretty()


oplog 配合mongodump 实现热备
mongodump --port 28017 --authenticationDatabase admin --oplog -o /mongodb/backup/
mongodump --port 28017 --oplog -o /mongodb/backup/
做用介绍:--oplog 会记录备份过程当中的数据变化,会以oplog.bson保存下来
恢复
mongorestore --port 28017 --oplogReplay /mongodb/backup


oplog高级应用 = binlog应用
背景:天天0点全备,oplog恢复窗口为48小时
某天,上午10点test.t 业务表被误删除。

恢复思路:
    0、停应用
    2、找测试库
    3、恢复昨天晚上全备
    4、截取全备以后到test.t 误删除时间点的oplog,并恢复到测试库
    5、将误删除表导出,恢复到生产库


模拟故障环境:
(1).模拟原始数据
mongo --port 28017
use test
for(var i = 1 ;i < 20; i++) {
    db.t.insert({a: i});
}
(2).全备数据库
rm -rf /mongodb/backup/*
mongodump --port 28017 --oplog -o /mongodb/backup

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

(3).再次模拟数据
db.t.insert({id:100})
db.t.insert({id:200})

(4).上午10点:删除test库下的t表
db.t.drop()
show tables;

(5).备份现有的oplog.rs表
mongodump --port 28017 -d local -c oplog.rs -o /mongodb/backup

(6).截取oplog并恢复到drop以前的位置
[mongod@db03 local]$ mongo --port 28017
my_repl:PRIMARY> use local
db.oplog.rs.find({op:"c"}).pretty();

获取到oplog误删除时间点位置,找到drop的t表时间点。
"ts" : Timestamp(1569309963, 1),

(7).恢复备份+应用oplog
[mongod@db03 backup]$ cd /mongodb/backup/local/
[mongod@db03 local]$ ls
oplog.rs.bson  oplog.rs.metadata.json
[mongod@db03 local]$ cp -a oplog.rs.bson ../oplog.bson
rm -rf /mongodb/backup/local/

mongorestore --port 28017  --oplogReplay --oplogLimit "1569309963:1" --drop /mongodb/backup/


============================================================================
分片集群的备份思路(了解)
1.你要备份什么?
config server
shard 节点
单独进行备份。

2.备份有什么困难和问题?
(1).chunk迁移的问题。
    人为控制在备份的时候,避开迁移的时间窗口。
(2).shard节点之间的数据不在同一时间点。
    选业务量较少的时候。

Ops Manager.
============================================================================
相关文章
相关标签/搜索