MySQL之十一---MongoDB詳解

第一章:邏輯結構

Mongodb 邏輯結構 MySQL邏輯結構
database
集合(collection
文檔(document 數據行

第二章:安裝部署

系統準備

redhatcentos6.2以上系統
系統開發包完整
ip地址和hosts文件解析正常
iptables防火牆&SElinux關閉
關閉大頁內存機制

其餘系統關閉參照官方文檔: mysql

https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/linux

關閉THP

 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.
 透明大頁面(THP)是一個Linux內存管理系統
 它下降了翻譯查詢緩衝區(TLB)的開銷
 經過使用較大的內存頁在具備大量內存的計算機上查找。
 可是,使用THP時,數據庫工做負載一般表現不佳,
 由於它們傾向於使用稀疏而不是連續的內存訪問模式。
 您應該在Linux機器上禁用THP,以確保MongoDB的最佳性能。
 [root@db01 ~]# 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 

mongodb安裝

建立所需用戶和組

 [root@db01 opt]#  useradd mongod
 [root@db01 opt]#  passwd mongod

建立mongodb所需目錄結構

 mkdir -p /mongodb/conf
 mkdir -p /mongodb/log
 mkdir -p /mongodb/data

上傳並解壓軟件到指定位置

下載: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.2.tgzsql

法一:mongodb

 [root@db01opt]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.2.tgz
 [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

法二:shell

 [root@db01 opt]# rz 上傳
 [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

設置目錄結構權限

 [root@db01 opt]#  chown -R mongod:mongod /mongodb

設置用戶環境變量

 [mongod@db01 ~]$ su - mongod
 [mongod@db01 ~]$ vi .bash_profile
 export PATH=/usr/local/mongodb/bin:$PATH
 [mongod@db01 ~]$ source .bash_profile

啓動mongodb

 [mongod@db01 ~]$ mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork 

登陸mongodb

 [mongod@db01 ~]$ mongo

使用配置文件

YAML模式數據庫

注:YAML不支持製表符縮進:請改用空格。json

系統日誌有關

 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   --是否打開用戶名密碼驗證

------------------如下是複製集與分片集羣有關---------------------- vim

 replication:
  oplogSizeMB: <NUM>
  replSetName: "<REPSETNAME>"
  secondaryIndexPrefetch: "all"
 sharding:
    clusterRole: <string>
    archiveMovedChunks: <boolean>     
 ---for mongos only
 replication:
    localPingThresholdMs: <int>
 sharding:
   configDB: <string>

YAML例子centos

 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
 mongod -f /mongodb/conf/mongo.conf   

mongodb的關閉方式

 mongod -f mongo.conf  --shutdown

mongodb 使用systemd管理

 [mongod@db01 ~]$ exit
 [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經常使用基本操做

mongodb 默認存在的庫

test庫: 登陸時默認存在的庫 管理MongoDB有關的系統庫 admin庫: 系統預留庫,MongoDB系統管理庫 local庫: 本地預留庫,存儲關鍵日誌 config庫: MongoDB配置信息庫安全

 show databases  / show dbs
 show tables   / show collections
 use admin 
 db  /  select databases()

命令種類

db 對象相關命令

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

rs 複製集有關(replication set):

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

sh 分片集羣(sharding cluster)

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

mongodb對象操做

 mongo         mysql
 庫    -----> 庫
 集合  -----> 表
 文檔  -----> 數據行

庫的操做

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

集合的操做

 app> db.createCollection('student')
 { "ok" : 1 }

方法2:插入文檔,集合自動建立。

 use oldboy
 db.student.insert({name:"zhangsan"})
 db.oldguo.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})

文檔操做

數據錄入

 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() //集合中索引+數據壓縮存儲以後的大小    

用戶及權限管理

注意:

驗證庫: 創建用戶時use到的庫,在使用用戶時,要加上驗證庫才能登錄。 對於管理員用戶,必須在admin下建立.

建用戶時,use到的庫,就是此用戶的驗證庫

登陸時,必須明確指定驗證庫才能登陸

一般,管理員用的驗證庫是admin,普通用戶的驗證庫通常是所管理的庫設置爲驗證庫

若是直接登陸到數據庫,不進行use,默認的驗證庫是test,不是咱們生產建議的.

從3.6 版本開始,不添加bindIp參數,默認不讓遠程登陸,只能本地管理員登陸。

用戶建立語法

 use admin 
 db.createUser
 {
     user: "<name>",                                            
     pwd: "<cleartext password>",                                    
     roles: [                                                
         { role: "<role>",
      db: "<database>"
     } 
     
     | "<role>",
     ...
     ]
 }
                              #user:用戶名
                              #pwd:密碼
                              #roles: 
                               role:角色名
                               db:做用對象 
                      role:root, readWrite,read  

驗證數據庫:

 mongo -u oldboy -p 123 10.0.0.51/oldboy

用戶管理例子

建立超級管理員:

 $ mongo
 use admin
 db.createUser(
 {
     user: "root",
     pwd: "root123",
     roles: [ { role: "root", db: "admin" } ]
 }
 )

驗證用戶

 db.auth('root','root123')

配置文件中,加入如下配置

 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.51,127.0.0.1
 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.51/admin
 db.system.users.find().pretty()

刪除用戶(root身份登陸,use到驗證庫)

 db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]})
 mongo -uroot -proot123 10.0.0.51/admin
 use oldboy1
 db.dropUser("app02")

