mongo的简介与架构理解

mongodb 是什么的

基于分布式文件存储的数据库,高性能、可扩展、易部署、易使用,存储数据非常方便,不仅仅是sql

名词解析

mongod 数据库
mongo 类似于客户端命令行
mongos 分片时的路由,mongos可以直接将用户查询定位到具体分片
Compass/navicat 客户端
BI Connector sql解析
Mongodb charts 可视化分析

mongodb 分布式模型

三种模式运行

常规模式

image.png
参考配置

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的主从复制

复制集模式

主从复制的升级版
image.png
参考配置

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,具有较高的优先级(如果有配置的话)
节点的增多不会影响写入效率

复制集加分片

image.png
注意点

  1. 路由转发节点&配置节点:数据与分片之间的关联关系,集群的信息,本身也可集群
  2. 主节点1 主节点2:具体存数据的地方
  3. 数据已分布式存储到各个集群中,上图构成了两个分片集群
  4. 最多分1024片
  5. 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"
        }
    ]
}
建模
  1. ESR 模式
    多条件查询时,E(精确查询)>S(排序)>R(范围查询),按此优先级查询
  2. 通过 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个文档)->分片->集群]
三个示例

  1. 范围:id 1-5000 5000-10000 连续可能会造成不均匀,有热点写情况发生,但是还是有的业务就需要这样[以id为片键分{id=1};以id为片键分{id=1,time=1 组合片键}]; 存在即合理

  2. 哈希:均匀了[以id为片键分{id=hash}];

  3. 自定义:可打标签表示,然后数据记录到各个分片(例如地域,投放平台)
    模型中加区域字段 2.集群层的分片加区域标签 3.每个区域分片块范围(命令行按照前两部切分分片,支持多where)

备份
  1. 可通过设置一个延迟节点达到备份数据库的作用(同一个机器再启动一个实例服务器,然后就当备份库用 refresh_interval=1s),恢复时要先关闭节点,也可锁住(得解锁)

  2. 全量备份 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值