【微服务部署】九、使用Docker Compose搭建高可用双机热备MySQL数据库
通常,一般业务我们使用云服务器提供的数据库,无论是MySQL数据库还是其他数据库,云服务厂商都提供了主备功能,我们不需要自己配置处理。而如果需要我们自己搭建数据库,那么考虑到数据的高可用性、故障恢复和扩展性,必须做数据备份配置。
一、MySQL 的多种数据备份机制
- mysqldump:这是 MySQL 自带的备份工具,通过导出 SQL 语句来备份数据库。它可以备份整个数据库、特定表或特定数据。使用命令行执行 mysqldump 命令可以生成 SQL 文件,然后可以使用该文件还原备份数据。备份命令:
# 单个数据库
mysqldump -h hostname -u username -p dbname > backup.sql
# 多个数据库
mysqldump -h hostname -u username -p --databases dbname1 dbname2 > backup.sql
- MySQL Enterprise Backup:这是 MySQL 官方提供的高级备份工具【商用收费工具】,可用于备份大型数据库。它支持增量备份和并行备份,可以在运行时备份数据库,减少备份期间的停机时间。它以block级别进行并行备份,性能大大优于逻辑备份工具如mysqldump。
mysqlbackup --host=hostname --user=username --password=password --backup-dir=/path/to/backupdir backup
- MySQL Workbench:MySQL Workbench是一种图形化MySQL管理工具,可以进行逻辑备份和还原,支持导出SQL脚本、CSV文件和XML文件等。
- 物理备份:这种备份方法直接复制数据库文件,包括数据文件、日志文件等。可以使用文件系统级别的工具,如 rsync 或者文件系统快照功能来备份。
- 复制(主从复制 / 多主复制):
- MySQL主从复制用于将一个MySQL服务器(称为主服务器)上的数据变更同步到其他MySQL服 务器(称为从服务器)。主从复制提供了数据备份、读写分离和负载均衡等功能,以提高系统的可用性和性能。
- MySQL多主复制允许在多个数据库实例之间进行双向数据同步。它的工作原理是每个数据库实例都可以充当主服务器和从服务器,可以同时接收和发送数据变更。
- 第三方备份工具:还有一些第三方工具可用于备份 MySQL 数据库,例如 Percona XtraBackup、MariaDB Backup 等。这些工具提供了更多高级特性,如并行备份、压缩备份等。
MySQL 提供的多种数据备份机制各有优缺点和适应场景,复制(主从复制 / 多主复制)适合我们的应用场景,多主复制比主从复制会更为复杂一些,需要考虑数据冲突等问题。在实际使用过程中,主主复制存在很多数据冲突的问题需要解决,所以这里我们选择使用主从备份机制。
二、MySQL 主从复制原理
MySQL 主从复制是一种基于日志的复制机制,用于将主服务器(Master)上的数据实时复制到一个或多个从服务器(Slave)。主从复制的原理如下:
- 主服务器将所有修改操作记录在二进制日志(Binary Log)中。这些修改可以是插入、更新或删除数据的操作。
- 从服务器连接到主服务器,并发送一个请求,请求成为主服务器的从服务器。主服务器收到请求后,将记录从服务器的信息,并开始与从服务器建立复制连接。
- 主服务器将二进制日志中的内容发送给从服务器。从服务器接收并执行这些日志中的操作,将数据修改操作反映到自己的数据库上。
- 从服务器还会定期向主服务器发送心跳信息以维持连接。如果主服务器长时间没有收到从服务器的心跳信息,就认为从服务器宕机,不再向其发送日志。
- 如果主服务器发生故障,导致无法提供服务,可以将一个从服务器提升为新的主服务器,以继续提供服务。此时,其他从服务器将切换到新的主服务器上进行复制。
通过主从复制,可以实现数据的实时复制和分布式读取,提高数据库的可用性和读取性能。此外,主从复制还可以用于备份数据,当主服务器发生故障时,可以快速切换到从服务器,减少服务停机时间。
需要注意的是,主从复制是异步的,从服务器的数据可能稍有延迟。而且主从复制只复制数据修改操作,不复制表结构的变更。如果需要同步表结构的变更,可以使用主从复制搭配其他工具,如 GTID(Global Transaction Identifier)或者基于触发器的解决方案。
三、MySQL 主主复制原理
MySQL主主复制是一种数据同步和高可用性解决方案,它能够保持多个MySQL服务器之间的数据一致性。主主复制的原理如下:
- 配置双向复制:在两台MySQL服务器上分别配置主从复制,使每台服务器都可以同时充当主服务器和从服务器。
- 生成二进制日志:当有数据更新操作(如插入、更新、删除)时,MySQL服务器会将这些操作记录在二进制日志中。
- 传递二进制日志:每台服务器将自己的二进制日志传递给另一台服务器。这可以通过网络连接实现,通常使用基于TCP/IP的复制协议。
- 应用二进制日志:每台服务器接收到对方的二进制日志后,会将这些日志应用到自己的数据库中,从而使两台服务器的数据保持一致。
- 处理冲突:在主主复制中,由于两台服务器都可以接收写操作,可能会出现冲突。为了处理冲突,MySQL提供了自动事务回滚和主键冲突检测等机制。
三、使用Docker Compose安装MySQL 主从服务器
1. 环境准备
首先准备至少2台Linux服务器,一台作为MySQL主服务器,一台或者多台作为MySQL从服务器。我们这里准备两台服务器分别为:
- 192.168.0.210 (MySQL主服务器)
- 192.168.0.195 (MySQL从服务器)
2. 准备MySQL文件存放目录
- 准备数据库存储目录,在两台主从服务器上分别执行一下命令
mkdir -p /opt/container/mysql/data /opt/container/mysql/config /opt/container/mysql/slave/mysql-files chmod -R 777 /opt/container/mysql/data /opt/container/mysql/config /opt/container/mysql/slave/mysql-files
/opt/container/mysql/data 用于存放MySQL数据文件
/opt/container/mysql/config 用于存放MySQL配置文件
/opt/container/mysql/slave/mysql-files 用于存放MySQL数据导入/导出的数据文件存放目录
3. MySQL主、从服务器docker-compose-mysql.yml文件
version: '3'
services:mysql:environment:## root账号的密码MYSQL_ROOT_PASSWORD: root密码TZ: Asia/Shanghai## 新建mysql账号MYSQL_USER: 'mysql_user'MYSQL_PASSWORD: mysql_user密码MYSQL_DATABASE: 'mysql_db'image: "docker.io/mysql:latest" container_name: mysqlrestart: always## 映射挂载volumes:## 数据目录,要确保先创建好- "/opt/container/mysql/data:/var/lib/mysql"- "/opt/container/mysql/config/my.cnf:/etc/mysql/my.cnf"- "/opt/container/mysql/slave/mysql-files:/var/lib/mysql-files"- "/etc/localtime:/etc/localtime"- "/usr/share/zoneinfo/Asia/Shanghai:/etc/timezone"## 初始化的脚本,初始化我们存放的init.sql文件- "./mysql:/docker-entrypoint-initdb.d/"ports:- "3306:3306"command:--max_connections=1000--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--default-authentication-plugin=mysql_native_password
4. 在MySQL主服务器上新增配置文件
在/opt/container/mysql/config目录下新增my.cnf文件, 配置文件内容:
注意主从服务器 server-id 一定要配置为不一样,在这里主服务器的server-id设置为150
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0# Custom config should go here
!includedir /etc/mysql/conf.d/sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
server-id=150
log-bin=/var/lib/mysql/mysql-bin
expire_logs_days=60
binlog-format=mixed
max_allowed_packet=256M
relay-log=mysql-relay
log-slave-updates
auto_increment_increment=2 #表示自增长字段每次递增的量
auto_increment_offset=1 #表示自增长字段从那个数开始
5. 在MySQL从服务器上新增配置文件
在/opt/container/mysql/config目录下新增my.cnf文件, 配置文件内容:
注意主从服务器 server-id 一定要配置为不一样,在这里从服务器的server-id设置为200,从服务器需要设置为read_only = 1只读模式,这里为了测试后面的主主复制,先不设置,实际应用中一定要设置。
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0# Custom config should go here
!includedir /etc/mysql/conf.d/sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
server-id=200
# 设置只读模式
# read_only = 1
log-bin=/var/lib/mysql/mysql-bin
expire_logs_days=60
binlog-format=mixed
max_allowed_packet=256M
relay-log=mysql-relay
log-slave-updates
auto_increment_increment=2 #表示自增长字段每次递增的量
auto_increment_offset=1 #表示自增长字段从那个数开始
6. 在两台MySQL主备服务器上分别执行docker-compose安装启动命令
将docker-compose-mysql.yml上传至/opt/software目录,这个目录可以自己选择,然后到目录下执行安装启动命令
docker-compose -f docker-compose-mysql.yml up -d
[root@localhost software]# docker-compose -f docker-compose-mysql.yml up -d
[+] Running 13/13⠿ mysql Pulled 40.4s⠿ 72a69066d2fe Pull complete 14.2s⠿ 93619dbc5b36 Pull complete 14.2s⠿ 99da31dd6142 Pull complete 14.6s⠿ 626033c43d70 Pull complete 14.7s⠿ 37d5d7efb64e Pull complete 14.7s⠿ ac563158d721 Pull complete 16.2s⠿ d2ba16033dad Pull complete 16.2s⠿ 688ba7d5c01a Pull complete 16.2s⠿ 00e060b6d11d Pull complete 24.5s⠿ 1c04857f594f Pull complete 24.5s⠿ 4d7cfa90e6ea Pull complete 24.6s⠿ e0431212d27d Pull complete 24.6s
WARN[0040] Found orphan containers ([nginx]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
[+] Running 1/1⠿ Container mysql Started 0.3s
通过docker ps命令可以看到mysql已经安装并启动成功
[root@localhost software]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf4e482dbc71 mysql:latest "docker-entrypoint.s…" 21 minutes ago Up 21 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
四、MySQL 主从复制配置及测试
1. 登录主MySQL服务器查看配置数据
- 进入docker容器
[root@localhost software]# docker exec -it bf4e482dbc71 bash
- 通过用户名密码登录mysql账户
root@bf4e482dbc71:/# mysql -uroot -p密码
- 查看需同步的主服务器数据 show master status,在MySQL从服务器上配置时需要用到File和Position的值
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 156 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2. 登录从MySQL服务器,并配置数据同步
- 进入docker容器
[root@localhost software]# docker exec -it b168db7981c0 bash
- 通过用户名密码登录mysql账户
root@bf4e482dbc71:/# mysql -uroot -p密码
- 登录成功后,执行从主数据库同步的配置命令
CHANGE MASTER TO master_host = '192.168.0.210',master_port = 3306,master_user = 'root',master_password = '密码',master_log_file = 'mysql-bin.000003',master_log_pos = 156;
- 启动从服务器
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
- 使用命令 show slave status\G 查看从服务器状态, 以下两项显示Yes,表示配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.0.210Master_User: rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000003Read_Master_Log_Pos: 156Relay_Log_File: mysql-relay.000002Relay_Log_Pos: 324Relay_Master_Log_File: mysql-bin.000003Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 156Relay_Log_Space: 529Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 150Master_UUID: ce0ecbd8-667b-11ee-98e5-0242ac120003Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace:
1 row in set, 1 warning (0.00 sec)
3. 主从数据库复制测试
- 在MySQL主服务器,新建一个数据库my_test
mysql> create database my_test;
Query OK, 1 row affected (0.01 sec)
- 在MySQL从服务器,执行查看数据库命令,可以看到my_test数据库已经同步到MySQL从服务器
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| dbwl |
| information_schema |
| my_test |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
- 在MySQL主服务器,新建一个表t_test并新增一条数据
mysql> use my_test;
Database changedmysql> create table t_test(id int UNSIGNED NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY (id));
Query OK, 0 rows affected (0.04 sec)mysql> insert into t_test(name) values('Test');
Query OK, 1 row affected (0.02 sec)
- 在MySQL从服务器查询数据库和表数据是否同步,如果配置正常,我们可以看到,在MySQL主服务器新增的数据库和表数据,在从服务器也存在。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| dbwl |
| information_schema |
| my_test |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)mysql> use my_test;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_my_test |
+-------------------+
| t_test |
+-------------------+
1 row in set (0.00 sec)mysql> select * from t_test;
+----+------+
| id | name |
+----+------+
| 1 | Test |
+----+------+
1 row in set (0.00 sec)
请注意,如果是主从复制,那么一定不要在从服务器进行写或删除操作,将从服务器配置为只读,否则数据将不再进行同步。
五、MySQL 主主复制配置及测试
MySQL 主主复制的配置和主从复制基本一样,只是需要将原本在从服务器执行的配置命令在主服务器上再执行一遍。
1. 配置主主同步
- 在从服务器上查看状态 show master status,在MySQL从服务器上配置时需要用到File和Position的值
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 2581 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
- 在主服务器上执行同步配置命令
CHANGE MASTER TO master_host = '192.168.0.195',master_port = 3306,master_user = 'root',master_password = '密码',master_log_file = 'mysql-bin.000003',master_log_pos = 2581;
- 在主服务器上执行start slave;
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
- 使用命令 show slave status\G 查看从服务器状态, 以下两项显示Yes,表示配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.0.195Master_User: rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000003Read_Master_Log_Pos: 2581Relay_Log_File: mysql-relay.000002Relay_Log_Pos: 324Relay_Master_Log_File: mysql-bin.000003Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 2581Relay_Log_Space: 529Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 200Master_UUID: c1d65f95-667e-11ee-bc7f-0242ac120003Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace:
1 row in set, 1 warning (0.00 sec)
2. 主主数据库复制测试,为了方便区分,下面仍以前面的主/从服务器命名进行区分
- 在MySQL从服务器,新建一个数据库my_test_slave
mysql> create database my_test_slave;
Query OK, 1 row affected (0.01 sec)
- 在MySQL主服务器,执行查看数据库命令,可以看到my_test_slave数据库已经同步到MySQL主服务器
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| dbwl |
| information_schema |
| my_test |
| my_test_slave |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)
- 在MySQL从服务器的my_test_slave数据库,新建一个表t_test并新增一条数据
mysql> use my_test_slave;
Database changedmysql> create table t_test(id int UNSIGNED NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY (id));
Query OK, 0 rows affected (0.04 sec)mysql> insert into t_test(name) values('Test');
Query OK, 1 row affected (0.02 sec)
- 在MySQL主服务器查询数据库和表数据是否同步,如果配置正常,我们可以看到,在MySQL从服务器新增的数据库和表数据,在主服务器也存在。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| dbwl |
| information_schema |
| my_test |
| my_test_slave |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)mysql> use my_test_slave;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+-------------------------+
| Tables_in_my_test_slave |
+-------------------------+
| t_test |
+-------------------------+
1 row in set (0.00 sec)mysql> select * from t_test;
+----+------+
| id | name |
+----+------+
| 1 | Test |
+----+------+
1 row in set (0.00 sec)
- 测试在主数据库插入一条数据,然后在从数据库查询,查看是否能够同步
mysql> insert into t_test(name) values('TestMaster');
Query OK, 1 row affected (0.02 sec)
- 在从数据库执行查询命令,可以看到数据也同步过来了,说明主主复制生效。
mysql> select * from t_test;
+----+------------+
| id | name |
+----+------------+
| 1 | Test |
| 3 | TestMaster |
+----+------------+
2 rows in set (0.00 sec)
很多业务场景中,大多数人使用主主复制+keepalived来实现MySQL服务器的高可用,但是存在很大的问题是处理数据冲突问题,可以通过my.cnf中配置,id自增来解决:
auto_increment_increment=2 #表示自增长字段每次递增的量
auto_increment_offset=1 #表示自增长字段从那个数开始
在实际业务处理中会更加复杂,所以在数据库到底是使用主从复制还是主主复制,需要根据自己的业务场景选择。
相关文章:

