docker 部署 mongodb 集群【建议收藏】

一、简洁搭建mognodb副本集

  • 环境说明

我都是在云服务器上搭建的,CentOS7,Docker环境,版本忘记了。我就直接在同一台服务器上搭建三个mongodb即可。

1、基本信息如下

服务器地址 www.it307.top

副本集名称 rs

容器节点及端口映射

​ m0 37017:27017

​ m1 47017:27017

​ m2 57017:27017

注:机器环境安装docker

2、部署步骤

2.1、下载mongo镜像

docker pull mongo

其实不用下载也可以,创建容器的时候会自动下载的。

2.2、启动三个节点

docker run --name m0 -p 37017:27017 -d mongo --replSet "rs"
docker run --name m1 -p 47017:27017 -d mongo --replSet "rs"
docker run --name m2 -p 57017:27017 -d mongo --replSet "rs"

--replSet "rs"如果不集群,就不要添加这个,添加了访问不了。

在这里插入图片描述

2.3、连接任意一个节点,进行副本集配置

  • 进入其中一个容器

随便进入一个即可,没有要求。也并不是说进入这个就是住节点。

docker exec -it m0  /bin/bash
  • 连接三个节点中的任意一个,注意ip地址为宿主机ip,我当前的为 www.it307.top。我有域名绑定的。

好像链接的这个节点就是主节点了

mongo --host www.it307.top --port 37017

在这里插入图片描述

此时已连接到m0节点,进行副本集配置。我们值在m0这台mongodb中配置就可以了,其他两个副本不需要配置的。

var config={_id:"rs",members:[{_id:0,host:"www.it307.top:37017"},{_id:1,host:"www.it307.top:47017"},{_id:2,host:"www.it307.top:57017"}
]};
rs.initiate(config)

在这里插入图片描述

响应应该类似下面,注意此时命令提示符已经发生变化,由原来的 > 变成了rs:SECONDARY>

在这里插入图片描述

2.4、查看副本集配置信息

rs.conf()

在这里插入图片描述

2.5、查看副本集状态

rs.status()

在这里插入图片描述

这样就搭建完成了。

3、测试

将这个太mongodb链接上,并且这三台mongodb是没有user这个数据库的。

在这里插入图片描述

我在37017这个mongodb里面添加一条数据,因为这台mongodb是主mongodb不是副本。副本是不能添加数据的,我们在上面配置的时候,只配置37017这台mongodb的。

37017这台mognodb中插入数据后,数据在三台mongodb都会存在。这样副本就搭建成功。

在这里插入图片描述

二、详细搭建mongodb副本集

需要将配置文件和数据保存目录都挂在到宿主机上,部署副本、集群和分片这种事情应该是在不同的机器上操作的,但是条件有限。我就全部在同一台机器上操作,利用不同的端口区分和不同的保存目录区分即可。

注意:本来是想将数据挂载到宿主机,然后开启认证。但是最终效果没有实现,所以只是为了做副本,能够使用事务的话。暂时我的解决思路是:启动两个mongodb,设置一个主机节点和副本节点,副本节点不要认证,但是端口号不要开放,Linux不要开放副本节点的端口号,然后将主节点设置为认证的方式,这样就可以使用副本了。

2.1、创建文件

2.1.1、创建配置文件保存目录和数据保存目录

mkdir -p /opt/mongodb/{/m0/data,/m0/conf,/m0/logs,/m1/conf,/m1/logs,/m2/data,/m2/data,/m2/conf,/m2/logs}

2.1.2、创建秘钥文件

因为使用集群以后,mongodb就会使用一个秘钥文件开做校验。集群之间使用的这个秘钥文件必须一样,可以生成一份出来复制到不同机器,我的是同一台机器,我就复制到不同文件里面。必须是同一份,同一份。

  • 生成和设置权限
openssl rand -base64 756 > /opt/mongodb/mongodbKeyfile.key
chmod 400 /opt/mongodb/mongodbKeyfile.key
  • 分别复制到三个节点下面
cp /opt/mongodb/mongodbKeyfile.key /opt/mongodb/m0/conf
cp /opt/mongodb/mongodbKeyfile.key /opt/mongodb/m1/conf
cp /opt/mongodb/mongodbKeyfile.key /opt/mongodb/m2/conf

分别将这个秘钥文件复制到这三个节点的conf目录下面。

2.2、配置文件

注意:我们的配置文件目录分别是 /opt/mongodb/m0/conf/opt/mongodb/m1/conf/opt/mongodb/m2/conf,上面这个命令已经创建建了。

