Mongodb
MongoDB 是一个基于分布式文件存储的数据库。由C++ 语言编写。旨在为WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
关系型数据库:原子性、一致性、独立性、持久性。
分布式计算:可靠性(容错)、可扩展性、资源共享、灵活性、更快的速度、开放系统、更高的性能。
CAP定理:对于一个分布式计算系统来说,不可能同时满足以下三点:
- 一致性(Consistency) (所有节点在同一时间具有相同的数据)
- 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
- 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
因此,根据CAP 原理将NoSQL 数据库分成了满足CA 原则、满足CP 原则和满足AP 原则三 大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
- CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
- AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
数据库分类:
1、列存储:hbase、cassandra、hypertable
2、文档存储:mongodb、couchdb
3、键值对存储:redis、mencachedb、berkeleydb
4、图存储:neo4j、flockdb
5、对象存储:db4o、versant
6、Xml数据库:basex
数据库启动:mongodb --config=/opt/mongodb-3.4.0/mongo.conf
数据库关闭:ps -ef | grep mongo.conf | grep -v grep | awk ‘{print $2}’| xargs kill -9
连接数据库:mongo -port 27017
URL连接格式:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
连接replica set 三台服务器, 写入操作应用在主服务器 并且分布查询到从服务器。mongodb://host1,host2,host3/?slaveOk=true
show dbs; 查询所有数据库
use dbname; 使用数据库,若不存在,则创建
db; 显示当前使用的数据库
db.dbname.insert({“name”:”zhangsan”}); 在dbname中插入数据,若数据库不存在,则会创建
db.dropDatabase() 删除正在使用的数据库
db.createCollection(name,option). 创建集合
db.collectionname.drop() 删除集合
use dbname; show collections;db.setname.drop() 删除集合
use dbname;show tables;db.setname.drop(). 删除数据库dbname中的集合setname
db.collectionname.insert(document). 在集合中插入文档
db.collectionname.find(). 查询集合中已经插入的文档
db.collectionname.updata(). 更新文档
db.collectionname.remove({‘title’:’yes’}) 可删除,但是不会真正释放空间,需要继续执行db.repairDatabase()来回收磁盘空间
db.collection.deleteMany({…}). 删除集合下的满足…的文档
查询文档:
db.col.find({“by”:”zhangsan”,”title”:”mongo”}).pretty() 查询by为zhangsan,并且title为mongo的数据
db.col.find({$or:[{“by”:”zhangsan”},{”title”:”mongo”}]}).pretty() 查询by为zhangsan,或者title为mongo的数据
条件操作符:
$gt 大于
$lt 小于
$gte 大于等于
$lte 小于等于
db.col.find({likes:{$gte:100}}). 查找likes大于等于100的数据
db.col.find({likes:{$gte:100,$lt:200}}) 查找likes大于等于100且小于200的数据
$type 数据的类型,如double为1,string为2
db.col.find({“title”:{$type:2}}). 查找title类型为string的数据
db.col.find({“title”:{$type:2}}).limit(3). 查找title类型为string的数据且只显示3条
db.col.find({“title”:{$type:2}}).limit(1).skip(1)查找title类型为string的数据且显示第二条
db.col.find({“title”:{$type:2}}).sort({“likes”:-1}). 1:升序排列,-1:降序排列
创建索引:
db.col.createIndex({“title”:1,”likes”:-1}) 1为升序索引,-1为降序索引
db.col.getIndexes(). 查看索引
db.col.totalIndexSize(). 查看索引大小
db.col.dropIndexes() 删除所有索引
db.col.dropIndex(“索引名称”) 删除指定索引
mongodb主从复制:
一主一从,一主多从。主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
主节点配置:
dbpath=/opt/mongodb-3.4.0/mongo.conf
logpath=/opt/mongodb-3.4.0/log.log
port=27017
bind_ip=127.0.0.1
master=true
从节点配置:
dbpath=/opt/mongodb-3.4.0/mongo.conf
logpath=/opt/mongodb-3.4.0/log.log
port=28018
bind_ip=127.0.0.1
slave=true
source=127.0.0.1:27017
分别启动两个mongodb数据库实例,在主库上做些操作,观看从库状态,若提示slaveok=false,则执行rs.slaveOk(),再查询。
查看主节点信息:db.printReplicationInfo();
查看从节点信息:db.printSlave ReplicationInfo();
Mongodb-replica set副本集:自带故障转移功能的主从复制
主节点配置:
dbpath=/data/mongodb
logpath=/opt/mongodb-3.4.0/logs/mongodb.log
pidfilepath=/data/mongodb/master.pid
logappend=true
replSet=test_set
bind_ip=10.148.0.39
port = 28018
fork = true
从节点配置:
dbpath=/data/mongodb
logpath=/opt/mongodb-3.4.0/logs/mongodb.log
pidfilepath=/data/mongodb/slave.pid
logappend=true
replSet=test_set
bind_ip=10.148.0.43
port = 28018
fork = true
在启动参数中加入replSet,然后在任意一台中rs.initiate()设置成员。rs.status()查看状态。
连接到mongodb里面
>cfg={_id:'test',members:[{_id:0,host:'127.0.0.1:28018'},{_id:1,host:'127.0.0.1:29019'}]};
>rs.initiate(cfg);
>rs.status();
rs.add(…)添加节点。
rs.remove(…)移除节点
Mongodb-sharding切片:
Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担
Config server:mongod实例,存储了整个ClusterMetadata,其中包括chunk信息。
Mongos:前端路由router,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用
1、设置sharding副本集rs0
nohup mongod --port 27031 --dbpath=/data/db4 --logpath=/data/log/rs1-2.log --logappend --fork--shardsvr --replSet=rs1
rs.initiate(…)
2、设置sharding副本集rs1
3、创建config副本集conf
nohup mongod --port 27100 --dbpath=/data/conf1 --logpath=/data/log/conf-1.log --logappend --fork --configsvr--replSet=conf &
rs.initiate(…)
4、创建route
nohup mongos--port 40000 --configdbconf/localhost:27100,localhost:27101 --fork --logpath=/data/log/route.log --logappend &
设置分片
mongo localhost:40000> use admin
> db.runCommand({ addshard: 'rs0/localhost:27020,localhost:27021'})
> db.runCommand({ addshard: 'rs1/localhost:27030,localhost:27031'})
> db.runCommand({ enablesharding: 'test'})
> db.runCommand({ shardcollection: 'test.user', key: {name: 1}})
Mongodb备份恢复:
mongodump -h dbhost [-d dbname] [-o backpath] 备份
mongorestore -h<hostname><:port> -d dbname <path>
mongoexport -d dbname -c collectionName -o fileName #默认是json格式
mongoimport [--port 28018] -d dbname -c clollectionName --file fileName
mongodb监控:
mongostat
mongotop