1.MongoDB的下载与安装
www.mongodb.org
groupadd -g 27017 mongod useradd -g 27017 -u 27017 mongod
mkdir -p /data/db
chown -R mongod.mongod data
2.MongoDB的操作
db #查看当前数据库
use db_name #使用数据库
show collections; #查看表的数据
db.getCollectionNames() #获取数据库中所有表的数据
db.mycoll.help(); #查询对相应表的一些操作
db.tables1.insert({name:"tom",age:"20",address:{add1:"hebei",add2:"wuhan"}}); #新建一张tables1表,并且插入相应的数值
db.mycoll.find().help(); #查询的方法,排序,最大最小等...
db.tables1.find(); #查看collection tables1的内容
for (i=0;i<1000;i++) db.tables1.insert({name:"Alex"+i}); #向collection tables1中插入1000条数据
db.find()的操作
条件操作
db.mytb1.find({"name":"Alex210"},{"name":1,"age":1,"addr":1}); { "_id" : ObjectId("58bf55e7a0ea941cdc1c6355"), "name" : "Alex210", "age" : 10.5, "addr" : "ShenZhen" }
等价于
select name,age,addr from mytb1 where name="Alex210"
AND操作
db.mytb1.find({"name":"Alex19","age":0.95},{"name":1,"age":1,"addr":1});
等价于
select name,age,addr from mytb1 where name="Alex19" and age="0.95"
OR操作
db.mytb1.find({'$or':[{"name":"Alex19"},{"age":1}]},{"name":1,"age":1,"addr":1});
等价于
select name,age,addr from mytb1 where name="Alex19" or age="1"
比较操作 db.mytb1.find({age:{$gt:10}});
<, <=, >, >= ($lt, $lte, $gt, $gte )
IN操作 db.mytb1.find({"age":{"$in":[10,20,30]}});
等价于
select * from mytb1 where age in (10,20,30)
NIN db.mytb1.find({"age":{"$nin":[10,20,30]}});
等价于
select * from mytb1 where age not in(10,20,30)
NULL操作 db.mytb1.find({"age":null}); 等价于 select * from mytb1 where age is null
LIKE操作 db.mytb1.find({name:/^Alex/}); 等价于 select * from mytb1 where name like "Alex%"
DISTINCT操作 db.mytb1.distinct('name'); 等价于 select distinct(name) from mytb1
COUNT操作 db.mytb1.find({"age":{"$in":[10,20,30]}}).count(); 等价于 select count(*) from mytb1 where age in (10,20,30)
MongoDB可以做数组的操作
EXISTS操作 db.mytb1.find({"age": {$exists:false}}); 如果mytb1里面不存在age字段的row打印出来
类型 | 对应数字 | 别名 | 说明 |
Double1 | 1 | double | |
String | 2 | string | |
Object | 3 | object | |
Array | 4 | array | |
Binary data | 5 | binData | |
Undefined | 6 | undefined | 弃用 |
ObjectId | 7 | objectId | |
Boolean | 8 | “bool” | |
Date | 9 | “date” | |
Null | 10 | “null” | |
Regular Expression | 11 | “regex” | |
DBPointer | 12 | “dbPointer” | |
JavaScript | 13 | “javascript” | |
Symbol | 14 | “symbol” | |
JavaScript(with scope) | 15 | “javascriptWithScope” | |
32-bit integer | 16 | “int” | |
Timestamp | 17 | “timestamp” | |
64-bit integer | 18 | “long” | |
Min key | -1 | “minKey” | |
Max key | 127 | “maxKey” |
TYPE类型查询 db.mytb1.find({"age":{$type:1}});
UPDATE操作 db.mytb1.update({name:"Alex19"},{$set:{age:"99"}});
UPDATE更新多条记录
db.mytb1.update({name:"Alex19"},{$set:{age:"88"}},false,true);
db.table_name.update(where,setNew,issert,multi );
参数解释:
where:类似于sql中的update 语句where后边的查询条件
setNew:类似于sql中update语句中set后边的部分,也就是你要更新的部分
upsert:如果要更新的那条记录没有找到,是否插入一条新纪录,默认为false不插入,true为插入
multi :是否更新满足条件的多条的记录,false:只更新第一条,true:更新多条,默认为false
UNSET操作 db.mytb1.update({name:"Alex20"},{$unset:{"age":1}});
删除age这个字段
SET操作
db.mytb1.update({name:"Alex20"},{$set:{"sex":"girl"}});
增加sex这个字段
REMOVE操作 db.mytb1.remove({name:"Alex20"}); 删除name="Alex20"的这条记录
索引操作
db.tables1.getIndexes();
获取索引
创建索引 > db.tables1.createIndex({name:1}); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
添加索引以后查询的速度快了很多。
MongoDB:
NoSQL、文档存储、JSON/BSON
groupadd -g 27017 mongod
useradd -g 27017 -u 27017 mongod
索引分类:
单键索引
组合索引(多字段索引)
多建索引:索引是创建在键值是子文档的索引
mongod --help
fork: mongod是否运行在后台
bind_ip: 启动以后的运行地址,默认为127.0.0.1
port: 监听端口,默认为27017
maxConns: 并发最大连接数
repair: 进程意外,启动需要修复数据库
MongoDB的复制功能:
两种类型:
master/slave
replica set: 复制集
主节点将数据修改操作保存至oplog中
arbiter: 仲裁节点
复制集中的节点分类:
0优先级的节点: 冷备节点,不会被选举成为主节点,但是可以参与选举
被隐藏的从节点:首先必须是0优先级的节点,其次不会被客户端访问,但可以参与选举
延迟复制的从节点:首先必须是0优先级的节点,且复制时间落后于主节点一个固定时长,但可以参与选举
arbiter: 仲裁节点
MongoDB的复制架构:
oplog: 大小固定的文件,存储在local数据库中
初始同步(initial sync)
回滚后追赶(post-rollback catch-up)
切分块迁移(sharding chunk migrations)
heartbeat
MongoDB的数据同步类型:
初始同步:
从节点没有任何数据
从节点丢失副本复制历史
初始同步的步骤:
1、克隆所有数据库的所有collections
2、应用数据集的所有改变:复制oplog并应用在本地
3、为所有collection构建索引
oplog是用于实现replication的,而journal是用于实现redo的log
复制
rs.add()报错,没有关闭防火墙
testSet:PRIMARY> rs.add("192.168.144.47")
{
"ok" : 0,
"errmsg" : "Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: docker46:27017; the following nodes did not respond affirmatively: 192.168.144.47:27017 failed with No route to host",
"code" : 74,
"codeName" : "NodeNotFound"
}
systemctl stop firewalld
systemctl disable firewalld
创建复制集,创建指定的配置文件,启动的时候指定配置文件启动
# 日志文件位置 logpath=/data/mongo/mongo.log bind_ip=127.0.0.1,192.168.144.46 # 以追加方式写入日志 logappend=true # 是否以守护进程方式运行 fork = true # 默认27017 #port = 27017 # 数据库文件位置 dbpath=/data/mongo # 启用定期记录CPU利用率和 I/O 等待 #cpu = true # 是否以安全认证方式运行,默认是不认证的非安全方式 #noauth = true #auth = true # 详细记录输出 #verbose = true # Inspect all client data for validity on receipt (useful for # developing drivers)用于开发驱动程序时验证客户端请求 #objcheck = true # Enable db quota management # 启用数据库配额管理 #quota = true # 设置oplog记录等级 # Set oplogging level where n is # 0=off (default) # 1=W # 2=R # 3=both # 7=W+some reads #diaglog=0 # Diagnostic/debugging option 动态调试项 #nocursors = true # Ignore query hints 忽略查询提示 #nohints = true # 禁用http界面,默认为localhost:28017 #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 # 为新数据库指定.ns文件的大小,单位:MB # Specify .ns file size for new databases. # nssize = # Replication Options 复制选项 # in replicated mongo databases, specify the replica set name here replSet=testSet replIndexPrefetch=_id_only # maximum size in megabytes for replication operation log #oplogSize=1024 # path to a key file storing authentication info for connections # between replica set members #指定存储身份验证信息的密钥文件的路径 #keyFile=/path/to/keyfile
MongoDB:
NoSQL、文档存储、JSON/BSON
groupadd -g 27017 mongod
useradd -g 27017 -u 27017 mongod
索引分类:
单键索引
组合索引(多字段索引)
多建索引:索引是创建在键值是子文档的索引
mongod --help
fork: mongod是否运行在后台
bind_ip: 启动以后的运行地址,默认为127.0.0.1
port: 监听端口,默认为27017
maxConns: 并发最大连接数
repair: 进程意外,启动需要修复数据库
MongoDB的复制功能:
两种类型:
master/slave
replica set: 复制集
主节点将数据修改操作保存至oplog中
arbiter: 仲裁节点
复制集中的节点分类:
0优先级的节点: 冷备节点,不会被选举成为主节点,但是可以参与选举
被隐藏的从节点:首先必须是0优先级的节点,其次不会被客户端访问,但可以参与选举
延迟复制的从节点:首先必须是0优先级的节点,且复制时间落后于主节点一个固定时长,但可以参与选举
arbiter: 仲裁节点
MongoDB的复制架构:
oplog: 大小固定的文件,存储在local数据库中
初始同步(initial sync)
回滚后追赶(post-rollback catch-up)
切分块迁移(sharding chunk migrations)
heartbeat
MongoDB的数据同步类型:
初始同步:
从节点没有任何数据
从节点丢失副本复制历史
初始同步的步骤:
1、克隆所有数据库的所有collections
2、应用数据集的所有改变:复制oplog并应用在本地
3、为所有collection构建索引
oplog是用于实现replication的,而journal是用于实现redo的log
复制
rs.add()报错,没有关闭防火墙
testSet:PRIMARY> rs.add("192.168.144.47")
{
"ok" : 0,
"errmsg" : "Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: docker46:27017; the following nodes did not respond affirmatively: 192.168.144.47:27017 failed with No route to host",
"code" : 74,
"codeName" : "NodeNotFound"
}
systemctl stop firewalld
systemctl disable firewalld
"stateStr" : "(not reachable/healthy)",节点状态不对,也是防火墙的问题
在56上
> rs.status()
{
"info" : "run rs.initiate(...) if not yet done for the set",
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized"
}
>
> rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "192.168.144.56:27017",
"ok" : 1
}
testSet:PRIMARY> rs.add("192.168.144.46");
{ "ok" : 1 }
testSet:PRIMARY> rs.add("192.168.144.47");
{ "ok" : 1 }
testSet:SECONDARY> show dbs
2017-03-15T06:48:43.988-0400 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:755:19
shellHelper@src/mongo/shell/utils.js:645:15
手工将Primary设置为Secondary,执行stepDown()
对于副本集的重新选举的影响条件:
心跳信息
优先级
optime:optime必须是最新的,不能落后于其他节点
网络连接
网络分区
选举机制:
出发选举的事件:
新副本集初始化时
从节点联系不到主节点时
主节点“下台”时:主几点收到stepDown()/某从节点有更高的优先级,且已经满足成为主节点的其他所有条件
主节点无法联系到副本集的“多数方”
设置节点的优先级:
只能在主节点上执行命令
cfg=rs.conf()
cfg.members[2].priority=2
rs.reconfig(cfg);
MongoDB的分片:
MySQL分片:Gizzard,HiveDB,MySQL+HScale,Hibernate Shard
分片架构中的角色:
mongos: Router
config: 元数据服务器
shard:数据节点,也称mongod实例节点
基于范围切片:range
基于列表切片:list
基于HASH切片:
添加mongodb的启动停止脚本
cd /etc/init.d/
[root@docker46 init.d]# cat mongodb #!/bin/bash # #chkconfig: 2345 80 90 #description: mongodb start() { su - mongod -c "/data/mongodb/bin/mongod -f /data/mongo/mongodb.cnf" } stop() { su - mongod -c "/data/mongodb/bin/mongod -f /data/mongo/mongodb.cnf --shutdown" } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac
chkconfig --add mongodb
chmod +x mongodb
chkconfig mongodb on