/opt/mongodb/m0,m1,m2/conf目录下面分别创建 mongod.conf配置文件,分别写入一下内容。三个节点都需要写。注意:当前文件使用的是yml语法,如果格式不好确定,可以在idea开发工具里面写好在复制过来。

直接创建一个直接复制的,下面有现成命令。

net:port: 27017 # 这是启动端口bindIp: 0.0.0.0  # 允许哪些ip连接(好像和下面的命令参数 --bind_ip_all 相类似的作用)
systemLog:logAppend: true #  重新启动的mongodb的时候日志拼接在以前的日志文件上,不用新建
security:keyFile: /data/configdb/mongodbKeyfile.key  # 这个路径很重要(注意这个路径是下面容器映射过的路径),不要写宿主机的绝对路径,容器是访问不到宿主机的,应该写容器中的路径。authorization: "enabled" # 开启客户端连接验证
replication:replSetName: "rs"  # 副本集的名称

特别强调这个问题,容器是不能访问宿主机的。所以配置文件里面配置的路径,一定要写容器对应的路径,千万不能写宿主机上的路径。因为容器是不能访问宿主机的,切记!!!切记!!!

在这里插入图片描述

  • 直接创建一个,复制到其他两个节点下
vim /opt/mongodb/m0/conf/mongod.conf

写入上面的配置文件,然后直接复制到其他节点下面。

cp /opt/mongodb/m0/conf/mongod.conf /opt/mongodb/m1/conf/
cp /opt/mongodb/m0/conf/mongod.conf /opt/mongodb/m2/conf/

2.3、创建启动命令

首先不要增加任何认证,先启动不用认证的mongodb,在里面将需要的集合、副本和用户名密码权限等信息创建好,在使用需要认证的命令重新创建容器。因为配置的信息已经映射到宿主机上了,只要不把宿主机上的数据删除,所有配置都是存在的。

mkdir -p /opt/docker
vim /opt/docker/mongodb.sh
  • 不用认证的命令
MONGODB_DIR=/opt/mongodb/m0
NAME=mognoM0
PORT=37017
docker stop ${NAME}
docker rm ${NAME}
docker run -p ${PORT}:27017 \--name ${NAME} \-v ${MONGODB_DIR}/data:/data/db \-v ${MONGODB_DIR}/conf:/data/configdb \-v ${MONGODB_DIR}/logs:/data/log \-d mongo:4.2.5 \--replSet "rs"MONGODB_DIR=/opt/mongodb/m1
NAME=mognoM1
PORT=47017
docker stop ${NAME}
docker rm ${NAME}
docker run -p ${PORT}:27017 \--name ${NAME} \-v ${MONGODB_DIR}/data:/data/db \-v ${MONGODB_DIR}/conf:/data/configdb \-v ${MONGODB_DIR}/logs:/data/log \-d mongo:4.2.5 \--replSet "rs"MONGODB_DIR=/opt/mongodb/m2
NAME=mognoM2
PORT=57017
docker stop ${NAME}
docker rm ${NAME}
docker run -p ${PORT}:27017 \--name ${NAME} \-v ${MONGODB_DIR}/data:/data/db \-v ${MONGODB_DIR}/conf:/data/configdb \-v ${MONGODB_DIR}/logs:/data/log \-d mongo:4.2.5 \--replSet "rs"

--replSet "rs" 表示集群的名称,我在配置文件里面写了,但是这里写上是没问题的,不写我不知道可不可以,应该是可以的吧。增加这个配置就说明是集群了,所以单体的还是不要增加。


  • 启动
sh /opt/docker/mongodb.sh

使用 docker ps查询是否全部启动成功。

在这里插入图片描述

2.4、配置副本

  • 连接任意一个节点,进行副本集配置

随便进入,进入哪个都行。注意:我这里起的容器名和第一章的容器名不同。

在这里插入图片描述

docker exec -it mognoM0 /bin/bash

连接三个节点中的任意一个,链接这个就是主节点。

mongo --host www.it307.top --port 37017

注意:如果安全组这些设置的很严格,这里填写内网地址。

  • 配置副本

这里在一个mongodb里面配置就行了,会自动同步到其他mognodb中的。

var config={_id:"rs",members:[{_id:0,host:"www.it307.top:37017",priority:3},{_id:1,host:"www.it307.top:47017",priority:2},{_id:2,host:"www.it307.top:57017",priority:1}
]};
rs.initiate(config)

