分佈式緩存 — MongoDB

--- 數據庫管理系統

數據庫管理系統主要分爲倆大類:RDBMS、NOSQL。在我的電腦、大型計算機和主機上應用最普遍的數據庫管理系統是關係型DBMS。NoSQL是對不一樣於傳統的關係數據庫的數據庫管理系統的統稱。html

二者最重要的不一樣點是NoSQL不使用SQL做爲查詢語言。其數據存儲能夠不須要固定的表格模式,也常常會避免使用SQL的JOIN操做,通常有水平可擴展性的特徵。linux

常見的數據庫管理系統,及其排名狀況以下:git

 

NoSQL數據庫四你們族

NoSQL中的四你們族主要是:列存儲、鍵值、圖像存儲、文檔存儲,其類型產品主要有如下這些。github

存儲類型mongodb

NoSQLshell

鍵值存儲數據庫

最終一致性鍵值存儲express

Cassandra、Dynamo、Riak、Hibari、Virtuoso、Voldemort編程

內存鍵值存儲json

Memcached、Redis、Oracle Coherence、NCache、Hazelcast、Tuple space、Velocity

持久化鍵值存儲

BigTable、LevelDB、Tokyo Cabinet、Tarantool、TreapDB、Tuple space

文檔存儲

MongoDB、CouchDB、SimpleDB、 Terrastore 、 BaseX 、Clusterpoint 、 Riak、No2DB

圖存儲

FlockDB、DEX、Neo4J、AllegroGraph、InfiniteGraph、OrientDB、Pregel

列存儲

Hbase、Cassandra、Hypertable

NoSQL的優點

  高可擴展性、分佈式計算、沒有複雜的關係、低成本

  架構靈活、半結構化數據

NoSQL與RDBMS對比 

NoSQL

RDBMS

表明着不只僅是SQL

沒有聲明性查詢語言

沒有預約義的模式

鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫

最終一致性,而非ACID屬性

非結構化和不可預知的數據

CAP定理

高性能,高可用性和可伸縮性

高度組織化結構化數據

結構化查詢語言(SQL) (SQL)

數據和關係都存儲在單獨的表中。

數據操縱語言,數據定義語言

嚴格的一致性

基礎事務

 

--- MongoDB介紹

MongoDB的特性

 

除了上圖所示的3大技術特點還支持

  二級索引、動態查詢、全文搜索 、聚合框架、MapReduce、GridFS、地理位置索引、內存引擎 、地理分佈等一系列的強大功能。

可是其也有些許的缺點,例如:

  多表關聯: 僅僅支持Left Outer Join

  SQL 語句支持: 查詢爲主,部分支持

  多表原子事務: 不支持

  多文檔原子事務:不支持

  16MB 文檔大小限制,不支持中文排序 ,服務端 Javascript 性能欠佳

存儲方式對比

     在傳統的關係型數據庫中,存儲方式是以表的形式存放,而在MongoDB中,以文檔的形式存在。

數據庫中的對應關係,及存儲形式的說明

 

MongoDB與SQL的結構對比詳解

SQL Terms/Concepts

MongoDB Terms/Concepts

database

database

table

collection

row

document or BSON document

column

field

index

index

table joins

embedded documents and linking

primary key

Specify any unique column or

column combination as

primary key.

primary key

In MongoDB, the primary key is

automatically set to the _id field.

aggregation (e.g. group by)

aggregation pipeline

See the SQL to Aggregation Mapping

Chart.

MongoDB數據類型

  • String :                           最經常使用的用於存儲數據的數據類型。在MongoDB中的字符串必須是有效的UTF-8
  • Integer :                         用來存儲一個數值。整數能夠是32位或64位,這取決於您的服務器
  • Boolean :                       用於存儲一個布爾值 (true/ false) 
  • Double :                         用來存儲浮點值
  • Min/ Max keys :             用來對BSON元素的最低和最高值比較
  • Arrays :                          使用此類型的數組或列表或多個值存儲到一個鍵
  • Timestamp :                   時間戳。這能夠方便記錄時的文件已被修改或添加
  • Object :                     用於嵌入式的文件
  • Null :                               用來存儲一個Null值
  • Symbol :                         用於字符串相同,但它一般是保留給特定符號類型的語言使用
  • Date :                             用於存儲當前日期或時間的UNIX時間格式。能夠指定本身的日期和時間,日期和年,月,日到建立對象
  • Object ID :                      用於存儲文檔的ID
  • Binary data :                   用於存儲二進制數據
  • Code :                       用於存儲到文檔中的JavaScript代碼
  • Regular expression :      用於存儲正則表