用戶管理注意事項

建用戶要有驗證庫,管理員admin,普通用戶是要管理的庫 登陸時,注意驗證庫

 mongo -uapp01 -papp01 10.0.0.51:27017/oldboy

重點參數

 net:
    port: 27017
    bindIp: 10.0.0.51,127.0.0.1
 security:
    authorization: enabled

MongoDB複製RS(ReplicationSet)

基本原理

基本構成是1主2從的結構,自帶互相監控投票機制(RaftMongoDBPaxosmysql MGR 用的是變種)) 若是發生主庫宕機,複製集內部會進行投票選舉,選擇一個新的主庫替代原有主庫對外提供服務。同時複製集會自動通知 客戶端程序,主庫已經發生切換了。應用就會鏈接到新的主庫。

Replication Set配置過程詳解

規劃

三個以上的mongodb節點(或多實例)

環境準備

多個端口:

 2801七、2801八、2801九、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

配置普通複製集

1主2從,從庫普通從庫v

 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'}]
           }          
     

初始化

 rs.initiate(config) 

查詢複製集狀態

 rs.status();

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)

複製集管理操做

查看複製集狀態

 rs.status();    //查看總體複製集狀態
 rs.isMaster();  // 查看當前是不是主節點
 rs.conf();     //查看複製集配置信息

添加刪除節點

 rs.remove("ip:port");   // 刪除一個節點
 rs.add("ip:port");      // 新增從節點
 rs.addArb("ip:port");   // 新增仲裁節點

案例1:添加 arbiter節點

鏈接到主節點

 [mongod@db01 ~]$ mongo --port 28018 admin
  • 添加仲裁節點

 my_repl:PRIMARY> rs.addArb("10.0.0.53:28020")
  • 查看節點狀態

 my_repl:PRIMARY> rs.isMaster()
 {
     "hosts" : [
         "10.0.0.51:28017",
         "10.0.0.51:28018",
         "10.0.0.51:28019"
     ],
     "arbiters" : [
         "10.0.0.51:28020"
     ]    

案例2:刪除節點

 
rs.remove("ip:port"); 
 my_repl:PRIMARY> rs.remove("10.0.0.51:28019");
 { "ok" : 1 }
 my_repl:PRIMARY> rs.isMaster()

案例3:新增從節點

 rs.add("ip:port");
 my_repl:PRIMARY> rs.add("10.0.0.51:28019")
 { "ok" : 1 }
 my_repl:PRIMARY> rs.isMaster()

特殊從節點

 

 

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)  

取消配置

 cfg=rs.conf() 
 cfg.members[2].priority=1
 cfg.members[2].hidden=false
 cfg.members[2].slaveDelay=0
 rs.reconfig(cfg)  
 ###members[2]  ##下標索引

查詢配置

 rs.conf(); 