在这里插入图片描述

在这里插入图片描述

这样副本就配置完成了,但是当前是不需要认证的。在线上环境我们需要用户名和密码认证。

  • 查看副本集配置信息
 rs.conf()

在这里插入图片描述

  • 查看副本集状态
rs.status()

在这里插入图片描述

2.5、创建用户名和密码

  • 创建用户

随意进入一个MongoDB容器,然后在这台容器里面分别登录其他MongoDB。直接使用MongoDB连接工具连接,然后直接在工具里面创建用户也可以。现在都是么有用户名和密码的,可以随便登录访问的。

如果当前是在mongodb里面,进入容器和登录mongodb这两个命令就可以不用了。如果不喜欢Linux界面操作,可以直接使用mongodb链接工具,直接链接上mongodb操作也可以的。

docker exec -it mognoM0 /bin/bash
  • 登录第一个MongoDB
mongo --host www.it307.top --port 37017
  • 切换数据库和创建用户
use user_db
db.createUser({ user: 'admin', pwd: 'admin123', roles: [ { role: "root", db: "admin" } ] });
db.auth('admin', 'admin123');

这里需要注意权限的问题,权限给root似乎太大了,但是也不能给太小,给太小会发现干啥都没权限。

在这里插入图片描述



一下为说明

use user_db  # 切换到user_db 这个数据,给user_db这个数据创建用户
db.createUser({user: 'userDb',  # 用户名pwd: '123456',  # 密码roles:[{role: 'root',  # 角色db: 'admin'  # 数据库,这个是不用改变的,意思是角色保存的数据库吧。}]
})db.auth('userDb', '123456') # 如果返回 1 说明用户名和密码没有问题,返回 0 说明用户名和密码不正确吧
show users  # 查看当前库下的用户db.dropUser('testadmin')  # 删除用户db.updateUser('admin', {pwd: '654321'})  # 修改用户密码db.auth('admin', '654321')  # 密码认证

2.6、创建需要认证的启动命令

  • 先退出mongodb和容器,回到宿主机
exit
exit

把原来的启动命令删除,重新编辑启动命令。

rm -rf /opt/docker/mongodb.sh
vim /opt/docker/mongodb.sh
  • 写入启动命令
MONGODB_DIR=/opt/mongodb/m0
NAME=mognoM0
PORT=37017
docker stop ${NAME}
docker rm ${NAME}
docker run -p ${PORT}:27017 \--name ${NAME} \-v ${MONGODB_DIR}/data:/data/db \-v ${MONGODB_DIR}/conf:/data/configdb \-v ${MONGODB_DIR}/logs:/data/log \-v /data/mongod/conf/keyfile/:/data/keyfile/ \--privileged \--restart=always \-d mongo:4.2.5 \--replSet "rs"  --bind_ip_all -f "/data/configdb/mongod.conf"MONGODB_DIR=/opt/mongodb/m1
NAME=mognoM1
PORT=47017
docker stop ${NAME}
docker rm ${NAME}
docker run -p ${PORT}:27017 \--name ${NAME} \-v ${MONGODB_DIR}/data:/data/db \-v ${MONGODB_DIR}/conf:/data/configdb \-v ${MONGODB_DIR}/logs:/data/log \--privileged \--restart=always \-d mongo:4.2.5 \--replSet "rs"  --bind_ip_all -f "/data/configdb/mongod.conf"MONGODB_DIR=/opt/mongodb/m2
NAME=mognoM2
PORT=57017
docker stop ${NAME}
docker rm ${NAME}
docker run -p ${PORT}:27017 \--name ${NAME} \-v ${MONGODB_DIR}/data:/data/db \-v ${MONGODB_DIR}/conf:/data/configdb \-v ${MONGODB_DIR}/logs:/data/log \--privileged \--restart=always \-d mongo:4.2.5 \--replSet "rs"  --bind_ip_all -f "/data/configdb/mongod.conf"

--restart=always:容器自动启动,docker启动后容器就自动启动了。

--replSet "rs":容器名称,配置文件里面指定过了,但是这里指定也没有问题。这里不指定可不可以不太清楚。

-f:配置文件地址,虽然配置文件我们做了挂在,但是这里必须指定,否则配置文件没有效果的。并且这里路径一定是容器的地址,绝对不能写宿主机上的地址。因为容器是不能访问宿主机的。

特别注意:这里的 -f表示指定配置文件的地址,一定要写容器里面的路径。容器是访问不了宿主机的。

  • 重启mongodb
