0
点赞
收藏
分享

微信扫一扫

MongoDB 索引和常用命令

妖妖妈 2023-10-14 阅读 26

一、 简介

NoSQL数据库四大家族:列存储 Hbase,键值(Key-Value)存储 Redis,图像存储 Neo4j,基于分布式文档存储的数据库MongoDb。

MongoDB 和关系型数据库对比

关系型数据库MongoDB
database(库)database(库)
table(表)collection(表)
row(行)document(BSON文档)
column(列)field(字段)
index(索引)index(地理索引、全文索引、hash索引)
join(主外键关联)embedded Document (嵌套文档)
primary key(指定1至N个列做主键)primary key(指定1至N个列做主键)

 BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文 档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和Binary Data类型。

 二、Linux安装Mongodb

解压: tar -xvf mongodb-linux-x86_64-4.1.3.tgz

 启动的两种方式:

1)默认27017的端口启动:./bin/mongod 

2)指定配置文件的方式启动:./bin/mongod -f mongo_37017.conf

注意:若启动报目录缺失, 需要创建对应的目录的文件,如: mkdir -p /data/mongo/data/server1

mongo shell 的启动

启动mongo shell :./bin/mongo

指定主机和端口的方式启动 :./bin/mongo --host=主机IP --port=端口

三、MongoDb的GUI工具

NoSQLBooster是MongoDB CLI界面中非常流行的GUI工具。它正式名称为MongoBooster。

默认安装即可。

四、简单操作

查看数据库:

         show dbs;

切换数据库 如果没有对应的数据库则创建:

         use 数据库名;

创建集合:

         db.createCollection("集合名")

查看集合:

         show tables;

        show collections;

删除集合:

         db.集合名.drop();

删除当前数据库:

         db.dropDatabase();

聚合操作:

        单目的聚合操作:count() 和 distinct()

        聚合管道(Aggregation Pipeline):

        聚合(aggregate)主要用于统计数据(诸如统计平均值,求和等),并返回计算后的数据结果。

        MapReduce 编程模型:

        MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结 果合并成最终结果(REDUCE)。

五、索引

1. 单键索引

2. 复合索引

3. 多键索引

4. 地理空间索引

5. 全文索引

6. 哈希索引

六、索引底层实现原理

        MongoDb使用BSON格式保存数据。与mysql使用B+树不一样,MongoDb用的是B-树,所有节点都有Data域,每个节点既保存数据又保存索引,搜索时相当于二分查找。

        B-树的特点: (1) 多路 非二叉树 (2) 每个节点 既保存数据 又保存索引 (3) 搜索时 相当于二分查找

        B+ 树的特点: (1) 多路非二叉 (2) 只有叶子节点保存数据 (3) 搜索时 也相当于二分查找 (4) 增加了 相邻节点指针

七、高可用

7.1 主从复制架构

        主从结构没有自动故障转移功能,需要指定master和slave端,不推荐在生产中使用。 mongodb4.0后不再支持主从复制!

[main] Master/slave replication is no longer supported

7.2 复制集replica sets

        原理:一个复制集中Primary节点上能够完成读写操作,Secondary节点仅能用于读操作。Primary节点需要记录所有改变数据库状态的操作,这些记录保存在 oplog 中,这个文件存储在 local 数据库,各个Secondary 节点通过此 oplog 来复制数据并应用于本地,保持本地的数据与主节点的一致。oplog 具有幂等性,即无论执行几次其结果一致,这个比 mysql 的二进制日志更好用。

        复制集数据同步分为初始化同步和keep复制同步。初始化同步指全量从主节点同步数据,如果Primary 节点数据量比较大同步时间会比较长。而keep复制指初始化同步过后,节点之间的实时同步一般是增量 同步。

        初始化同步有以下两种情况会触发: (1) Secondary第一次加入。 (2) Secondary落后的数据量超过了oplog的大小,这样也会被全量复制。

        主节点选举触发的时机:

        当触发选举时,Secondary节点尝试将自身选举为Primary。主节点选举是一个二阶段过程+多数派协议。

 7.3 环境搭建

1. 创建目录: mkdir replica_sets