MongoDB數據存儲格式

  • JSON格式

  JSON 數據格式與語言無關,脫胎於 JavaScript,但目前不少編程語言都支持 JSON 格式數據的生成和解析。JSON 的官方 MIME 類型是 application/json,文件擴展名是 .json。

  MongoDB 使用JSON(JavaScript ObjectNotation)文檔存儲記錄。

  JSON數據庫語句能夠容易被解析。

  Web 應用大量使用,NAME-VALUE 配對

 

  • BSON格式

  BSON是由10gen開發的一個數據格式,目前主要用於MongoDB中,是MongoDB的數據存儲格式。BSON基於JSON格式,選擇JSON進行改造的緣由主要是JSON的通用性及JSON的schemaless的特性。 

  二進制的JSON,JSON文檔的二進制編碼存儲格式

  BSON有JSON沒有的Date和BinData

  MongoDB中document以BSON形式存放

> db.meeting.insert({meeting:「M1 June",Date:"2018-01-06"});

MongoDB的優點

    📢 MongoDB是開源產品

    📢 On GitHub Url:https://github.com/mongodb

    📢  Licensed under the AGPL,有開源的社區版本

    📢 起源& 贊助by MongoDB公司,提供商業版licenses 許可

     這些優點造就了mongodb的豐富的功能:

  JSON 文檔模型、動態的數據模式、二級索引強大、查詢功能、自動分片、水平擴展、自動複製、高可用、文本搜索、企業級安全、聚合框架MapReduce、大文件存儲GridFS

各存儲引擎的對比

 

MySQL InnoDB

MySQL NDB

Oracle

MongoDB MAPI

MongoDB WiredTiger

事務

YES

YES

ES

NO

NO

鎖粒度

ROW-level

ROW-level

ROW-level

Collection-level

Document-level

Geospatial

YES

YES

YES

YES

YES

MVCC

YES

NO

YES

NO

NO

Replication

YES

YES

YES

YES

YES

外鍵

YES

YES(From 7.3)

YES

NO

NO

數據庫集羣

NO

YES

YES

YES

YES

B-TREE索引

YES

YES

YES

YES

YES

全文檢索

YES

NO

YES

YES

YES

數據壓縮

YES

NO

YES

NO

YES

存儲限制

64TB

384EB

NO

NO

NO

表分區

YES

YES

YES

YES (分片)

YES (分片)

MongoDB適用場景

  網站數據、緩存等大尺寸、低價值的數據

  在高伸縮性的場景,用於對象及JSON數據的存儲。

在下面的表格中進行選擇,但有1個yes的時候:能夠考慮MongoDB;當有2個以上yes的時候:不會後悔的選擇!

應用特徵

Yes/No?

個人數據量是有億萬級或者須要不斷擴容

 

須要2000-3000以上的讀寫每秒

 

新應用,需求會變,數據模型沒法肯定

 

我須要整合多個外部數據源

 

個人系統須要99.999%高可用

 

個人系統須要大量的地理位置查詢

 

個人系統須要提供最小的latency

 

我要管理的主要數據對象<10

 

MongoDB 慎用場景

慎用場景

緣由

PB 數據持久存儲大數據分析數據湖

Hadoop、Spark提供更多分析運算功能和工具,並行計算能力更強

MongoDB + Hadoop/Spark

搜索場景:文檔有幾十個字段,須要按照任意字段搜索並排序限制等

不建索引查詢太慢,索引太多影響寫入及更新操做

ERP、CRM或者相似複雜應用,幾十上百個對象互相關聯

關聯支持較弱,事務較弱

須要參與遠程事務,或者須要跨表,跨文檔原子性更新的

MongoDB  事務支持僅限於本機的單文檔事務

100% 寫可用:任什麼時候間寫入不能停

MongoDB換主節點時候會有短暫的不可寫設計所限

 

 

--- MongoDB的部署

MongoDB官網:https://www.mongodb.com/

CentOS6.X版本軟件下載地址:https://www.mongodb.org/dl/linux/x86_64-rhel62

安裝前準備

在安裝以前首先確認該版本軟件是否支持你的操做系統。

更多詳情查看:https://docs.mongodb.com/manual/installation/ 

Platform

3.6 Community & Enterprise

3.4 Community & Enterprise

3.2 Community & Enterprise

3.0 Community & Enterprise

RHEL/CentOS 6.2 and later

RHEL/CentOS 7.0 and later

環境說明

系統環境說明:
[root@MongoDB ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@MongoDB ~]# uname -r 2.6.32-696.el6.x86_64 [root@MongoDB ~]# /etc/init.d/iptables status iptables: Firewall is not running. [root@MongoDB ~]# getenforce Disabled [root@MongoDB ~]# hostname -I 10.0.0.152 172.16.1.152
軟件版本說明: 本次使用的mongodb版本爲:mongodb-linux-x86_64-3.2.8.tgz

部署MongoDB

在root用戶下操做

cat >> /etc/rc.local <<'EOF'
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
EOF

該方法僅限與CentOS系統使用,其餘系統關閉參照官方文檔:https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/

Transparent Huge Pages (THP),經過使用更大的內存頁面,能夠減小具備大量內存的機器上的緩衝區(TLB)查找的開銷。

可是,數據庫工做負載一般對THP表現不佳,由於它們每每具備稀疏而不是連續的內存訪問模式。您應該在Linux機器上禁用THP,以確保MongoDB的最佳性能。

建立用戶

groupadd -g 800 mongod
useradd  -u 801 -g mongod  mongod

修改用戶密碼

echo 123456 |passwd --stdin  mongod

建立程序目錄

mkdir -p /application/mongodb/   &&\
cd  /application/mongodb/   &&\
mkdir  -p  bin  conf  log  data

下載程序

cd  /application/mongodb/
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tgz

解壓程序

tar xf  mongodb-linux-x86_64-3.2.8.tgz
cd mongodb-linux-x86_64-3.2.8/bin/ &&\
cp * /mongodb/bin

修改程序屬主

chown -R mongod:mongod /application/mongodb

切換到mongod用戶,設置用戶環境變量

su - mongod
cat >> .bash_profile <<'EOF'
export PATH=/mongodb/bin:$PATH
EOF
source .bashprofile 

至此,MongoDB數據庫部署完成

---管理MongoDB

數據庫的啓動與關閉

啓動:mongod --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
關閉:mongod --shutdown  --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork

   參數說明: 

參數

參數說明

--dbpath    

數據存放路徑

--logpath   

日誌文件路徑

--logappend 

日誌輸出方式

--port      

啓用端口號

--fork      

在後臺運行

--auth      

是否須要驗證權限登陸(用戶名和密碼)

--bind_ip   

限制訪問的ip

--shutdown

關閉數據庫

登入數據庫

[mongod@MongoDB ~]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
> 
  • 使用配置文件的方式管理數據庫:

普通格式配置文件

cd /application/mongodb/conf/
[mongod@MongoDB conf]$ vim mongod1.conf 
dbpath=/application/mongodb/data
logpath=/application/mongodb/log/mongodb.log
port=27017
logappend=1
fork=1

   使用配置文件時的啓動與關閉:

啓動:mongod -f mongod1.conf 
關閉:mongod -f mongod1.conf  --shutdown

YAML格式配置文件(3.X 版本官方推薦使用)

[mongod@MongoDB conf]$ cat  mongod.conf 
systemLog:
   destination: file
   path: "/application/mongodb/log/mongod.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/application/mongodb/data"
processManagement:
   fork: true
net:
   port: 27017

在數據庫中關閉數據庫的方法

shell > mongo
[mongod@MongoDB conf]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
> db.shutdownServer()
shutdown command only works with the admin database; try 'use admin'
> use admin
> db.shutdownServer()
server should be down...

注:

mongod進程收到SIGINT信號或者SIGTERM信號,會作一些處理

> 關閉全部打開的鏈接

> 將內存數據強制刷新到磁盤

> 當前的操做執行完畢

> 安全中止

切忌kill -9   數據庫直接關閉,數據丟失,數據文件損失,修復數據庫(成本高,有風險)

   使用kill命令關閉進程

$ kill -2 PID
  原理:-2表示向mongod進程發送SIGINT信號。
或
$ kill -4 PID
  原理:-4表示向mognod進程發送SIGTERM信號。

 

  • 使用腳本管理mongodb服務

   注:該腳本能夠直接在root用戶下運行

[root@MongoDB ~]# cat  /etc/init.d/mongod  
#!/bin/bash
#
# chkconfig: 2345 80 90
# description:mongodb
# by clsn
# blog_url http://blog.nmtui.com
#################################
 
MONGODIR=/application/mongodb
MONGOD=$MONGODIR/bin/mongod
MONGOCONF=$MONGODIR/conf/mongod.conf
InfoFile=/tmp/start.mongo
 
. /etc/init.d/functions 
 
status(){
    PID=`awk 'NR==2{print $NF}' $InfoFile`
    Run_Num=`ps -p $PID|wc -l`
    if [ $Run_Num -eq 2 ]; then
        echo "MongoDB is running"
    else 
        echo "MongoDB is shutdown"
        return 3
    fi
}
 
start() {
    status &>/dev/null
    if [ $? -ne 3 ];then 
        action "啓動MongoDB,服務運行中..."  /bin/false 
        exit 2
    fi
    sudo su - mongod -c "$MONGOD -f $MONGOCONF" >$InfoFile 2>/dev/null 
    if [ $? -eq 0 ];then 
        action "啓動MongoDB"  /bin/true
    else
        action "啓動MongoDB"  /bin/false
    fi
}

stop() {
    sudo su - mongod -c "$MONGOD -f $MONGOCONF --shutdown"  &>/dev/null
    if [ $? -eq 0 ];then
        action "中止MongoDB"  /bin/true
    else 
        action "中止MongoDB"  /bin/false
    fi 
}
 
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        sleep 2
        start
        ;;
    status)
        status
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 1
esac                            

 

---MongoDB的基本操做

MongoDB的基本操做主要是對數據庫、集合、文檔的操做,包括建立數據庫、刪除數據庫、插入文檔、更改文檔、刪除文檔、和查詢文檔。

Mongodb中關鍵字種類:

db(數據庫實例級別)

         db自己

             db.connection 數據庫下的集合信息

                 db.collection.xxx(

rs(複製集級別)

 

sh(分片級別)

查詢操做

在客戶端指定數據庫進行鏈接:(默認鏈接本機test數據庫)

[mongod@MongoDB ~]$ mongo 10.0.0.152/admin
MongoDB shell version: 3.2.8
connecting to: 10.0.0.152/admin
> db
admin

查看當前數據庫版本

> db.version()
3.2.8

切換數據庫

> use test;
switched to db test

顯示當前數據庫

> db
test
> db.getName()
test

查詢全部數據庫

> show dbs;   --要顯示數據庫必須插入至少一條文檔
clsn 0.000GB local 0.000GB test 0.000GB 
> show databases; 
clsn 0.000GB local 0.000GB test 0.000GB

查看數據庫(clsn)當前狀態

> use clsn;
> db.stats()
{
    "db" : "clsn",
    "collections" : 1,
    "objects" : 10000,
    "avgObjSize" : 80,
    "dataSize" : 800000,
    "storageSize" : 258048,
    "numExtents" : 0,
    "indexes" : 1,
    "indexSize" : 94208,
    "ok" : 1
}

查看當前數據庫的鏈接機器地址

> db.getMongo()
connection to 127.0.0.1

數據管理

建立數據庫

當use的時候,系統就會自動建立一個數據庫。若是use以後沒有建立任何集合。系統就會刪除這個數據庫。

> use clsn;

刪除數據庫

若是沒有選擇任何數據庫,會刪除默認的test數據庫

> show dbs;
clsn   0.000GB
local  0.000GB
test   0.000GB
> use clsn 
switched to db clsn
> db.dropDatabase()
{ "dropped" : "clsn", "ok" : 1 }

建立集合

方法一:

> use clsn;
switched to db clsn
> db.createCollection('a')
{ "ok" : 1 }
> db.createCollection('b')
{ "ok" : 1 }

查看當前數據庫中的全部集合

> show collections;
a
b
> db.getCollectionNames()
[ "a", "b" ]

方法二:

  當插入一個文檔的時候,一個集合就會自動建立。

> use clsn;
switched to db clsn
> db.c.insert({name:'clsn'});   --以{}包注,文檔是以鍵值對出現的,必須成對設置
 WriteResult({ "nInserted" : 1 }) > db.c.insert({url:'http://blog.nmtui.com'}); WriteResult({ "nInserted" : 1 })

查看建立的合集

> db.getCollectionNames()
[ "a", "b", "c" ]

查看集合中的文檔

> db.c.find()   --若是括號內不加任何條件那麼默認是顯示全部的文檔
 { "_id" : ObjectId("5a4cbcea83ec78b7bea904f8"), "name" : "clsn" } { "_id" : ObjectId("5a4cbcfc83ec78b7bea904f9"), "url" : "http://blog.nmtui.com" }

> db.c.find({"uid":1})  --這裏指定條件
{ "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 }

重命名集合

> db.c.renameCollection("clsn")
{ "ok" : 1 }
> db.getCollectionNames()
[ "a", "b", "clsn" ]

刪除集合

> db.a.drop()
true
> db.getCollectionNames()
[ "b", "clsn" ]

插入1w行數據

> for(i=0;i<10000;i++){ 
  db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()});
} WriteResult({ "nInserted" :
1 })

查詢集合中的查詢全部記錄:> db.log.find()

> DBQuery.shellBatchSize=50;    # 每頁顯示50條記錄
50 
app> db.log.findOne()            # 查看第1條記錄
app> db.log.count()              # 查詢總的記錄數
app> db.log.find({uid:1000});    # 查詢UUID爲1000的數據

--注:默認每頁顯示20條記錄,當顯示不下的的狀況下,能夠用it迭代命令查詢下一頁數據。

刪除集合中的記錄數

>  db.log.distinct("name")        #  查詢去掉當前集合中某列的重複數據
[ "mongodb" ]
>  db.user.remove({"uid":1})      # 刪除文檔
WriteResult({ "nRemoved" : 1 })   # 當removed爲1的時候說明刪除成功
>  db.log.remove({})              #  清空集合
WriteResult({ "nRemoved" : 10000 })  
>  db.log.distinct("name")
[ ]

查看集合存儲信息

> db.log.stats()          # 查看數據狀態
> db.log.dataSize()       # 集合中數據的原始大小
> db.log.totalIndexSize() # 集合中索引數據的原始大小
> db.log.totalSize()      # 集合中索引+數據壓縮存儲以後的大小
> db.log.storageSize()    # 集合中數據壓縮存儲的大小

pretty()使用

> db.log.find({uid:1000}).pretty()
{
    "_id" : ObjectId("5a4c5c0bdf067ab57602f7c2"),
    "uid" : 1000,
    "name" : "mongodb",
    "age" : 6,
    "date" : ISODate("2018-01-03T04:28:59.343Z")
}

更新文檔

更新文檔這裏經過update方法括號內,第一個文檔是查詢的文檔,第二個文檔是修改成什麼文檔!

>  db.user.update({"uid":3},{"uid" : 3, "name" : "shuaige", "salary" : 2000 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.findOne({"uid":3})
{
        "_id" : ObjectId("575f068e0c73a5a96e8f7ca4"),
        "uid" : 3,
        "name" : "shuaige",
        "salary" : 2000
}
> 

能夠看到這個更新結果是咱們想要的結果,這種方式叫作 文檔的替換方式更新

uid、salary均不須要變動,可是咱們都要寫出來!

變量替換方式

咱們能夠把取出來的值賦值給一個變量,而後經過變量去修改!

#把查詢到的值賦值給a
> a = db.user.findOne({"uid":4})
{
        "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"),
        "uid" : 4,
        "name" : "luotianshuai4",
        "salary" : 7000
}
> a.name
luotianshuai4
#經過變量.字段名去修改字段的內容
> a.name="dashuaige" dashuaige > db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "luotianshuai4", "salary" : 7000 }
#而後在經過update更新
> db.user.update({"uid":4},a) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "dashuaige", "salary" : 7000 }

