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,…...
通信算法复习题纲
通信算法复习题1、当信源发送信号满足以下哪一项条件时,接收端采用最小距离准则进行判决等价于采用最大后验概率准则进行判决?2、OFDM系统的正交性体现在哪个方面?3、模拟信号数字化过程中,哪一步会引入量化噪声?4、OF…...
交叉编译 MQTT/Mosquitto
交叉编译 MQTT/Mosquitto 概述 Eclipse Mosquitto 是一个开源(EPL/EDL许可)消息代理,它实现了 MQTT 协议版本 5.0、3.1.1 和 3.1。Mosquitto 重量轻,适用于从低功耗单板计算机到全服务器的所有设备。 MQTT 协议提供了一种使用发…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...
【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