2. 进到目录中,解压mongodb: tar -xvf mongodb-linux-x86_64-4.1.3.tgz

3. 确保当前没有正在运行的monodb

4. 创建,编写mogo的配置文件:vi mongo_37017.conf

 5. 创建缺失目录:

6. 根据配置文件加载启动3个节点:

./bin/mongod -f mongo_37017.conf

./bin/mongod -f mongo_37018.conf

./bin/mongod -f mongo_37019.conf

7. 初始化节点配置,进入任意一个节点比如37017节点运行如下命令:

 37017初始化后,该节点由“SECONDARY”变为“PRIMARY”。

8. 主节点可以进行增删节点操作:

 rs.add("192.168.0.203:37019")

rs.remove("192.168.0.203:37019")

9. 插入数据验证结果:

进入主节点 ----- 插入数据 ------ 进入从节点验证

注意:默认节点下从节点不能读取数据。调用 rs.slaveOk() 解决。

37017主节点:

37018从节点:

节点说明:

        PRIMARY 节点: 可以查询和新增数据

        SECONDARY 节点:只能查询 不能新增 基于priority 权重可以被选为主节点

        ARBITER 节点: 不能查询数据 和新增数据 ,不能变成主节点 

7.4 切片

1)解压并重命名切片目录:

tar -xvf mongodb-linux-x86_64-4.1.3.tgz

mv mongodb-linux-x86_64-4.1.3 shard_cluster

2)进入目录中,创建config文件夹,配置节点集群

mkdir config

vi config-17017.conf

3)同理配置 config-17018.conf、config-17019.conf

4)创建缺失目录

 mkdir config1 logs config2 config3

5)启动节点

./bin/mongod -f config/config-17017.conf

./bin/mongod -f config/config-17018.conf

./bin/mongod -f config/config-17019.conf

6)进入任一节点,配置节点集群,使用admin,初始化,查看状态

[root@rac1 shard_cluster]# ./bin/mongo --port=17017 
MongoDB shell version v4.1.3
connecting to: mongodb://127.0.0.1:17017/
Implicit session: session { "id" : UUID("62ab236a-a0f4-4b74-8064-2b22180f786d") }
MongoDB server version: 4.1.3
Server has startup warnings: 
2023-10-11T22:14:21.557-0400 I CONTROL  [initandlisten] 
2023-10-11T22:14:21.557-0400 I CONTROL  [initandlisten] ** NOTE: This is a development version (4.1.3) of MongoDB.
2023-10-11T22:14:21.557-0400 I CONTROL  [initandlisten] **       Not recommended for production.
2023-10-11T22:14:21.557-0400 I CONTROL  [initandlisten] 
2023-10-11T22:14:21.557-0400 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2023-10-11T22:14:21.557-0400 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2023-10-11T22:14:21.557-0400 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2023-10-11T22:14:21.557-0400 I CONTROL  [initandlisten] 
2023-10-11T22:14:21.558-0400 W CONTROL  [initandlisten] 
2023-10-11T22:14:21.558-0400 W CONTROL  [initandlisten] 
2023-10-11T22:14:21.558-0400 I CONTROL  [initandlisten] 
> use admin
switched to db admin
> var cfg ={"_id":"configsvr",
... "members":[
... {"_id":1,"host":"192.168.0.203:17017"},
... {"_id":2,"host":"192.168.0.203:17018"},
... {"_id":3,"host":"192.168.0.203:17019"}]
... };
> rs.initiate(cfg)
{
	"ok" : 1,
	"$gleStats" : {
		"lastOpTime" : Timestamp(1697077081, 1),
		"electionId" : ObjectId("000000000000000000000000")
	},
	"lastCommittedOpTime" : Timestamp(0, 0),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1697077081, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1697077081, 1)
}
configsvr:SECONDARY> rs.status()

7)配置shard集群,先配置shard1,再按相同步骤配置shard2

cd shard_cluster/

8) 创建shard目录,在进入创建shard1和shard2目录

9)进入shard1中,创建并编辑vi shard-37017.conf

10)在同样的位置,同理创建vi shard-37018.conf、vi shard-37019.conf