他的本質仍是替換的方式,只不過是方便了

 

---MongoDB中用戶管理

MongoDB數據庫默認是沒有用戶名及密碼的,即無權限訪問限制。爲了方便數據庫的管理和安全,需建立數據庫用戶。

1、用戶的權限

 

權限

說明

Read                

容許用戶讀取指定數據庫

readWrite           

容許用戶讀寫指定數據庫

dbAdmin             

容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile

userAdmin           

容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶

clusterAdmin        

只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。

readAnyDatabase     

只在admin數據庫中可用,賦予用戶全部數據庫的讀權限

readWriteAnyDatabase

只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限

userAdminAnyDatabase

只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限

dbAdminAnyDatabase  

只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。

root                

只在admin數據庫中可用。超級帳號,超級權限

 

用戶建立語法  

{
  user: "<name>", 
  pwd: "<cleartext password>", 
  customData: { <any information> }, 
  roles: [ 
        { role: "<role>", 
            db: "<database>" } | "<role>", 
            ... 
       ] 
}

語法說明:

user字段:用戶的名字;

pwd字段:用戶的密碼;

cusomData字段:爲任意內容,例如能夠爲用戶全名介紹;

roles字段:指定用戶的角色,能夠用一個空數組給新用戶設定空角色;

role字段:能夠指定內置角色和用戶定義的角色。