副本集其餘操做命令

查看副本集的配置信息

 admin> rs.conf()

查看副本集各成員的狀態

 admin> rs.status()

副本集角色切換(不要人爲隨便操做)

 admin> rs.stepDown()

注: admin> rs.freeze(300) //鎖定從,使其不會轉變成主庫 freeze()和stepDown單位都是秒。

設置副本節點可讀:在副本節點執行

 admin> rs.slaveOk()
 show  tables;
 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 0 1

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

MongoDB Sharding Cluster 分片集羣

 

 

規劃

 10個實例:38017-38026
 configserver:38018-38020
 3臺構成的複製集(1主兩從,不支持arbiter)38018-38020(複製集名字configserver)
 shard節點:
 sh1:38021-23 (1主兩從,其中一個節點爲arbiter,複製集名字sh1)
 sh2:38024-26 (1主兩從,其中一個節點爲arbiter,複製集名字sh2)
  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

修改配置文件:

第一組複製集搭建:(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

第二組節點:(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

啓動全部節點,並搭建複製集

 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

38021登陸

 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)

38024 登陸

 
 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)

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 <<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

啓動節點,並配置複製集

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

38018登陸

 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'}]
            }

38018初始化

 rs.initiate(config)  

注:configserver能夠是一個節點,官方建議複製集。configserver不能有arbiter 新版本中,要求必須是複製集。 注:mongodb 3.4以後,雖然要求config serverreplica set,可是不支持arbiter

mongos節點配置:

建立目錄:

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

配置文件:

 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

啓動mongos

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

分片集羣添加節點

鏈接mongos(10.0.0.51)配置

  • 鏈接到mongs的admin數據庫

 # su - mongod
 $ mongo 10.0.0.51:38017/admin
  • 添加分片

 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"} )
  • 列出分片

 mongos> db.runCommand( { listshards : 1 } )
  • 總體狀態查看

 mongos> sh.status();

使用RANGE分片集羣

RANGE分片配置及測試

RANGE自動分片策略

激活數據庫分片功能

 mongo --port 38017 admin
 use admin
 admin>  ( { enablesharding : "數據庫名稱" } )
 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<1000000;i++){ db.autotab.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
  db.autotab.stats()

分片結果測試

 shard1:
 mongo --port 38021
 db.autotab.count();
 ​
 shard2:
 mongo --port 38024
 db.autotab.count();

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()

Hash分片例子:

對oldboy庫下的vast大表進行hash建立哈希索引

oldboy開啓分片功能

 mongo --port 38017 admin
 use admin
  db.runCommand( { enablesharding : "oldboy" } )

oldboy庫下vast表創建hash索引

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

開啓分片

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

oldboy庫下錄入10w行數據測試

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

查看結果

 db.vast.getShardDistribution()

hash分片結果測試

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

分片集羣的查詢及管理

判斷是否Shard集羣

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

列出全部分片信息

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

列出開啓分片的數據庫

 admin> use config
 config> db.databases.find( { "partitioned": true } )
 或者:
 config> db.databases.find() //列出全部數據庫分片狀況

查看分片的片鍵

 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
 }

查看分片的詳細信息

 admin> sh.status()

刪除分片節點(謹慎)

 1)確認blance是否在工做
 sh.getBalancerState()
 2)刪除shard2節點(謹慎)
 mongos> db.runCommand( { removeShard: "shard2" } )
 注意:刪除操做必定會當即觸發blancer。

balancer操做

mongos的一個重要功能,自動巡查全部shard節點上的chunk的狀況,自動作chunk遷移。 何時工做 自動運行,會檢測系統不繁忙的時候作遷移 在作節點刪除的時候,當即開始遷移工做 balancer只能在預設定的時間窗口內運行

有須要時能夠關閉和開啓blancer(備份的時候)

 mongos> sh.stopBalancer()
 mongos> sh.startBalancer()

自定義 自動平衡進行的時間段

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

 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;

備份恢復

備份恢復工具介紹:

   mongoexport/mongoimport  #導出/導入
  mongodump/mongorestore

備份工具區別

