Mongodb 安裝部署
MongoDB 是一個基於分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB 是一個介於關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。它支持的數據結構非常松散,是類似json的bson格式,因此可以存儲比較復雜的數據類型。Mongo最大的特點是它支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功能,而且還支持對數據建立索引。
二、什麽是mongodb
1.mongodb是有C++語言編寫,是一個機遇分布式文件存儲的開源數據庫系統。
2.在高負載的情況下,隨時添加更多的節點,可以保證服務器性能。
4.mongodb將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。
5.mongodb文檔類似於json對象,字段值可以包含其他文檔,數組及文檔數組。
三、mongodb的優缺點
優點:
文檔結構的存儲方式,能夠更便捷的獲取數據
內置GridFS,支持大容量存儲
海量數據下,性能優越
動態查詢
全索引支持,擴展到內部對象和內嵌數組
查詢記錄分析
快速,就地更新
高效存儲二進制大對象(照片,視頻等等)
復制(副本集)和支持自動故障恢復
內置Auto-Sharding 自動分片支持雲集擴展性,分片簡單
MapReduce 支持復雜聚合
不支持事務操作
MongoDB 占用空間過大 (不過這個確定對於目前快速下跌的硬盤價格來說,也不算什麽缺點了)
MongoDB沒有如MySQL那樣成熟的維護工具
無法進行關聯表查詢,不適用於關系多的數據
復雜聚合操作通過mapreduce創建,速度慢
模式自由,自由靈活的文件存儲格式帶來的數據錯
MongoDB 在你刪除記錄後不會在文件系統回收空間。除非你刪掉數據庫。但是空間沒有被浪費
Ps:
1.GridFS
GridFS是一個出色的分布式文件系統,可以支持海量的數據存儲。
內置了GridFS了MongoDB,能夠滿足對大數據集的快速範圍查詢。
2.內置Auto-Sharding 自動分片支持雲集擴展性,分片簡單
一個collection可按照記錄的範圍,分成若幹個段,切分到不同的Shard上。
Shards可以和復制結合,配合Replica sets能夠實現Sharding+fail-over,不同的Shard之間可以負載均衡。
查詢是對客戶端是透明的。客戶端執行查詢,統計,MapReduce等操作,這些會被MongoDB自動路由到後端的數據節點。
這讓我們關註於自己的業務,適當的 時候可以無痛的升級。MongoDB的Sharding設計能力最大可支持約20 petabytes,足以支撐一般應用。
這可以保證MongoDB運行在便宜的PC服務器集群上。PC集群擴充起來非常方便並且成本很低,避免了“sharding”操作的復雜性和成本。
3、海量數據下,性能優越
在使用場合下,千萬級別的文檔對象,近10G的數據,對有索引的ID的查詢不會比mysql慢,而對非索引字段的查詢,則是全面勝出。 mysql實際無法勝任大數據量下任意字段的查詢,而mongodb的查詢性能實在讓我驚訝。寫入性能同樣很令人滿意,同樣寫入百萬級別的數 據,mongodb比我以前試用過的couchdb要快得多,基本10分鐘以下可以解決。補上一句,觀察過程中mongodb都遠算不上是CPU殺手。
4、全索引支持,擴展到內部對象和內嵌數組
索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數據時必須掃描集合中的每個文件並選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是非常低的,特別在處理大量的數據時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的性能是非常致命的。
索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構。
5、MapReduce 支持復雜聚合
MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點類似sql語句中的 count(*)。
與關系型數據庫相比,mongodb的缺點:
Mongodb 不支持事物操作:
所以事務要求嚴格的系統(如果銀行系統)肯定不能用它。
mongodb不支持事務操作:
所以事務要求嚴格的系統(如果銀行系統)肯定不能用它。
mongodb占用空間過大:
關於其原因,在官方的FAQ中,提到有如下幾個方面:
1、空間的預分配:為避免形成過多的硬盤碎片,mongodb每次空間不足時都會申請生成一大塊的硬盤空間,而且申請的量從64M、128M、256M那 樣的指數遞增,直到2G為單個文件的最大體積。隨著數據量的增加,你可以在其數據目錄裏看到這些整塊生成容量不斷遞增的文件。
2、字段名所占用的空間:為了保持每個記錄內的結構信息用於查詢,mongodb需要把每個字段的key-value都以BSON的形式存儲,如果 value域相對於key域並不大,比如存放數值型的數據,則數據的overhead是最大的。一種減少空間占用的方法是把字段名盡量取短一些,這樣占用 空間就小了,但這就要求在易讀性與空間占用上作為權衡了。
3、刪除記錄不釋放空間:這很容易理解,為避免記錄刪除後的數據的大規模挪動,原記錄空間不刪除,只標記“已刪除”即可,以後還可以重復利用。
4、可以定期運行db.repairDatabase()來整理記錄,但這個過程會比較緩慢
MongoDB沒有如MySQL那樣成熟的維護工具,這對於開發和IT運營都是個值得註意的地方。
四、安裝部署
(一)yum源方式安裝
1、添加yum源
vim /etc/yum.repos.d/mongodb3.0.repo
[mongodb]
name=mongodb
baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.2/x86_64/
http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.7/x86_64/
enabled=1
gpgcheck=0
2、安裝
yum -y install mongodb-org
3、安裝完的後續調整
blockdev --report
blockdev --setra 256 /dev/sda
blockdev --setra 256 /dev/dm-1
4、WARNING 解決
WARNING: /sys/kernel/mm/transparent_hugepage/enabled?is?‘always‘.
需要做以下操作
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
打開文件數限制
vim /etc/security/limits.d/20-nproc.conf(不一定是這個名稱,可以cd到limits.d目錄下查看)
- soft nproc 32000 //32000是mongodb要求的
5、 CentOS 7上需要把mongoDB添加到systemd,否則會出現下面的錯誤
systemd[1]: Failed to start SYSV: Mongo is a scalable, document-oriented database..
將mongodb添加到systemd管理中
vim /usr/lib/systemd/system/mongod.service
[Unit]
Description=mongodb database
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=--quiet -f /etc/mongod.conf"
ExecStart=/usr/bin/mongod $OPTIONS run
PIDFile=/var/run/mongodb/mongod.pid
[Install]
WantedBy=multi-user.target
建立軟連接
ln -s /usr/lib/systemd/system/mongod.service /etc/systemd/system/multi-user.target.wants/
重新加載systemctl
systemctl daemon-reload
6、寫配置文件
vim mongodb.conf(主上的啟動參數文件)
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongod.log
storage:
dbPath: /data/db
journal:
enabled: true
processManagement:
net:
port: 27001
security:
authorization: enabled
7、啟動
mkdir -p /data/mongodb/logs/
mongod -f mongodb.conf
(二)源碼方式安裝
1、下載源碼包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz
2、解壓
tar zxf mongodb-linux-x86_64-3.0.6.tgz -C /data/
cd /data &&mv mongodb-linux-x86_64-3.0.6/ mongodb
3、添加環境變量
echo "export PATH=/data/mongodb/bin/:$PATH" >>/etc/profile
soure /etc/profile
4、創建一個默認數據保存目錄
mkdir -p /data/db
mkdir -p /data/mongodb/logs/
5、添加一個配置文件
vim /etc/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongod.log
storage:
dbPath: /data/db
journal:
enabled: true
processManagement:
net:
port: 27001
security:
authorization: enabled
6、啟動
mongod -f mongodb.conf
Ps: Warrning 源碼安裝WARNING錯誤是一樣的,請按照yum方式處理WARNING問題
五、操作使用
數據庫常用命令
1、Help查看命令提示
help
db.help();
db.yourColl.help();
db.youColl.find().help();
rs.help();
2、切換/創建數據庫
use yourDB; 當創建一個集合(table)的時候會自動創建當前數據庫
3、查詢所有數據庫
show dbs;
4、刪除當前使用數據庫
db.dropDatabase();
5、從指定主機上克隆數據庫
db.cloneDatabase(“127.0.0.1”); 將指定機器上的數據庫的數據克隆到當前數據庫
6、從指定的機器上復制指定數據庫數據到某個數據庫
db.copyDatabase("mydb", "temp", "127.0.0.1");將本機的mydb的數據復制到temp數據庫中
7、修復當前數據庫
db.repairDatabase();
8、查看當前使用的數據庫
db.getName();
db; db和getName方法是一樣的效果,都可以查詢當前使用的數據庫
9、顯示當前db狀態
db.stats();
10、當前db版本
db.version();
11、查看當前db的鏈接機器地址
db.getMongo();
Collection聚集集合
1、創建一個聚集集合(table)
db.createCollection(“collName”, {size: 20, capped: 5, max: 100});
2、得到指定名稱的聚集集合(table)
db.getCollection("account");
3、得到當前db的所有聚集集合
db.getCollectionNames();
4、顯示當前db所有聚集索引的狀態
db.printCollectionStats();
用戶相關
1、添加一個用戶
db.addUser("name");
db.addUser("userName", "pwd123", true); 添加用戶、設置密碼、是否只讀
2、數據庫認證、安全模式
db.auth("userName", "123123");
3、顯示當前所有用戶
show users;
4、刪除用戶
db.removeUser("userName");
其他
1、查詢之前的錯誤信息
db.getPrevError();
2、清除錯誤記錄
db.resetError();
查看聚集集合基本信息
1、查看幫助 db.yourColl.help();
2、查詢當前集合的數據條數 db.yourColl.count();
3、查看數據空間大小 db.userInfo.dataSize();
4、得到當前聚集集合所在的db db.userInfo.getDB();
5、得到當前聚集的狀態 db.userInfo.stats();
6、得到聚集集合總大小 db.userInfo.totalSize();
7、聚集集合儲存空間大小 db.userInfo.storageSize();
8、Shard版本信息 db.userInfo.getShardVersion()
9、聚集集合重命名 db.userInfo.renameCollection("users"); 將userInfo重命名為users
10、刪除當前聚集集合 db.userInfo.drop();
聚集集合查詢
1、查詢所有記錄
db.userInfo.find();
相當於:select* from userInfo;
默認每頁顯示20條記錄,當顯示不下的情況下,可以用it叠代命令查詢下一頁數據。註意:鍵入it命令不能帶“;”
但是你可以設置每頁顯示數據的大小,用DBQuery.shellBatchSize= 50;這樣每頁就顯示50條記錄了。
2、查詢去掉後的當前聚集集合中的某列的重復數據
db.userInfo.distinct("name");
會過濾掉name中的相同數據
相當於:select distict name from userInfo;
3、查詢age = 22的記錄
db.userInfo.find({"age": 22});
相當於: select * from userInfo where age = 22;
4、查詢age > 22的記錄
db.userInfo.find({age: {$gt: 22}});
相當於:select * from userInfo where age >22;
5、查詢age < 22的記錄
db.userInfo.find({age: {$lt: 22}});
相當於:select * from userInfo where age <22;
6、查詢age >= 25的記錄
db.userInfo.find({age: {$gte: 25}});
相當於:select * from userInfo where age >= 25;
7、查詢age <= 25的記錄
db.userInfo.find({age: {$lte: 25}});
8、查詢age >= 23 並且 age <= 26
db.userInfo.find({age: {$gte: 23, $lte: 26}});
9、查詢name中包含 mongo的數據
db.userInfo.find({name: /mongo/});
//相當於%%
select * from userInfo where name like ‘%mongo%’;
10、查詢name中以mongo開頭的
db.userInfo.find({name: /^mongo/});
select * from userInfo where name like ‘mongo%’;
11、查詢指定列name、age數據
db.userInfo.find({}, {name: 1, age: 1});
相當於:select name, age from userInfo;
當然name也可以用true或false,當用ture的情況下河name:1效果一樣,如果用false就是排除name,顯示name以外的列信息。
12、查詢指定列name、age數據, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
相當於:select name, age from userInfo where age >25;
13、按照年齡排序
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});
14、查詢name = zhangsan, age = 22的數據
db.userInfo.find({name: ‘zhangsan‘, age: 22});
相當於:select * from userInfo where name = ‘zhangsan’ and age = ‘22’;
15、查詢前5條數據
db.userInfo.find().limit(5);
相當於:selecttop 5 * from userInfo;
16、查詢10條以後的數據
db.userInfo.find().skip(10);
相當於:select from userInfo where id not in (
selecttop 10 from userInfo
);
17、查詢在5-10之間的數據
db.userInfo.find().limit(10).skip(5);
可用於分頁,limit是pageSize,skip是第幾頁*pageSize
18、or與 查詢
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
相當於:select * from userInfo where age = 22 or age = 25;
19、查詢第一條數據
db.userInfo.findOne();
相當於:selecttop 1 * from userInfo;
db.userInfo.find().limit(1);
20、查詢某個結果集的記錄條數
db.userInfo.find({age: {$gte: 25}}).count();
相當於:select count(*) from userInfo where age >= 20;
21、按照某列進行排序
db.userInfo.find({sex: {$exists: true}}).count();
相當於:select count(sex) from userInfo;
索引
1、創建索引
db.userInfo.ensureIndex({name: 1});
db.userInfo.ensureIndex({name: 1, ts: -1});
2、查詢當前聚集集合所有索引
db.userInfo.getIndexes();
3、查看總索引記錄大小
db.userInfo.totalIndexSize();
4、讀取當前集合的所有index信息
db.users.reIndex();
5、刪除指定索引
db.users.dropIndex("name_1");
6、刪除所有索引索引
db.users.dropIndexes();
修改、添加、刪除集合數據
1、添加
db.users.save({name: ‘zhangsan’, age: 25, sex: true});
添加的數據的數據列,沒有固定,根據添加的數據為準
2、修改
db.users.update({age: 25}, {$set: {name: ‘changeName‘}}, false, true);
相當於:update users set name = ‘changeName’ where age = 25;
db.users.update({name: ‘Lisi‘}, {$inc: {age: 50}}, false, true);
相當於:update users set age = age + 50 where name = ‘Lisi’;
db.users.update({name: ‘Lisi‘}, {$inc: {age: 50}, $set: {name: ‘hoho‘}}, false, true);
相當於:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’;
3、刪除
db.users.remove({age: 132});
4、查詢修改刪除
db.users.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: ‘a2‘}, $inc: {age: 2}},
remove: true
});
db.runCommand({ findandmodify : "users",
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: ‘a2‘}, $inc: {age: 2}},
remove: true
});
update 或 remove 其中一個是必須的參數; 其他參數可選。
Mongodb 安裝部署