Mongodb操作基础 分片

news/2024/4/29 1:59:42/文章来源:https://blog.csdn.net/qq_42929788/article/details/128052355

Mongodb分片

MongoDB分片是MongoDB支持的另一种集群形式,它可以满足MongoDB数据量呈爆发式增长的需求。当MongoDB存储海量的数据时,一台机器可能无法满足数据存储的需求,也可能无法提供可接受的读写吞吐量,这时,我们就可以通过在多台机器上对海量数据进行划分(即分片),使得MongoDB数据库系统能够存储和处理更多的数据。

分片概述

分片(Sharding)技术是开发人员用来提高数据存储和数据读写吞吐量常用的技术之一。简单的来说,分片主要是将数据进行划分后,将它们分别存放于不同机器上的过程。通过使用分片可以实现降低单个机器的压力和处理更大的数据负载功能。分片与副本集主要区别在于,分片是每个节点存储数据的不同片段,而副本集是每个节点存储数据的相同副本。

所有数据库都可以进行手动分片(Manual Sharding),因此,分片并不是MongoDB特有的。不同类型的数据均可以通过人为操作被分配到不同的数据库服务器上,然而,人工分片是需要编写相关代码来实现分片功能,并且还不容易维护(如集群中节点发生变动的情况)。MongoDB数据库可以实现自动分片,它内置了多种分片逻辑,使得MongoDB可以自动处理分片上数据的分布,也可以很容易的管理分片集群。

由于数据量太大,导致本地磁盘不足以存储的情况;为了提高数据库性能,从而将海量数据存储在内存中,导致单个MongoDB数据库内存不足的情况;若是出现数据请求量太大,导致单MongoDB机器不能满足读写数据的性能情况。若是出现这三种情况,我们就可以使用MongoDB的分片技术来解决。

分片策略

MongoDB之所以能够实现自动分片,这是因为其内置了分片策略。MongoDB通过分片键(Shard Key)将集合中的数据划分为多个块(Chunk)(默认大小为64MB,每个块均表示集合中数据的一部分),然后MongoDB根据分片策略将划分的块分发到分片集群中。需要注意,分片键可以是集合文档中的一个或多个字段。

MongoDB的分片策略主要包括范围分片和哈希分片两种,介绍如下:

  1. 范围分片(Range Sharding)

MongoDB根据分片键的值范围将数据划分为不同块,每个分片都包含了分片键在一定范围内的数据。这样的话,若有文档写入时,MongoDB会根据该文档的分片键,从而交由指定分片服务器去处理。

若文档分片键的值范围在[minKey,10)中,则该文档需要交由分片服务器A进行相关处理;若文档分片键的值范围在[10,20)中,则该文档需要交由分片服务器B进行相关处理;若文档分片键的值范围在[20,maxKey)中,则该文档需要交由分片服务器C进行相关处理。 使用基于范围分片时,拥有相近分片键的文档会存储在同一个分片服务器中,从而提升范围查询的效率。但是,当插入批量文档时,分片键集中在一定范围内,就会导致数据分布不均匀,从而导致其中一个分片服务器负载过重。
在这里插入图片描述

  1. 哈希分片(Hash Sharding)

哈希分片类似于范围分片,两者的区别在于范围分片是MongoDB根据分片键的值直接进行范围划分,而哈希分片则先将分片键的值进行哈希计算后,然后对这些哈希值进行范围划分,从而使得每个分片都包含了哈希值在一定范围内的数据;范围分片可以支持复合分片键,而哈希分片只支持单个字段作为分片键。哈希值的随机性,使得数据随机分布在分片集群中不同分片服务器上。
在这里插入图片描述

从图中可以看出,若文档分片键的哈希值为5,则该文档需要交由分片服务器A进行相关处理;若文档分片键的哈希值为12,则该文档需要交由分片服务器B进行相关处理;若文档分片键的哈希值为23,则该文档需要交由分片服务器C进行相关处理。 使用基于哈希分片时,拥有“相近”分片键的文档不会存储在同一个分片服务器中,这样的话,数据的分离性会更好,可以保证分片集群中数据分布均衡。但是,由于数据是通过哈希计算进行随机存放的,因此会降低查询性能。

分片集群架构

在MongoDB分片集群中,只有各组件间的协同工作,才可使得分片集群正常运行。在学习分片集群的操作之前,有必要先来学习一下分片集群架构。
在这里插入图片描述

从图中可以看出,分片集群中主要由三个部分组成,即分片服务器(Shard)、路由服务器(Mongos)以及配置服务器(Config Server)组成。其中,分片服务器有三个,即Shard1、Shard2、Shard3;路由服务器有两个,即Mongos1和Mongos2;配置服务器有三个,即主、副、副。下面,我们针对分片集群架构中的组成部分进行详细介绍,具体如下:

分片服务器

即MongoDB实例(即mongod,用Shard表示),分片服务器是实际存储数据的组件,持有完整数据集中的一部分,每个分片服务器都可以是一个MongoDB实例,也可是一组MongoDB实例组成的集群(副本集)。从MongoDB 3.6开始,必须将分片部署为副本集,这样具有更好的容错性。

路由服务器

即mongos,路由服务器主要提供客户端应用程序与分片集群交互的接口,所有请求都需要通过路由服务器进行协调工作。路由服务器实际上就是一个消息分发请求中心,它负责把客户端应用程序对应的数据请求转发到对应的分片服务器上。应用程序将查询、存储、更新等请求原封不动地发送给路由服务器。路由服务器询问配置服务器操作分片服务器需要获取哪些元数据,然后连接相应的分片服务器进行相关操作,最后将各个分片服务器的响应进行合并,返回给客户端应用程序。
生产环境中,一个分片集群通常会有多个路由服务器,一方面可以解决多个客户端同时请求,从而达到负载均衡的效果;另一方面可以解决当路由服务器宕机时导致整个分片集群无法使用的问题。

配置服务器

即Config Server。在生产环境中,通常需要多个配置服务器,因为它存储了分片集群的元数据,并且这些数据是不允许丢失的。因此,需要配置多个配置服务器以防止数据丢失,尽管其中一台分片服务器宕机,我们还有其它配置服务器,从而保证MongoDB分片集群依然能够正常工作。从MongoDB 3.4版本开始,配置服务器必须部署副本集,因此我们需要配置三个配置服务器组成的副本集。
配置服务器存储着分片集群的持久化元数据,而路由服务器存储着分片集群的非持久化元数据,这些数据均为内存缓存的数据。当路由服务器初次启动或关闭重启时,就会从配置服务器中加载分片集群的元数据。若是配置服务器的信息发生变化,则会通知所有路由服务器更新自己的状态,这样路由服务器就能继续准确的协调客户端与分片集群的交互工作。

部署分片集群

环境准备

从图中可以看出,为了保证不同虚拟机中资源的平均分配,我们在三台虚拟机中分别部署了副本集的不同节点,即虚拟机NoSQL_1中包含主节点Shard1、副节点shard2和仲裁节点Shard3,虚拟机NoSQL_2中包含仲裁节点Shard1、主节点Shard2和副节点Shard3,虚拟机NoSQL_3中包含副节点Shard1、仲裁节点Shard2和主节点Shard3。注意,若是在单台虚拟机中部署分片副本集的三个主节点或者三个仲裁节点,则会导致该台虚拟机性能过大或性能空闲。
由于部署分片集群时,每台虚拟机都要启动不同的服务进程,因此部署分片集群之前,需要清楚每台虚拟机的服务端口号所表示的服务,从而避免出现端口冲突的情况。接下来,我们通过一张表来介绍分片集群中服务端口号的分配情况,如表所示。
在这里插入图片描述
为了规范MongoDB分片集群相关服务器的数据文件、配置文件以及日志文件,这里我们通过使用user_mongo用户分别在服务器nosql01、nosql02、nosql03的根目录下创建一些文件夹作为约定(若服务器不存在user_mongo用户,则创建user_mongo用户,并授权;将目录/opt/servers/mongodb_demo/更改为用户user_mongo权限),具体如下:

mkdir -p /opt/servers/mongodb_demo/shardcluster/
mkdir -p /opt/servers/mongodb_demo/shardcluster/configServer/configFile
mkdir -p /opt/servers/mongodb_demo/shardcluster/configServer/data
mkdir -p /opt/servers/mongodb_demo/shardcluster/configServer/logs
mkdir -p /opt/servers/mongodb_demo/shardcluster/shard/configFile
mkdir -p /opt/servers/mongodb_demo/shardcluster/shard/shard1_data
mkdir -p /opt/servers/mongodb_demo/shardcluster/shard/shard2_data
mkdir -p /opt/servers/mongodb_demo/shardcluster/shard/shard3_data
mkdir -p /opt/servers/mongodb_demo/shardcluster/shard/logs
mkdir -p /opt/servers/mongodb_demo/shardcluster/mongos/configFile
mkdir -p /opt/servers/mongodb_demo/shardcluster/mongos/logs

接下来,我们需要分别在三台服务器(nosql01、nosql02、nosql03)的配置服务器、分片服务器以及路由服务器的日志目录下,创建对应的日志管理文件。这里我们以服务器nosql为例,具体如下:

# 配置服务器日志管理文件
touch /opt/servers/mongodb_demo/shardcluster/configServer/logs/config_server.log
touch /opt/servers/mongodb_demo/shardcluster/shard/logs/shard1.log
touch /opt/servers/mongodb_demo/shardcluster/shard/logs/shard2.log
touch /opt/servers/mongodb_demo/shardcluster/shard/logs/shard3.log
touch /opt/servers/mongodb_demo/shardcluster/mongos/logs/mongos.log

执行上述命令后,查看是否成功创建配置服务器、分片服务器(1、2、3)、路由服务器的日志管理文件,这里以查看服务器nosql01上的配置服务器日志管理文件为例进行展示,具体效果如图所示。
在这里插入图片描述
从图中可以看出,我们已经成功创建配置服务器的日志管理文件。(注:重复上述步骤,在服务器nosql02和服务器nosql03根目录下创建同样的目录结构以及日志管理文件,这里不再赘述)。至此,我们完成了MongoDB分片集群的环境准备工作。

部署MongoDB

由于MongoDB分片集群是基于MongoDB的不同角色组建的,因此部署MongoDB分片集群的基础仍是部署MongoDB。部署MongoDB的步骤如下:
(1)将MongoDB安装包上传到服务器nosql01的/opt/software/目录下。
(2)将MongoDB安装包的用户和用户组权限修改为user_mongo。
(3)解压安装MongoDB,将MongoDB安装包解压到目录/opt/servers/mongo_demo/shardcluster/下。
(4)解压完MongoDB安装包后,进入到/opt/servers/mongodb_demo/shardcluster目录,如果觉得解压后的文件名过长,可以对文件进行重命名。
(5)分发集群配置文件。将服务器nosql01上用于存放分片集群相关配置文件、日志文件和数据文件等相关内容的目录shardcluster分发到服务器nosql02和nosql03上。

具体命令如下:

tar -zxvf /opt/software/mongodb-linux-x86_64-rhel70-4.2.2.tgz -C /opt/servers/mongodb_demo/shardcluster/
cd /opt/servers/mongodb_demo/shardcluster/
mv mongodb-linux-x86_64-rhel70-4.2.2/ mongodb
scp -r /opt/servers/mongodb_demo/shardcluster/mongodb/ user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/mongodb/
scp -r /opt/servers/mongodb_demo/shardcluster/mongodb/ user_mongo@nosql03:/opt/servers/mongodb_demo/shardcluster/mongodb/

执行上述命令后,需要按照提示内容连接服务器并且输入用户user_mongo的密码,即123456,按照提示输入后,服务器nosql01的mongodb目录会分发到服务器nosql02和nosql03上,具体如图所示。
在这里插入图片描述

部署Config Server

上一小节完成了MongoDB的部署。本节我们将部署Config Server,具体步骤如下:

创建配置文件

首先,使用user_mongo用户进入服务器nosql01的/configServer/configFile/目录下,创建配置文件mongodb_config.conf,用于启动配置服务器,具体命令如下:

touch /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf

然后,编辑配置文件mongodb_config.conf,添加配置服务器的相关参数。

vim  /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf
#数据文件存放位置
dbpath=/opt/servers/mongodb_demo/shardcluster/configServer/data
#日志文件
logpath=/opt/servers/mongodb_demo/shardcluster/configServer/logs/config_server.log
#端口号
port=27022
#绑定服务IP
bind_ip=nosql01
#使用追加的方式写日志
logappend=true
#以守护进程的方式运行MongoDB
fork=true
#最大同时连接数
maxConns=5000
#复制集名称
replSet=configs
#声明这是一个集群的ConfigServer
configsvr=true

最后,将配置文件mongodb_config.conf通过scp命令分发到服务器nosql02和nosql03的目录configFile下,具体命令如下:

#分发到服务器nosql02
scp /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/configServer/configFile/
#分发到服务器nosql03
scp /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf user_mongo@nosql03:/opt/servers/mongodb_demo/shardcluster/configServer/configFile/

这里需要注意的是,参数bind_ip是根据当前服务器的IP地址或主机名进行修改的。执行上述命令后,我们必须修改服务器nosql02和nosql03配置文件mongodb_config.conf中的参数bind_ip的值,即将bind_ip的值修改为对应服务器的IP地址或主机名。

启动Config Server

分别在三台服务器(即nosql01、nosql02、nosql03)中MongoDB的bin目录下启动Config Server,具体命令如下:

cd /opt/servers/mongodb_demo/shardcluster/mongodb/bin
./mongod -f /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf

执行上述命令后,控制台会输出Config Server服务启动信息,若出现“successfully”,则说明Config Server启动成功,如图所示。

配置Config Server副本集

待三台服务器的Config Server启动完成后,选择任意一台服务器通过MongoDB客户端对Config Server进行初始化副本集的操作,这里以服务器nosql01为例,在MongoDB的bin目录下登录MongoDB客户端,并进行初始化,命令如下。

./mongo --host nosql01 --port 27022
> rs.initiate()
configs:SECONDARY> rs.add('nosql2:27022')
configs:PRIMARY> rs.add('nosql03:27022')

执行上述命令后,查看控制台输出信息,如图所示。
在这里插入图片描述
我们可通过执行“rs.status()”命令查看副本集状态,从而判断副本集是否部署成功。至此,完成分片集群中以副本集模式部署Config Server。

部署shard

创建配置文件

在服务器nosql01的/shard/configFile目录下,创建三个配置文件mongodb_shard1.conf、mongodb_shard2.conf和mongodb_shard3.conf,用于启动副本集模式的Shard,具体命令如下:

touch /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard1.conf
touch /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard2.conf
touch /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard3.conf

执行上述命令后,再执行“ll”命令,查看三个配置文件是否创建成功。
执行“vi”命令,在配置文件mongodb_shard1.conf中添加分片服务器1的相关参数。

cd /opt/servers/mongodb_demo/shardcluster/shard/configFile/
vi mongodb_shard1.conf
#数据文件存放位置
dbpath=/opt/servers/mongodb_demo/shardcluster/shard/shard1_data
#日志文件
logpath=/opt/servers/mongodb_demo/shardcluster/shard/logs/shard1.log
#端口号
port=27018
#使用追加的方式写日志
logappend=true
#以守护进程的方式运行MongoDB
fork=true
#最大同时连接数
maxConns=5000
#绑定服务IP
bind_ip=nosql01
#声明开启分片
shardsvr=true
#指定集名称
replSet=shard1

在配置文件mongodb_shard1.conf中添加完上述内容后。
重复执行“vi”命令,在配置文件mongodb_shard2.conf和mongodb_shard3.conf中添加分片服务器的相关参数。
执行上述操作后,至此,我们完成对服务器nosql01中分片集群的Shard配置。
重复nosql01中Shard配置过程,完成对服务器nosql02,nosql03的shard配置。
具体参数,可以按照此表来,大家也可以自行分配端口。
在这里插入图片描述

启动Shard

分别在三台服务器(nosql01、nosql02、nosql03)中MongoDB的bin目录下启动Shard,具体命令如下:

cd /opt/servers/mongodb_demo/shardcluster/mongodb/bin
./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard1.conf
./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard2.conf
./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard3.conf

三台服务器启动Shard时,控制台均输出“child process started successfully”的信息,因此说明我们成功启动Shard。

配置Shard副本集

三台虚拟机的Shard启动完成后,通过MongoDB客户端分别对三台服务器中的分片进行初始化副本集的操作,具体操作步骤如下。
首先,在服务器nosql01中登录MongoDB客户端,对分片服务器Shard1进行初始化副本集操作(副本集分片Shard1的主节点位于服务器nosql01),具体命令如下:

# 在MongoDB的bin目录下执行
$ ./mongo --host nosql01 --port 27018
# 初始化,设置本机为副本集主节点
> rs.initiate()
# 添加副节点
shard1:SECONDARY> rs.add('nosql02:27019')
# 添加仲裁节点
shard1:PRIMARY> rs.addArb('nosql03:27020')

执行上述命令后,我们就完成了分片服务器Shard1中副本集的初始化配置。注:我们可通过执行“rs.status()”命令查看副本集状态。
然后,在服务器nosql02中登录MongoDB客户端,对分片服务器Shard2进行初始化副本集操作(副本集分片Shard2的主节点位于服务器nosql02),具体命令如下:

#在MongoDB的bin目录下执行
$ ./mongo --host nosql02 --port 27018
#初始化,设置本机为副本集主节点
> rs.initiate()
#添加副节点
shard2:SECONDARY> rs.add('nosql03:27019')
#添加仲裁节点
shard2:PRIMARY> rs.addArb('nosql01:27020')

执行上述命令后,我们就完成了分片服务器Shard2中副本集的初始化配置。注:我们可通过执行“rs.status()”命令查看副本集状态。
最后,在服务器nosql03中登录MongoDB客户端,对分片服务器Shard3进行初始化副本集操作(副本集分片Shard3的主节点位于服务器nosql03),具体命令如下:

#在MongoDB的bin目录下执行
$ ./mongo --host nosql03 --port 27018
#初始化,设置本机为副本集主节点
> rs.initiate()
#添加副节点
shard3:SECONDARY> rs.add('nosql01:27019')
#添加仲裁节点
shard3:PRIMARY> rs.addArb('nosql02:27020')

执行上述命令后,我们就完成了分片服务器Shard3中副本集的初始化配置。注:我们可通过执行“rs.status()”命令查看副本集状态。
至此,我们完成了分片集群中三个Shard的部署,并且每个Shard以副本集模式运行。

部署mongos

创建配置文件

在服务器nosql01的/mongos/configFile目录下,创建配置文件mongodb_mongos.conf,用于启动mongos,具体命令如下:

touch /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf
vi /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf

执行“vi”命令,在配置文件mongodb_mongos.conf中添加路由服务器的相关参数,具体如下:

logpath=/opt/servers/mongodb_demo/shardcluster/mongos/logs/mongos.log
logappend=true
port=27021
bind_ip=nosql01
fork=true
#指定配置服务器(Config Server)地址
configdb =configs/nosql01:27022,nosql02:27022,nosql03:27022
maxConns=20000

上述内容中,我们没有设置参数dbpath,这是因为路由服务器不需要存储数据目录,因此不需要设置参数dbpath。
由于在分片集群中规划了两个mongos,因此,需要将配置文件mongodb_mongos.conf通过scp命令分发至服务器nosql02的目录/mongos/configFile下,具体命令如下:

scp /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/mongos/configFile/

执行上述命令后,我们需要修改服务器nosql02的配置文件mongodb_mongos.conf中参数bind_ip的值,即将值修改为当前服务器的IP地址或主机名(即nosql02)。

启动mongos服务

分别在两台服务器(nosql01和nosql02)中MongoDB的bin目录下启动mongos,具体命令如下:

cd /opt/servers/mongodb_demo/shardcluster/mongodb/bin
./mongos -f /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf

两台服务器启动mongos时,控制台均输出“child process started successfully”的信息,说明我们成功启动mongos,从而确保分片集群中至少包含两个mongos。

启动分片功能

分片集群部署完成后,还需要启动分片功能。下面,我们来启动分片集群的分片功能,具体步骤如下。

(1)在服务器nosql01中登录mongos的MongoDB客户端(需要通过mongos操作分片集群),具体命令如下:
(2)切换到数据库gateway,具体命令如下:
(3)向分片集群中添加三个Shard,分别为shard1、shard2和shard3,具体命令如下:

# 在MongoDB的bin目录下执行
$ ./mongo --host nosql01 --port 27021
mongos> use gateway
switched to db gateway
mongos> sh.addShard("shard1/nosql01:27018,nosql02:27019,nosql03:27020")
{.......}
mongos> sh.addShard("shard2/nosql01:27020,nosql02:27018,nosql03:27019") 
{.......}
mongos> sh.addShard("shard3/nosql01:27019,nosql02:27020,nosql03:27018")
{.......}

执行上述命令后,控制台会返回当前添加Shard操作是否成功的信息,若信息中出现字段“OK”的值为1,则说明当前Shard添加成功。

分片的基本操作

我们启动了分片集群的分片功能。若此时向分片集群添加数据库和集合时,默认情况下这些集合和数据库是没有实现分片功能的。接下来,我们将详细讲解如何实现对数据库和集合进行分片操作,具体操作步骤如下。
(1)登录MongoDB客户端
在服务器nosql01中登录mongos的MongoDB客户端,具体命令如下:

在MongoDB的bin目录下执行
$ ./mongo --host nosql01 --port 27021

(2)设置chunk
为了便于展示分片操作,将分片chunk(块)设置为1M,使得插入少量数据就可体现出分片的效果,具体命令如下:

# 切换到数据库config 
mongos> use config
switched to db config
# 设置块大小为1M
mongos> db.settings.save({"_id":"chunksize","value":1})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "chunksize" 

(3)模拟写入数据
在分片集群中,创建数据库school,并向数据库中添加集合user,然后模拟向集合中写入五万条文档,具体命令如下:

#切换(创建)数据库school 
mongos> use school
switched to db school
#向集合user中添加5万条文档
mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
WriteResult({ "nInserted" : 1 })

(4)对数据库进行分片操作
在开启集合分片前,需要先开启数据库的分片功能,具体命令如下。

#切换到数据库gateway 
mongos> use gateway
switched to db gateway
#实现数据库school分片功能
mongos> sh.enableSharding("school")
{......}

执行上述命令后,若是控制台返回“ok:1”,则说明我们成功开启数据库分片功能,即成功对数据库进行分片操作。注:我们需要在数据库gateway下进行数据库分片操作。
(5)对集合进行分片操作
对集合进行分片操作前,需要为集合user创建索引,具体命令如下:

#切换到数据库school 
mongos> use school
switched to db school
#以"id"作为索引
mongos> db.user.createIndex({"id":1})
{......}

执行上述命令后,我们成功为集合user创建索引。接下来,我们将以索引“id”作为分片键,对集合user进行分片操作,具体命令如下:

#切换到数据库gateway 
mongos> use gateway
#以"id"作为分片键对集合user进行分片
mongos> sh.shardCollection("school.user",{"id":1})
{......}

从上述返回结果“ok:1”可看出,我们成功为数据库school下的集合user开启分片功能。
(6)查看分片信息
在数据库gateway下,执行命令“sh.status()”,查看数据库school中集合user的分片信息。从返回结果可以看出,school.user(即数据库school下的集合user)的分片键(shard key)为id;参数“chunks”中各Shard的分布信息为“shard1 2,shard2 2,shard3 2”,说明shard1、shard2和shard3中分别存在两个chunk。
(7)开启安全认证
MongoDB默认没有开启安全认证,分片集群与副本集开启安全认证的方式基本一致。同样是使用KeyFile安全认证的方式,具体步骤如下。

  1. 创建并同步KeyFile文件;
  2. 创建全局管理用户;
  3. 关闭分片集群;
  4. 修改分片集群中各服务器的配置文件;
  5. 启动分片集群。
#创建并同步KeyFile文件
mkdir -p /opt/servers/mongodb_demo/shardcluster/key
touch /opt/servers/mongodb_demo/shardcluster/key/keyfile
openssl rand -base64 756 -out /opt/servers/mongodb_demo/shardcluster/key/keyfile
chmod 600 /opt/servers/mongodb_demo/shardcluster/key/keyfile
scp -r /opt/servers/mongodb_demo/shardcluster/key user_mongo@nosql2:/opt/servers/mongodb_demo/shardcluster/
#创建全局管理用户
cd /opt/servers/mongodb_demo/shardcluster/mongodb/bin
./mongo --host nosql1 --port 27021
> use admin
> db.createUser({user:"itcastAdmin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]})> use gateway#关闭平衡器> sh.stopBalancer()
#修改安全认证配置
#在Config Server与Shard启动配置文件中追加
# Config Server配置文件存放目录/opt/servers/mongodb_demo/shardcluster/configServer/configFile
#Shard配置文件存放目录/opt/servers/mongodb_demo/shardcluster/shard/configFile 
keyFile=/opt/servers/mongodb_demo/replicaset/key/keyfile
auth=true
#在mongos启动配置文件中追加
#mongos配置文件目录 /opt/servers/mongodb_demo/shardcluster/mongos/configFile
keyFile=/opt/servers/mongodb_demo/replicaset/key/keyfile
#启动分片集群
cd /opt/servers/mongodb_demo/shardcluster/mongodb/bin
./mongod -f /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard1.conf
./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard2.conf
./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard3.conf./mongos -f /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf

(8)验证安全认证
以安全认证模式启动分片集群后,我们通过不指定用户的方式登录mongos的MongoDB客户端,验证是否可以正常读取分片集群中的文档,这里以服务器nosql01为例,具体命令如下:

# 在服务器nosql01中MongoDB的bin目录下执行
$ ./mongo --host nosql01 --port 27021
#需要创建root用户开启平衡器
> use admin
> db.auth("itcastAdmin","123456")
> db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]})
> db.auth("admin","123456")
> use gateway
> sh.startBalancer()

执行上述命令后,再依次执行“user school”和“db.user.find().limit(10)”命令,查看集合user中前10条文档,效果具体如下:

mongos> use school
switched to db school
mongos> db.user.find().limit(10)
{......}

从上述返回结果“command find requires authentication”可以看出,查看文档操作需要用户认证后才能查看。
下面,我们以全局用户进行身份验证后,再进行查看文档操作,具体命令如下:

mongos> use admin
switched to db admin
mongos> db.auth("itcastAdmin","123456")
1
mongos> use school
switched to db school> db.user.find().limit(10)
mongos> db.user.find().limit(10)
{......}

从上述返回结果可以看出,客户端成功展示了集合user中的前十条文档内容,因此可以说明我们成功开启分片集群的安全认证。

结尾

制作不易,本人水平不高,希望大家批评指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_37228.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】2022第五届“传智杯”全国大学生计算机大赛(练习赛)

【参考&#xff1a;第五届“传智杯”全国大学生计算机大赛&#xff08;练习赛&#xff09; - 洛谷 | 计算机科学教育新生态】 练习赛满分程序&#xff08;多语言&#xff09;&#xff1a;https://www.luogu.com.cn/paste/fi60s4yu CPU一秒大概运行 10810^8108 次&#xff0c;…

ASEMI肖特基二极管MBR40200PT参数,MBR40200PT规格

编辑-Z ASEMI肖特基二极管MBR40200PT参数&#xff1a; 型号&#xff1a;MBR40200PT 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;200V 最大平均正向整流输出电流&#xff08;IF&#xff09;&#xff1a;40A 峰值正向浪涌电流&#xff08;IFSM&#xff0…

imx6ull pro BSP 工具链

BSP&#xff0c;Board Support Package&#xff0c;指板级支持包&#xff0c;是构建嵌入式操作系统所 需的引导程序(Bootload)、内核(Kernel)、根文件系统(Rootfs)和工具链 (Toolchain)。 每种开发板的 BSP 都不一样&#xff0c;并且这些源码都非常庞大。我们把这些源码都 放在…

自动化运维CICD

目录 概述 为什么持续集成和发布可以提高效率 如何实现 1、在linux服务器安装部署代码仓库 2、安装jenkins 使用shell脚本实现CICD 使用pipeline实现CICD 使用Blue Ocean实现CICD 概述 持续集成&#xff08;Continuous Integration&#xff0c;CI)和持续发布&#xff0…

二、进程管理(四)经典同步互斥问题

目录 4.1生产者-消费者问题 4.1.1单类生产者-单类消费者问题 4.1.2多类生产者-多类消费者问题 4.1.3吸烟者问题 4.2读者-写者问题 4.3哲学家进餐问题 分析进程同步和互斥问题的三步&#xff1a; 关系分析&#xff1a;分析问题中的同步&#xff08;前驱关系&#xff09;、…

【网络】tcpdump、Wireshark 案例超详细介绍

文章目录网络分层应用层找到服务器的 IP查接口、对象的耗时删除指定网站的Cookie表示层、会话层tcpdump、wireshard传输层telnet: 路径可达性测试nc: 路径可达性测试netstat&#xff1a;查看当前连接状态iftop&#xff1a;查看当前连接的传输速率netstat -s: 查看丢包和乱序的统…

数据结构(5)树形结构——二叉搜索树(JAVA代码实现)

5.1.概述 二叉搜索树&#xff0c;也叫二叉查找树、二叉排序树&#xff0c;顾名思义&#xff0c;这种二叉树是专门用来进行数据查找的二叉树。二叉搜索树的查找其实就是二分查找。 二叉搜索树的定义&#xff1a; 二叉搜索树可以为空如果二叉搜索树不为空&#xff0c;那么每个…

