k8s搭建一主三从的mysql8集群---无坑

一,环境准备

1.1 k8s集群服务器

ip角色系统主机名cpumem
192.168.40.129mastercentos7.9k8smaster48
192.168.40.130node1centos7.9k8snode148
192.168.40.131node2centos7.9k8snode248
192.168.40.132node3centos7.9k8snode348

k8s集群操作请参考《K8s安装部署(v1.28)--超详细(cri-docker作为运行时)-CSDN博客》 

1.2 nfs服务器器

ip角色系统主机名cpumem用图
192.168.40.129mastercentos7.9k8smaster48k8s主服务器

nfs服务器
192.168.40.130node1centos7.9k8snode148k8s的工作节点
需要装nfs软件
192.168.40.131node2centos7.9k8snode248k8s的工作节点
需要装nfs软件
192.168.40.132node3centos7.9k8snode348k8s的工作节点
需要装nfs软件

二,安装nfs服务

2.1  安装(所有节点)

因为需要在三个工作节点上连接nfs,所以工作节点上也要安装

yum install -y nfs-utils

2.2 暴露nfs目录(只暴露nfs主服务器)

要安装四台mysql(一主三从),所以我们要创建四个目录用于这四台服务器。

直接在nfs服务器(k8s-master:192.168.40.129)当中创建这三个目录并写入 /etc/exports 文件夹中(创建的目录可以修改):

mkdir -p /data/nfs/{mysql-master,mysql-slaver-01,mysql-slaver-02,mysql-slaver-03}
cat >> /etc/exports << EOF
/data/nfs/mysql-master *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-01 *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-02 *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-03 *(rw,sync,no_root_squash)
EOF

如果目录不为空,需要清空