11)创建缺失文件目录

mkdir shard1-37017 shard1-37018 shard1-37019

12)启动shard1集群每隔节点,随机mongo shell进去中一个,进行集群配置,初始化、并查看状态

[root@rac1 shard_cluster]# ./bin/mongo --port 37017
MongoDB shell version v4.1.3
connecting to: mongodb://127.0.0.1:37017/
Implicit session: session { "id" : UUID("e2a51d10-5626-43db-846d-cc2391d71604") }
MongoDB server version: 4.1.3
Server has startup warnings: 
2023-10-11T22:30:19.852-0400 I CONTROL  [initandlisten] 
2023-10-11T22:30:19.852-0400 I CONTROL  [initandlisten] ** NOTE: This is a development version (4.1.3) of MongoDB.
2023-10-11T22:30:19.852-0400 I CONTROL  [initandlisten] **       Not recommended for production.
2023-10-11T22:30:19.852-0400 I CONTROL  [initandlisten] 
2023-10-11T22:30:19.852-0400 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2023-10-11T22:30:19.852-0400 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2023-10-11T22:30:19.852-0400 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2023-10-11T22:30:19.852-0400 I CONTROL  [initandlisten] 
2023-10-11T22:30:19.852-0400 W CONTROL  [initandlisten] 
2023-10-11T22:30:19.852-0400 W CONTROL  [initandlisten] 
2023-10-11T22:30:19.852-0400 I CONTROL  [initandlisten] 
> var cfg ={"_id":"shard1",
... "protocolVersion" : 1,
... "members":[
... {"_id":1,"host":"192.168.0.203:37017"},
... {"_id":2,"host":"192.168.0.203:37018"},
... {"_id":3,"host":"192.168.0.203:37019"}
... ]
... };
> rs.initiate(cfg)
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1697077902, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1697077902, 1)
}
shard1:SECONDARY> rs.status()

13)同理shard2集群搭建47017到47019,其中shard2-47017.conf内容如下:

14)进入任一节点,配置集群,初始化,查看

[root@rac1 shard_cluster]# ./bin/mongod -f shard/shard2/shard2-47019.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 16666
child process started successfully, parent exiting
[root@rac1 shard_cluster]# ./bin/mongo --port 47017
MongoDB shell version v4.1.3
connecting to: mongodb://127.0.0.1:47017/
Implicit session: session { "id" : UUID("c98ecf26-5f82-47c6-a026-8b0beb94bc4f") }
MongoDB server version: 4.1.3
Server has startup warnings: 
2023-10-11T22:37:15.189-0400 I CONTROL  [initandlisten] 
2023-10-11T22:37:15.189-0400 I CONTROL  [initandlisten] ** NOTE: This is a development version (4.1.3) of MongoDB.
2023-10-11T22:37:15.189-0400 I CONTROL  [initandlisten] **       Not recommended for production.
2023-10-11T22:37:15.189-0400 I CONTROL  [initandlisten] 
2023-10-11T22:37:15.189-0400 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2023-10-11T22:37:15.189-0400 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2023-10-11T22:37:15.189-0400 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2023-10-11T22:37:15.189-0400 I CONTROL  [initandlisten] 
2023-10-11T22:37:15.189-0400 W CONTROL  [initandlisten] 
2023-10-11T22:37:15.189-0400 W CONTROL  [initandlisten] 
2023-10-11T22:37:15.189-0400 I CONTROL  [initandlisten] 
> var cfg ={"_id":"shard2",
... "protocolVersion" : 1,
... "members":[
... {"_id":1,"host":"192.168.0.203:47017"},
... {"_id":2,"host":"192.168.0.203:47018"},
... {"_id":3,"host":"192.168.0.203:47019"}
... ]
... };
> rs.initiate(cfg)
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1697078414, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1697078414, 1)
}
shard2:SECONDARY> rs.status()

15)配置路由节点,首先创建route目录

[root@rac1 shard_cluster]# mkdir -p route/logs

16)配置文件

[root@rac1 route]# vi route-27017.conf

17)用mongos启动路由节点,并查看最初的状态

