30分鐘開始
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供海北州網(wǎng)站建設(shè)、海北州做網(wǎng)站、海北州網(wǎng)站設(shè)計(jì)、海北州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、海北州企業(yè)網(wǎng)站模板建站服務(wù),十多年海北州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
分布式系統(tǒng)理論:
CAP:
一致性
可用性
分區(qū)容錯(cuò)性
MongoDB:
安裝
crud
索引
副本集
分片
NOSQL:非關(guān)系型、分布式、不提供ACID功能
技術(shù)特點(diǎn):
1、簡(jiǎn)單數(shù)據(jù)模型
2、元數(shù)據(jù)和應(yīng)用數(shù)據(jù)分離(分不同服務(wù)器存儲(chǔ))
3、弱一致性
優(yōu)勢(shì):
1、避免不必要的復(fù)雜性
2、高吞吐量
3、高水平擴(kuò)展能力和低端硬件集群
4、不適用對(duì)象-關(guān)系映射
劣勢(shì):
1、不支持ACID特性
2、功能簡(jiǎn)單
3、沒有統(tǒng)一的數(shù)據(jù)查詢模型
分類:
NoSQL:
鍵值存儲(chǔ)
列式數(shù)據(jù)庫(kù)
文檔數(shù)據(jù)庫(kù)
圖式數(shù)據(jù)庫(kù)
SQL:
MySQL
pgsql
緩存數(shù)據(jù)庫(kù)系統(tǒng):
memcache
CAP理論:從CAP中挑出2個(gè)
BASE理論:
基本可用
軟狀態(tài)
最終一致性
C,A:SQL(保證一致性,可用性)
C,P:悲觀加鎖機(jī)制(一致性,分區(qū)容錯(cuò)性)
A,P:DNS
數(shù)據(jù)一致性模型:強(qiáng)一致性、弱一致性、最終一致性
數(shù)據(jù)一致性的實(shí)現(xiàn)技術(shù):
Quorum(法定票數(shù))系統(tǒng)NRW策略(關(guān)注)
N:副本數(shù)
R:完成讀操作所需要讀取的最少副本數(shù)
W:完成寫操作所需要寫入的最少副本數(shù)
要想保證強(qiáng)一致性:R+W>N
最多只能保證最終一致性:R+W<=N
兩段式提交:2PC(two phase commit protocol)(關(guān)注)
有兩類節(jié)點(diǎn):
一類為協(xié)調(diào)者
一類為事務(wù)參與者
兩段:
1、請(qǐng)求階段:事務(wù)協(xié)調(diào)者通知事務(wù)參與者提交事務(wù)
2、提交階段:事務(wù)參與者提交事務(wù)
時(shí)間戳策略
Paxos:根據(jù)協(xié)議進(jìn)行協(xié)調(diào)
向量時(shí)鐘
NoSQL的數(shù)據(jù)存儲(chǔ)模型:
1、鍵值存儲(chǔ):k-w
優(yōu)點(diǎn):查找迅速
缺點(diǎn):數(shù)據(jù)無結(jié)構(gòu)、通常只被當(dāng)做字符串或二進(jìn)制數(shù)據(jù)
應(yīng)用場(chǎng)景:內(nèi)容緩存
實(shí)例:redis,dynamo
2、列式模型:
數(shù)據(jù)模型:數(shù)據(jù)按列存儲(chǔ),將同一列數(shù)據(jù)存在一起
優(yōu)點(diǎn):查找迅速,可擴(kuò)展性強(qiáng),易于實(shí)現(xiàn)分布式
缺點(diǎn):功能相對(duì)sql有限
應(yīng)用場(chǎng)景:分布式文件系統(tǒng)或分布式存儲(chǔ)
實(shí)例:Bigtable(google),cassandra,HBase,Hypertable
3、文檔模型
數(shù)據(jù)模型:與鍵值模型相似,value指向結(jié)構(gòu)化數(shù)據(jù)
優(yōu)點(diǎn):數(shù)據(jù)格式要求不嚴(yán)格,無需事先定義結(jié)構(gòu)
缺點(diǎn):查詢性能不高,缺乏統(tǒng)一查詢語(yǔ)法
應(yīng)用場(chǎng)景:web應(yīng)用
實(shí)例:MongoDB,CouchDB
4、圖式模型:
數(shù)據(jù)模型:圖結(jié)構(gòu)模型
優(yōu)點(diǎn):利用圖結(jié)構(gòu)相關(guān)算法提高性能,滿足特殊場(chǎng)景應(yīng)用需求
缺點(diǎn):實(shí)現(xiàn)分布式較困難,功能有定向性
應(yīng)用場(chǎng)景:社交網(wǎng)絡(luò)、推薦系統(tǒng)、關(guān)系圖譜
實(shí)例:Neo4j
www.nosql-database.org
Mongodb:
collection:表
多個(gè)collection:database
MongoDB的安裝:是一個(gè)易于擴(kuò)展的、高性能、開源、文檔模式的no-sql數(shù)據(jù)庫(kù)
存儲(chǔ):海量數(shù)據(jù)、文檔數(shù)據(jù)庫(kù)、不需要?jiǎng)?chuàng)建表結(jié)構(gòu)、c++研發(fā)的,開源
是什么?
基于文檔數(shù)據(jù)庫(kù)(json格式)
無表結(jié)構(gòu)
性能:
c++
支持各種索引
不支持事務(wù)
內(nèi)存映射(延遲寫操作)
擴(kuò)展性:
復(fù)制
auto-sharding
商業(yè)支持
支持基于文檔的查詢:表達(dá)式為json
支持使用map/reduce
靈活的聚合操作
在分片的基礎(chǔ)上并行處理
GridFS:網(wǎng)格文件系統(tǒng),存儲(chǔ)單個(gè)大文件或海量小文件的分布式文件系統(tǒng)
地理位置、空間索引
被生產(chǎn)環(huán)境驗(yàn)證過
特性:
動(dòng)態(tài)查詢
查詢性能剖析
基于復(fù)制完成故障自動(dòng)轉(zhuǎn)移
rabbitmq的性能太差,使用HBase
適應(yīng)場(chǎng)景:
web網(wǎng)站
緩存
低價(jià)值、高存儲(chǔ)量
高擴(kuò)展性
實(shí)現(xiàn)對(duì)象、json存儲(chǔ)的應(yīng)用編程環(huán)境
不適合場(chǎng)景:
事務(wù)型
商業(yè)智能決策
使用sql接口的
MongoDB數(shù)據(jù)模型:面向集合的數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù):無需創(chuàng)建
表:集合(行):由文檔組成,多個(gè)文檔組成一個(gè)表,文檔是json格式的(可以嵌套),集合無需事先定義
c/s:
mongod服務(wù)器端
mongo
安裝:
查看配置文件:
[root@stu ~]# cat /etc/mongod.conf # mongo.conf #where to log logpath=/var/log/mongo/mongod.log logappend=true # fork and run in background fork = true #port = 27017 dbpath=/var/lib/mongo #運(yùn)行mongod服務(wù)的用戶也是mongod,所以保證這個(gè)目錄的屬主屬組也為mongod, 為了數(shù)據(jù)使用,應(yīng)該找一個(gè)合理的目錄 # location of pidfile pidfilepath = /var/run/mongodb/mongod.pid # Disables write-ahead journaling # nojournal = true # Enables periodic logging of CPU utilization and I/O wait #cpu = true # Turn on/off security. Off is currently the default #noauth = true #auth = true # Verbose logging output. #verbose = true # Inspect all client data for validity on receipt (useful for # developing drivers) #objcheck = true # Enable db quota management #quota = true # Set oplogging level where n is # 0=off (default) # 1=W # 2=R # 3=both # 7=W+some reads #diaglog = 0 # Ignore query hints #nohints = true # Disable the HTTP interface (Defaults to localhost:27018). #nohttpinterface = true # Turns off server-side scripting. This will result in greatly limited # functionality #noscripting = true # Turns off table scans. Any query that would do a table scan fails. #notablescan = true # Disable data file preallocation. #noprealloc = true # Specify .ns file size for new databases. # nssize =# Accout token for Mongo monitoring server. #mms-token = # Server name for Mongo monitoring server. #mms-name = # Ping interval for Mongo monitoring server. #mms-interval = # Replication Options # in replicated mongo databases, specify here whether this is a slave or master #slave = true #source = master.example.com # Slave only: specify a single database to replicate #only = master.example.com # or #master = true #source = slave.example.com
創(chuàng)建目錄,改屬主屬組
修改配置文件
啟動(dòng)服務(wù)
system數(shù)據(jù)庫(kù)保存其他數(shù)據(jù)庫(kù)的元數(shù)據(jù)(和myslq中的mysql數(shù)據(jù)庫(kù)一樣)
查看端口:
27017:服務(wù)端口
28017:管理端口
NoSql數(shù)據(jù)庫(kù)一般是在內(nèi)網(wǎng)中使用的,不進(jìn)行認(rèn)證,直接連
數(shù)據(jù)庫(kù)幫助:
> db.help function () { print("DB methods:"); print("\tdb.addUser(userDocument)"); print("\tdb.adminCommand(nameOrDocument) - switches to 'admin' db, and runs command [ just calls db.runCommand(...) ]"); print("\tdb.auth(username, password)"); print("\tdb.cloneDatabase(fromhost)"); print("\tdb.commandHelp(name) returns the help for the command"); print("\tdb.copyDatabase(fromdb, todb, fromhost)"); print("\tdb.createCollection(name, { size : ..., capped : ..., max : ... } )"); print("\tdb.currentOp() displays currently executing operations in the db"); print("\tdb.dropDatabase()"); print("\tdb.eval(func, args) run code server-side"); print("\tdb.fsyncLock() flush data to disk and lock server for backups"); print("\tdb.fsyncUnlock() unlocks server following a db.fsyncLock()"); print("\tdb.getCollection(cname) same as db['cname'] or db.cname"); print("\tdb.getCollectionNames()"); print("\tdb.getLastError() - just returns the err msg string"); print("\tdb.getLastErrorObj() - return full status object"); print("\tdb.getMongo() get the server connection object"); print("\tdb.getMongo().setSlaveOk() allow queries on a replication slave server"); print("\tdb.getName()"); print("\tdb.getPrevError()"); print("\tdb.getProfilingLevel() - deprecated"); print("\tdb.getProfilingStatus() - returns if profiling is on and slow threshold"); print("\tdb.getReplicationInfo()"); print("\tdb.getSiblingDB(name) get the db at the same server as this one"); print("\tdb.hostInfo() get details about the server's host"); print("\tdb.isMaster() check replica primary status"); print("\tdb.killOp(opid) kills the current operation in the db"); print("\tdb.listCommands() lists all the db commands"); print("\tdb.loadServerScripts() loads all the scripts in db.system.js"); print("\tdb.logout()"); print("\tdb.printCollectionStats()"); print("\tdb.printReplicationInfo()"); print("\tdb.printShardingStatus()"); print("\tdb.printSlaveReplicationInfo()"); print("\tdb.removeUser(username)"); print("\tdb.repairDatabase()"); print("\tdb.resetError()"); print("\tdb.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into { cmdObj : 1 }"); print("\tdb.serverStatus()"); print("\tdb.setProfilingLevel(level,) 0=off 1=slow 2=all"); print("\tdb.setVerboseShell(flag) display extra information in shell output"); print("\tdb.shutdownServer()"); print("\tdb.stats()"); print("\tdb.version() current version of the server"); return __magicNoPrint; }
集合幫助:
> db.mycoll.help() DBCollection help db.mycoll.find().help() - show DBCursor help db.mycoll.count() db.mycoll.copyTo(newColl) - duplicates collection by copying all documents to newColl; no indexes are copied. db.mycoll.convertToCapped(maxBytes) - calls {convertToCapped:'mycoll', size:maxBytes}} command db.mycoll.dataSize() db.mycoll.distinct( key ) - e.g. db.mycoll.distinct( 'x' ) db.mycoll.drop() drop the collection db.mycoll.dropIndex(index) - e.g. db.mycoll.dropIndex( "indexName" ) or db.mycoll.dropIndex( { "indexKey" : 1 } ) db.mycoll.dropIndexes() db.mycoll.ensureIndex(keypattern[,options]) - options is an object with these possible fields: name, unique, dropDups db.mycoll.reIndex() db.mycoll.find([query],[fields]) - query is an optional query filter. fields is optional set of fields to return. e.g. db.mycoll.find( {x:77} , {name:1, x:1} ) db.mycoll.find(...).count() db.mycoll.find(...).limit(n) db.mycoll.find(...).skip(n) db.mycoll.find(...).sort(...) db.mycoll.findOne([query]) db.mycoll.findAndModify( { update : ... , remove : bool [, query: {}, sort: {}, 'new': false] } ) db.mycoll.getDB() get DB object associated with collection db.mycoll.getIndexes() db.mycoll.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } ) db.mycoll.insert(obj) db.mycoll.mapReduce( mapFunction , reduceFunction ,) db.mycoll.remove(query) db.mycoll.renameCollection( newName , ) renames the collection. db.mycoll.runCommand( name , ) runs a db command with the given name where the first param is the collection name db.mycoll.save(obj) db.mycoll.stats() db.mycoll.storageSize() - includes free space allocated to this collection db.mycoll.totalIndexSize() - size in bytes of all the indexes db.mycoll.totalSize() - storage allocated for all data and indexes db.mycoll.update(query, object[, upsert_bool, multi_bool]) - instead of two flags, you can pass an object with fields: upsert, multi db.mycoll.validate( ) - SLOW db.mycoll.getShardVersion() - only for use with sharding db.mycoll.getShardDistribution() - prints statistics about data distribution in the cluster db.mycoll.getSplitKeysForChunks( ) - calculates split points over all chunks and returns splitter function
簡(jiǎn)單使用:
使用數(shù)據(jù)庫(kù):(無需創(chuàng)建),collection也無需創(chuàng)建
db.collection.insert:插入
show collections:查詢集合
db.collections.find():查詢語(yǔ)句
db.collections.update():更新
db.collections.remove():移除
集合信息:
刪除集合:
查看數(shù)據(jù)庫(kù)文件:
基本操作:
show dbs:查看所有數(shù)據(jù)庫(kù)
show collections:查看集合
show users:查看用戶
show profile:
show logs:查看所有日志列表
show log [name]:查看具體的日志
遠(yuǎn)程連接:
mongo --host ip
crud操作:
create,read,update,delete
雖然沒有表結(jié)構(gòu),但還是應(yīng)該對(duì)同類對(duì)象放到一個(gè)collection
查詢:
db.users.find({age:{$gt:18}}).sort({age:1}) 查詢age大于18的用戶,以age為升序進(jìn)行排序
插入:
db.users.insert(
{
name:'suse',
age:26,
status:'A',
group:['news','sports']
}
)
更新:
db.coll.update(
{age:{$gt:18}},
{$set:{status:'A'}},
{multi:true} 不指定時(shí)只修改第一個(gè)符合條件
)
刪除:
db.coll.delete(
{status:'D'}
)
插入:
一批只顯示20個(gè),輸入it繼續(xù)
limit:
刪除:
修改:
find高級(jí)用法:
db.collection.find(<添加>,<字段>)
db.collection.count()返回條數(shù)
比較運(yùn)算:
$gt:大于{field:{$gt:value}}
$gte:大于等于{field:{$gte:value}}
$in:存在于{field:{$in:[value1,value2,...]}}
$lt:小于{field:{$lt:value}}
$lte:小于等于{field:{$lte:value}}
$ne:不等于{field:{$ne:value}}
$nin:不存在于{field:{$nin:[value1,value2...]}}
大于
顯示需要的字段:
邏輯運(yùn)算:
$or:或運(yùn)算,{$or:[{expression1},{expression2},...]}
$and:或運(yùn)算,{$and:[{expression1},{expression2},...]}
$not:或運(yùn)算,{field:{$not:{operator-expression}}}
$nor:反運(yùn)算,即返回不符合所有指定條件的文檔,{$nor:[{expression1},{expression2},...]}
與運(yùn)算:
元素查詢:
如果要分居文檔中是否存在某字段等條件來挑選文檔,則需要用到元素運(yùn)算
$exists:根據(jù)指定字段的存在性挑選文檔,語(yǔ)法:{field:{$exists:
$mod:將指定字段的值進(jìn)行取模運(yùn)算,并返回其余數(shù)作為指定值的文檔,語(yǔ)法{field:{$mod:[divisor,remainder]}}
$type:返回指定字段的值類型為指定類型的文檔,語(yǔ)法:{field:{$type:
重新插入一條數(shù)據(jù):
查詢:
更新:
update專有操作符大致包含:field,array,bitwise
field:
$inc:增大指定字段的值,格式:
db.collection.update({field:value},{$nic:{field1:amount}}),其中{field:value}用于指定挑選標(biāo)準(zhǔn),{$inc:{field1:amount}}用于指定要提升其值的字段及提升大小amount
$rename:更改字段名,格式為{$rename:{
$set:修改字段的值為新指定的值,格式db.collection.update({field:value1},{$set:{field2:value2}})
$unset:刪除指定的字段,格式db.collection.update({field:value1},{$unset:{field1:""}})