mongodb
mongodb 是什么的
基于分布式文件存储的数据库,高性能、可扩展、易部署、易使用,存储数据非常方便,不仅仅是sql
mongod 数据库
mongo 类似于客户端命令行
mongos 分片时的路由
Compass/navicat(要钱) 客户端
BI Connector sql解析
Mongodb charts 可视化分析
mongodb 分布式模型
三种模式运行
常规模式
https://netjoy.yuque.com/docs/share/57252c08-1c73-4c19-8db4-6444cc73d4d6?# 《图1》
mongod --master -f /etc/mongodb/27021.conf" mongod
mongod --slave --source 127.0.0.1:27021 -f /etc/mongodb/27022.conf" mongod
mongod --slave --source 127.0.0.1:27021 -f /etc/mongodb/27023.conf" mongod
vs Mysql
胜出
-
延迟问题(oplog 写入效率高于binlog 物理日志请找PostgreSql)
-
数据不一致问题(字段灵活,可不必要屏蔽错误,例如版本,lock,数据一致,远程映射表…)
-
并发写入支持高,mysql入库还弄了队列缓慢入
平手
-
占用磁盘问题
-
主库压力大
-
主节点挂了,那就真挂了
-
简单
-
SqlServer mysql常用的操作,mongo也能干
复制集模式
主从复制的升级版
https://netjoy.yuque.com/docs/share/a30b21ad-116b-4424-89ea-2bbad3867856?# 《图2》
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")
对比
1.journal vs redo log 暂且平手
2.节点加再多也不影响写效率
3.复制集个节点版本最好一致(mysql也一样)
复制集加分片
https://netjoy.yuque.com/docs/share/3c056955-469e-44f6-9744-7c0437935bd1?# 《图3》
几个点
1.最多1024片
2.shard服务器(ssd+内存+cpu)
3.分片规则(
[片键(一列字段)->文档->块(n个文档)->分片->集群,mongos可以直接定位到具体分片]
-
范围id 1-5000 5000-10000 连续可能会造成不均匀,有热点写 但是还是有的业务就需要这样[以id为片键分{id=1};以id为片键分{id=1,time=1 组合片键}]; 存在即合理
-
哈希 均匀了[以id为片键分{id=hash}];
-
自定义 可打标签表示,然后数据记录到各个分片(例如地域,投放平台)
模型中加区域字段 2.集群层的分片加区域标签 3.每个区域分片块范围(命令行按照前两部切分分片,支持多where)
)
对比
M vs Es vs Mysql (M2008 Es2010)
-
没有单点故障
-
mysql需要中间件
-
动态水平扩容 vs es, 无需关机,自动分片数据分片 平手
-
schema_version 版本 vs es的version锁
-
一个缺点,全文搜索干不过ES,但是…
-
同样支持canal(口碑好),pandans
-
PB VS TB
-
一个java(引擎Lucene) 一个c++,还有js
-
tcp 驱动 vs HTTP
-
[定位]一个是查询分析(引擎),一个是存储(数据库),重要的数据敢不敢存es,修改一次mapping真的头大
// 也可解决快手数据类型不规范
db.members.find();
{ "_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("5b62a5e53eeb75204f15dbe6"), "user_id" : 102, "level" : "gold" }
db.members.find({user_id:{$eq:"102"}});
{ "_id" : ObjectId("5b62a5db3eeb75204f15dbe5"), "user_id" : "102", "level" : "gold" }
不要感觉我不严谨,我也有动态约束 vs ES自定义策略
-
支持执行计划 有索引优化器 最关键的来了 分布式事务(少用,通过控制分片集,尽可能把需要操作事务的数据放到一个分片集中),支持触发器(change stream),慢查询日志
-
索引: 单键,组合,多值,地理位置,全文(自制分词器 倒排 vs B树),TTL(连山log),部分,哈希
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
}
]
}
- 建模[1. esr省内存排序, 2.json灵活存储,可将连山多张表合并成json中的嵌套,例如upload表 <=16M,但是我们可以加字段 3.列转行,对json中子集字段建立索引-单索引]
{
"video_id":23423,
"md5":"sdfdf",
"owner_name":"凯爷",
"upload_list":[
{
"upid":234,
"apidata":"success"
},
{
"upid":234,
"apidata":"error"
}
]
}
-
writeconcern 阻塞应答 [0最快,>=1,majority大多数]
-
balk vs js 条件,批量修改,但是我可以修改时只动指定字段
-
覆盖索引 查询字段存储到索引本身中
-
js语法支持脚本&查询 expression脚本 vs js
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)"
}
}
}
}
运维
备份
1.1 可通过设置一个延迟节点达到备份数据库的作用(同一个机器再启动一个实例剩服务器,然后就当备份库用 refresh_interval=1s),恢复时要先关闭节点,也可锁住(得解锁)
1.2 全量备份 Oplog增量 Mongodump/mongorestore + 复制数据文件 (mongoimport/mongoexport json csv)
2.登陆认证方式 账号+密码+写入读取管理员权限
3.maxWaitTime 客户端最大连接时长
4.mtools python 日志分析,慢查询可构建图表
5.mongostat 自带(运行状态);mongotop 集合压力状态,可定位到集合写入耗时 映哥学习到的三巨头 Zabbix,munin,Nagios
操作
-
官方讲解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"));
}
?>
- 第三方包的选择
提倡官方扩展库纳入的驱动
再提供一个牛逼的轮子
https://packagist.org/packages/jenssegers/mongodb (非官方包可能方法不全)
- 一个好玩儿的漫画运维 https://huaweicloud.blog.csdn.net/article/details/104276358