2、建立管理員用戶

進入管理數據庫:> use admin

建立管理用戶,root權限

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

注意:建立管理員角色用戶的時候,必須到admin下建立。刪除的時候也要到相應的庫下操做。

查看建立完用戶後的collections;

> show tables; 
system.users  # 用戶存放位置
system.version

查看建立的管理員用戶

> show users
{
  "_id" : "admin.root",
  "user" : "root",
  "db" : "admin",
  "roles" : [
    {
      "role" : "root",
      "db" : "admin"
    }
  ]
}

驗證用戶是否能用

> db.auth("root","root")
1  # 返回 1 即爲成功

用戶建立完成後在配置文件中開啓用戶驗證

cat >>/application/mongodb/conf/mongod.conf<<-'EOF'
security:
  authorization: enabled
EOF

重啓服務

/etc/init.d/mongod  restart

登錄測試,注意登錄時選擇admin數據庫

注意:用戶在哪一個數據庫下建立的,最後加上什麼庫。

--方法一:命令行中進行登錄
[mongod@MongoDB ~]$ mongo -uroot -proot admin 
MongoDB shell version: 3.2.8
connecting to: admin
> 
--方法二:在數據庫中進行登錄驗證:
[mongod@MongoDB ~]$ mongo 
MongoDB shell version: 3.2.8
connecting to: test
> use admin
switched to db admin
> db.auth("root","root")
1
> show tables;
system.users
system.version

