mongodb 是什么的
基于分布式文件存储的数据库,高性能、可扩展、易部署、易使用,存储数据非常方便,不仅仅是sql
名词解析
mongod 数据库
mongo 类似于客户端命令行
mongos 分片时的路由,mongos可以直接将用户查询定位到具体分片
Compass/navicat 客户端
BI Connector sql解析
Mongodb charts 可视化分析
mongodb 分布式模型
三种模式运行
常规模式
参考配置
mongod --master -f /etc/mongodb/27021.conf
mongod --slave --source 127.0.0.1:27021 -f /etc/mongodb/27022.conf
mongod --slave --source 127.0.0.1:27021 -f /etc/mongodb/27023.conf
缺点
主节点挂了,那就真挂了,类似于mysql的主从复制
复制集模式
主从复制的升级版
参考配置
1. 创建三个目录,data{1,2,3} mongodb.conf{1,2,3},并修改其中内容
systemLog:
path: /data/mongodb/logs/mongod.log
logAppend: false
destination: file
net:
bindIp: 127.0.0.1
port: 27017
maxIncomingConnections: 65536
storage:
dbPath: /data/mongodb/db
replication:
replSetName: rs0
2.启动
mongodb -f mongodb.conf
mongodb -f mongodb.conf
mongodb -f mongodb.conf
3.配置复制集
登录第一个
rs.initiate()
rs.add("HOSTNAME:29018")
rs.add("HOSTNAME:29019")
主节点挂了后,选举节点会投票出新的节点,可在一个查的不多的节点上设置投票节点,选举节点(可在某个复本节点配置成选举节点)
选举规则:大多数节点存活,能够与多数节点建立连接,具有较新的oplog,具有较高的优先级(如果有配置的话)
节点的增多不会影响写入效率
复制集加分片
注意点
- 路由转发节点&配置节点:数据与分片之间的关联关系,集群的信息,本身也可集群
- 主节点1 主节点2:具体存数据的地方
- 数据已分布式存储到各个集群中,上图构成了两个分片集群
- 最多分1024片
- shard分片服务器吃资源(ssd+内存+cpu)
mongodb与其他数据库的相似点
mongodb 是 PB 级别的数据库
支持分布式事务
通过集群可以实现消除单点故障
动态水平扩容, 无需关机,自动分片数据分片
支持schema_version 版本,和 es 的version(ES的version起到锁的作用)很像
交互方式 TCP
通过各编程语言驱动来操作
定位 存储数据库
文档中的数据类型可不一致,但也支持字段约束,类似于ES自定义策略
db.members.find();
// user_id 数据类型可变
{ "_id" : ObjectId("5b62a5c73eeb75204f15dbe3"), "user_id" : 100, "level" : "vip" }
{ "_id" : ObjectId("5b62a5cb3eeb75204f15dbe4"), "user_id" : 101, "level" : "vip" }
{ "_id" : ObjectId("5b62a5db3eeb75204f15dbe5"), "user_id" : "102", "level" : "gold" }
{ "_id" : ObjectId("5b62a5e53eeb75204f15dbe6"), "user_id" : 102, "level" : "gold" }
db.members.find({user_id:{$eq:"102"}});
{ "_id" : ObjectId("5b62a5db3eeb75204f15dbe5"), "user_id" : "102", "level" : "gold" }
支持执行计划,有索引优化器,分布式事务(少用,通过控制分片集,尽可能把需要操作事务的数据放到一个分片集中),支持触发器(change stream),慢查询日志
索引支持(B树)
单键,组合,多值,地理位置,全文,TTL(定时删除过期时间数据),部分,哈希
部分索引:
// 如查询 upid 字段,可建立到 upid 字段上索引
{
"video_id":23423,
"md5":"sdfdf",
"owner_name":"凯爷",
"upload_list":[
{
"upid":234,
"apidata":"success"
},
{
"upid":234,
"apidata":"error"
}
]
}
建模
- ESR 模式
多条件查询时,E(精确查询)>S(排序)>R(范围查询),按此优先级查询 - 通过 json 中内嵌 json 模式合并多张表,一个 json 中的内嵌 json (upload_list)建议不超过16MB
支持 canal pandans
覆盖索引
查询字段存储到索引本身中,查询时将直接从索引中读取数据
支持 js 语法,可用 js 编写shell脚本,或放入到代码中执行
db.eval("function(){return 'refactor';}")
或
var url = "mongodb://127.0.0.1:27017/db_shuozhuo";
var db = connect(url);
var collection_num = 3;
for (var i = 0; i < collection_num; i++)
{
var coll_name = "collection_" + i.toString();
db[coll_name].insert([{
"name": "Sally",
"age": 28,
"gender": "female",
"friend": ObjectId("5c9b18e87c2a03b843f51d1a")
},{
"name": "Jenny",
"age": 29,
"gender": "female",
"friend": ObjectId("5c9b18e87c2a03b843f51d1a")
}]);
}
ES
GET index1/_search
{
"size":1,
"script_fields":{
"pow":{
"script":{
"lang":"painless",
"source":"Math.pow(3,3)"
}
}
}
}
修改数据时,可只指定修改的指定字段,无需像ES修改时要指定全部字段
只修改 name 字段 举例
ES
DB::table('test')->where('id',1)->update(['id'=>1,'name'=>'new_test','adr'=>'china']);
mongo
DB::table('test')->where('id',1)->update(['name'=>'new_test']);
运维
mongo中的数据复制,通过 oplog 复制(逻辑日志),持久化存储 journal (类似 redo log)
如何分片
分布式模型中第三种复制集加分片的三种分片规则
五个维度 [片键(一列字段)->文档->块(n个文档)->分片->集群]
三个示例
-
范围:id 1-5000 5000-10000 连续可能会造成不均匀,有热点写情况发生,但是还是有的业务就需要这样[以id为片键分{id=1};以id为片键分{id=1,time=1 组合片键}]; 存在即合理
-
哈希:均匀了[以id为片键分{id=hash}];
-
自定义:可打标签表示,然后数据记录到各个分片(例如地域,投放平台)
模型中加区域字段 2.集群层的分片加区域标签 3.每个区域分片块范围(命令行按照前两部切分分片,支持多where)
备份
-
可通过设置一个延迟节点达到备份数据库的作用(同一个机器再启动一个实例服务器,然后就当备份库用 refresh_interval=1s),恢复时要先关闭节点,也可锁住(得解锁)
-
全量备份 Oplog 增量 Mongodump/mongorestore + 复制数据文件 (mongoimport/mongoexport json csv)
全文搜索比较慢
自制分词搜索
GET video_report_result/_analyze
{
"analyzer" : "ik_max_word",
"text" : "连山牛逼"
}
{
"tokens" : [
{
"token" : "连山",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "牛",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "逼",
"start_offset" : 3,
"end_offset" : 4,
"type" : "CN_CHAR",
"position" : 2
}
]
}
php SCWS 类库自制分词搜索
分布式客户端应答机制
MongoDB应答机制就是说对于当前数据库的写入成功与否告知客户端
参数 writeconcern 阻塞应答 [0最快,>=1,majority大多数]
0:无法知道写入是否成功,立即返回
1~:大于等于1,N个节点写入成功后返回
majority:大多数节点写入成功后返回
认证方式
登陆认证方式: 账号+密码+写入 读取 管理员权限
客户端最大连接时长
maxWaitTime
mtools python 日志分析,慢查询可构建图表
mongostat 自带(运行状态);mongotop 集合压力状态,可定位到集合写入耗时
操作
官方讲解demo超详细 堪比elastic中文社区 https://www.mongodb.org.cn/
php一个小细节
长短链接
<?php
for ($i=0; $i<1000; $i++) {
$m = new Mongo("localhost:27017");
}
?>
<?php
for ($i=0; $i<1000; $i++) {
$m = new Mongo("localhost:27017", array("persist" => "x"));
}
?>
第三方包的选择
laravel 牛逼的轮子
https://packagist.org/packages/jenssegers/mongodb
运维 blog
https://huaweicloud.blog.csdn.net/article/details/104276358