【微服务部署】九、使用Docker Compose搭建高可用双机热备MySQL数据库
通常,一般业务我们使用云服务器提供的数据库,无论是MySQL数据库还是其他数据库,云服务厂商都提供了主备功能,我们不需要自己配置处理。而如果需要我们自己搭建数据库,那么考虑到数据的高可用性、故障恢复和扩展性&…...

HTTP Basic 认证
HTTP Basic 认证 难度等级:【初级】 由RFC7617定义的HTTP Basic认证是一种非常基础而简单的认证模式,因此叫他Basic认证。他本质上就是浏览器提供的一个接口,能够根据HTTP返回值,自动弹出一个登录框,让用户输入ID和密码…...

计算机网络第2章-HTTP和Web协议(2)
Web和HTTP 一个新型应用即万维网(World Wide Web)Web。 HTTP概况 Web的应用层协议是超文本传输协议(HTPP),它是Web的核心。 HTTP由两个程序实现:一个用户程序和一个服务器程序。 Web页面(W…...

css3 table表格
使用CSS3来美化HTML表格(table)可以提高表格的外观和可读性 表格样式: table { width: 100%; border-collapse: collapse; } width: 100%; 使表格宽度充满其容器。border-collapse: collapse; 合并相邻的表格边框,使表格看起来更整…...

【【萌新的SOC学习之AXI DMA环路测试介绍】】
萌新的SOC学习之AXI DMA环路测试介绍 AXI DMA环路测试 DMA(Direct Memory Access,直接存储器访问)是计算机科学中的一种内存访问技术。它允许某些计算机内部的硬件子系统可以独立地直接读写系统内存,而不需中央处理器(CPU)介入处…...

07 | @Entity 之间的关联关系注解如何正确使用?
实体与实体之间的关联关系一共分为四种,分别为 OneToOne、OneToMany、ManyToOne 和 ManyToMany;而实体之间的关联关系又分为双向的和单向的。实体之间的关联关系是在 JPA 使用中最容易发生问题的地方,接下来我将一一揭晓并解释。我们先看一下…...

深入理解AQS之ReentrantLock源码分析
开题:如何自己生成一把独占锁? 1. 管程 — Java同步的设计思想 管程:指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。 互斥:同一时刻只允许一个线程访问共享资源; 同步:线程之间…...

微软宣布延长Azure支持Apache Cassandra 3.11时间到2024年
近日微软表示为缓解管理员不适应升级节奏,将Azure托管实例对Apache Cassandra 3.11 的支持延长1年,从而时间将持续到2024年年底。 Multiable万达宝汽车ERP(www.multiable.com.cn/solutions_qc)支持自定义栏位,实时生产排产,提高生产效率 此…...

cv_bridge和opencv 记录
过程记录 背景 实验室笔记本上想跑一下vins-fusion。但是因为是有毕业师兄的代码,不敢随意破坏环境。 电脑环境: ubuntu 20.04 opencv 3.3.1 和 4.2.0 Error: vins-fusion中修改CMakeLists.txt,find_package(OpenCV 3.3.1 REQUIRED)&…...

关于OWL-carousel插件在ajax调用后需要重新实例化问题(页面无轮播效果)
维护公司老项目,发现问题,记录一下~ 1.产生原因 owl 已经实例已经存在,在ajax请求成功后并更改完页面数据后, 但是没有销毁之前实例,并重新生成新的实例,导致没有owl插件没有轮播效果. 2.解决方案 html: <div class"owl-slider …...

day4作业
1,判断一个整数是奇数还是偶数,至少有两种方式实现 #1,判断一个整数是奇数还是偶数,至少有两种方式实现 #1) number int(input("请输入一个数:"))if number % 2 0:print("偶数") else:print("奇数&qu…...

SSMS中的SQL sever代理
目录 一、用途: 二、用法 SQL Server代理(SQL Server Agent)是SQL Server Management Studio (SSMS) 2008中的一个功能模块,它用于执行和调度自动化任务、作业和脚本,如作业和警报。SQL Server代理允许在指定的时间间…...

估算总体标准差的极差均值估计法sigma = R/d2
总体标准差的估算值可以通过将平均极差除以合适的常数因子d2来计算。这个估算方法是用于估算总体标准差的一种常见方法,尤其在质量控制和过程监控中经常使用。 总体标准差的估算值 (平均极差) / d2 其中: "总体标准差的估算值" 表示用极差…...

JavaScript之正则表达式
详见MDN 正则表达式(RegExp) 正则表达式不是JS独有的内容,大部分语言都支持正则表达式 JS中正则表达式使用得不是那么多,我们可以尽量避免使用正则表达式 在JS中,正则表达式就是RegExp对象,RegExp 对象用于将文本与一个模式匹配 正…...

Spring实战 | Spring AOP核心功能分析之葵花宝典
国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题 国庆中秋特辑&…...

linux之/etc/skel目录
/etc/skel目录是在使用useradd添加用户时,一个需要用到的目录,该目录用来存放新建用户时需要拷贝到新建用户家目录下的文件。即:当我们新建新用户时,这个目录下的所有文件会自动被复制到新建用户的家目录下,默认情况下…...

文件介绍---C语言编程
0 Preface/Foreword 1 C文件概述 文件(File)是程序设计中的一个重要的概念。所谓“文件”一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质(如磁盘)上。操作系统是以文件为单位对数据进行管理,…...

软考 系统架构设计师系列知识点之特定领域软件体系结构DSSA(6)
接前一篇文章:软考 系统架构设计师系列知识点之特定领域软件体系结构DSSA(5) 所属章节: 第7章. 系统架构设计基础知识 第5节. 特定领域软件体系结构 相关试题 3. 特定领域软件架构(Domain Specific Software Archite…...

TensorFlow入门(二十三、退化学习率)
学习率 学习率,控制着模型的学习进度。模型训练过程中,如果学习率的值设置得比较大,训练速度会提升,但训练结果的精度不够,损失值容易爆炸;如果学习率的值设置得比较小,精度得到了提升,但训练过程会耗费太多的时间,收敛速度慢,同时也容易出现过拟合的情况。 退化学习率 退化学…...

登录中获取验证码的节流
一. 验证码框 <el-input placeholder"请输入验证码" prefix-icon"el-icon-lock" v-model"ruleForm.code"><el-button slot"suffix" :disabled"disabled" type"text" size"mini" click"ch…...

spring boot 实现Minio分片上传
应用场景 分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。 分片上传的场景…...

2023年09月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
C/C编程(1~8级)全部真题・点这里 Python编程(1~6级)全部真题・点这里 第1题:生日相同 在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试…...

docker-compose 部署示例
文章目录 docker-compose文件格式docker-compose 下载 docker-compose文件格式 这个软件的实际很小,只是根据配置文件产生一些docker命令来执行可以。 配置文件本身是yml的格式,如下 version: 3.5services:# Etherpad: real-time collaborative docume…...

新版WordPress插件短视频去水印小程序源码
最新版去水印小程序源码,本版本全开源,是WordPress插件 上传到Wordpress 安装插件 启动之后 绑定自己的小程序id wordpress可以在宝塔一键部署 也可以用我的这个 搭建前我们需要一下东西: 第一个:一台服务器(国内外都可…...

如何提高MES系统的落地成功率?
导 读 ( 文/ 2768 ) 制造执行系统(MES)在现代制造业中扮演着至关重要的角色,但实施MES系统并取得成功并非易事。为了帮助企业提高MES系统的落地成功率,本文将介绍关键的方法和策略。通过深入了解业务需求、有效的团队合作、全面的…...

private key ssh连接服务器
这里用到的软件是PuTTY。 https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 保存本地rsa文件后,打开软件PuTTYgen,点击Load导入文件,输入Key passphrase即密码,保存至本地。 随后在PuTTY配置ssh的用户名 来Cred…...

PDF-Word-图片等的互相转换
轻闪PDF客户端 - 功能强大的一站式PDF工具 | PDF编辑、转换、阅读 上面页面支持PDF转换成各类别:鼠标停留在PDF工具,点击转换类型即可在线转换 Word-PDF:word文档打开word文件中,点击文件->另存为->另存为的位置->保存…...

【VR开发】【Unity】0-课程简介和概述
【说明】 这是我录制的一套VR基础开发课程的文字版本,更加便于快速参考。 应大家在后台所提的需求,从今天开始,我计划带给大家一套完整达40课时的VR开发基础课程。 在开始学习前需要注意如下几点: 本教程基于Unity2022.2.1f1版…...

Java面试题-Java核心基础-第三天(基本数据类型)
目录 一、Java的基本数据类型了解吗? 二、基本类型和包装类型的区别 三、包装类型的缓存机制了解吗? 四、自动拆箱和自动装箱了解吗? 五、为什么浮点数在运算的时候会有精度损失的风险? 六、如何解决浮点数在运算时存在的精度…...

Bean容器里的单例是根据什么识别它是同一个类呢?(比如容器里创建了A类,再去用这个A类的时候,Bean容器怎么知道这个就是A类?)
Spring容器中的Bean的识别主要依赖于Bean的名称(ID)和类型。以下是详细解释: Bean的名称(ID):每个Bean在Spring容器中都必须有一个唯一的名称(ID)。这个名称通常在配置文件中、Java…...