3、按生產需求建立應用用戶

建立對某庫的只讀用戶

--在test庫建立只讀用戶test
use test
db.createUser(
  {
    user: "test",
    pwd: "test",
    roles: [ { role: "read", db: "test" } ]
  }
)
--測試用戶是否建立成功
db.auth("test","test")
show  users;
--登陸test用戶,並測試是否只讀
show collections;
db.createCollection('b')

建立某庫的讀寫用戶

--建立test1用戶,權限爲讀寫
db.createUser(
  {
    user: "test1",
    pwd: "test1",
    roles: [ { role: "readWrite", db: "test" } ]
  }
)
--查看並測試用戶
show users;
db.auth("test1","test1")

建立對多庫不一樣權限的用戶

--建立對app爲讀寫權限,對test庫爲只讀權限的用戶
use app
db.createUser(
  {
    user: "app",
    pwd: "app",
roles: [ { role: "readWrite", db: "app" },
         { role: "read", db: "test" }
 ]
  }
)
--查看並測試用戶
show users
db.auth("app","app")

刪除用戶

--刪除app用戶:先登陸到admin數據庫
mongo -uroot –proot 127.0.0.1/admin
--進入app庫刪除app用戶
use app
db.dropUser("app")

4、自定義數據庫

建立app數據庫的管理員:先登陸到admin數據庫

