mongodb 浅谈架构

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

胜出

  1. 延迟问题(oplog 写入效率高于binlog 物理日志请找PostgreSql)

  2. 数据不一致问题(字段灵活,可不必要屏蔽错误,例如版本,lock,数据一致,远程映射表…)

  3. 并发写入支持高,mysql入库还弄了队列缓慢入

平手

  1. 占用磁盘问题

  2. 主库压力大

  3. 主节点挂了,那就真挂了

  4. 简单

  5. 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可以直接定位到具体分片]

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

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

  3. 自定义 可打标签表示,然后数据记录到各个分片(例如地域,投放平台)

模型中加区域字段 2.集群层的分片加区域标签 3.每个区域分片块范围(命令行按照前两部切分分片,支持多where)

)

对比

M vs Es vs Mysql (M2008 Es2010)

  1. 没有单点故障

  2. mysql需要中间件

  3. 动态水平扩容 vs es, 无需关机,自动分片数据分片 平手

  4. schema_version 版本 vs es的version锁

  5. 一个缺点,全文搜索干不过ES,但是…

  6. 同样支持canal(口碑好),pandans

  7. PB VS TB

  8. 一个java(引擎Lucene) 一个c++,还有js

  9. tcp 驱动 vs HTTP

  10. [定位]一个是查询分析(引擎),一个是存储(数据库),重要的数据敢不敢存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自定义策略

  1. 支持执行计划 有索引优化器 最关键的来了 分布式事务(少用,通过控制分片集,尽可能把需要操作事务的数据放到一个分片集中),支持触发器(change stream),慢查询日志

  2. 索引: 单键,组合,多值,地理位置,全文(自制分词器 倒排 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. 建模[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"

        }

    ]

}

  1. writeconcern 阻塞应答 [0最快,>=1,majority大多数]

  2. balk vs js 条件,批量修改,但是我可以修改时只动指定字段

  3. 覆盖索引 查询字段存储到索引本身中

  4. 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

操作

  1. 官方讲解demo超详细 堪比elastic中文社区 https://www.mongodb.org.cn/

  2. 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"));

}

?>

  1. 第三方包的选择

提倡官方扩展库纳入的驱动

再提供一个牛逼的轮子

https://packagist.org/packages/jenssegers/mongodb (非官方包可能方法不全)

  1. 一个好玩儿的漫画运维 https://huaweicloud.blog.csdn.net/article/details/104276358
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值