rm -rf /data/nfs/mysql-master/*
rm -rf /data/nfs/mysql-slaver-01/*
rm -rf /data/nfs/mysql-slaver-02/*
rm -rf /data/nfs/mysql-slaver-03/*

 2.3 开启nfs服务器

直接在主服务器(192.168.40.129)上启动nfs服务器。

systemctl enable --now nfs-server

 2.4 测试nfs服务

我们可以通过这行命令来检查目录是否暴露成功: 注意修改为自己的nfs服务器地址

showmount -e 192.168.40.129

 

三,搭建MySql集群

3.1 创建命名空间

创建一个命名空间来部署MySQL集群,当然你也可以使用默认的Default命名空间。这里就用 mysql-cluster 命名空间来搭建集群了,首先我们将这个命名空间创建出来:

创建yaml

kubectl create namespace mysql-cluster --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:creationTimestamp: nullname: mysql-cluster
spec: {}
status: {}

 将上面内容 保存到mysql-ns.yaml中

 执行命令

kubectl apply -f mysql-ns.yaml

查看名称空间

kubectl get ns

3.2 创建MySQL密码的Secret

创建一个存储了MySQL密码的Secret,直接使用这行命令生成这个Secret的资源清单文件:
注意修改root的密码和命名空间,我的root密码设置为的是123456

kubectl create secret generic mysql-password --namespace=mysql-cluster --from-literal=mysql_root_password=123456 --dry-run=client -o=yaml
apiVersion: v1
data:mysql_root_password: MTIzNDU2
kind: Secret
metadata:creationTimestamp: nullname: mysql-passwordnamespace: mysql-cluster

将上述yaml内容保存到  mysql-secret.yaml 

kubectl apply -f  mysql-secret.yaml 

查看创建的密码

 kubectl get secret -n mysql-cluster

  

3.3 编写MySQL主节点yaml

3.3.1 创建pv和pvc

我们之前安装了nfs,现在我们可以给予那些目录创建pv和pvc, 注意nfs地址和路径


apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-master-nfs-pvnamespace: mysql-cluster
spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:# 注意修改IP地址和暴露的目录(如果不一样)server: 192.168.40.129path: /data/nfs/mysql-masterstorageClassName: "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-master-nfs-pvcnamespace: mysql-cluster
spec:accessModes:- ReadWriteManystorageClassName: "nfs"resources:requests:storage: 1GivolumeName: mysql-master-nfs-pv

3.3.2 创建主节点mysql配置文件

我们需要为主节点准备一个 my.cnf 配置文件,文件内容如下: 

[mysqld]
skip-host-cache
skip-name-resolve
datadir          = /var/lib/mysql
socket           = /var/run/mysqld/mysqld.sock
secure-file-priv = /var/lib/mysql-files
pid-file         = /var/run/mysqld/mysqld.pid
user             = mysql
secure-file-priv = NULL
server-id        = 1
log-bin          = master-bin
log_bin_index    = master-bin.index
binlog_do_db     = test_db
binlog_ignore_db = information_schema
binlog_ignore_db = mysql
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
binlog-format    = ROW[client]
socket           = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/

有那么几个配置需要注意一下那么几个配置:

  • # server id,要注意多个mysql节点唯一

server-id        = 1

  • # 生成的logbin的文件名

log-bin          = master-bin
log_bin_index    = master-bin.index

  • # 同步哪个数据库,这里我们为了测试之同步test_db这个数据库

binlog_do_db     = test_db

  • # 排除哪个数据库,可以写多行,排除的数据库不会被主从同步,这里写上mysql自带的几个数据库

binlog_ignore_db = information_schema
... # 还有几行省略

  • # binlog的格式

binlog-format    = ROW

创建一个ConfigMap来存储这个配置文件。可以使用以下配置生成yaml资源清单文件内容:

kubectl create configmap mysql-master-cm -n mysql-cluster --from-file=mysql.cnf --dry-run=client -o yaml

apiVersion: v1
data:my.cnf: |[mysqld]skip-host-cacheskip-name-resolvedatadir          = /var/lib/mysqlsocket           = /var/run/mysqld/mysqld.socksecure-file-priv = /var/lib/mysql-filespid-file         = /var/run/mysqld/mysqld.piduser             = mysqlsecure-file-priv = NULLserver-id        = 1log-bin          = master-binlog_bin_index    = master-bin.indexbinlog_do_db     = test_dbbinlog_ignore_db = information_schemabinlog_ignore_db = mysqlbinlog_ignore_db = performance_schemabinlog_ignore_db = sysbinlog-format    = ROW[client]socket           = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:name: mysql-master-cmnamespace: mysql-cluster

3.3.3 创建主节点服务Service


apiVersion: v1
kind: Service
metadata:name: mysql-master-svcnamespace: mysql-clusterlabels:app: mysql-master
spec:ports:- port: 3306name: mysqltargetPort: 3306nodePort: 30306selector:app: mysql-mastertype: NodePortsessionAffinity: ClientIP

注意端口设置 

3.3.4 创建主节点的StatefulSet


apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-masternamespace: mysql-cluster
spec:selector:matchLabels:app: mysql-masterserviceName: "mysql-master-svc"replicas: 1template:metadata:labels:app: mysql-masterspec:terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:8.0.34image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-confmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-master-nfs-pvc- name: mysql-confconfigMap:name: mysql-master-cmitems:- key: my.cnfmode: 0644path: my.cnf

 注意mysql的镜像,可以找其他可用镜像替换。

3.3.5 完整的主节点配置yaml

一个完整的主节点yaml 包含PersistentVolume,PersistentVolumeClaim,ConfigMap,Service,StatefulSet 如下:


apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-master-nfs-pvnamespace: mysql-cluster
spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:# 注意修改IP地址和暴露的目录(如果不一样)server: 192.168.40.129path: /data/nfs/mysql-masterstorageClassName: "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-master-nfs-pvcnamespace: mysql-cluster
spec:accessModes:- ReadWriteManystorageClassName: "nfs"resources:requests:storage: 1GivolumeName: mysql-master-nfs-pv---
apiVersion: v1
data:my.cnf: |[mysqld]skip-host-cacheskip-name-resolvedatadir          = /var/lib/mysqlsocket           = /var/run/mysqld/mysqld.socksecure-file-priv = /var/lib/mysql-filespid-file         = /var/run/mysqld/mysqld.piduser             = mysqlsecure-file-priv = NULLserver-id        = 1log-bin          = master-binlog_bin_index    = master-bin.indexbinlog_do_db     = test_dbbinlog_ignore_db = information_schemabinlog_ignore_db = mysqlbinlog_ignore_db = performance_schemabinlog_ignore_db = sysbinlog-format    = ROW[client]socket           = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:name: mysql-master-cmnamespace: mysql-cluster---apiVersion: v1
kind: Service
metadata:name: mysql-master-svcnamespace: mysql-clusterlabels:app: mysql-master
spec:ports:- port: 3306name: mysqltargetPort: 3306nodePort: 30306selector:app: mysql-mastertype: NodePortsessionAffinity: ClientIP---apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-masternamespace: mysql-cluster
spec:selector:matchLabels:app: mysql-masterserviceName: "mysql-master-svc"replicas: 1template:metadata:labels:app: mysql-masterspec:terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:8.0.34image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-confmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-master-nfs-pvc- name: mysql-confconfigMap:name: mysql-master-cmitems:- key: my.cnfmode: 0644path: my.cnf

将上面的yaml 保存到 mysql-master.yaml 中,为后续部署准备 

3.4 编写MySQL从节点yaml

有了上面主节点的配置的yaml文件,我们可以根据它适当改下配置,作为从节点配置yaml

3.4.1 从节点共用Service配置

从节点我共用个service,保存到 mysql-slave-service.yaml ,配置如下

apiVersion: v1
kind: Service
metadata:name: mysql-slave-svcnamespace: mysql-clusterlabels:app: mysql-slave
spec:ports:- port: 3306name: mysqltargetPort: 3306nodePort: 30308selector:app: mysql-slavetype: NodePortsessionAffinity: ClientIP

3.4.2 从节点yaml配置

我们还是需要 PersistentVolume,PersistentVolumeClaim,ConfigMap,StatefulSet,只是已经把Service 独立成共用的了。无需在做配置

3.4.2.1 配置ConfigMap

从节点的ConfigMap稍微不一样

我们先编写my.cnf 如下

[mysqld]
skip-host-cache
skip-name-resolve
datadir          = /var/lib/mysql
socket           = /var/run/mysqld/mysqld.sock
secure-file-priv = /var/lib/mysql-files
pid-file         = /var/run/mysqld/mysqld.pid
user             = mysql
secure-file-priv = NULL
server-id        = 2
log-bin          = slave-bin
relay-log        = slave-relay-bin
relay-log-index  = slave-relay-bin.index[client]
socket           = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/

几个配置需要注意一下 

  • # server id,注意不同节点要不一样

server-id        = 3

  • # 从节点的logbin文件

log-bin          = slave-bin
relay-log        = slave-relay-bin
relay-log-index  = slave-relay-bin.index
 

还是用 生成yaml配置文件的方式 执行下 

kubectl create configmap mysql-slave-02-cm -n mysql-cluster --from-file=my.cnf --dry-run=client -o yaml

apiVersion: v1
data:my.cnf: |[mysqld]skip-host-cacheskip-name-resolvedatadir          = /var/lib/mysqlsocket           = /var/run/mysqld/mysqld.socksecure-file-priv = /var/lib/mysql-filespid-file         = /var/run/mysqld/mysqld.piduser             = mysqlsecure-file-priv = NULLserver-id        = 2log-bin          = slave-binrelay-log        = slave-relay-binrelay-log-index  = slave-relay-bin.index[client]socket           = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:name: mysql-slave-01-cmnamespace: mysql-cluster
3.4.2.2 从节点的完整yaml

从节点的完整yaml配置如下 

apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-slave-01-nfs-pvnamespace: mysql-cluster
spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.40.129path: /data/nfs/mysql-slaver-01storageClassName: "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-slave-01-nfs-pvcnamespace: mysql-cluster
spec:accessModes:- ReadWriteManystorageClassName: "nfs"resources:requests:storage: 1GivolumeName: mysql-slave-01-nfs-pv---
apiVersion: v1
data:my.cnf: |[mysqld]skip-host-cacheskip-name-resolvedatadir          = /var/lib/mysqlsocket           = /var/run/mysqld/mysqld.socksecure-file-priv = /var/lib/mysql-filespid-file         = /var/run/mysqld/mysqld.piduser             = mysqlsecure-file-priv = NULLserver-id        = 2log-bin          = slave-binrelay-log        = slave-relay-binrelay-log-index  = slave-relay-bin.index[client]socket           = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:name: mysql-slave-01-cmnamespace: mysql-cluster---apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-slave-01namespace: mysql-cluster
spec:selector:matchLabels:app: mysql-slaveserviceName: "mysql-slave-svc"replicas: 1template:metadata:labels:app: mysql-slavespec:terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:8.0.34image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-confmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-slave-01-nfs-pvc- name: mysql-confconfigMap:name: mysql-slave-01-cmitems:- key: my.cnfmode: 0644path: my.cnf

 注意:

  1. PersistentVolume 中的nfs地址、路径,以及pv名称
  2. PersistentVolumeClaim 中pv的名称要对应
  3. ConfigMap 中的server-id 不能一样
  4. StatefulSet 对应名称要一致

保存在 mysql-slave-01.yaml

3.4.2.3 复制从节点的配置

复制 mysql-slave-01.yaml 两份 分别为 mysql-slave-02.yaml 和mysql-slave-03.yaml ,改上述对应的位置的配置 (基本都是改1为2、3,或者改01为02、03

cp mysql-slave-01.yaml mysql-slave-02.yaml
cp mysql-slave-01.yaml mysql-slave-03.yaml

以上是所有的yaml配置,如下图

3.5 启动集群服务 

3.5.1 启动

kubectl apply -f .

3.5.2 k8s查看所有集群信息 

kubectl get all -n mysql-cluster -o wide

3.5.3 进入主节点查看状态

 kubectl exec -itn mysql-cluster pod/mysql-master-0 -- mysql -uroot -p

输入的密码123456(根据自己的配置改) 

查看状态命令

 show master status

还需要注意  File 的名称 master-bin.000003 ,Position 157,这个我们将在从节点加入集群时用到

这里面我们先 编写加入集群的命令,如下(暂时不执行

change master to master_host='mysql-master-0.mysql-master-svc.mysql-cluster.svc.cluster.local', master_port=3306, master_user='root', master_password='123456', master_log_file='master-bin.000003', master_log_pos=157, master_connect_retry=30, get_master_public_key=1;

需要注意下面的几个参数:

  • master_host: 这个参数是master的地址,kubernetes提供的解析规则是 pod名称.service名称.命名空间.svc.cluster.local ,所以我们master的mysql地址是 deploy-mysql-master-0.deploy-mysql-master-svc.deploy-test.svc.cluster.local
  • master_port: 主节点的mysql端口,我们没改默认是3306
  • master_user: 登录到主节点的mysql用户 master_password: 登录到主节点要用到的密码
  • master_log_file: 我们之前查看mysql主节点状态时候的 File 字段
  • master_log_pos: 我们之前查看mysql主节点状态时候的
  • Position 字段 master_connect_retry: 主节点重连时间
  • get_master_public_key: 连接主mysql的公钥获取方式 根据上面参数,

如果要修改那么请按照自己的环境进行修改。 

3.5.4 进入从节点 加入集群

 kubectl exec -itn mysql-cluster pod/mysql-slave-01-0 -- mysql -uroot -p

 输入密码

输入我们上面已经备好的脚本

change master to master_host='mysql-master-0.mysql-master-svc.mysql-cluster.svc.cluster.local', master_port=3306, master_user='root', master_password='123456', master_log_file='master-bin.000003', master_log_pos=157, master_connect_retry=30, get_master_public_key=1;

启动从节点集群

 start slave; 

 

查看从节点的集群状态 

 show slave status\G

其他02,03两个节点也是一样 

kubectl exec -itn mysql-cluster pod/mysql-slave-02-0 -- mysql -uroot -p 
kubectl exec -itn mysql-cluster pod/mysql-slave-03-0 -- mysql -uroot -p

 

3.5.5 查看各个节点启动状态

 3.5.5.1 根据nfs的目录文件判定

主节点

ll /data/nfs/mysql-master/

 从节点01

从节点02

 从节点03

3.5.5.2 使用管理工具登录

 输入我们的服务器地址、端口、用户名、密码,检查各个节点是否都能登录

四,测试主从集群

4.1 进入主节点 建库、建表、插入数据

kubectl exec -itn mysql-cluster pod/mysql-master-0 -- mysql -uroot -p

 建库、建表、插入数据 脚本如下

CREATE DATABASE `test_db`;
USE `test_db`;CREATE TABLE `user` (`user_id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '用户id',`username` VARCHAR(50) NOT NULL COMMENT '用户名',`age` TINYINT UNSIGNED DEFAULT 18 COMMENT '年龄',`gender` TINYINT UNSIGNED DEFAULT 2 COMMENT '性别;0=男,1=女,2=未知'
) COMMENT '用户表';INSERT INTO `user` (`username`, `age`, `gender`) VALUES ('oopxiajun', '18', '0');

4.2 在从库查看是否同步

4.2.1 使用工具

我们直接刷新从库看下

所有都刷新下看下

4.2.2 进入节点查看

 kubectl exec -itn mysql-cluster pod/mysql-slave-01-0 -- mysql -uroot -p

查看库

show databases;

 查看表

use test_db;
show tables;

查看数据

 select * from user;

结果如下

我们看到库、表、数据都是同步了的。 

五,总结

5.1 为什么需要Mysql的主从复制

对于构建基于MySQL的大规模、高性能应用来讲,需要使用水平扩展(集群)的数据库架构方式。在MySQL内建的复制功能可以实现,通过为服务器配置一个或多个备库的方式来进行数据同步。

同时复制功能不仅有利于构建高性能的应用,也是高可用性、可扩展性、容灾、备份以及数据仓库等工作的基础。

复制的基本原理是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。主库和备库之间可以有多种不同的组合方式。

5.2 主从同步原理

MySQL实际上是如何复制数据的。总的来说,复制有三个步骤:

  1. 在主库上开启记录二进制日志。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。
  2. 备库将主库的二进制日志复制到其本地的中继日志中。首先,备库会启动一个工作线程,称为I/O线程,I/O线程跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储(binlog dump)线程(该线程没有对应的SQL命令),这个二进制转储线程会读取主库上二进制日志中的事件。它不会对事件进行轮询。如果该线程追赶上了主库,它将进入睡眠状态,直到主库发送信号量通知其有新的事件产生时才会被唤醒,备库I/0线程会将接收到的事件记录到中继日志中。
  3. 备库的SQL线程执行最后一步,该线程从中继日志中读取事件并在备库执行,从而实现备库数据的更新。当SQL线程追赶上I/O线程时,中继日志通常已经在系统缓存中,所以中继日志的开销很低。SQL线程执行的事件也可以通过配置选项来决定是否写入其自己的二进制日志中,它对于我们稍后提到的场景非常有用。 

在这个过程中,涉及两个角色:

  1. Master角色 启用 binlog 日志:开启 binlog 日志,记录所有除查询以外的 SQL 命令
  2. Slave角色: Slave_IO: 复制 master 主机 binlog 日志文件里的 SQL 命令到本机的 relay-log(中继日志) 文件里。从服务器上的 I/O thread(读写线程) 负责读取主服务器 binlog 日志中的 SQL 命令,并将其写入到 Relay log(中继日志中); Slave_SQL: 执行本机 relay-log(中继日志) 文件里的 SQL 语句,实现与 Master 数据一致。从服务器中的 SQL thread(SQL 线程)读取中继日志中的 SQL 命令,并将其写入到 Slave 的数据库中; 

5.3 主从同步结构模式

主从的复制的结果模式设置需要注意几点:

  1. 一个MySQL备库实例只能有一个主库。
  2. 每个备库必须有一个唯一的服务器ID。
  3. 一个主库可以有多个备库(或者相应的,一个备库可以有多个兄弟备库)。
  4. 如果打开了log_slave_updates选项,一个备库可以把其主库上的数据变化传播到其他备库。 

5.4 常见的结构模式

  1. 单向复制:一主一从
  2. 一主多从:从 <—— 主 ——> 从,即一个主节点,多个从节点(我们本章实现)
  3. 链式复制:主 <—— 从<—— 从:即链式复制,第一个主节点,最后一个为从节点,中间的为主从节点
  4. 互为主从:主 <——> 主:也叫双主复制或者双向复制。需要解决冲突问题。 

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

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

相关文章

算法种类丰富,分析准确率业内领先的智慧能源开源了

一、简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;减少企业级应用约 95%的开发成本&#xff0c;在强大视频算…

Java | Leetcode Java题解之第450题删除二叉搜索树中的节点

题目&#xff1a; 题解&#xff1a; class Solution {public TreeNode deleteNode(TreeNode root, int key) {TreeNode cur root, curParent null;while (cur ! null && cur.val ! key) {curParent cur;if (cur.val > key) {cur cur.left;} else {cur cur.rig…

docker快速安装ELK

一、创建elk目录 创建/elk/elasticsearch/data/目录 mkdir -p /usr/local/share/elk/elasticsearch/data/ 创建/elk/logstash/pipeline/目录 mkdir -p /usr/local/share/elk/logstash/pipeline/ 创建/elk/kibana/conf/目录 mkdir -p /usr/local/share/elk/kibana/conf/ 二、创建…

基于ESP8266—AT指令连接阿里云+MQTT透传数据(1)

在阿里云创建MQTT产品的过程涉及几个关键步骤,主要包括注册阿里云账号、实名认证、开通MQTT服务实例、创建产品与设备等。以下是详细的步骤说明: 一、准备工作 访问阿里云官网,点击注册按钮,填写相关信息(如账号、密码、手机号等)完成注册。注册完成后,需要对账号进行实…

FOC电机驱动开发踩坑记录

关键技术 SVPWM电机磁场控制电流采样park变换和Clark变换滑膜观测器&#xff08;无感FOC&#xff09; SVPWM电机磁场控制 SVPWM主要思想是通过精确的对UVW三相电流的分时控制&#xff0c;来控制转子的合成力矩&#xff0c;达到目标方向&#xff0c;常用的是6分区的设计&…

Ubuntu 安装 Docker Compose

安装Docker Compose # 删除现有的 docker-compose&#xff08;如果存在&#xff09; sudo rm -f /usr/local/bin/docker-compose ​ # 下载最新的 docker-compose 二进制文件 sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-…

C++平台跳跃游戏

目录 开头程序Game.cpp源文件Player.h头文件Player.cpp源文件 程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 Game.cpp源文件 #include <iostream> #include "Player.h" using namespace std; void printma…

scrapy爬取汽车、车评数据【上】

这个爬虫我想分三期来写&#xff1a; ✅ 第一期写如何爬取汽车的车型信息&#xff1b; ✅ 第二期写如何爬取汽车的车评&#xff1b; ✅ 第三期写如何对车评嵌入情感分析结果&#xff0c;以及用简单的方法把数据插入mysql中&#xff1b; 技术基于scrapy框架、BERT语言模型、mysq…

JQuery基本介绍和使用方法

JQuery基本介绍和使用方法 W3C 标准给我们提供了⼀系列的函数, 让我们可以操作: ⽹⻚内容⽹⻚结构⽹⻚样式 但是原⽣的JavaScript提供的API操作DOM元素时, 代码⽐较繁琐, 冗⻓. 我们可以使⽤JQuery来操作⻚⾯对象. jQuery是⼀个快速、简洁且功能丰富的JavaScript框架, 于20…

【Spring】Spring Boot项目创建和目录介绍

文章目录 1 Spring Boot 介绍2 Spring Boot 项目创建注意事项 3. 项目代码和目录介绍pom 文件父工程目录介绍 1 Spring Boot 介绍 Spring 让 Java 程序更加快速、简单和安全&#xff0c;Spring 对于速度、简单性和生产力的关注使其成为世界上最流行的 Java 框架 Spring 官方提…

用Python+flask+mysql等开发的Excel数据资产落地工具

话不多说 1)Excel文件上传,列表预览 2)选中要导入结构及数据的Excel文件 约束说明: 2.1)Excel文件的第一行约定为表头名称 2.2)系统自动识别字段列名及数据类型,目前不支持合并表头 3)Excel建表导入数据成功后,可在表源列表中预览查看 4)对数据表源可进行透视图设计管理,可对…

叉车防撞系统方案,引领安全作业新时代

在现代工业的舞台上&#xff0c;叉车如同忙碌的“搬运工”&#xff0c;在仓储和制造环境中发挥着不可或缺的作用。然而&#xff0c;随着叉车使用频率的不断攀升&#xff0c;安全事故也如影随形&#xff0c;给企业带来经济损失的同时&#xff0c;更严重威胁着操作人员的生命安全…

深入探讨Windows 11专业版与Windows 11专业工作站版的差异

前言 深入探讨Windows 11专业版与Windows 11专业工作站版的差异&#xff0c;可以更全面地理解这两款操作系统版本面向的不同用户群体、硬件支持、性能特点以及应用场景&#xff0c;从而为专业用户和企业选择最合适的平台提供依据。 硬件支持与扩展能力 Windows 11专业版&…

HTB:Unified[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which are the first four open ports? 2.What is the title of the software that is running running on port 8443? 3.What is the version of the software that is running? 4.What is the CVE for the identified vulnerabilit…

数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall

数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall 数据集-目标检测系列-豹子 猎豹 检测数据集 leopard 数据量&#xff1a;5k 想要进一步了解&#xff0c;请联系。 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#x…

贝锐蒲公英工业物联方案:助力美的智慧楼宇全球布局

智慧楼宇正日益成为现代城市发展的基石&#xff0c;作为该领域的先锋&#xff0c;美的楼宇科技通过其创新的iBUILDING数字化平台和低碳技术&#xff0c;引领着智慧空间的可持续发展&#xff0c;并持续推动建筑及相关行业的数字化转型。 美的楼宇科技的解决方案融合了先进的楼宇…

五子棋双人对战项目(5)——对战模块

目录 一、需求分析 二、约定前后端交互接口 三、实现游戏房间页面&#xff08;前端代码&#xff09; game_room.html game_room.css srcipt.js 四、实现后端代码 GameAPI Room Mapper 五、线程安全问题 一、需求分析 在对局中&#xff0c;玩家需要知道实时对局情况&…

商家营销工具架构升级总结

今年以来&#xff0c;商家营销工具业务需求井喷&#xff0c;需求数量多且耗时都比较长&#xff0c;技术侧面临很大的压力。因此这篇文章主要讨论营销工具前端要如何应对这样大规模的业务需求。 问题拆解 我们核心面对的问题主要如下&#xff1a; 1. 人力有限 我们除了要支撑存量…

redis 5的安装及启动(window)

最近看大模型的时候发现入手redis的同学没有练手的&#xff0c;而且大部分redis的文章要钱才能看&#xff0c;在这里我把路径和环境配置&#xff0c;启动给大家说一下 下载 redis5的获取链接在下面&#xff08;为什么是redis5&#xff0c;因为上个模型用的就是redis5&#xff…

基于单片机的两轮直立平衡车的设计

本设计基于单片机设计的两轮自平衡小车&#xff0c;其中机械部分包括车体、车轮、直流电机、锂电池等部件。控制电路板采用STC12C5A60S2作为主控制器&#xff0c;采用6轴姿态传感器MPU6050测量小车倾角&#xff0c;采用TB6612FNG芯片驱动电机。通过模块化编程完成了平衡车系统软…