use app
db.createUser(
{
  user: "admin",
  pwd: "admin",
  roles: [ { role: "dbAdmin", db: "app" } ]
}
)

建立app數據庫讀寫權限的用戶並具備clusterAdmin權限:

use app
db.createUser(
{
  user: "app04",
  pwd: "app04",
  roles: [ { role: "readWrite", db: "app" },
        { role: "clusterAdmin", db: "admin" }
       ]
}
)

---MongoDB維護

1、導入導出

mongoimport命令能夠把一個特定格式文件中的內容導入到指定的collection中。該工具能夠導入JSON格式數據,也能夠導入CSV格式的數據。 
mongoexport命令能夠把一個collection導出成JSON格式或CSV格式的文件。能夠經過參數指定導出的數據項,也能夠根據指定的條件導出數據。 
參數說明:

  • -d:指明數據庫的名字
  • -c:指明collection的名字
  • -f:指明要導出哪些列
  • -o:指明要導出的文件名
  • -q:指明導出數據的過濾條件
for(var i=1;i<=100;i++)  db.info.insert({"id":i,"name":"jack"+i})    //循環寫入100條數據
mongoexport -d school -c info -o /opt/info.json   //導出
mongoimport -d school -c info1 --file /opt/info.json  //導入到info集合
mongoexport -d school -c info1 -q '{"id":{"$eq":10}}' -o /opt/top10.json    //條件導出指定第10行