sh /opt/docker/mongodb.sh

2.7、测试

在主节点37017机器下面创建一条数据,然后再副本中查询,三台机器上都可以查询到,说明副本搭建成功。

在这里插入图片描述

2.8、关闭容器删除容器和删除本地数据

  • 关闭所有容器
docker stop mognoM0 mognoM1 mognoM2
  • 删除容器
docker rm mognoM0 mognoM1 mognoM2
  • 删除本地数据
rm -rf /opt/mongodb
rm -rf /opt/docker/mongodb.sh

三、springdataMongoDB实现事务处理

  • 引入依赖
<!---mongodb相关依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
  • yml配置
server:port: 8083spring:data:mongodb:# mongodb://用户名:密码@链接地址1:端口号,链接地址2:端口号,……/连接的数据库uri: mongodb://admin:admin123@www.it307.top:37017,www.it307.top:47017,www.it307.top:57017/user_dblogging:level:org.springframework.data.mongodb.core: debug # 显示操作的mognodb语句,开发环境使用

切记,一定不能再路径后面增加以下语句,不能增加,不能增加,不能增加。

?slaveOk=true&replicaSet=repl&write=1&readPreference=secondaryPreferred&connectTimeoutMS=300000
  • 配置事务
package com.mongodb.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.MongoTransactionManager;@Configuration
public class MongoTransactionConfig {@Beanpublic MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {return new MongoTransactionManager(dbFactory);}
}
  • 使用事务
@Transactional(rollbackFor = Exception.class)

直接在需要使用事务的上面打上这个注解即可。但是 @Test下面测试好像事务不生效的。

  • 案例

控制层

@PostMapping("/transactional")
public void mongodbTransactional(){userService.mongodbTransactional();
}
@Transactional(rollbackFor = Exception.class)
@Override
public void mongodbTransactional() {UserDO user = new UserDO();user.setId(ObjectId.get());user.setMobile("18580759247");user.setNickname("我靠你大爷的");mongoTemplate.save(user);user.setId(ObjectId.get());mongoTemplate.insert(user);System.out.println(1/0); // 这里会报错误,如果这里不报错误,那么上面就会增加成功,这里报错误了,上面增加的数据都会被回滚。
}

四、常见的问题

Cannot create namespace user_db.user in multi-document transaction.; nested exception is com.mongodb.MongoWriteException: Cannot create namespace user_db.user in multi-document transaction.

在这里插入图片描述

不能再分布式事务中创建文档XXX,使用MongoDB连接工具连接上集群的所有MongoDB,在里面插入一条数据,这是相应的集合就创建了,在使用java程序就不会出现这个问题。

这里面只能有一台主节点才能插入数据的,所以要试着看,总有一台式能插入的。

在这里插入图片描述

注意:创建容器的时候,配置的路径一定是容器里面的路径,访问不到宿主机的。


command insert requires authentication

在这里插入图片描述

这个问题是权限不够,创建用户的时候我们给那个用户的角色太小,没有权限操作。给这个用户附一个大一点的权限,有相关操作的权限即可。


Error reading file /opt/mongodb/m1/conf/mongodbKeyfile.key: No such file or directory

在这里插入图片描述

这个问题就是配置文件里面配置的路径或者启动命令上指定配置文件的路径写错了。注意:这个路径一定要写容器的路径,千万不能写宿主机的路径。虽然容器的路径已经挂在到宿主机相应的文件里面,但是容器是不能访问宿主机的,所以必须写容器里面的路径。写容器的路径,容器路径,切记!!!切记!!!切记!!!

