?趾疚、MongoDb的體系結(jié)構(gòu)
NoSql的概念
NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是 SQL ”痛侍,關(guān)系型數(shù)據(jù)庫特點(diǎn)是規(guī)范的數(shù)據(jù)結(jié)構(gòu)钥弯,表與表之間通過外鍵進(jìn)?關(guān)聯(lián),這些特征使我們對數(shù)據(jù)的管理更加清晰和嚴(yán)謹(jǐn)垂寥,但隨著互聯(lián)網(wǎng)的發(fā)展數(shù)據(jù)成爆炸式的增?我們對數(shù)據(jù)庫需要更好的靈活性和更快的速度颠黎。這就是NoSql可以做到 的。它不需要預(yù)先定義模式滞项,沒有主外鍵關(guān)聯(lián)狭归、支持分片、支持復(fù)本文判。
NoSql的分類
鍵值(Key-Value)存儲數(shù)據(jù)庫
這?類數(shù)據(jù)庫主要會使?到?個哈希表过椎,這個表中有?個特定的鍵和?個指針指向特定的 數(shù)據(jù)。Key/value模型對于IT系統(tǒng)來說的優(yōu)勢在于簡單戏仓、易部署疚宇。但是如果DBA只對部分值進(jìn)行查詢或更新的時候,Key/value就顯得效率低下了赏殃。舉例如:Redis.
列存儲數(shù)據(jù)庫
這部分?jǐn)?shù)據(jù)庫通常是?來應(yīng)對分布式存儲的海量數(shù)據(jù)敷待。鍵仍然存在,但是它們的特點(diǎn)是指 向了多個列嗓奢。這些列是由列家族來安排的讼撒。如:Cassandra, HBase, Riak.
?檔型數(shù)據(jù)庫
?檔型數(shù)據(jù)庫的靈感是來?于Lotus Notes辦公軟件的,?且它同第?種鍵值存儲相類似股耽。該類型的數(shù)據(jù)模型是版本化的?檔根盒,半結(jié)構(gòu)化的?檔以特定的格式存儲,?如JSON物蝙。?檔型數(shù)據(jù)庫可以看作是鍵值數(shù)據(jù)庫的升級版炎滞,允許之間嵌套鍵值。?且?檔型數(shù)據(jù)庫?鍵值 數(shù)據(jù)庫的查詢效率更?诬乞。如:CouchDB, MongoDb册赛。
圖形(Graph)數(shù)據(jù)庫
圖形結(jié)構(gòu)的數(shù)據(jù)庫同其他?列以及剛性結(jié)構(gòu)的SQL數(shù)據(jù)庫不同钠导,它是使?靈活的圖形模 型,并且能夠擴(kuò)展到多個服務(wù)器上森瘪。NoSQL數(shù)據(jù)庫沒有標(biāo)準(zhǔn)的查詢語?(SQL)牡属,因此進(jìn)?數(shù)據(jù) 庫查詢需要制定數(shù)據(jù)模型。許多NoSQL數(shù)據(jù)庫都有REST式的數(shù)據(jù)接?或者查詢API扼睬。
MongoDb的邏輯組成
邏輯結(jié)構(gòu)與關(guān)系數(shù)據(jù)庫的對比
關(guān)系型數(shù)據(jù)庫 | MongoDb |
---|---|
database(數(shù)據(jù)庫) | database(數(shù)據(jù)庫) |
table (表) | collection( 集合) |
row( 行) | document( BSON 文檔) |
column (列) | field (字段) |
index(唯一索引逮栅、主鍵索引) | index (全文索引) |
join (主外鍵關(guān)聯(lián)) | embedded Document (嵌套文檔) |
primary key(指定1至N個列做主鍵) | primary key (指定_id field做為主鍵) |
aggreation(groupy) | aggreation (pipeline mapReduce) |
二、MongoDb使用
mongoDb 由C++編寫窗宇,下載下來的包可以直接啟動措伐。
參數(shù) | 說明 |
---|---|
dbpath | 數(shù)據(jù)庫目錄坪哄,默認(rèn)/data/db |
bind_ip | 監(jiān)聽IP地址昆烁,默認(rèn)全部可以訪問 |
port | 監(jiān)聽的端口,默認(rèn)27017 |
logpath | 日志路徑 |
logappend | 是否追加日志 |
auth | 是開啟用戶密碼登陸 |
fork | 是否已后臺啟動的方式登陸 |
config | 指定配置文件 |
mongo shell 是一個js 控臺弃锐,可以執(zhí)行js 相關(guān)運(yùn)算
數(shù)據(jù)庫與集合的基礎(chǔ)操作
#查看數(shù)據(jù)庫
show dbs;
#切換數(shù)據(jù)庫
use luban;
#創(chuàng)建數(shù)據(jù)庫與集合粪躬,在插入數(shù)據(jù)時會自動 創(chuàng)建數(shù)據(jù)庫與集和
db.friend.insertOne({name:"wukong",sex:"man"});
#查看集合
show tables;
show collections;
#刪除集合
db.friend.drop();
#刪除數(shù)據(jù)庫
db.dropDatabase();
MongoDB CRUD
數(shù)據(jù)插入
//插入單條
db.friend.insertOne({name:"wukong"担败,sex:"man"});
// 插入多條
db.friend.insertMany([
{name:"wukong",sex:"man"},
{name:"diaocan",sex:"woman",age:18,birthday:new Date("1995-11-02")},
{name:"zixiao",sex:"woman"}]);
// 指定ID
db.friend.insert([
{_id:1,name:"wokong",sex:"man",age:1},
{_id:2,name:"diaocan",sex:"women",birthday:new Date("1988-11-11")}])
注意:數(shù)據(jù)插入,一個集合內(nèi)的數(shù)據(jù)格式可以完全不相同短蜕,但不建議這樣氢架,每條數(shù)據(jù)都有唯一id傻咖,id默認(rèn)自動生成朋魔,但也可以指定,前提是不能重復(fù)卿操,否則報錯警检。
數(shù)據(jù)查詢
a.基于條件的基礎(chǔ)查詢
b.$and、$or害淤、$in扇雕、$gt、$gte窥摄、$lt镶奉、$lte 運(yùn)算符
c.基于 sort skip limit 方法實(shí)現(xiàn)排序與分頁
d.嵌套查詢
e.數(shù)組查詢
f.數(shù)組嵌套查詢
值運(yùn)算:$in、$gt崭放、$gte哨苛、$lt、$lte币砂、$all
$in:值在范圍內(nèi)存在建峭。
$gt:大于值。
$gte:大于等于值决摧。
$lt:小于值亿蒸。
$lte:小于等于值凑兰。
$all:值在范圍內(nèi)都存在。
邏輯運(yùn)算:$and边锁、$or
其值為多個邏輯的組合運(yùn)算姑食,后面跟中括號,中括號包括多個大括號茅坛∈该牛基于具體的值進(jìn)行運(yùn)算
#基于ID查找
db.emp.find({_id:1101})
#基于屬性查找
db.emp.find({"name":"魯班"})
# && 運(yùn)算 與大于 運(yùn)算
db.emp.find({"job":"講師","salary":{$gt:8000}})
# in 運(yùn)算 工作為"講師"或者"客服部"
db.emp.find({"job":{$in:["講師","客服部"]}})
# or 運(yùn)算 工作為"講師"或者"客服部" || 名字是貂蟬 或者 年齡18
db.emp.find({$or:[{job:"講師" },{job:"客服部"}] })
db.friend.find({$or:[{"name":"貂蟬"},{age:{$gte:18}}]});
- 排序與分頁
# 首先按dep升序salary降序排列,然后從第5條開始灰蛙,最后選擇2條數(shù)據(jù)祟剔。
db.emp.find().sort({dep:1,salary:-1}).skip(5).limit(2)
- 嵌套查詢
# 數(shù)據(jù)
{_id:"001",name:"陳霸天",grade:{redis:87,dubbo:90,zookeper:85}}
# 錯誤示例:無結(jié)果
db.student.find({grade:{redis:87,dubbo:90 });
# 錯誤示例:無結(jié)果
db.student.find({grade:{redis:87,dubbo:90,zookeper:85} })
# 正確示例:基于復(fù)合屬性查找 時必須包含其所有的值 并且順序一至
db.student.find({grade:{redis:87,zookeper:85,dubbo:90} })
#基于復(fù)合屬性當(dāng)中的指定值 查找。注:名稱必須用雙引號
db.student.find({"grade.redis":87});
db.student.find({"grade.redis":{"$gt":80}});
- 數(shù)組查詢
# 數(shù)據(jù)
{_id:"001",name:"陳霸天",subjects:["redis","zookeper","dubbo"]}
# 無結(jié)果
db.subject.find({subjects:["redis","zookeper"]})
# 無結(jié)果
db.subject.find({subjects:["zookeper","redis","dubbo"]})
# 與嵌套查詢一樣摩梧,必須是所有的值 并且順序一至
db.subject.find({subjects:["redis","zookeper","dubbo"]})
# $all 匹配數(shù)組中包含該兩項(xiàng)的值物延。注:順序不作要求
db.subject.find({subjects:{"$all": ["redis","zookeper"]}})
# 簡化數(shù)組查詢
db.subject.find({subjects:"redis"})
# 簡化數(shù)組查詢 ,匹配數(shù)組中存在任意一值仅父。與$all相對應(yīng)
db.subject.find({subjects:{$in: ["redis","zookeper"]}})
- 數(shù)組嵌套查詢
# 數(shù)據(jù)
{_id:"001",name:"陳霸天",subjects:[{name:"redis",hour:12},{name:"java",hour:12}]}
# 基礎(chǔ)查詢 叛薯,必須查詢?nèi)浚翼樞蛞恢?db.subject2.find({subjects:{name:"redis",hour:12} })
# 指定查詢第一個數(shù)組 課時大于12
db.subject2.find({"subjects.0.hour":{$gt:12}})
# 查詢?nèi)慰颇?課時大于12
db.subject2.find({"subjects.hour":{$gt:12}})
# $elemMatch 元素匹配笙纤,指定屬性滿足耗溜,且不要求順序一至
db.subject2.find({subjects:{$elemMatch:{name:"redis",hour:12}}})
# 數(shù)組中任意元素匹配 不限定在同一個對象當(dāng)中
db.subject2.find({"subjects.name":"mysql","subjects.hour":120})
- 數(shù)據(jù)的修改與刪除
db.表.update( 條件,{設(shè)置值}省容,false,false )
$set :設(shè)置值
$unset :刪除指定字段
$inc:自增
# 設(shè)置值
db.emp.update({_id:1101} ,{ $set:{salary:10300} })
# 自增
db.emp.update({_id:1101} ,{ $inc:{salary:200}})
# 基于條件 更新多條數(shù)據(jù)
# 只會更新第一條
db.emp.update({"dep":"客服部"},{$inc:{salary:100}})
# 更新所有 匹配的條件
db.emp.updateMany({"dep":"客服部"},{$inc:{salary:100}})
# $unset刪除字段
db.subject2.update({"_id":"001"},{$unset:{"subjects":1}})
- 嵌套數(shù)組修改
$addToSet : 添加至集合 ( 命令區(qū)分大小寫)
$push: 推送至集合
$pull:從集合中刪除
$pop:刪除集合中的 兩端未尾元素抖拴。
# $addToSet:添加至集合,多次執(zhí)行不會重復(fù)插入
db.subject2.update({"_id":"001"},{$addToSet:{"subjects":{"name":"mongodb","hour":20}}})
# $push:推送至集合腥椒,不判斷重復(fù)
db.subject2.update({"_id":"001"},{$push:{"subjects":{"name":"mongodb","hour":20}}})
# $pull:將匹配的元素項(xiàng)阿宅,從集合中全部刪除
db.subject2.update({"_id":"001"},{$pull:{"subjects":{"name":"mongodb","hour":20}}})
# 僅匹配一個字段
db.subject2.update({"_id":"001"},{$pull:{"subjects":{"name":"mongodb"}}})
# $addToSet、$push笼蛛、$pull 均可操作數(shù)組洒放,效果等同于執(zhí)行多次數(shù)組中元素。
db.subject2.update({"_id":"001"},{$addToSet:{"subjects":[{"name":"mongodb","hour":20},{"name":"mongodb2","hour":22}]}})
# $pop:刪除集合中的 兩端未尾元素滨砍。
# -1 刪除隊(duì)首 元素
db.subject2.update({"_id":"001"},{$pop:{"subjects":-1}})
# 1 刪除隊(duì)尾元素
db.subject2.update({"_id":"001"},{$pop:{"subjects":-1}})
注:值僅能是 1 或 -1往湿, 不能是其它值
# upsert 更新時如果記錄不存在,將會進(jìn)行插入操作
db.subject2.update({"_id":"009"},{$set:{"name":"陳陳"}},true)
刪除
// 基于查找刪除
db.emp.deleteOne({_id:1101})
// 刪除整個集合
db.project.drop()
// 刪除庫
db.dropDatabase()
三惋戏、mongoDB的聚合操作
mongoDB的聚合操作主要分為pipeline和mapRedurce领追。pipeline 速度快,但只能運(yùn)行在單機(jī)上日川,適合數(shù)據(jù)量小的實(shí)時聚合操作蔓腐。mapRedurce 可以運(yùn)行在分布式節(jié)點(diǎn),適適大數(shù)量并且復(fù)雜的聚合分析操作龄句。
Pipeline 聚合
pipeline 聚合其特性是運(yùn)行速度快回论,只能運(yùn)行在單機(jī)上散罕,并且對資源的使用有一定限制如下:
- 單個的聚合操作耗費(fèi)的內(nèi)存不能超過20%
- 返回的結(jié)果集大小在16M以內(nèi)
語法說明
aggredate 方法接收任意多個參數(shù),每個參數(shù)都是一個具體類別的聚合操作傀蓉,通過參數(shù)的順序組成一個執(zhí)行鏈欧漱。每個操作執(zhí)行完后將返回結(jié)果交給下一個操作。值到最后產(chǎn)出結(jié)果葬燎。
Pipeline相關(guān)運(yùn)算符
$match :匹配過濾聚合的數(shù)據(jù)
$project:返回需要聚合的字段
$group:統(tǒng)計(jì)聚合數(shù)據(jù) 误甚,必須指定_id 列.
- $max:求出最大值
- $sum:求和
- $avg:求平均值
- $push: 將結(jié)果插入至一個數(shù)組當(dāng)中
- $addToSet:將結(jié)果插入至一個數(shù)組當(dāng)中,并去重
- $first:取第一個值
- $last:取最后一個值
$limit:用來限制MongoDB聚合管道返回的文檔數(shù)谱净。
$skip:在聚合管道中跳過指定數(shù)量的文檔窑邦,并返回余下的文檔。
$unwind:(flatmap)將文檔中的某一個數(shù)組類型字段拆分成多條壕探,每條包含數(shù)組中的一個值冈钦。
$sort:將輸入文檔排序后輸出。
示例:
# $match 條件過濾
db.emp.aggregate({$match:{"job":"講師"}})
# $project 指定列返回
#返回指定例,_id 自動帶上
db.emp.aggregate({$match:{"job":"講師"}},{$project:{"job":1,"salary":1}})
#返回指定列李请,并修改列名
db.emp.aggregate({$match:{"job":"講師"}},{$project:{"工作":"$job","薪水":"$salary"}})
# $group 操作 ( 必須指定_id 列)
# 基于工作分組瞧筛,并求出薪水總和
db.emp.aggregate({$group:{_id:"$job",total:{$sum:"$salary"}}})
# 求出薪水最大值
db.emp.aggregate({$group:{_id:"$job",total:{$max:"$salary"}}})
# 將所有薪水添加列表
db.emp.aggregate({$group:{_id:"$job",total:{$push:"$salary"}}})
# 將所有薪水添加列表 并去重
db.emp.aggregate({$group:{_id:"$job",total:{$addToSet:"$salary"}}})
# 聚合操作可以任意個數(shù)和順序的組合
# 二次過濾
db.emp.aggregate({$match:{"job":"講師"}},{$project:{"工作":"$job","薪水":"$salary"}},{$match:{"薪水":{$gt:8000}}})
# $skip 與 $limit 跳轉(zhuǎn) 并限制返回?cái)?shù)量
db.emp.aggregate({$group:{_id:"$job",total:{$push:"$salary"}}},{$limit:4},{$skip:2});
# sort 排序
db.emp.aggregate({$project:{"工作":"$job","salary":1}},{$sort:{"salary":1,"工作":1}});
# unwind 操作,將數(shù)組拆分成多條記錄
db.emp.aggregate({$group:{_id:"$job",total:{$push:"$salary"}}},{$unwind:"$total"});
MapRedurce 聚合
mapRedurce 非常適合實(shí)現(xiàn)非常復(fù)雜 并且數(shù)量大的聚合計(jì)算导盅,其可運(yùn)行在多臺節(jié)點(diǎn)上實(shí)行分布式計(jì)算较幌。
MapReduce 現(xiàn)大量運(yùn)用于hadoop大數(shù)據(jù)計(jì)算當(dāng)中,其最早來自于google 的一遍論文白翻,解決大PageRank搜索結(jié)果排序的問題乍炉。其大至原理如下:
- mongodb中mapRedurce的使用流程
1.創(chuàng)建Map函數(shù),
2.創(chuàng)建Redurce函數(shù)
3.將map嘁字、Redurce 函數(shù)添加至集合中恩急,并返回新的結(jié)果集
4.查詢新的結(jié)果集
// 創(chuàng)建map 對象 ,group key纪蜒,value以數(shù)組形式展示
var map1=function (){
emit(this.job,1); // 內(nèi)置函數(shù) key,value
}
// 創(chuàng)建reduce 對象 ,接收key此叠,以及values[value,value,value,value]
var reduce1=function(key,values){
return Array.sum(values);
}
// 執(zhí)行mapReduce 任務(wù) 并將結(jié)果放到新的集合 result 當(dāng)中
db.emp.mapReduce(map1,reduce1,{out:"result"});
// 查詢新的集合
db.result.find()
# 使用復(fù)合對象作為key
var map2=function (){
emit({"job":this.job,"dep":this.dep},{"name":this.name,"dep":this.dep});
}
var reduce2=function(key,values){
return values.length;
}
db.emp.mapReduce(map2,reduce2,{out:"result2"}).find()
# 調(diào)式 mapReduce 執(zhí)行
var emit=function(key,value){
print(key+":"+value);
}
四纯续、mongoDB的索引特性
- 索引的基礎(chǔ)概念
- 單鍵索引
- 多鍵索引
- 復(fù)合索引
- 過期索引
- 全文索引
1. 索引的基礎(chǔ)概念
每個集合(表)默認(rèn)情況下都會有一個索引(_id)。
# 查看執(zhí)行計(jì)劃:
db.emp.find({"salary":{$gt:500}}).explain()
#創(chuàng)建索引
db.emp.createIndex({salary:1})
#查看索引
db.emp.getIndexes()
#查看執(zhí)行計(jì)劃
db.emp.find({"salary":{$gt:500}}).explain()
單鍵索引
# 單個例上創(chuàng)建索引:
db.subject.createIndex({"name":1})
# 嵌套文檔中的列創(chuàng)建索引
db.subject.createIndex({"grade.redis":1})
# 整個嵌套文檔創(chuàng)建索引
db.subject.createIndex({"grade":1})
復(fù)合索引
# 建復(fù)合索引
db.emp.createIndex( { "job":1,"salary":-1} )
# 查看執(zhí)行計(jì)劃:
db.emp.find({"job":"講師", "salary":{$gt:500}}).explain()
db.emp.find({"job":"講師"}).explain()
db.emp.find({"salary":{$gt:500}}).explain()
# 復(fù)合索引如下
job_1_salary_-1灭袁,復(fù)合索引遵循最左原則猬错。
db.emp.find({"job":"講師","salary":{$gt:5000}}).explain() // 走索引
db.emp.find({"salary":{$gt:5000},"job":"講師"}).explain() // 走索引
db.emp.find({"job":"講師"}).explain() // 走索引
db.emp.find({"salary":{$gt:5000}}).explain() //不走索引
# 排序 場景
db.emp.find({}).sort({"job":1,"salary":-1}).explain()// 完全匹配 ==>走索引
db.emp.find({}).sort({"job":-1,"salary":1}).explain()//完全不匹配 ==>走索引
db.emp.find({}).sort({"job":1,"salary":1}).explain()// 一半匹配 ==>不走索引
db.emp.find({}).sort({"job":-1,"salary":-1}).explain()// 一半匹配 ==>不走索引
db.emp.find({}).sort({"job":-1}).explain() // ==>走索引
db.emp.find({}).sort({"salary":-1}).explain() // ==>不走索引
過期索引
過期索引存在一個過期的時間,如果時間過期茸歧,相應(yīng)的數(shù)據(jù)會被自動刪除倦炒,注意這邊刪除的是數(shù)據(jù),而不是索引软瞎。
# 示例
# 插入數(shù)據(jù)
db.log.insert({"title":"this is logger info","createTime":new Date()})
# 創(chuàng)建過期索引
db.log.createIndex({"createTime":1},{expireAfterSeconds:10})
全文索引
# 創(chuàng)建全文索引
db.project.createIndex( {"name":"text","description":"text"})
# 使用全文索引進(jìn)行查詢逢唤,查找的是包含"java"或者"dubbo"
db.project.find({$text:{$search:"java dubbo"}})
# 用于屏蔽關(guān)鍵字拉讯,查找的是包含"java"但屏蔽"dubbo"
db.project.find({$text:{$search:"java -dubbo"}})
# 短語查詢,\" 包含即可,查找的是"Apache Dubbo"
db.project.find({$text:{$search:"\"Apache Dubbo\""}})
# 中文查詢鳖藕,查找的是包含"阿里"或者"開源"
db.project.find({$text:{$search:"阿里 開源"}})
五魔慷、MongoDB 集群
MongoDB 復(fù)制集群
PRIMARY 節(jié)點(diǎn): 可以查詢和新增數(shù)據(jù)
SECONDARY 節(jié)點(diǎn):只能查詢 不能新增 基于priority 權(quán)重可以被選為主節(jié)點(diǎn)
RBITER 節(jié)點(diǎn): 不能查詢數(shù)據(jù) 和新增數(shù)據(jù) ,不能變成主節(jié)點(diǎn)
注意1:MongoDB主從間的數(shù)據(jù)同步是通過日志文件oplog進(jìn)行同步的著恩,這與mysql的同步機(jī)制類似院尔。
注意2:MongoDB選舉流程比較簡單,通過比較節(jié)點(diǎn)中設(shè)置的權(quán)重喉誊,權(quán)重大的節(jié)點(diǎn)會成為新的主節(jié)點(diǎn)邀摆。
基礎(chǔ)示例
主節(jié)點(diǎn)配置
dbpath=/data/mongo/master
port=27017
fork=true
logpath=master.log
replSet=tulingCluster
從節(jié)點(diǎn)配置
- 其中replSet相同代表著是同一個集群下的節(jié)點(diǎn)。
#子節(jié)點(diǎn)配置1
dbpath=/data/mongo/slave
port=27018
fork=true
logpath=slave.log
replSet=tulingCluster
#子節(jié)點(diǎn)配置2
dbpath=/data/mongo/slave2
port=27019
fork=true
logpath=slave2.log
replSet=tulingCluster
分別啟動三個節(jié)點(diǎn)
進(jìn)入其中一個節(jié)點(diǎn)
集群復(fù)制配置管理
# 查看復(fù)制集群的幫助方法
rs.help()
# 添加配置
# 聲明配置變量
var cfg ={"_id":"tuling",
"members":[
{"_id":1,"host":"127.0.0.1:27017"},
{"_id":2,"host":"127.0.0.1:27018"}
]
}
# 初始化配置
rs.initiate(cfg)
# 查看集群狀態(tài)
rs.status()
# 變更節(jié)點(diǎn)示例
# 插入新的復(fù)制節(jié)點(diǎn)
rs.add("127.0.0.1:27019")
# 刪除slave 節(jié)點(diǎn)
rs.remove("127.0.0.1:27019")
注:默認(rèn)節(jié)點(diǎn)下從節(jié)點(diǎn)不能讀取數(shù)據(jù)伍茄。調(diào)用 rs.slaveOk() 解決隧熙。
MongoDB 分片集群
隨著數(shù)據(jù)的增長,單機(jī)實(shí)例的瓶頸是很明顯的幻林≌甓ⅲ可以通過復(fù)制的機(jī)制應(yīng)對壓力,但mongodb中單個集群的 節(jié)點(diǎn)數(shù)量限制到了12個以內(nèi)沪饺,所以需要通過分片進(jìn)一步橫向擴(kuò)展躏敢。此外分片也可節(jié)約磁盤的存儲。
分片示例
配置 并啟動config 節(jié)點(diǎn)集群
# 節(jié)點(diǎn)1 config1-37017.conf
dbpath=/data/mongo/config1
port=37017
fork=true
logpath=logs/config1.log
replSet=configCluster
configsvr=true
# 節(jié)點(diǎn)2 config2-37018.conf
dbpath=/data/mongo/config2
port=37018
fork=true
logpath=logs/config2.log
replSet=configCluster
configsvr=true
# 進(jìn)入shell 并添加 config 集群配置:
var cfg ={"_id":"configCluster",
"protocolVersion" : 1,
"members":[
{"_id":0,"host":"127.0.0.1:37017"},
{"_id":1,"host":"127.0.0.1:37018"}
]
}
# 重新裝載配置整葡,并重新生成集群件余。
rs.initiate(cfg)
配置 shard 節(jié)點(diǎn)集群
# 節(jié)點(diǎn)1 shard1-47017.conf
dbpath=/data/mongo/shard1
port=47017
fork=true
logpath=logs/shard1.log
shardsvr=true
# 節(jié)點(diǎn)2 shard2-47018.conf
dbpath=/data/mongo/shard2
port=47018
fork=true
logpath=logs/shard2.log
shardsvr=true
配置 路由節(jié)點(diǎn) mongos
# 節(jié)點(diǎn) route-27017.conf
port=27017
bind_ip=0.0.0.0
fork=true
logpath=logs/route.log
configdb=conf/127.0.0.1:37017,127.0.0.1:37018
# 添加分片節(jié)點(diǎn)
sh.status()
sh.addShard("127.0.0.1:47017");
sh.addShard("127.0.0.1:47018");
# 為數(shù)據(jù)庫開啟分片功能
sh.enableSharding("tuling")
# 為指定集合開啟分片功能
sh.shardCollection("tuling.emp",{"_id":1})
# 修改分片大小
use config
db.settings.find()
db.settings.save({_id:"chunksize",value:1})
# 嘗試插入1萬條數(shù)據(jù):
for(var i=1;i<=100000;i++){
db.emp.insert({"_id":i,"name":"copy"+i});
}
db.emp.createIndex({_id: 'hashed'})
注意:添加分片的時候,若分片為一個集群遭居,那么路由對分片的添加要注明集群名稱啼器,例如:
sh.addShard("tulingCluster/127.0.0.1:47017,127.0.0.1:47018")