2、備份與恢復

備份:mongodump 
恢復:mongorestore
 
參數說明:

  • -h: MongoDB所在服務器地址
  • -d:須要備份的數據庫實例
  • -o:備份的數據存放的位置,該目錄須要提早創建,在備份完成後,系統自動在dump目錄下創建一個test目錄,這個目錄裏面存放該數據庫實例的備份數據。
    mkdir /backup   --建立存放目錄
    mongodump -d abc -o /backup/       --備份abc數據庫
    mongorestore -d abc123 --dir=/backup/abc    --恢復到abc123數據庫

3、複製數據庫

>db.copyDatabase("abc","abc1")  --複製數據庫abc生成abc1

 

---SQL與MongoDB語言對比

SQL語言與CRUD語言對照 

SQL Schema Statements

MongoDB Schema Statements

CREATE TABLE users (

id MEDIUMINT NOT NULL

AUTO_INCREMENT,

user_id Varchar(30),

age Number,

status char(1),

PRIMARY KEY (id)

)

Implicitly created on first insert() operation. The primary

key _idis automatically added if _id field is not specified.

db.users.insert( {

user_id: "abc123",

age: 55,

status: "A"

} )

However, you can also explicitly create a collection:

db.createCollection("users")

ALTER TABLE users

ADD join_date DATETIME

在Collection 級沒有數據結構概念。然而在 document級,能夠經過$set在

update操做添加列到文檔中。

db.users.update(

{ },

{ $set: { join_date: new Date() } },

{ multi: true }

)

ALTER TABLE users

DROP COLUMN join_date

在Collection 級沒有數據結構概念。然而在 document級,能夠經過$unset

在update操做從文檔中刪除列。

db.users.update(

{ },

{ $unset: { join_date: "" } },

{ multi: true }

)

CREATE INDEX idx_user_id_asc

ON users(user_id)

db.users.createIndex( { user_id: 1 } )

CREATE INDEX

idx_user_id_asc_age_desc

ON users(user_id, age DESC)

db.users.createIndex( { user_id: 1, age: -1 } )

DROP TABLE users

db.users.drop()

插入/刪除/更新 語句對比

SQL  Statements

MongoDB  Statements

INSERT INTO

users(user_id,

age

status)

VALUES ("bcd001",

45,

"A")

db.users.insert(

{ user_id: "bcd001", age:

45, status: "A" }

)

DELETE FROM users

WHERE status = "D"

db.users.remove( { status: "D" } )

DELETE FROM users

db.users.remove({})

UPDATE users

SET status = "C"

WHERE age > 25

db.users.update(

{ age: { $gt: 25 } },

{ $set: { status: "C" } },

{ multi: true }

)

UPDATE users

SET age = age + 3

WHERE status = "A"

db.users.update(

{ status: "A" } ,

{ $inc: { age: 3 } },

{ multi: true }

)

查詢類操做對比 

SQL SELECT Statements

MongoDB find() Statements

SELECT *

FROM users

db.users.find()

SELECT id,

user_id,

status

FROM users

db.users.find(

{ },

{ user_id: 1, status: 1, _id: 0 }

)

SELECT user_id, status

FROM users

db.users.find(

{ },

{ user_id: 1, status: 1 }

)

SELECT *

FROM users

WHERE status = "A"

db.users.find(

{ status: "A" }

)

SELECT user_id, status

FROM users

WHERE status = "A"

db.users.find(

{ status: "A" },

{ user_id: 1, status: 1, _id: 0 }

)

--- 錯誤解決

--在登錄數據庫的時候,發現會由描述文件相關的報錯。
[mongod@MongoDB mongodb]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
Server has startup warnings: 
2018-01-03T11:08:55.526+0800 I CONTROL  [initandlisten] 
2018-01-03T11:08:55.526+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 19193 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
--解決辦法:
cat >> /etc/security/limits.conf <<EOF
mongod   soft     nofile     32767.5
mongod   soft     nproc      32767.5
EOF
--修改後,重啓服務器,便可解決該問題。

 

整理自:https://www.cnblogs.com/clsn/p/8214194.html#auto_id_2一、https://blog.51cto.com/13625810/214748一、https://www.cnblogs.com/luotianshuai/p/5583439.html

相關文章
相關標籤/搜索