MongoDB安裝部署及操作


安裝服務套路

MongoDB安裝部署及操作

mongodb官網
簡書作者:張亞_7868
張-博客副本

安裝

yum install libcurl openssl -y
mkdir /opt/mongo_cluster/ -p
mkdir /data/soft -p
cd /data/soft/
#wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz
tar zxvf mongodb-linux-x86_64-3.6.13.tgz -C /opt/mongo_cluster/
cd /opt/mongo_cluster/ && ln -s mongodb-linux-x86_64-3.6.13 mongodb
mkdir /opt/mongo_cluster/mongo_27017/{conf,logs,pid} -p
mkdir /data/mongo_cluster/mongo_27017 -p

配置啟動:

cat > /opt/mongo_cluster/mongo_27017/conf/mongodb.conf  << EOF
systemLog:
  destination: file   
  logAppend: true  
  path: /opt/mongo_cluster/mongo_27017/logs/mongodb.log
storage:
  journal:
    enabled: true
  dbPath: /data/mongo_cluster/mongo_27017
  directoryPerDB: true
  wiredTiger:
     engineConfig:
        cacheSizeGB: 1
        directoryForIndexes: true
     collectionConfig:
        blockCompressor: zlib
     indexConfig:
        prefixCompression: true

processManagement:
  fork: true
  pidFilePath: /opt/mongo_cluster/mongo_27017/pid/mongod.pid

net:
  port: 27017
  bindIp: 127.0.0.1,10.0.0.51
