1.什么mongodb?
MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
2、MongoDB 概念
2.1、数据库
MongoDB 的单个实例可以容纳多个独立的数据库,每个数据库都有自己的集合和权限。
数据库通过名字来标识;数据库名为 UTF-8 字符串,需满足以下条件:
- 不能是空字符串("")。
- 不得含有 ' '(空格)、.、$、/、\ 和 \0 (空字符)。
- 应全部小写。
- 最多 64 字节。
内置数据库:
- admin:管理数据库。将一个用户添加到这个数据库,则这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如关闭服务器。
- local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的集合。
- config:当 MongoDB 使用分片时,config 数据库用于保存分片的相关信息。
2.2、文档(Document)
文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。一个简单的文档例子如下:
文档有如下特性:
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB 区分类型和大小写。
- MongoDB 的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意 UTF-8 字符。
文档键命名规范:
- 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
2.3、集合
集合就是文档组,类似于关系数据库中的表。集合没有固定的结构,可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
比如,我们可以将以下不同数据结构的文档插入到同一集合中:
{"name":"杜甫", "age":29}
{"name":"李白", "age":30}
{"name":"白居易", "age":31, "height":175}
集合名的命名规范:
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
- 集合名字不能含有保留字符;集合名中不要有$。
Capped collections 是固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。和标准的集合不同,你必须要显式的创建一个 capped collection,指定一个集合的大小,单位是字节。固定集合的数据存储空间值提前分配的。固定集合不能删除一个文档,可以使用 drop() 方法删除整个集合。
2.4、MondoDB 和 RDBMS 的对比
RDBMS 术语/概念 |
MongoDB 术语/概念 |
解释/说明 |
database |
database |
数据库 |
table |
collection |
数据库表/集合 |
row |
document |
数据记录行/文档 |
column |
field |
数据字段/域 |
index |
index |
索引 |
table joins |
$lookup |
|
primary key |
primary key |
主键,MongoDB 自动将 _id 字段设置为主键 |
transaction |
transaction |
|
group by |
aggregation |
|
3.如何部署
mongodb有三种部署模式
实验目标
在k8s里面部署mongodb副本集
克隆项目
git clone https://github.com/mongodb/mongodb-enterprise-kubernetes.git
create namespace
kubectl create namespace mongodb
Create CustomResourceDefinitions
kubectl apply -f crds.yaml -n namespace
install the Operator
kubectl apply -f mongodb-enterprise.yaml
-n namespace
Projects
A
Project
object is a Kubernetes
ConfigMap
that points to an Ops Manager installation and a
Project
. This
ConfigMap
has the following structure:
$ cat my-project.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: my-project
namespace: mongodb
data:
projectName: myProjectName # this is an optional parameter
orgId: 5b890e0feacf0b76ff3e7183 # this is an optional parameter
baseUrl: https://my-ops-manager-or-cloud-manager-url
Apply this file to create the new
Project
:
kubectl apply -f my-project.yaml -n middleware
Credentials
kubectl -n mongodb create secret generic my-credentials --from-literal="user=my-public-api-key" --from-literal="publicApiKey=my-private-api-key" -n middleware
Creating a MongoDB Resource
kubectl apply -f samples/mongodb/minimal/replica-set.yaml -n mongodb
Create Admin Credentials Secret
kubectl create secret generic ops-manager-admin-secret --from-literal=Username="user.name@example.com" --from-literal=Password="Passw0rd." --from-literal=FirstName="User" --from-literal=LastName="Name" -n <namespace>
Create MongoDBOpsManager Resource
kubectl apply -f samples/ops-manager/ops-manager-external.yaml -n <namespace>
4.验证
为了从 Kubernetes 集群外部访问 Ops Manager UI,您必须在 Ops Manager 资源定义中启用 spec.externalConnectivity。最简单的方法是配置 LoadBalancer 服务类型。
测试Ops Manager UI
您将能够从 Operator 创建的 Service 对象中获取用于连接到 Ops Manager UI 的 URL。
访问http//:{节点ip}:31147
用户名和密码是前面创建的
测试mongodb连接
MongoDB Connection String:
mongodb://redacted-credentials@ops-manager-external-db-0.ops-manager-external-db-svc.middleware.svc.cluster.local:27017,ops-manager-external-db-1.ops-manager-external-db-svc.middleware.svc.cluster.local:27017,ops-manager-external-db-2.ops-manager-external-db-svc.middleware.svc.cluster.local:27017/?authMechanism=SCRAM-SHA-256&authSource=admin&connectTimeoutMS=20000&replicaSet=ops-manager-external-db&serverSelectionTimeoutMS=20000
用mongo compass客户端工具测试,可以登录
5.引用