專職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.
============================================================================
相關文章
相關標籤/搜索