[root@rac1 shard_cluster]# ./bin/mongos -f route/route-27017.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 17138
child process started successfully, parent exiting
[root@rac1 shard_cluster]# ./bin/mongo --port 27017
MongoDB shell version v4.1.3
connecting to: mongodb://127.0.0.1:27017/
Implicit session: session { "id" : UUID("69b121a0-4b5d-40a6-8187-cdadcfe11e13") }
MongoDB server version: 4.1.3
Server has startup warnings: 
2023-10-11T22:43:51.014-0400 I CONTROL  [main] 
2023-10-11T22:43:51.014-0400 I CONTROL  [main] ** NOTE: This is a development version (4.1.3) of MongoDB.
2023-10-11T22:43:51.014-0400 I CONTROL  [main] **       Not recommended for production.
2023-10-11T22:43:51.014-0400 I CONTROL  [main] 
2023-10-11T22:43:51.014-0400 I CONTROL  [main] ** WARNING: Access control is not enabled for the database.
2023-10-11T22:43:51.014-0400 I CONTROL  [main] **          Read and write access to data and configuration is unrestricted.
2023-10-11T22:43:51.014-0400 I CONTROL  [main] ** WARNING: You are running this process as the root user, which is not recommended.
2023-10-11T22:43:51.014-0400 I CONTROL  [main] 
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
  	"_id" : 1,
  	"minCompatibleVersion" : 5,
  	"currentVersion" : 6,
  	"clusterId" : ObjectId("65275767e63b0b69060b85eb")
  }
  shards:
  active mongoses:
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
                No recent migrations
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }

18)向路由中添加分片节点

mongos> sh.addShard("shard1/192.168.0.203:37017,192.168.0.203:37018,192.168.0.203:37019");
{
	"shardAdded" : "shard1",
	"ok" : 1,
	"operationTime" : Timestamp(1697078828, 7),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1697078828, 7),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
mongos> sh.addShard("shard2/192.168.0.203:47017,192.168.0.203:47018,192.168.0.203:47019");
{
	"shardAdded" : "shard2",
	"ok" : 1,
	"operationTime" : Timestamp(1697078840, 6),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1697078840, 6),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
  	"_id" : 1,
  	"minCompatibleVersion" : 5,
  	"currentVersion" : 6,
  	"clusterId" : ObjectId("65275767e63b0b69060b85eb")
  }
  shards:
        {  "_id" : "shard1",  "host" : "shard1/192.168.0.203:37017,192.168.0.203:37018,192.168.0.203:37019",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/192.168.0.203:47017,192.168.0.203:47018,192.168.0.203:47019",  "state" : 1 }
  active mongoses:
        "4.1.3" : 1
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
                No recent migrations
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }

19)创建数据库,创建集合,并开启hash分片

mongos> sh.enableSharding("lagou_resume")
{
	"ok" : 1,
	"operationTime" : Timestamp(1697078917, 5),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1697078917, 5),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
mongos> sh.shardCollection("lagou_resume.lagou_resume_datas",{"name":"hashed"}
... )
{
	"collectionsharded" : "lagou_resume.lagou_resume_datas",
	"collectionUUID" : UUID("84fd313d-c5cd-4d83-9572-bf57873e2827"),
	"ok" : 1,
	"operationTime" : Timestamp(1697078999, 25),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1697078999, 25),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
mongos> use lagou_resume;
switched to db lagou_resume
mongos> for(var i=1;i<= 1000;i++){
... db.lagou_resume_datas.insert({"name":"test"+i,
... salary:(Math.random()*20000).toFixed(2)});
... }
WriteResult({ "nInserted" : 1 })

20)去shard1分片和shard2分片查询信息:

八、安全

设置用户、密码确保安全性。

1. 生成密钥文件 并修改权限

openssl rand -base64 756 > data/mongodb/testKeyFile.file

chmod 600 data/mongodb/keyfile/testKeyFile.file

2. 在路由配置文件中 设置密钥文件

keyFile=data/mongodb/testKeyFile.file

3. 配置节点集群和分片节点集群开启安全认证和指定密钥文件

auth=true

keyFile=data/mongodb/testKeyFile.file

举报

相关推荐

0 条评论