EOF
2.啟動命令
cd /opt/mongo_cluster/
mongodb/bin/mongod -f mongo_27017/conf/mongodb.conf 
3.檢查
ps -ef|grep mongo   
netstat -lntup|grep 27017
4.登錄
mongodb/bin/mongo db01:27017
5.關閉
mongodb/bin/mongod -f mongo_27017/conf/monogdb.conf --shutdown
6 警告解決:
優化警告
#解決大內存頁警告
echo never > /sys/kernel/mm/transparent_hugepage/enabled 
echo never > /sys/kernel/mm/transparent_hugepage/defrag
-----------------
vim /etc/init.d/disable-transparent-hugepages
#!/bin/bash
### BEGIN INIT INFO
# Provides:          disable-transparent-hugepages
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    mongod mongodb-mms-automation-agent
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description:       Disable Linux transparent huge pages, to improve
#                    database performance.
### END INIT INFO
case $1 in
  start)
    if [ -d /sys/kernel/mm/transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/transparent_hugepage
    elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/redhat_transparent_hugepage
    else
      return 0
    fi

    echo 'never' > ${thp_path}/enabled
    echo 'never' > ${thp_path}/defrag

    re='^[0-1]+$'
    if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
    then
      # RHEL 7
      echo 0  > ${thp_path}/khugepaged/defrag
    else
      # RHEL 6
      echo 'no' > ${thp_path}/khugepaged/defrag
    fi
    unset re
    unset thp_path
    ;;
esac
------------------
chmod 755 /etc/init.d/disable-transparent-hugepages     
chkconfig --add disable-transparent-hugepages
#普通用戶啟動
/opt/mongo_cluster/mongodb/bin/mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf --shutdown
> useradd mongo
> echo '123456'|passwd --stdin mongo
chown -R mongato:mongo /opt/mongo_cluster
chown -R mongo:mongo /data/mongo_cluster
su - mongo
vim .bashrc 
export PATH=/opt/mongo_cluster/mongodb/bin:$PATH
source .bashrc
mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf
mongo

基礎命令

> show databases
admin   0.000GB
config  0.000GB
local   0.000GB
> 
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> 
> db
test
> use local
switched to db local
> 
> db
local
> show tables
startup_log
### 插入數據
db.test.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"})
db.test.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"})
db.test.insert({"name":"yazhang","age":28,"ad":"北京市朝陽區"})
db.test.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區"})
db.test.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區","sex":"boy"})
##### 批量插入多條數據
db.inventory.insertMany( [
    { "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
    { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
    { "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
    { "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
    { "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
 ]);
##### 查詢數據
db.test.find()              #查詢test表下所有數據
db.test.findOne()           #查詢一條數據
db.inventory.find()         #查詢表下所有數據
db.inventory.findOne()      #查詢一條數據
###### 條件查詢
db.inventory.find({"status":"D"})
db.inventory.find({"size.uom":"cm"})
db.inventory.find({"size.uom":"cm","qty":{$lt: 50}})
db.inventory.find({"status":"A","qty":{$lt:50}})

db.inventory.find(
		{
		"size.uom":"cm",            c# 查詢
		"qty":                      #條件
			{
				$lt:50              #小於50
			}
		}
)
# 且語句
> db.inventory.find({"size.h":{$gt:11},"qty":{$lt:50}})
{ "_id" : ObjectId("5d232ffb441afa799e27dd0f"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
> db.inventory.find({"size.h":{$gt:11},"qty":{$lt:100}})
{ "_id" : ObjectId("5d232ffb441afa799e27dd0f"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A" }
{ "_id" : ObjectId("5d232ffb441afa799e27dd12"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D" }
# 或語句
db.inventory.find({$or:[{"status":"A"},{"status":"D"}]})
db.inventory.find( {
    $and : [
        { $or : [ { "status" : "D" }, {"qty":{$lt: 50}} },
        { $or : [ { "status" : "A" }, {"qty":{$lt: 50} } ] }
    ]})
myCursor = db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
    })
# 更新 修改
更新前的內容
db.inventory.find({ "item" : "paper" })
{ "_id" : ObjectId("5d22be4e0e03689b676725dc"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D" }
更新語句
db.inventory.updateOne(
    { "item" : "paper" }, 
    {
      $set: {  "size.uom" : "cm",  "status" : "P" },
      $currentDate: { "lastModified": true }
    }
)
更新后的內容
db.inventory.find( { "item" : "paper" } )
{ "_id" : ObjectId("5d22be4e0e03689b676725dc"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "cm" }, "status" : "P", "lastModified" : ISODate("2019-07-08T07:06:00.748Z")}
更新多條
db.inventory.updateMany(
    { "qty" : { $lt: 50 } },
    {
       $set: { "size.uom" : "cm", "status": "P" },
       $currentDate : { "lastModified": true }
    }
)
db.inventory.updateOne(
    { "qty" : { $lt: 50 } },
    {
       $set: { "size.uom" : "cm", "status": "P" },
       $currentDate : { "lastModified": true }
    }
)
db.inventory.updateMany(
    { "qty" : { $lt: 50 } },
    {
       $set: { "size.uom" : "cm", "status": "P" },
       $currentDate : { "lastModified": true }
    }
)
 db.inventory.updateOne(
 {"item":"journal"},
     {$set:
        {"size.h":"100"},
        $currentDate:{"lastModified":true}
 }
 )
刪除內容
db.inventory.find( {"status" : "D"})
db.inventory.deleteOne(
	{"status" : "D"}
)
刪除匹配到的內容
db.inventory.find( {"status" : "P"})
db.inventory.deleteMany(
	{"status" : "P"}
)
mongo分析工具
mongotop    #另一窗口查看數據庫正在工作的語句
mongostat   #另一窗口查看數據庫正在工作的語句
#實驗語句
for(i=0;i<100000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6})}

用戶授權認證

use admin
db.createUser(
	{
		user: "admin",
		pwd: "123456",
		roles:[ { role: "root", db:"admin"}]}
)
--------------role里的角色可以選:
              Built-In Roles(內置角色):
             .1. 數據庫用戶角色:read、readWrite;
              .2. 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
              .3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
              .4. 備份恢復角色:backup、restore;
              .5. 所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
              .6. 超級用戶角色:root 
                // 這里還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
              .7. 內部角色:__system
              具體角色: 
                Read:允許用戶讀取指定數據庫
                readWrite:允許用戶讀寫指定數據庫
                backup,retore:在進行備份、恢復時可以單獨指定的角色,在db.createUser()方法中roles里面的db必須寫成是admin庫,要不然會 報錯
                dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
                userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫里創建、刪除和管理用戶
                clusterAdmin:只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。
                readAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀權限
                readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限
                userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限,
                dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。
                root:只在admin數據庫中可用。超級賬號,超級權限
修改配置文件
vim /opt/mongo_cluster/mongo_27017/conf/mongodb.conf   
# 添加
security:
  authorization: enabled

重啟服務
mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf --shutdown
mongod -f /opt/mongo_cluster/mongo_27017/conf/mongodb.conf

登錄
mongo
show dbs 
mongo -uadmin -p 
show dbs

用戶

1.使用admin用戶登錄 
mongo -uadmin -p 
show dbs 

2.切換到test庫,並創建一個用戶賦予不同庫的不同角色
use test
db.createUser(
  {
    user: "myTester",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "test2" } ]
  }
)

3.在test庫下插入測試數據 
db.test.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"})
db.test.insert({"name":"zhangya","age":27,"ad":"北京市朝陽區"})
db.test.insert({"name":"yazhang","age":28,"ad":"北京市朝陽區"})
db.test.insert({"name":"xiaozhang","age":28,"ad":"北京市朝陽區"})

4.在test2庫下插入測試數據
use test2
db.test2.insert({"name":"zhangya","age":27,"ad":"北京市昌平區"})
db.test2.insert({"name":"zhangya","age":27,"ad":"北京市昌平區"})
db.test2.insert({"name":"yazhang","age":28,"ad":"北京市昌平區"})

5.使用myTester用戶登錄到test驗證庫
mongo -umyTester -pxyz123 db01:27017/test
show dbs 
db 

6.切換到test庫,測試能否讀寫
use test
db.test.insert({"name":"58NB","age":27,"ad":"北京市朝陽區"})
db.test.find()

7.切換到test2庫,測試能否讀寫
use test2
db.test2.insert({"name":"58NB","age":27,"ad":"北京市昌平區"})
db.test2.find()

多實例

Mongo用戶下

su - mongo

副本集配置
1.創建配置文件目錄
mkdir -p /opt/mongo_cluster/mongo_2801{7,8,9}/{conf,logs,pid}
2.修改副本集配置文件
cat >/opt/mongo_cluster/mongo_28017/conf/mongo_28017.conf <<EOF
systemLog:
  destination: file   
  logAppend: true  
  path: /opt/mongo_cluster/mongo_28017/logs/mongodb.log
storage:
  journal:
    enabled: true
  dbPath: /data/mongo_cluster/mongo_28017
  directoryPerDB: true
  wiredTiger:
     engineConfig:
        cacheSizeGB: 0.5 
        directoryForIndexes: true
     collectionConfig:
        blockCompressor: zlib
     indexConfig:
        prefixCompression: true
processManagement:
  fork: true
  pidFilePath: /opt/mongo_cluster/mongo_28017/pid/mongod.pid
net:
  port: 28017
  bindIp: 127.0.0.1,10.0.0.51
replication:
   oplogSizeMB: 1024 
   replSetName: dba58 
EOF
3.復制配置文件到其他目錄
cp /opt/mongo_cluster/mongo_28017/conf/mongo_28017.conf /opt/mongo_cluster/mongo_28018/conf/mongo_28018.conf
cp /opt/mongo_cluster/mongo_28017/conf/mongo_28017.conf /opt/mongo_cluster/mongo_28019/conf/mongo_28019.conf
4.修改配置文件里的端口
sed -i 's#28017#28018#g' /opt/mongo_cluster/mongo_28018/conf/mongo_28018.conf  
sed -i 's#28017#28019#g' /opt/mongo_cluster/mongo_28019/conf/mongo_28019.conf
5.創建數據目錄
mkdir /data/mongo_cluster/mongo_2801{7,8,9}
6.啟動多實例
mongod -f /opt/mongo_cluster/mongo_28017/conf/mongo_28017.conf 
mongod -f /opt/mongo_cluster/mongo_28018/conf/mongo_28018.conf 
mongod -f /opt/mongo_cluster/mongo_28019/conf/mongo_28019.conf
7.初始化副本集
config = {
_id : "dba58", 
members : [
{_id : 0, host : "db01:28017"},
{_id : 1, host : "db01:28018"},
{_id : 2, host : "db01:28019"},
] }
rs.initiate(config) 

8.查看副本集狀態
rs.status()

# 主
db.inventory.insertMany( [
    { "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
    { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
    { "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
    { "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
    { "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
 ]);

# 從 
8.查看副本集狀態
rs.status()
 ##### 報錯
    臨時解決
    rs.slaveOk();
    永久解決
    echo "rs.slaveOk();" >> .mongorc.js

權重調整+主庫降級

1.查看配置信息
rs.conf()
2.配置權重
config = rs.conf()
config.members[2].priority=100
3.重新導入配置信息
rs.reconfig(config)
4.主庫降級,發起重新選舉 
rs.stepDown()
5.恢復成默認權重
config = rs.conf()
config.members[2].priority=1
rs.reconfig(config) 
rs.stepDown()

增加節點

1.安裝配置啟動新節點
mkdir /opt/mongo_cluster/mongo_28010/{conf,logs,pid} -p
mkdir /data/mongo_cluster/mongo_28010
cp /opt/mongo_cluster/mongo_28017/conf/mongo_28017.conf /opt/mongo_cluster/mongo_28010/conf/mongo_28010.conf
sed -i 's#28017#28010#g' /opt/mongo_cluster/mongo_28010/conf/mongo_28010.conf
mongod -f /opt/mongo_cluster/mongo_28010/conf/mongo_28010.conf
mongo db01:28010
2.主庫執行添加新節點操作
use admin
rs.add("db01:28010")
刪除舊節點
1.主庫操作,刪除舊節點
mongo db01:28017
rs.remove("db01:28010")
2.節點下線
mongod -f /opt/mongo_cluster/mongo_28010/conf/mongo_28010.conf --shutdown
添加仲裁節點
1.清空28010節點的數據
rm -rf /data/mongo_cluster/mongo_28010/*
2.重新啟動
mongod -f /opt/mongo_cluster/mongo_28010/conf/mongo_28010.conf
3.檢查
mongo db01:28010
4.主庫操作
mongo db01:28017
rs.addArb("db01:28010")
5.查看節點狀態
mongo db01:28010

備份恢復

導出
mongoexport --port 28017 -d dba -c inventory -o /backup/log.json
mongoexport --port 28017 -d dba -c inventory --type=csv -f item,qty,size,status  -o /backup/log.csv
導入
mongoimport --port 28017 -d oldboy -c inventory /backup/log.json
導入CSV
mongoimport  --port 28017 -d dba58 -c log2 --type=csv --headerline -f item,qty,size,status  --file  /backup/log.csv
mysql導出csv
select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';
導入csv
mongoimport --port 28017  -d world  -c city --type=csv -f ID,Name,CountryCode,District,Population --file  /tmp/city1.csv
全備
mongodump  --port 28017 -o /data/backup
只備一個庫
mongodump  --port 28017 -d world -o /data/backup
恢復:
mongorestore --port 28017 -d world1  /data/backup/world/
恢復之前先刪除
mongorestore --port 28017 -d world1  /data/backup/world/  --drop
db.oplog.rs.find({"op":"i","ns" : "oldboy.foo"}).pretty()
{
	"ts" : Timestamp(1562586945, 1),
	"t" : NumberLong(6),
	"h" : NumberLong("-3385388396708106697"),
	"v" : 2,
	"op" : "c",
	"ns" : "wo.$cmd",
	"ui" : UUID("f8a551a8-bde0-4456-a2bc-3c449da7864d"),
	"wall" : ISODate("2019-07-08T11:55:45.409Z"),
	"o" : {
		"drop" : "ci"
	}
}


mongorestore --port 28017 --oplogReplay --oplogLimit "1562586945:1"  --drop  /data/backup/

報錯總結

報錯記錄1
> db.test.insert({"name":"yazhangya","age":27,"ad":"北京市朝陽區"})
WriteResult({
	"writeError" : {
		"code" : 13,
		"errmsg" : "not authorized on test2 to execute command { insert: \"test\", ordered: true, lsid: { id: UUID(\"01431e12-5d4a-47a9-8ac4-657ab08fda7c\") }, $db: \"test2\" }"
	}
})
問題原因:
當前登錄的用戶對這個庫沒有寫入權限

報錯記錄2
dba58:SECONDARY> show tables
2019-07-08T17:50:44.576+0800 E QUERY    [thread1] Error: listCollections failed: {
	"operationTime" : Timestamp(1562579435, 1),
	"ok" : 0,
	"errmsg" : "not master and slaveOk=false",
	"code" : 13435,
	"codeName" : "NotMasterNoSlaveOk",
	"$clusterTime" : {
		"clusterTime" : Timestamp(1562579435, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
} :
解決方法:
臨時解決
rs.slaveOk();
永久解決
echo "rs.slaveOk();" >> .mongorc.js 
db.inventory.deleteOne( {"item" : "journal"})

報錯記錄3
從庫執行命令
db.inventory.deleteOne( {"item" : "journal"})
2019-07-08T18:03:45.247+0800 E QUERY    [thread1] WriteCommandError: not master :
WriteCommandError({
	"operationTime" : Timestamp(1562580215, 1),
	"ok" : 0,
	"errmsg" : "not master",
	"code" : 10107,
	"codeName" : "NotMaster",
	"$clusterTime" : {
		"clusterTime" : Timestamp(1562580215, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
})

問題原因:
從庫不能執行增刪改命令

報錯記錄4
2019-07-08T18:58:31.608+0800 I NETWORK  [thread1] trying reconnect to db01:28010 (10.0.0.51) failed
2019-07-08T18:58:31.609+0800 I NETWORK  [thread1] reconnect db01:28010 (10.0.0.51) ok
dba58:OTHER> 
dba58:OTHER> 
問題原因:
不在集群內或者被集群移除了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM