当前位置: 首页 > news >正文

Linux 中使用 docker-compose 部署 MongoDB 6 以上版本副本集及配置 SSL / TLS 协议

一、准备环境

MongoDB 副本集部署至少 3 个节点(奇数节点),为了保障数据安全性,可考虑将 MongoDB 节点分布在不同的主机上,本示例使用一台主机部署 3 个 MongoDB示例。

1、创建 MongoDB 集群数据相关目录
# 创建 MongoDB 集群根目录及 3 个子目录
mkdir -p /mongodb-cluster/{mongo01, mongo02, mongo03}# 创建 3 个 MongoDB 下子目录
mkdir -p /mongodb-cluster/mongo01/{certs, configdb, data, db, logs}
mkdir -p /mongodb-cluster/mongo02/{certs, configdb, data, db, logs}
mkdir -p /mongodb-cluster/mongo03/{certs, configdb, data, db, logs}# 准备给上面 logs 目录赋予操作权限(注意:未赋予 logs 目录权限,运行会报错)
chmod 777 /mongodb-cluster/mongo01/logs
chmod 777 /mongodb-cluster/mongo01/logs
chmod 777 /mongodb-cluster/mongo01/logs
2、生成服务端、集群内部成员、客户端相关证书

由于部署 MongoDB 副本集,集群成员和客户端需要与服务端进行认证通信,保证通信的可靠性,目前 MongoDB 提供如下方式进行通信认证:

security.clusterAuthMode

类型:String

默认值:keyFile

用于集群认证的方式。如果您使用 内部 x.509 身份验证,请在此处指定。此选项可以具有以下值之一:

价值描述
keyFile使用密钥文件进行身份验证。只接受密钥文件。
sendKeyFile用于滚动升级目的。发送密钥文件进行身份验证,但可以同时接受密钥文件和 x.509 证书。
sendX509用于滚动升级目的。发送 x.509 证书进行身份验证,但可以同时接受密钥文件和 x.509 证书。
x509受到推崇的。发送 x.509 证书进行身份验证并仅接受 x.509 证书。

通过上面说的几种通信认证方式,默认 keyFile 密钥文件方式认证,这种方式也是最简单的,只能用于测试环境下使用,通常我们为了服务端和客户端通信安全,则会使用 x509 认证方式,下面我就使用 x509 方式进行配置 TLS 协议认证。

注意:因为大多数 CA 高可靠证书,都是由第三方厂商提供,需要收费的。(这里自己通过 openssl 生成自签名 CA 证书,实现通信认证)。

自签名证书生成
(1)、生成根证书 ca.pem
# 生成 CA 私钥(ca.key)(不加密)
openssl genrsa -out ca.key 2048
# 生成 CA 证书签名请求(ca.csr)
# 每个集群成员证书和服务端证书中必须具有相同的 O、OU 和 DC (具体可参考:https://www.mongodb.com/docs/manual/core/security-x.509)
openssl req -new -key ca.key -out ca.csr # 注意:在执行这条命令后,需要按要求填写内容,最后面两项可选,密码可不填
# 生成自签名 CA 证书(ca.pem), 直接免费 100 年有效
openssl x509 -req -days 36500 -in ca.csr -signkey ca.key -out ca.pem
(2)、生成服务端证书 server.pem
# 生成 server 端私钥 (server.key) 不加密
openssl genrsa -out server.key 2048
# 生成 server 证书签名请求 (server.csr)
openssl req -new -key server.key -out server.csr # 注意:输入内容和上面的保持一致
# 使用 ca 证书签署服务端 csr 以生成服务端证书 (server.crt) 
openssl ca -days 36500 -in server.csr -out server.crt -cert ca.pem -keyfile ca.key # 注意:执行这条命令会出现 2 处错误,按如下方式解决,再执行# 第一个错误
/etc/pki/CA/index.txt No such file or directory
# 直接执行如下命令
touch /etc/pki/CA/index.txt# 第二个错误
/etc/pki/CA/serial No such file or directory
# 直接执行如下命令后,文件里面输入数字,如:01,再保存 
vim /etc/pki/CA/serial# 解决完问题后,再执行上面的命令对证书进行签名(后面输入区域,都输入 y 即可)
openssl ca -days 36500 -in server.csr -out server.crt -cert ca.pem -keyfile ca.key# 删掉 server.crt 中的 certificate 信息,保留加密证书内容即可# 合并证书和私钥成 PEM 文件, 构建命令如下:
cat server.key server.crt > server.pem# 再验证自签名证书是否成功(返回,OK 代表成功)
openssl verify -CAfile ca.pem server.pem
(3)、生成客户端证书 client.pem(流程和服务端一样,只是稍微改了下名)
# 生成 client 端私钥 (client.key) 不加密
openssl genrsa -out client.key 2048
# 生成 client 证书签名请求 (client.csr)
openssl req -new -key client.key -out client.csr # 注意:输入内容和上面的保持一致
# 使用 ca 证书签署客户端 csr 以生成客户端证书 (client.crt) 
openssl ca -days 36500 -in client.csr -out client.crt -cert ca.pem -keyfile ca.key 
# 注意:这条命令运行后会出现 2 个错误,是因为之前签署了服务端证书,前面自己创建的两个文件已存在,所以,需要把 /etc/pki/CA 下的 index.txt 和 serial 文件删除,再重新执行该命令,再解决前面提到的错误就可以了# 解决完问题后,再执行上面的命令对证书进行签名(后面输入区域,都输入 y 即可)
openssl ca -days 36500 -in client.csr -out client.crt -cert ca.pem -keyfile ca.key# 删掉 client.crt 中的 certificate 信息,保留加密证书内容即可# 合并证书和私钥成 PEM 文件, 构建命令如下:cat client.key client.crt > client.pem# 再验证自签名证书是否成功(返回,OK 代表成功)openssl verify -CAfile ca.pem client.pem
(4)、生成服务端成员证书 cluster.pem(流程和客户端一样,只是稍微改了下名),这里就不写了。
二、创建 MongoDB 集群的核心文件并配置
1、将前面生成的所有 PEM 证书 copy 到各 mongo 下 certs 目录中
# 执行如下命令
cp 文件路径 /mongodb-cluster/mongo01/certs
cp 文件路径 /mongodb-cluster/mongo02/certs
cp 文件路径 /mongodb-cluster/mongo03/certs# 注意:确认包含如下 4 个文件
ca.pem  client.pem  cluster.pem  server.pem
2、创建各示例的 mongod.conf 核心文件并配置
# 创建 mongod.conf 配置文件
touch /mongodb-cluster/mongo01/configdb/mongod.conf
touch /mongodb-cluster/mongo02/configdb/mongod.conf
touch /mongodb-cluster/mongo03/configdb/mongod.conf

在各个示例 mongod.conf 文件里面写入如下内容:

注意:每个示例配置的端口号 27017 可不改,因为这是容器里面的端口,也可以根据需求更改

net:bindIp: 0.0.0.0 # 配置允许所有主机连接,默认只能本地连接port: 27017 # 因为在一台主机中,三个示例的端口对应 27017、27018、27019 或者 其它不冲突的端口也可以tls:CAFile: /data/certs/ca.pem # 容器内映射路径,在本配置文件下,所有配置的路径都是容器路径,作为宿主机的映射路径certificateKeyFile: /data/certs/server.pemclusterFile: /data/certs/cluster.pemallowInvalidCertificates: trueallowInvalidHostnames: trueallowConnectionsWithoutCertificates: truemode: requireTLS # MongoDB 认证模型,使用 TLS, 默认不使用 TLS
processManagement:fork: false  # 是否开启以守护进程模式在后台运行
replication:replSetName: rs0 # 副本集名称
security:clusterAuthMode: x509  # 集群安全认证模型使用 x509authorization: enabled # 启用基于 RBAC 权限访问操作
storage:engine: wiredTiger # 6.0 以上版本默认使用 wiredTiger 引擎, 从 4.2 版本移除了 MMAPv1 存储引擎# 具体参数配置可参考:https://www.mongodb.com/docs/manual/reference/configuration-options/#storage-optionswiredTiger:engineConfig:cacheSizeGB: 0.5journalCompressor: zstd # 默认使用 snappy 方式压缩,这里使用 zstd 高效压缩方式 zstdCompressionLevel: 6 # 设置 zstd 方式压缩级别,默认为 6, 范围:1-22, 级别越高,压缩率也越高collectionConfig:blockCompressor: zstdindexConfig:prefixCompression: true # 开启索引前缀压缩
systemLog:destination: file  # 日志存储方式为 file, 默认为 system_log 输出方式logAppend: true # 是否开启日志追加,默认为 falsepath: /data/logs/mongod.log  # 日志存储路径
3、创建 docker-compose.yaml 部署文件
# 创建 docker-compose.yaml 文件
touch /mongodb-cluster/docker-compose.yaml

在 docker-compose.yaml 文件里面写入如下内容:

version: "3.9"
services:mongo01:container_name: mongo01 # 容器名image: mongo # 拉取的镜像,未指定版本,默认 latest 最新版ports:- 27017:27017 # 容器内端口号映射,如:宿主机端口:容器端口environment:TZ: Asia/Shanghai # 配置时区信息volumes:- /etc/localtime:/etc/localtime- ./mongo01/db:/data/db  # 挂载数据 db 目录, 默认容器内是 /data/db, 因为前面没配置 storage.dbPath 路径- ./mongo01/configdb:/data/configdb # 挂载前面的 mongod.conf 配置文件, 默认容器内 /data/configdb- ./mongo01/certs:/data/certs # 这个是自定义挂载的 TLS 相关配置- ./mongo01/logs:/data/logs # 挂载容器内日志目录restart: alwayscommand: mongod --replSet rs0 -f /data/configdb/mongod.conf # 容器启动后,需要执行的命令networks:- mongo_network # 使用自定义网络mongo02:container_name: mongo02image: mongoports:- 27018:27018environment:TZ: Asia/Shanghaivolumes:- /etc/localtime:/etc/localtime- ./mongo02/db:/data/db- ./mongo02/configdb:/data/configdb- ./mongo02/certs:/data/certs- ./mongo02/logs:/data/logsrestart: alwayscommand: mongod --replSet rs0 -f /data/configdb/mongod.confnetworks:- mongo_networkmongo03:container_name: mongo03image: mongoports:- 27019:27019environment:TZ: Asia/Shanghaivolumes:- /etc/localtime:/etc/localtime- ./mongo03/db:/data/db- ./mongo03/configdb:/data/configdb- ./mongo03/certs:/data/certs- ./mongo03/logs:/data/logsrestart: alwayscommand: mongod --replSet rs0 -f /data/configdb/mongod.confnetworks:- mongo_network 
# 创建容器网络
networks:mongo_network:name: mongo_network
三、启动 MongoDB 集群并初始化及配置客户端认证
1、启动 MongoDB 集群
# 使用如下命令启动
docker-compose up -d# 查看容器日志(未输出错误信息或没有日志信息则成功)
docker logs -f mongo01 -n 100# 需要查看具体容器输出日志,可在前面配置的日志目录中查看
2、进入其中一个容器,进行集群初始化(在 3 个示例中随便进入哪个都行,但只要对一个容器内做初始化即可)
# 进入容器
docker exec -it mongo01 /bin/bash# 进入 mongo 服务端, 需要指定客户端签名证书(注意:MongoDB 6.0 以上版本, 客户端命令为 mongosh)
# --host 是你前面生成签名证书时填的 Common Name 的值, 简称:CN, 可根据需求填写, 配置写错了, 会导致连接有问题
# 具体可参考:https://www.mongodb.com/docs/manual/core/security-x.509
mongosh --tls --tlsCertificateKeyFile /data/certs/client.pem --tlsCAFile /data/certs/ca.pem --host localhost --port 27017# 进入 mongo 服务端后,需要先创建一个用户并赋予权限,不然,操作会出错
# 执行如下命令, 创建用户(注意:在执行命令之前,需要先 use admin 切换到 admin 库)
# 具体可参考:https://www.mongodb.com/docs/manual/reference/built-in-roles
db.createUser({user:"root", # 用户名pwd:"123456", # 密码roles:[{role:"root",db:"admin"}] # 可配置多个角色, root 角色表示拥有超级用户角色, 作用于 admin 数据库}
);# 使用刚创建的 root 用户登录认证, 进行执行接下来的操作
# root 用户登录认证(注意:需要在 admin 库执行, use admin 切换命令)
db.auth("root", "123456")
# 执行如下命令,初始化 mongo 副本集, 返回 ok 代表已初始化成功
rs.initiate( {_id : "rs0", # 副本集名称members: [{ _id: 0, host: "172.21.0.3:27017" }, # mongo 实例 IP, 配置成宿主机 IP 即可{ _id: 1, host: "172.21.0.4:27018" },{ _id: 2, host: "172.21.0.2:27019" }]
})# 再执行 rs.status() 命令查看集群状态, 也可通过 rs.conf() 命令查看集群节点配置信息
3、使用 x509 证书对客户端进行身份验证

将 x.509 证书添加 subject 为用户要使用客户端证书进行身份验证,您必须首先将来自客户端证书的值 subject 作为 MongoDB 用户添加到 $external 数据库中。每个唯一的 x.509 客户端证书对应一个 MongoDB 用户。您不能使用单个客户端证书对多个 MongoDB 用户进行身份验证。具体可参考:https://www.mongodb.com/docs/manual/tutorial/configure-x509-client-authentication

# 在宿主机上执行如下命令(注意:client.pem 是前面生成的客户端签名证书)
# 使用以下命令从客户端证书中检索 RFC2253 格式化:subject
openssl x509 -in client.pem -inform PEM -subject -nameopt RFC2253# 该命令会返回 subject 字符串和证书:
subject= CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry
-----BEGIN CERTIFICATE-----
# ...
-----END CERTIFICATE-----# 添加作为用户 RFC2253 的合规值, subject 根据需要省略空格。
# 首先, 需要进入主节点容器内 mongo 服务端, 执行如下操作:
# 进入容器
docker exec -it mongo01 /bin/bash
# 进入 mongo 服务端
mongosh --tls --tlsCertificateKeyFile /data/certs/client.pem --tlsCAFile /data/certs/ca.pem --host localhost --port 27017
# 需要切换为 admin 库, use admin 命令, 再执行 root 用户认证命令
db.auth("root", "123456")# 以下添加一个用户并授予该用户 readWrite 在数据库中的角色 test 和 root 角色:
db.getSiblingDB("$external").runCommand({createUser: "1491140482@qq.com,CN=localhost,OU=BND,O=BN,ST=JS,C=CN",roles: [{ role: "readWrite", db: "test" },{ role: "root", db: "admin" }],writeConcern: { w: "majority" , wtimeout: 5000 }}
)# 客户端连接后认证, 使用如下命令:
db.getSiblingDB("$external").auth({mechanism: "MONGODB-X509"}
)# 客户端连接期间进行身份认证, 执行如下命令:
mongosh --tls --tlsCertificateKeyFile client.pem \--tlsCAFile ca.pem \--authenticationDatabase '$external' \--authenticationMechanism MONGODB-X509
四、测试 MongoDB 副本集数据同步
1、在主容器里面写入数据,再进入从容器里面查询
# 进入主容器
docker exec -it mongo01 /bin/bash# 进入 mongo 服务端
mongosh --tls --tlsCertificateKeyFile /data/certs/client.pem --tlsCAFile /data/certs/ca.pem --host localhost --port 27017# 切换 admin 库, use admin 命令
use admin
# db 认证
db.auth("root", "123456")
# 插入一条数据在 test 库中, 文档不存在会自动创建
db.test.insertOne( { x: 1 } )
# 查询数据
db.test.find()# 然后, 下面再从容器里面查看是否有数据
docker exec -it mongo02 /bin/bash # 进入从容器
mongosh --tls --tlsCertificateKeyFile /data/certs/client.pem --tlsCAFile /data/certs/ca.pem --host localhost --port 27018 # 进入 mongo 服务端use admin # 切换 admin
db.auth("root", "123456") # db 认证
db.test.find() # 查询数据, 这里会出错, 默认是强制读主的, 不允许从节点进行读操作, 只能作为备份和高可用, 需要显示开启读操作# 解决方案, 如下:
rs.secondaryOk() or db.getMongo().setReadPref("primaryPreferred")
# 这两条命令执行其中一条即可, 再次执行 db.test.find() 查询数据就能读到了
# 注意:rs.secondaryOk() 命令在新版本被弃用了, 建议使用:db.getMongo().setReadPref("primaryPreferred") 命令进行操作
五、使用 Navicat 客户端连接 MongoDB 副本集
1、将服务器中的客户端签名证书和 CA 证书导出

包含:ca.pem 和 client.pem 两个文件

2、进行使用 Navicat 连接,如下图:

在这里插入图片描述

继续配置启用 SSL 模式进行连接,如下图:

在这里插入图片描述

然后,点击测试连接,即可连接成功。

六、其它
1、添加副本,在登录到主节点下输入
rs.add("ip:port")
2、删除副本
rs.remove("ip:port")
3、新增仲裁节点
rs.addArb("ip:port")
4、修改副本集里面的节点 IP
# 声明 cfg 变量
cfg = rs.conf()# 执行修改各节点的 IP
cfg.members[0].host = "192.xxx.xxx.121:27017"
cfg.members[1].host = "192.xxx.xxx.121:27018"
cfg.members[2].host = "192.xxx.xxx.121:27019"# 重新加载配置
rs.reconfig(cfg)# 查询副本集状态
rs.status()# 查询副本集配置
rs.conf()

相关文章:

Linux 中使用 docker-compose 部署 MongoDB 6 以上版本副本集及配置 SSL / TLS 协议

一、准备环境 MongoDB 副本集部署至少 3 个节点(奇数节点),为了保障数据安全性,可考虑将 MongoDB 节点分布在不同的主机上,本示例使用一台主机部署 3 个 MongoDB示例。 1、创建 MongoDB 集群数据相关目录 # 创建 Mo…...

JavaWeb--Mybatis练习

Mybatis练习Mybatis练习1 配置文件实现CRUD1.1 环境准备1.2 查询所有数据1.2.1 编写接口方法1.2.2 编写SQL语句1.2.3 编写测试方法1.2.4 起别名解决上述问题1.2.5 使用resultMap解决上述问题1.2.6 小结1.3 查询详情1.3.1 编写接口方法1.3.2 编写SQL语句1.3.3 编写测试方法1.3.4…...

Springer-MTA期刊上传Latex要求

https://blog.csdn.net/qq_40721108/article/details/129000957本文简述比较全面Please provide any additional items.If your data are available online, for example in a repository, you can add a weblink using the “Link(s) to supporting data” option from the dr…...

Graph Embedding基础 图表示学习 什么是Graph Embedding

本文包括 DeepWalk LINE SDNE Node2vec Struc2vec等几个重要的Graph Embedding 方法 先说下不同embedding的区别是什么: DeepWalk:采用随机游走,形成序列,采用skip-gram方式生成节点embedding。node2vec:不同的随机游…...

某直聘tp_token解析

尊重版权,请勿盗版,不放代码。截至2023-02-23更新---------------------------------------检测windows属性总数大于150 改成大于15 > 150检测了document属性大于50检测了navigate属性检测了navigate.plugins 属性值检测moudle nodejs是否存在&#x…...

替代启攀微8按键触控八通道触摸芯片-GTC08L

能完美替代启攀微8按键触控八通道电触摸芯片-GTC08L芯片是一款非常适用于音响上超稳定超抗干扰低功耗八通道电容式触摸IC;可通过触摸实现各种逻辑功能控制;操作简单、方便实用;电压范围宽,可在2.7V~5.5V(单…...

Zabbix“专家坐诊”第182期问答汇总

问题一: Q:像烽火、浪潮这种没有ilo的设备怎么监控他们的硬件状态呢? A:如果没有ilo,可以使用其他硬件监控软件,例如HP Insight Manager、IBM Director、Dell OpenManage等。这些软件可以帮助您监控硬件状…...

PHP、Nginx、openssl ECC证书搭建

在一台Ubuntu中#!/bin/bash# 安装 Nginxsudo apt-get updatesudo apt-get install nginxsudo apt-get install libssl-devsudo apt-get install -y nginx# 配置 Nginxsudo ufw allow Nginx HTTPsudo systemctl start nginxsudo systemctl enable nginx# 安装 PHPsudo apt-get i…...

秒杀服务------技术点及亮点

大技术使用Redisson使用Redisson在秒杀服务中有两个作用,一个是作为分布式锁来确保多个秒杀服务同时在线时同时上架秒杀商品,只允许有一个秒杀服务成功上架秒杀商品,其他的上架失败。第二个作用是作为分布式信号量,每个秒杀商品在…...

【Python数据挖掘入门】一、数据挖掘概况

一、数据挖掘概况 数据挖掘是指从大量的数据中,通过统计学、人工智能、机器学习等方法,挖掘出未知的、具有价值的信息和知识的过程。 典型案例: 啤酒与尿布杜蕾斯与口香糖杜蕾斯与红酒 数据挖掘是一门交叉学科,覆盖了统计学、数…...

【python】anaconda 管理 python 环境

anaconda 管理虚拟环境anaconda 简介python 虚拟环境的安装查看当前 anaconda中所有的虚拟环境创建新的虚拟环境激活所创建的虚拟环境删除指定的虚拟环境退出当前虚拟环境查看当前虚拟环境中所有安装的库安装常用包pycharmpycharm 下环境配置pycharm 使用anaconda 简介 anacon…...

线上插画培训班有用吗,教你选靠谱的插画课程

线上插画培训班有用吗,教你选靠谱的插画课程,推荐5个靠谱的动漫插画培训课程,各有特色和优势,相信可以给大家一些参考! 一:5个靠谱的动漫插画网课 1、轻微课(五颗星) 主打课程有日…...

吃鸡用什么蓝牙耳机效果好?手游吃鸡公认最好的几款蓝牙耳机

蓝牙耳机的作用很多,几乎每个人都需要一副很棒的耳机在通勤或锻炼途中使用,并且玩游戏也少不了它,手游近几年十分的流行,下面整理了几款性能不错的蓝牙耳机。 第一款:南卡小音舱蓝牙耳机 蓝牙版本:5.3 发…...

四个步骤在CRM系统中设置游戏化机制

长期高强度的单一工作会让销售人员逐渐失去对工作的兴趣,导致销售状态缺少动力和激情,工作开展愈加困难。不少企业通过CRM销售管理系统设置游戏化竞赛,调动销售人员的工作积极性。那么,如何在CRM系统中设置游戏化机制?…...

2023年TikTok营销如何破局?品牌应做好这6点

转眼到了2023年,虽然过去的一年,国际市场风云变幻,但对TikTok来说,却是丰收的一年。2022年, TikTok的全球收入为35亿美元,同比增长60%。TikTok以6.72亿次下载量依旧位居榜首,短视频进一步风靡全…...

2023年CDGA考试-第5章-数据建模和设计(含答案)

2023年CDGA考试-第5章-数据建模和设计(含答案) 单选题 1.请从下列选项中选择关于企业数据模型描述准确的选项 A.企业模型包括继承关系模型、概念模型、主题域模型、逻辑模型 B.企业模型包括数据名称、数据属性和元数据定义、概念和逻辑实体关系以及业务规则 C.企业模型包括…...

蓝桥杯入门即劝退(二十)快乐数(我不快乐了)

欢迎关注点赞评论,共同学习,共同进步! ------持续更新蓝桥杯入门系列算法实例-------- 如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流! 你的点赞、关注、评论、是我创作的动力! -------希望我的文章…...

Aspose.Imaging for .NET V23

Aspose.Imaging for .NET V23 Aspose.Imaging for.NET是帮助开发人员在自己的应用程序中创建、编辑、绘制或转换图像的类库。它包括在不安装Photoshop或任何其他图像编辑器的情况下以Adobe Photoshop原生格式保存的功能。Aspose.Imaging for.NET是一个灵活稳定的API&#xff0c…...

通信算法复习题纲

通信算法复习题1、当信源发送信号满足以下哪一项条件时,接收端采用最小距离准则进行判决等价于采用最大后验概率准则进行判决?2、OFDM系统的正交性体现在哪个方面?3、模拟信号数字化过程中,哪一步会引入量化噪声?4、OF…...

交叉编译 MQTT/Mosquitto

交叉编译 MQTT/Mosquitto 概述 Eclipse Mosquitto 是一个开源(EPL/EDL许可)消息代理,它实现了 MQTT 协议版本 5.0、3.1.1 和 3.1。Mosquitto 重量轻,适用于从低功耗单板计算机到全服务器的所有设备。 MQTT 协议提供了一种使用发…...

无重复字符的最长子串的解法

class Solution {public int lengthOfLongestSubstring(String s) {// 哈希集合&#xff0c;记录每个字符是否出现过Set<Character> occ new HashSet<Character>();int n s.length();// 右指针&#xff0c;初始值为 -1&#xff0c;相当于我们在字符串的左边界的左…...

Apache Hadoop生态部署-zookeeper单机安装

目录 查看服务架构图-服务分布、版本信息 一&#xff1a;安装前准备 1&#xff1a;zookeeper安装包选择--官网下载 2&#xff1a;zookeeper3.5.7安装包--百度网盘 二&#xff1a;安装与常用配置 2.1&#xff1a;下载解压zk安装包 2.2&#xff1a;配置修改 2.3&#xff1…...

java面试题-IO流

基础IO1.如何从数据传输方式理解IO流&#xff1f;IO流根据处理数据的类型可以分为字节流和字符流。字节流字节流以字节&#xff08;8位&#xff09;为单位读写数据。字节流主要用于读写二进制文件&#xff0c;如图片、音频、视频等。Java中的InputStream和OutputStream就是字节…...

Java性能-GC工具

GC工具(帮助分析程序性能 WE always need THAT TO help US) 开启GC日志 JDK 8 -verbose:gc 开启gc -XX:PrintGC 打印gc信息 -XX:PrintGCDetails 打印详细信息 -XX:PrintGCTimeStamps 相对于jvm启动时间0值开始 -XX:PrintGCDateStamps 日期字符串 -Xloggc:filename gc输入日志…...

复赛名单公布!2022隐私计算HACKATHON大赛火热进行中!

开放隐私计算开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号O…...

微信小程序的全局弹窗以及全局实例

全局组件 微信小程序组件关系中&#xff0c;父组件使用子组件需要在父组件index.json中引入子组件&#xff0c;然后在父组件页面中使用&#xff0c;这种组件的对应状态是一对一的&#xff0c;一个组件对应一个页面。如果有一个全局弹窗&#xff08;登录&#xff09;&#xff0…...

100种思维模型之诺依曼思维模型-019

生活中&#xff0c;难免总会遇到一些“大”、“笼统”、“难入手”的问题&#xff01; 如&#xff0c;前几天突然接到领导安排&#xff0c;帮忙梳理一个材料“***景区创建5A级旅游景区提升规划”。 对于一个没有学过景区提升规划、没有做过规划的我来说&#xff0c;真的挺难的…...

Python + Airtest + poco + pytest + pytest-html 实现Android App自动化测试框架

Python Airtest poco pytest pytest-html 实现Android App自动化测试框架 一、背景 为了尝试除Appium外的测试框架&#xff0c;本文将介绍基于网易的airtest框架为基础&#xff0c;配合poco及pytest实现对Android App的自动化测试。 二、框架介绍 框架集成使用airtest p…...

一篇文章让你学会spring

Spring6 1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简…...

golang入门笔记——测试

测试类型&#xff1a; 单元测试&#xff1a; 规则&#xff1a; 1.所有测试文件以_test.go结尾 2.func Testxxx&#xff08;*testing.T&#xff09; 3.初始化逻辑放到TestMain中 运行&#xff1a; go test [flags][packages]Go语言中的测试依赖go test命令。 go test命令是一…...