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
}