mongoDB分布式存储(一)

1. mongoDB功能介绍

1.1 核心特性

  • 文档数据库,基于二进制json存储文档
  • 高性能、高可用、直接加机器就可以解决扩展性问题
  • 支持丰富的CRUD操作,例如聚合统计、全文检索、坐标检索

1.2 文档数据库

存放的是json格式的数据,任何字段都不需要提前定义

{
  name:"pp",
  age:23,
  status:"working",
  groups:["news","sports"]            
}

 

2. mongoDB架构 

 

 

存储引擎是数据库和硬件之间的接口,它负责处理用什么数据结构存储数据,以及如何写入、删除和读取数据。不同的工作负载类型对于读写性能的需求不同,例如新闻网站需要大量的读,而社交类网站需要大量的写。MongoDB 3.0开始,提供了可插拔的存储引擎API,使得用户可以在MongoDB和第三方提供的多种存储引擎之间切换。

在一个MongoDB复制集中,多种存储引擎可以并存,可以满足应用更复杂的需求。例如,使用In-memory存储引擎进行低延时的操作,同时使用基于磁盘的存储引擎完成持久化。

目前MongoDB默认使用的是WiredTiger存储引擎,WiredTiger是SleepyCat提供的一款开源数据引擎。通过使用现代编程技术,如Hazard指针和Lock-free算法,WiredTiger实现了多核可扩展性。

 

3. mongoDB简单用法示例

  • 列举数据库:show databases
  • 选择数据库:use my_db1  --数据库无需创建,只是一个命名空间
  • 列举数据表:show collectons
  • 建立数据表:db.createCollection("my_collection")  --数据表schema free,无需定义字段
  • 插入document:db.my_collection.insertOne({uid:10000,name:"xiaoming",likes:["football","game"]})  --任意嵌套层级的json,文档ID自动生成,无需指定
  • 查询document:db.my_collection.find({likes:'football',name:{$in:['xiaoming','libai']}}).sort({uid:1})  --基于任意json层级过滤
  • 更新document:db.my_collection.updateMany({likes:'football'},{$set:{name:'libai'}})  --第一个参数是过滤条件,第二个参数是更新操作
  • 删除document:db.my_collection.deleteMany({name:'xiaoming'})  --参数是过滤条件
  • 创建index:db.my_collection.createIndex({uid:1, name:-1})  --可以指定创建索引时的正反顺序,影响排序效率

所有操作示例见官方文档:https://docs.mongodb.com/manual/crud/

 

 

4. mongoDB单机安装

 推荐使用docker安装单机mongoDB,主要是方便...docker search mongo #搜索mongo镜像,如果没有特殊需求建议选择官方版

#搜索mongo镜像,如果没有特殊需求建议选择官方版
docker search mongo 

#不加tag默认拉取最新镜像
docker pull mongo

#查看镜像是否拉取成功
docker images

#暴露27017端口,连接客户端,同时可以-v 选择挂载volume
docker run -itd --name mongo -p 27017:27017 mongo 

#查看mongo服务是否已经启动
docker ps

#进入mongo容器
docker exec -it mongo mongo admin

#新增admin用户,密码123456
db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});

#admin用户登录mongo
db.auth('admin','123456')

 

5. 客户端连接mongoDB

首先需要install客户端

go get go.mongodb.org/mongo-driver/mongo

 

go-mongo详细的api文档可以看官网文档,有很详细的example

https://pkg.go.dev/go.mongodb.org/mongo-driver@v1.8.0/mongo#pkg-overview

func main() {
    // 建立连接 5s超时
    client, err := mongo.Connect(context.TODO(),
        options.Client().ApplyURI("mongodb://xxx.xxx.xxx.xxx:27017"),
        options.Client().SetConnectTimeout(time.Second*5))
    if err != nil {
        fmt.Println(err)
        return
    }

    // 选择数据库
    database := client.Database("my_db")

    // 选择表
    collection := database.Collection("my_collection")
    collection = collection
}

 

posted @ 2022-03-16 20:29  aganippe  阅读(295)  评论(0编辑  收藏  举报