Timed out after 30000 ms while waiting for a server that matches com.mongodb.client.internal.MongoClientDelegate$1@71bfc42c. Client view of cluster state is {type=REPLICA_SET, servers=[]; nested exception is com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches com.mongodb.client.internal.MongoClientDelegate$1@71bfc42c. Client view of cluster state is {type=REPLICA_SET, servers=[]

在这里插入图片描述

这种情况就是主节点挂了,最后只有一个从节点,没有办法实现一个主节点一个从节点的最低要求了。使用一下命令查看一下

rs.status()

在这里插入图片描述

一定要用命令查看状态,可能docker容器是运行的,但是MongoDB已经不再正常的运行了。

  • docket启动容器报一下错误
docker: Error response from daemon: driver failed programming external connectivity on endpoint mognoM0 (68acee746dba74982afecf366dc5e18dd2fa8cc2298816482ad1f550a0589363):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 37017 -j DNAT --to-destination 172.18.0.5:27017 ! -i docker0: iptables: No chain/target/match by that name.

五、快速卸载当前配置的容器和数据

除了安装mongodb操作意外,千万不能使用。这个命令下去,所有的数据和容器都全毁了。

docker stop mognoM0 mognoM1 mognoM2
docker rm mognoM0 mognoM1 mognoM2
rm -rf /opt/mongodb /opt/docker

解决方法,直接重启docker

systemctl restart docker

在这里插入图片描述

六、注意事项

  • 凡是出现什么问题,第一就是看日志。容器查看日志方式。
docker logs 容器名称 | 容器id
  • 集群配置,配置文件配置的地址和启动命令上指定的地址,一定要写容器地址,千万不能写宿主机地址。容器不能访问宿主机,如果直接写宿主机的地址,会提示么有这样的文件或者目录等等。错误信息里面有相关说明。

  • 如果配置文件指定集群名称 replSetName: "rs"或者启动命令上指定集群名称 --replSet "rs"。如果不配置集群,那么会提示不是主节点的错误信息。所以必须先配置集群信息,也就是副本信息,然后再做操作。所以:上面我都是先创建副本了在创建用户信息的。

七、部署的时候注意

有些使用我将庞大的后端你系统部署上去以后,MongoDB挂了。虽然docker容器是启动的,但是实际上已经没有工作了,可以使用 rs.status()命令查看到。这个时候我们在将docker容器关闭,重新启动。或者直接执行docker容器创建命令也可以,但是每次都会出现启动失败,直接将docker重启在去执行MongoDB创建命令,最后查看状态,运行正常。

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

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

相关文章

数据结构——6.1 图的基本概念

第六章 图 6.1 图的基本概念 概念 图的概念&#xff1a;G由点集V和边集E构成&#xff0c;记为G(V,E)&#xff0c;边集可以为空&#xff0c;但是点集不能为空 注意&#xff1a;线性表可以是空表&#xff0c;树可以是空树&#xff0c;但图不可以是空&#xff0c;即V一定是非空集…

leetcode:63.不同路径二

dp数组含义&#xff1a;由初始位置到最终位置路径个数 递推公式&#xff1a;如果没有障碍再进行递推公式 初始化&#xff1a;1.若起始位置和终止位置有障碍路径个数为0 2.dp[i][0] 1和dp[0][j] 1的for循环条件都需要加上一个and dp[i][0] 0和and dp[0][j] 0. 3.遍历顺序…

案例:三台主机实现 级联复制

介绍&#xff1a;级联复制架构 级联复制架构 是一种特殊的主从结构&#xff0c;之前聊到的几种主从结构都只有两层&#xff0c;但级联复制架构中会有三层&#xff0c;关系如下&#xff1a; 也就是在级联复制架构中&#xff0c;存在两层从库&#xff0c;这实际上属于一主多从架…

Deepin基本环境查看(九)【被封印的创世神】

文章目录 - 相关文章目录1、概述2、Deepin中的创世神和管理员1&#xff09;创世神root2&#xff09;root被封印原因3&#xff09;其他的神灵【管理员】 3、神殿管理【su与sudo】1&#xff09;su&#xff08;Switch User&#xff09;2&#xff09;sudo&#xff08;Superuser Do&…

Open CASCADE学习|环形弹簧建模

目录 Draw Test Harness&#xff1a; C&#xff1a; 环形弹簧&#xff0c;也称为弓簧&#xff0c;是由拉伸弹簧和连接弹簧构成的。在结构上&#xff0c;环形弹簧通常包括端环、外环和内环&#xff0c;其主要参数包括弹簧的内径、外径和自由高度。环形弹簧的一个显著特点是&am…

计算机毕业设计SSM基于的冷链食品物流信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; vue mybatis Maven mysql5.7或8.0等等组成&#xff0c;B…

网络原理(一)

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网络原理(一) 一. 应用层 应用层是和程序员联系最密切的一层,对于应用层来说,程序员可以自定义应用层协议,应用层的协议一般要约定好以下两部分内容: 根据需求,明确要传输哪些信…

[算法学习]

矩阵乘法 只有当左矩阵列数等于右矩阵行数&#xff0c;才能相乘N*M的矩阵和M*K的矩阵做乘法后矩阵大小为N*k矩阵乘法规则&#xff1a;第一个矩阵A的第 i 行与第二个矩阵的第 j 列的各M个元素对应相乘再相加得到新矩阵C[i][j]的值 整除 同余 同余的性质 线性运算&#xff0c;…

Android:Cordova,JavaScript操作设备功能

Cordova学习 Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头、麦克风等。 Cordova还提供了一组统一的JavaScript类库,以及为这些类库所用的设备相关的原生后台代码。 Cordova是PhoneGap贡献给Apache后的开源项目,是从…

最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(一)项目概述

黑马程序员最新Java项目实战《苍穹外卖》&#xff0c;最适合新手的SpringBootSSM的企业级Java项目实战。 项目简介 《苍穹外卖》项目的定位是一款为餐饮企业&#xff08;餐厅、饭店&#xff09;定制的软件产品。该项目是一个在线外卖订购系统&#xff0c;顾客可以通过网站或者…

Java安全 CC链1分析(Lazymap类)

Java安全 CC链1分析 前言CC链分析CC链1核心LazyMap类AnnotationInvocationHandler类 完整exp&#xff1a; 前言 在看这篇文章前&#xff0c;可以看下我的上一篇文章&#xff0c;了解下cc链1的核心与环境配置 Java安全 CC链1分析 前面我们已经讲过了CC链1的核心ChainedTransf…

TestNG基础教程

TestNG基础教程 一、常用断言二、执行顺序三、依赖测试四、参数化测试1、通过dataProvider实现2、通过xml配置&#xff08;这里是直接跑xml&#xff09; 五、testng.xml常用配置方式1、分组维度控制2、类维度配置3、包维度配置 六、TestNG并发测试1、通过注解来实现2、通过xml来…

Makefile编译原理 make 中的路径搜索_2

一.make中的路径搜索 VPATH变量和vpath关键字同时指定搜索路径。 实验1 VPATH 和 vpath 同时指定搜索路径 mhrubuntu:~/work/makefile1/18$ tree . ├── inc │ └── func.h ├── main.c ├── makefile ├── src1 │ └── func.c └── src2 └── func.c mak…

【正在更新】从零开始认识语音识别:DNN-HMM混合系统语音识别(ASR)原理

摘要 | Abstract TO-BE-FILLED 1.前言 | Introduction 近期想深入了解语音识别(ASR)中隐马尔可夫模型(HMM)和深度神经网络-隐马尔可夫(DNN-HMM)混合模型&#xff0c;但是尽管网络上有许多关于DNN-HMM的介绍&#xff0c;如李宏毅教授的《深度学习人类语言处理》[1]&#xff0c;…

火车可视化调车系统

列车在调车作业时&#xff0c;当机车头在尾部推动车厢时&#xff0c;司机室一人操控机车&#xff0c;车厢前端配备两名挂梯随车运行调车员&#xff0c;调车员人为分析行车方向是否有障碍、轨道行人等紧急情况&#xff0c;通过对讲机通知司机控制停车。由于司机无法直观观察列车…

逆向实战29——某度 某家号2024旋转验证码识别

前言 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 目标网站 aHR0cHM6Ly9hd…

Linux下的文件权限与访问控制:守护你的数据宝藏

引言 在Linux这片广袤的领域中&#xff0c;文件权限与访问控制犹如守护宝藏的魔法阵&#xff0c;它们确保你的系统安全、数据不被窥探。对于初学者而言&#xff0c;了解并掌握这些魔法阵的奥秘&#xff0c;是成为一名合格Linux巫师的必经之路。那么&#xff0c;就让我们一起揭…

Redis核心技术与实战【学习笔记】 - 28.Redis 6.0新特性(多线程、客户端缓存与安全)

简述 Redis 6.0 新增了几个关键新特性&#xff0c;分别是面向网络处理的多 IO 线程、客户端缓存、细粒度的权限控制&#xff0c;以及 RESP 3 协议的使用。 其中&#xff0c;面向网络处理的多 IO 线程可以提高网络请求处理的速度&#xff0c;而客户端缓存可以让应用直接在客户…

fast.ai 深度学习笔记(二)

深度学习 2&#xff1a;第 1 部分第 4 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-4-2048a26d58aa 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这…

【机器学习300问】22、什么是超参数优化?常见超参数优化方法有哪些?

在之前的文章中&#xff0c;我主要介绍了学习率 η和正则化强度 λ 这两个超参数。这篇文章中我就主要拿这两个超参数来进行举例说明。如果想在开始阅读本文之前了解这两个超参数的有关内容可以参考我之前的文章&#xff0c;文章链接为你放在了这里&#xff1a; 【机器学习300…