简介mysql
1.MongoD歌基于分布式文件存储的数据库。linux
分布式文件系统是指文件系统管理的物理存储资源不必定直接链接在本地节点上,而是经过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,对等特性容许一些系统扮演客户机和服务器的双重角色。web
特色sql
.它的特色是高性能、易部署、易使用,存储数据很是方便。主要功能特性有:mongodb
1.*面向集合存储,易存储对象类型的数据。shell
2.*模式自由。数据库
3.*支持动态查询。编程
4.*支持彻底索引,包含内部对象。数组
5.*支持查询。安全
6.*支持复制和故障恢复。
7.*使用高效的二进制数据存储,包括大型对象(如视频等)。
8.*自动处理碎片,以支持云计算层次的扩展性。
9.*支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
10.文件存储格式为BSON(一种JSON的扩展)。
11.*可经过网络访问。
安装MongoDB
1:建立yum仓库配置文件,编辑 /etc/yum.repos.d/mongodb.repo文件,添加
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
2:安装mongodb-org,且mongodb-org-server、mongodb-org-mongos、mongodb-org-shell、mongodb-org-tools将一并被安装
yum install -y mongodb-org
修改配置文件 /etc/mongodb.conf
bind_ip = 0.0.0.0 让全部的用户均可以链接服务端, 生成环境里请自行按需修改
dbpath = /data/mongo 从新指定数据存储的路径
httpinterface = true 打开基于web接口来监控mongodb的工做特性,且监听于28017
rest = true 支持restful编程接口
port = 27017 指定mongodb-server监听的端口
建立数据目录,而且修改权限
mkdir -pv /data/mongo
chown -R mongod.mongod /data/mongo
启动MongoDB,而且查看数据目录是否存在数据
systemctl start mongod.service
ll /data/mongo/
查看客户端链接到服务端的帮助
[root@mongodb1 data]# mongo --help
MongoDB shell version:
2.6.12
usage: mongo [options] [db address] [file names (ending in .js)]
MongoDB的帮助
(三):经过客户端链接到服务端
mongo --host
192.168.23.9 链接到服务端,默认是链接192.168.23.9:27017/test, test为数据库名
show dbs
db.help() 查看库级别的命令
db.stats() 查看数据库状态
db.version() 查看数据库版本
db.serverStatus() 查看数据库服务器状态
db.mycoll.help() 查看表级别的命令
db.getCollectionNames 显示当前库中全部的表的列表
sh.help() 关于sharding的操做
rs.help() 集合赋值命令
help admin 管理命令
help connect 链接操做语法
help keys key shortcuts
help misc misc things to know
help mr mapreduce
show dbs 显示数据库名称
show collections 显示表名称
show users 查看已有用户
show profile 显示profile信息,显示性能评估工具
show logs 显示日志名信息
show log [name] 显示指定的日志名的信息
use <db_name> 进入某库,设定某库为当前库
db.foo.find()
db.foo.find( { a :
1 } )
it
result of the last line evaluated; use to further iterate
DBQuery.shellBatchSize = x
set default number of items to display on shell
exit quit the mongo shell
db.students.insert({name:"dage",age:20}) 插入一条数据,默认会建立students表
show collections 显示当前的表
db.students.stats() 显示students表的数据信息
db.students.find() 查询插入的各个字段
db.students.count() 查看students表中有多少个document
find()的高级用法:比较操做:
(一) db
.students.find({age: {$gt: 30}}) age大于30
{
"_id" : ObjectId("597b49b4072d632a342867cc"), "name" : "data", "age" : 34 }
(二)db
.students.find({age: {$gte: 30}}) age大于等于30
(三)db
.students.find({age: {$lt: 30}}) age小于30
(四)db
.students.find({age: {$lte: 30}}) age小于等于30
(五)db
.students.find({age: {$in: [20, 30]}}) age在[20, 30]的document
(六)db
.students.find({age: {$nin: [20, 30]}}) age不在[20, 30]的document
find()的高级用法:组合条件:逻辑运算
(一)db
.students.find({$or: [{name: {$eq: "yhy"}}, {age: {$nin: [40,50]}}]}) 或运算
(二)
$and:与运算
(三)
$not:非运算
(四)
$nor:取反运算
find()的高级用法:元素查询: 根据document中是否存在指定的字段进行的查询
(一)db.students.find({gender: {$exists:
true}}) 查询存在gender字段的document
(二)$mod:取摸
(三)$type:返回指定字段的值类型为指定类型的document
MongoDB支持的数据类型有:Double,
String, Object, Array, Binary data, Undefined, Boolean, Date, Null 等
update()的高级用法:$set 更新,或插入字段的值, $unset 删除指定字段 ,$rename 修改字段名
(一)db.students.
update({name: "yhy"}, {$set: {age: 44}})
将name为yhy的这个document的age字段的值改成
44
db.students.
update({name: "yhy"}, {$set: {age: 50}})
将name为yhy的这个document的age字段的值改成
50
(二)db.students.
update({name: "yhy"}, {$unset: {age: 50}})
删除name字段为yhy的document的age为
50的字段
(三)db.students.
update({name: "yhy"}, {$rename: {age: "Age"}})
修改name字段为yhy的document的age字段名为Age字段名
(四)db.students.
update({name: "yhy"}, {$inc: {course: "Python"}})
给name字段为yhy的document增长一个字段course且值为Python
# 删除字段
db.students.remove({
"name": "yhy"})
# 删除表
db.students.drop()
# 删除当前数据库
db.dropDatabase()
索引
1:MongoDB中的索引与MySQL中的索引有相似的功能,将表中的字段添加索引,索引会将字段作排序,依次索引可以大大提升MongoDB的查询能力,可是会削弱一部分的i/o能力
2:在MySQL的学习过程当中,咱们知道,当用户去查询一行数据的时候,都须要指定条件过滤,那么在条件过滤时,最好可以使用字段上创建的索引,可以帮助咱们快速匹配到行,拿到须要的数据。若是使用到了索引,那么MySQL先会去查找索引,而后经过索引定位到数据表中的数据,最后返回给调用者, MySQL的索引类型有以下几类:B Tree索引、hash索引、空间索引、全文索引
3:mongoDB索引类型有:单键索引、组合索引、多键索引、空间索引、文本索引、hash索引
db
.student.ensureIndex({name: 1})
给name字段建立索引,
1为指定按升序建立索引,若是你想按降序来建立索引指定为-1便可。
实例
db
.student.getIndexes()
查看索引
db
.student.find({"name": "yhy"}).explain()
查看是否使用到了索引(因为MongoDB调优)
db
.student.dropIndex("name_1")
删除索引
db
.students.ensureIndex({name: 1}, {unique: true})
给name字段建立一个惟一键索引,那么再给students表增长一条行document,且name与以前存在的document的name值相同,那么就会报错, 如:增长一条document
db
.students.insert({name: "yhy"})
报错的信息以下:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.students.$name_1 dup key: { : \"yhy\" }"
}
})
受权认证
mongodb存储全部的用户信息在admin 数据库的集合system.users中,保存用户名、密码和数据库信息。mongodb默认不启用受权认证,只要能链接到该服务器,就可链接到mongod。若要启用安全认证,须要更改配置文件参数auth
1:建立一个root用户,角色为userAdminAnyDatabase,所以root用户对数据库具备管理权限,可是不具有操做权限
db.createUser({user:"root",pwd:"123456", roles: [{ role: "userAdminAnyDatabase", db: "admin" }]});
2:createUser()方法说明
user:定义用户名
pwd:设置密码
roles:指定用户的角色,能够用一个空数组给新用户设定空角色; 在roles字段,能够指定内置角色和用户定义的角色。
db:指定用户对哪一个数据库具备管理员权限
3:角色种类说明
Built-
In Roles(内置角色):
①. 数据库用户角色:
read、readWrite;
②. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
③. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
④. 备份恢复角色:backup、
restore;
⑤. 全部数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
⑥. 超级用户角色:root
⑦. 内部角色:__system
4:角色对应的意义说明
Read:容许用户读取指定数据库
readWrite:容许用户读写指定数据库
dbAdmin:容许用户在指定数据库中执行管理函数,如索引建立、删除,查看统计或访问system.profile
userAdmin:容许用户向system.users集合写入,能够找指定数据库里建立、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户全部分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户全部数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户全部数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户全部数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户全部数据库的dbAdmin权限。
root:只在admin数据库中可用。超级帐号,超级权限
5:查看受权表
db.system.users.find();
6:此时退出MongoDB,且编辑配置文件/etc/mongod.
conf, 添加
auth=true(针对于2.6版本)
security:(针对于3.4版本)
authorization: enabled
7:能够在链接数据库的时候认证,也能够在登入时候认证,这里使用登入以后认证的方式
show dbs; (会报错,由于没有管理受权)
db.auth("root", "123456") 受权以后再查看数据库就没有问题了
8:此时登入使用的是root用户,角色是管理角色,可是不具有对数据库的操做权限
use test;
show collections; (会报错,由于没有操做权限)
9:再次建立一个用户:
test,让其对test具备读写操做, 且切换用户为test
db.createUser({user:"test",pwd:"test", roles: [{ role: "readWrite", db: "test" }]});
db.auth("test", "test")
10:再次查看
test库的表,发现能够查看了
show collections;
11:其实,若是须要建立一个用户具备管理权限且同时具备操做权限,那么这个用户的角色必须是root
db.createUser({user:"yhy",pwd:"123456", roles: [{ role: "root", db: "admn" }]});
mongod是服务器程序,mongo是客户端程序,不要搞混乱了,咱们不只可使用systemctl来启动mongoDB, 还能够直接使用mongod来启动
在启动mongod的时候,能够指定一系列的选项,那么mongodb中,提供了一个配置文件:/etc/mongod.conf ,那么能够将这些选项都写在这个配置文件里,使得启动mongod时,mongodb会先读取这个配置文件中的选项,以后在读取命令行的选项来启动mongodb
①:在配置mongodb2
.6的时候,经常使用的一些选项有
fork = {true=false}:指定mongod是否运行在后台
bind_ip = IP地址:指定监听的地址,若是不指定,默认是监听本地的全部IP地址
port = 监听的端口:指定监听的端口
maxConns = 并发链接数:指定支持的最大并发链接数
logappend = {true=false}:指定是否支持日志滚动
auth = :指定是否启用认证功能
②:在配置mongodb3
.4的时候,经常使用的选项有(若是想使用mongodb的web管理页面,在/usr/lib/systemd/system/mongod.service文件中,修改:Environment="OPTIONS=-f /etc/mongod.conf --rest")(/usr/lib/systemd/system/mongod.service这个unit file能够指定不少环境配置选项)
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /data/mongodb
journal:
enabled: true
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
net:
port: 27017
bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces.
# 启用认证
security:
authorization: enabled
参考官方文档:https://docs.mongodb.com/compass/current/install/#install-on-red-hat-enterprise-linux-rhel
Mongodb compass 提供图形化管理界面管理MongoDB
1:下载安装包:
wget https:
//downloads.mongodb.com/compass/mongodb-compass-1.6.0.x86_64.rpm;
2:安装
yum install mongodb-compass-
1.6.0.x86_64.rpm;
3:启动
DEBUG=* mongodb-compass;
MongoDB的复制架构
以上全部的内容都是 MongoDB standalone方式 运行,下面咱们将重点讲解MongoDB的复制,也就是副本集的概念(MongoDB的集群架构)
MongoDB复制是将数据同步在多个服务器的过程,复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提升了数据的可用性, 并能够保证数据的安全性, 复制还容许您从硬件故障和服务中断中恢复数据
1:在mongodb的集群中,通常会部署多个节点,且有多个节点有相同的数据。
2:主节点能够进行读写操做,而从节点通常只可以进行读操做
3:副本集就是服务全部的mongodb实例的同一个数据集(也就是说副本集定义了一个集群,一个已经运行的集群中若是添加了一个新的节点,那么必须指定这个新的节点加入到哪一个副本集中。一个副本集就定义了一个集群,一个副本集能够最多支持12个成员,可是只有7个成员能够参与投票)
4:对应MySQL而言:从节点在主节点复制数据的方式为主节点将数据操做保存在二进制日志中,而从节点就是复制主节点的二进制日志,在本地再执行一次,那么这就实现了与主节点的数据一致。而mongodb是主节点将数据操做保存在操做日志(oplog)中,从节点复制操做日志(oplog),在本地再执行一次实现数据集一致
5:从节点每隔一段时间会探测一次主节点的心跳信息,若是在一段时间中没法得到主节点的心跳信息,那么其他的从节点会从新进行一次投票选举操做,谁的优先级高就会成为下一个主节点。
6:mongodb节点集群至少须要三个节点,一个主节点,两个从节点
7:复制中的四种特殊的从节点分类
a:
0优先级的节点:冷备节点,不会被选举成为主节点,可是能够参与选举过程
b:被隐藏的从节点:不想让客户端访问数据的节点,必须为
0优先级的节点,不会显示在mongodb集群的信息中
c:延迟复制的从节点:必须为
0优先级的节点,且复制时间落后于主节点一个固定时间,能够参与选举过程
d:arbiter:没有数据
8:oplog:记录数据改变的操做日志,用于数据同步复制,大小固定的文件,存储在local数据库中,集群中每个节点都有oplog。可是只有当其成为主节点的时候,才会将其数据改变的操做记录到oplog之中
同步的步骤分为:
初始同步
同步以后追赶主节点
切分块迁移(切片)
local库中存放了副本集的全部的元数据和oplog,用于存储oplog的一个叫oplog.rs的collection表,oplog.rs的大小默认与文件系统有关,可是能够自定义
基于MongoDB2.6版本配置MongoDB主从复制集群架构实战
(请你们自行完成3.4版本的MongoDB主从复制集群架构)
1:集群环境说明:mongodb1:192.168.43.十、mongodb2:192.168.43.十一、mongodb3:192.168.43.12。且基于主机名相互通讯/etc/hosts文件(为了集群信息同步不出现问题,先关闭认证功能anth)
2:编辑mongodb1的/etc/mongod.conf文件,注释auth指令,添加以下内容
# 指定副本集的名称
replSet=uplooking
# 指定预拷贝的索引,这里只拷贝id那个系统自动生成的索引
replIndexPrefetch=_id_only
noauth=true
3:将mongodb1的配置文件拷贝到mongodb二、mongodb3
scp
/etc/mongod.conf 192.168.43.11:/etc/
scp
/etc/mongod.conf 192.168.43.12:/etc/
3:启动mongodb一、mongodb二、mongodb3
4:登入mongodb1的shell接口
> rs.status(); (查看集群中的节点状态)
> rs.initiate();(初始化副本集)
> rs.status();(再次查看集群中的节点状态)
uplooking:PRIMARY> (此时的提示符已经变了)
5:当初始化了主节点之后,须要添加其余的从节点到mongodb集群中来
uplooking:PRIMARY> rs.add("192.168.43.11")
uplooking:PRIMARY> rs.add("192.168.43.12")
6:添加了其余节点之后,就能够查看配置信息和副本集的状态信息
uplooking:PRIMARY> rs.conf()
{
"_id" : "uplooking",
"version" : 3,
"members" : [
{
"_id" : 0,
"host" : "mongodb1:27017"
},
{
"_id" : 1,
"host" : "192.168.43.11:27017"
},
{
"_id" : 2,
"host" : "192.168.43.12:27017"
}
]
}
7:再次查看状态副本集的状态信息
uplooking:PRIMARY> rs.status()
{
"set" : "uplooking",
"date" : ISODate("2017-10-29T16:05:55Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "mongodb1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 914,
"optime" : Timestamp(1509292923, 1),
"optimeDate" : ISODate("2017-10-29T16:02:03Z"),
"electionTime" : Timestamp(1509292619, 1),
"electionDate" : ISODate("2017-10-29T15:56:59Z"),
"self" : true
},
{
"_id" : 1,
"name" : "192.168.43.11:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 237,
"optime" : Timestamp(1509292923, 1),
"optimeDate" : ISODate("2017-10-29T16:02:03Z"),
"lastHeartbeat" : ISODate("2017-10-29T16:05:54Z"),
"lastHeartbeatRecv" : ISODate("2017-10-29T16:05:54Z"),
"pingMs" : 0,
"syncingTo" : "mongodb1:27017"
},
{
"_id" : 2,
"name" : "192.168.43.12:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 232,
"optime" : Timestamp(1509292923, 1),
"optimeDate" : ISODate("2017-10-29T16:02:03Z"),
"lastHeartbeat" : ISODate("2017-10-29T16:05:55Z"),
"lastHeartbeatRecv" : ISODate("2017-10-29T16:05:55Z"),
"pingMs" : 0,
"syncingTo" : "mongodb1:27017"
}
],
"ok" : 1
}
8:此时从节点能够在shell接口查看到在主节点复制过来的数据库和表,可是不能查询表的内容,所以须要经过命令让从节点变为可用节点,在查询就能够了
uplooking:SECONDARY> rs.slaveOk()
9:主节点也能够经过命令变为从节点, 此时其余的节点经过投票将会变为主节点
uplooking:SECONDARY> rs.stepDown()
10:在新的主节点(mongodb2)中能够设置从节点的优先级让从节点变为主节点,让第一个从节点优先级为10,那么第一个从节点就会变为主节点
uplooking:PRIMARY> config=rs.conf() # 先使用一个config临时变量保存rs.conf()的值,也就是当前的副本集配置
uplooking:PRIMARY> config.members[0].priority=10 # 让第一个节点,也便是mongodb1的优先级为10
uplooking:PRIMARY> rs.reconfig(config) # 让副本集得到新的配置,此时,mongodb1将会成为主节点
11:在主节点中,从副本集中移除一个节点,
rs.conf()
# 先查看须要删除的host
rs.remove(
"192.168.43.12:27017")
12:也能够将一个从节点变为arbiter仲裁节点,这里将mongodb3变为arbiter节点,必须先让mongodb3下线,而后删除数据目录,在重启,再设置为arbiter仲裁节点
rs.addArb(
"192.168.43.12")