Visual C++ 2010开发的程序在其它电脑上运行提示“找不到MSVCR100D.dll”原因及解决

Visual C 2010开发的程序在其它电脑上运行提示“找不到MSVCR100D.dll”原因及解决 Microsoft Visual C&#xff08;简称Visual C、MSVC、VS或VC&#xff09;2010是微软公司的免费C开发工具&#xff0c;具有集成开发环境&#xff0c;可提供编辑C语言&#xff0c;C以及C/CLI等编程…

Java项目:JSP手机商城管理系统包含前台

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;管理员登录后台&#xff0c;普通用户登录前台&#xff1b; 管理员角色…

大数据_什么是数据中台?

目录 一、数据中台的定义 二、数据中台必备的是个核心能力 三、数据中台VS业务中台 四、数据中台VS数据仓库 五、数据中台VS现有信息架构 六、数据中台的业务价值与技术价值 一、数据中台的定义 数据中台是一套可持续“让企业的数据用起来”的机制&#xff0c;是一种战略…

[附源码]计算机毕业设计JAVA人力资源管理系统论文2022

[附源码]计算机毕业设计JAVA人力资源管理系统论文2022 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…

第8章 综合案例—构建DVD租赁商店数据仓库

目录 章节概要 案例背景介绍 数据仓库的架构模型 数据仓库的架构模型 数据库sakila的下载和安装 数据库sakila简介 数据库sakila中 数据表之间的关系 数据表简介 用于储存电影基本信息及相关介绍的数据&#xff0c;该数据表各个字段的含义如表。 用于储存定义电影id所…

Kafka生产者之分区

一、分区好处 &#xff08;1&#xff09;便于合理使用存储资源&#xff0c;每个Partition在一个Broker上存储&#xff0c;可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务&#xff0c;可以实现负载均衡的效果&#xff1b; &#xff08;2&…

惊喜:2023前瞻版Java面试指南,不止八股文

前言&#xff1a; 2022年马上就要过去了&#xff0c;即将要到来的就是2023年的金三银四面试季&#xff0c;随着政策的放宽&#xff0c;经济的逐步复苏&#xff0c;岗位的需求也会越来越大&#xff0c;所以趁这段时间进行知识储备将会是最好的时间段&#xff0c;永远要做快人一…

智能疾病查询接口

一、接口介绍 最全的疾病大全&#xff0c;收集了数万种常见疾病&#xff0c;任何常见疾病都可查询。 二、功能体验 三、API文档 3.1 查询疾病科目 3.1.1接入点说明 查询疾病的类别。 3.1.2接口地址 http[s]&#x1f615;/www.idmayi.com/546-1?idmayi_appid替换自己的值&…

APP逆向案例之(二)对加固APP进行分析和破解

说明&#xff1a;对加固APP进行分析和破解&#xff0c;对发现新版本提示关掉 1、先对APP窗口类行进HOOK&#xff0c;确定窗口提示用的是那个类。 android hooking watch class android.app.AlertDialog 2、发现一个非常明显的函数 setCancelable objection -g com.hello.qq…

【ML特征工程】第 4 章 :特征缩放的影响:从词袋到 Tf-Idf

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

工作中常用的设计模式--策略模式

一般做业务开发&#xff0c;不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java&#xff0c;基于Spring框架。 1 策略模式(Strategy Pattern) 一个类的行为或方法&#xff0c;在运行时可以根据条件的不同&#xff0c;有不同的…

(C语言)printf打印的字符串太长了,我想分两行!

本文来自于公众号&#xff1a;C语言编程技术分享 一、提问 有下述C程序&#xff1a; #include <stdio.h> #include <stdlib.h>int main() { printf("123456789012345678901234567890\n");system("pause");return 0; } printf函数要打印的字…

B. Elimination of a Ring Pinely Round 1 (Div. 1 + Div. 2)

传送门 题目意思&#xff1a; 给你一个为环的序列n&#xff0c;这个序列有一个特殊的地方&#xff1a;就是如果有相邻元素相等他就会立马删除其中一个元素&#xff08;第一个和最后一个相邻&#xff09;。 然后你每次可以删除一个元素&#xff0c;问你能删除的最多的操作数是多…