應用場景總結: mongoexport/mongoimport:json csv 異構平臺遷移 mysql <---> mongodb 同平臺,跨大版本:`mongodb 2 ----> mongodb 3 mongodump/mongorestore 平常備份恢復時使用.

導出工具mongoexport

參數:

$ mongoexport --help 
 -h:指明數據庫宿主機的IP
 -u:指明數據庫的用戶名
 -p:指明數據庫的密碼
 -d:指明數據庫的名字
 -c:指明collection的名字
 -f:指明要導出那些列
 -o:指明到要導出的文件名
 -q:指明導出數據的過濾條件
 --authenticationDatabase admin

用法:

單表備份至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 test -c log --type=csv -f uid,name,age,date  -o /mongodb/log.csv

導入工具mongoimport

參數:

 $ mongoimport --help
 參數說明:
 -h:指明數據庫宿主機的IP
 -u:指明數據庫的用戶名
 -p:指明數據庫的密碼
 -d:指明數據庫的名字
 -c:指明collection的名字
 -f:指明要導入那些列
 -j, --numInsertionWorkers=<number>  number of insert operations to run concurrently       (defaults to 1)
 //並行

數據恢復:

恢復json格式表數據到log1

 mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json

恢復csv格式的文件到log2

上面演示的是導入JSON格式的文件中的內容,若是要導入CSV格式文件中的內容,則須要經過--type參數指定導入格式,具體以下所示:

注意: csv格式的文件頭行,有列名字

 mongoimport   -uroot -proot123 --port 27017 --authenticationDatabase admin   -d oldboy -c log2 --type=csv --headerline --file  /mongodb/log.csv

csv格式的文件頭行,沒有列名字

 mongoimport   -uroot -proot123 --port 27017 --authenticationDatabase admin   -d oldboy -c log3 --type=csv -f id,name,age,date --file  /mongodb/log.csv

注:--headerline:指明第一行是列名,不須要導入。

異構平臺遷移案例

mysql -----> mongodb

mysql開啓安全路徑

 vim /etc/my.cnf   --->添加如下配置
 secure-file-priv=/tmp
 --重啓數據庫生效
 /etc/init.d/mysqld restart

導出MySQL數據爲CSV格式

 select * from test.t100w  limit 100  into outfile '/tmp/t100w.csv' fields terminated by ',';

導入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

mongodumpmongorestore

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

mongodumpmongorestore基本使用

全庫備份

 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

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

mongodumpmongorestore高級企業應用(--oplog)

注意:這是replica set或者master/slave模式專用 --oplog use oplog for taking a point-in-time snapshot

oplog介紹

replica setoplog是一個定容集合(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)

 

oplog企業級應用

實現熱備,在備份時使用--oplog選項

注:爲了演示效果咱們在備份過程,模擬數據插入 準備測試數據

 [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保存下來恢復

 mongorestore  --port 28018 --oplogReplay /mongodb/backup

oplog高級應用

背景:天天0點全備,oplog恢復窗口爲48小時 某天,上午10點test 業務表被誤刪除。 恢復思路: 0.停應用 1.找測試庫 2.恢復昨天晚上全備 3.截取全備以後到test誤刪除時間點的oplog,並恢復到測試庫 4.將誤刪除表導出,恢復到生產庫

恢復步驟:

模擬故障環境:

全備數據庫 模擬原始數據

 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})

2.上午10點:刪除wo庫下的ci表 10:00時刻,誤刪除

3.備份現有的oplog.rs表

 mongodump --port 28017 -d local -c oplog.rs  -o /mongodb/bak

4.截取oplog並恢復到drop以前的位置 更合理的方法:登錄到原數據庫

 [mongod@db01 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"
     }
 }

5.獲取到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/ 
 [mongod@db01 backup]$mondb --port 28017
 db.a.count()
 db.b.count()
 db.c.count()

分片集羣的備份思路

 備份的目標:
 config server
 shard 節點
 單獨進行備份
 備份有什麼困難和問題
 chunk遷移的問題
 人爲控制在備份的時候,避開遷移的時間窗口
 shard節點之間的數據不在同一時間點。
     選業務量較少的時候            
 Ops Manager 
相關文章
相關標籤/搜索