第90讲:MySQL数据库主从复制集群原理概念以及搭建流程

文章目录

    • 1.MySQL主从复制集群的核心概念
      • 1.1.什么是主从复制集群
      • 1.2.主从复制集群中的专业术语
      • 1.3.主从复制集群工作原理
      • 1.4.主从复制中的小细节
      • 1.5.搭建主从复制集群的前提条件
      • 1.6.MySQL主从复制集群的架构信息
    • 2.搭建MySQL多实例环境
      • 2.1.在mysql-1中搭建身为主库的MySQL实例
      • 2.2.在mysql-2中搭建MySQL多实例
        • 2.2.1.安装数据库软件
        • 2.2.1.搭建第一个3306从库的MySQL实例
        • 2.2.2.搭建第二个3307从库的MySQL实例
      • 2.3.MySQL多个节点搭建完毕
    • 3.配置MySQL主从复制集群
      • 3.1.在主库开启Binlog二进制日志
      • 3.2.在主库上创建主从复制的用户
      • 3.3.将主库数据备份并在从库中进行还原
      • 3.4.配置从库连接主库的复制信息
      • 3.5.启动主从复制线程
    • 4.查看主从复制集群状态

1.MySQL主从复制集群的核心概念

1.1.什么是主从复制集群

主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。

MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。

MySQL 复制的优点主要包含以下三个方面:

  • 主库出现问题,可以快速切换到从库提供服务。
  • 实现读写分离,降低主库的访问压力。
  • 可以在从库中执行备份,以避免备份期间影响主库服务。

1.2.主从复制集群中的专业术语

在MySQL主从复制集群中,主要分为两大部分:文件、线程。

文件:

  • 主库
    • Binlog:二进制日志。
  • 从库
    • relay-log:中继日志,主库推送过来的Binlog日志都存放在中继日志中。
    • master.info:从库复制主库的信息文件,记录着主库的地址、用户、Binlog等信息。
    • relay-log.info:中继日志的信息文件,该文件记录了上次执行relay-log的位置等信息。

线程:

  • 主库
    • binlog_dump_thread:二进制日志投递线程,主要将二进制日志发送给从库的线程。
  • 从库
    • IO_Thread:从库的IO线程,用于请求和接收主库的Binlog二进制日志。
    • SQL_Thread:从库的SQL线程,用于将主库发来的二进制日志在数据库中进行数据复制。

1.3.主从复制集群工作原理

MySQL主从复制集群的工作原理主要围绕前面提到的文件和线程。

MySQL主从复制集群的原理:

1)首先从库执行change master to将连接主库的配置信息记录到master.info文件中,此时从库上会开启两个线程:I/O线程和SQL线程。

2)从库上的I/O线程会从master.info文件中读取主库的连接信息。

3)从库I/O线程获取到主库的信息后,会与主库进行身份认证,然后建立连接。

4)当从库I/O线程成功连接到主库后,主库会立即给从库分配一个binlog_dump_thread线程,用于推送Binlog日志到从库。

5)从库I/O线程会根据master.info中记录的Binlog信息(Binlog日志文件、标识位号)与主库的binlog_dump_thread线程请求最新的Binlog日志。

6)这时主库的binlog_dump_thread线程就会去查询是否产生了新的Binlog日志,如果产生了新的Binlog日志,会截取最新的Binlog日志然后推送给从库的I/O线程。

7)从库的I/O线程接收到主库推送的Binlog日志后,会现将其存放在内存的TCP/IP缓存中,然后告知主库的binlog_dump_thread线程,Binlog日志已收到。

8)此时从库的I/O线程会去更新master.info文件中的Binlog位置点信息,记录最新的Binlog标识号。

9)然后从库的I/O线程会将主库推送的Binlog日志写入到磁盘上的relay-log文件中。

10)最后由从库的SQL线程读取relay-log.ifno文件,获取relay-log最新的位置点,然后根据的位置点去relay-log中执行最新的Binlog日志,执行完成后会再次更新relay-log.info文件中记录的relay-log位置点。

这就是完整的主从复制工作原理。

image-20220705232103542

简单来说MySQL主从复制的原理就是,从库的I/O线程读取连接主库的配置信息,然后去连接主库开始主从同步,当I/O线程连接上主库后,主库会立即给I/O线程分配一个Dump线程,用于推送Binlog日志到从库,此时I/O线程会根据master.info文件中记录的Binlog信息,向主库的Dump线程请求最新的BInlog,Dump线程查询到有最新的Binlog产生,会将最新的Binlog截取,然后推送给从库的I/O线程,I/O线程收到Binlog日志后,将其存放在内存的TCP/IP缓存中,然后更新master.info文件中最新的Binlog信息,紧接着将Binlog日志写入到relay-log中,最后由从库的SQL线程从relay-log.info中读取relay-log的位置号,然后执行relay-log中最新的Binlog日志,执行完成后,再次更新relay-log.info中的relay-log位置号,以便于下次再relay-log中读取最新的Binlog日志。

relay-log日志会通过MySQL中的其他线程定期清理。

1.4.主从复制中的小细节

从上面说的主从复制原理来看,好像每次都是从库向主库去请求新数据,那么什么时候从库才应该向主库请求呢?请求的频率如何?

其实是这样的:当主库上产生了新的事务,更新到Binlog日之后,会给binlog_dump_thread线程发送一个“信号”,binlog_dump_thread线程会与从库的I/O线程一直建立连接,binlog_dump_thread线程就会通知从库的I/O线程有新数据产生了,这时从库的I/O线程就带着master.info中记录的最新Binlog标识位号,向binlog_dump_thread线程请求最新的Binlog,然后完成数据同步。

MySQL主从复制第一次复制时,是按照上面说到的10步完成的,第二次复制时,只需要等待主库的binlog_dump_thread线程向从库的I/O线程发送信号,然后I/O线程去请求最新的Binlog,最后由SQL线程复制数据即可。

1.5.搭建主从复制集群的前提条件

搭建MySQL主从复制集群的前提条件如下:

  • 首先需要准备多个MySQL实例,最少两个MySQL实例,能够实现一主一从的架构,可以在多个服务器中分布部署独立的MySQL节点,也可以在一台服务器中部署多个MySQL实例。
  • 每个MySQL实例都需要由单独的sever_id。
  • 身为主库角色的MySQL实例需要开启二进制日志,从库在特定场景下需要开启。
  • 主库需要授权一个专门的用户作为主从复制的用户。
  • 如果主库是一个运行很多年的数据库,突然要升级为主从复制集群,最好先将主库的数据同步一份到从库中。
  • 开启专用的复制线程。

1.6.MySQL主从复制集群的架构信息

本次主从复制的架构是一主两从的结构。

IP主机名端口角色server_id
192.168.20.11mysql-13306主库1
192.168.20.12mysql-23306从库2
192.168.20.12mysql-23307从库3

2.搭建MySQL多实例环境

再搭建MySQL主从复制集群之前,首先搭建出多个MySQL实例,由于服务器有限,因此通过两台机器模拟出一主两从的环境。

主从复制集群中有一个节点开启了gtid,所有的节点都需要开启gtid,否则主从将不能同步。

2.1.在mysql-1中搭建身为主库的MySQL实例

mysql-1服务器中的3306端口的MySQL实例再前面已经搭建完成了,就是我们一直在使用的数据库实例,里面有数据,更加方便演示主从集群,下面只是提供一下搭建过程的步骤。

注意每个MySQL节点的server_id都要设置成不同的,如果你的一主两从都是单独在不同服务器中部署的,那么直接参考本小结的数据库实例安装即可,不用再看多实例的步骤了。

1.解压MySQL
[root@mysql-1 ~]# tar xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
[root@mysql-1 ~]# mv /usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql

2.设置MySQL的环境变量
[root@mysql-1 ~]# vim /etc/profile
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
export LD_LIBRARY_PATH=:/usr/local/mysql/lib

3.创建mysql用户
[root@mysql-1 ~]# groupadd -r mysql
[root@mysql-1 ~]# useradd -M -r -s /sbin/nologin -g mysql mysql

4.准备数据目录
[root@mysql-1 ~]# mkdir /data/mysql
[root@mysql-1 ~]# chown -R mysql. /data/mysql

5.初始化数据库
[root@mysql-1 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

6.准备mysql配置文件
[root@mysql-1 ~]# vim /etc/my.cnf
[mysqld]	
user=mysql								
port=3306							    
server_id=1							#每个MySQL数据库的server_id都设置成不同的
basedir=/usr/local/mysql				
datadir=/data/mysql	
log_bin=mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
socket=/tmp/mysql.sock
log_error=/data/mysql/mysql_err.log
character-set-server=utf8

[mysql]
socket=/tmp/mysql.sock

7.准备服务管理脚本
[root@mysql-1 ~]# vim /etc/systemd/system/mysqld.service 
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

8.启动数据库
[root@mysql-1 ~]# systemctl daemon-reload 
[root@mysql-1 ~]# systemctl start mysqld

9.设置root密码
[root@mysql-1 ~]# mysqladmin -u root -P 3306  password '123456'

10.登陆数据库
[root@mysql-1 ~]# mysql -uroot -p123456
mysql>

2.2.在mysql-2中搭建MySQL多实例

由于服务器数量有限,在mysql-2这台服务器中分别搭建两个从库。

2.2.1.安装数据库软件
1.解压MySQL
[root@mysql-2 ~]# tar xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
[root@mysql-2 ~]# mv /usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql

2.设置MySQL的环境变量
[root@mysql-2 ~]# vim /etc/profile
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
export LD_LIBRARY_PATH=:/usr/local/mysql/lib

3.创建mysql用户
[root@mysql-2 ~]# groupadd -r mysql
[root@mysql-2 ~]# useradd -M -r -s /sbin/nologin -g mysql mysql
2.2.1.搭建第一个3306从库的MySQL实例

搭建第一个从库实例,端口号为3306,server_id为2,数据路径为/data/mysql3306。

1.创建3306从库的数据目录
[root@mysql-2 ~]# mkdir /data/mysql3306
[root@mysql-2 ~]# chown -R mysql.mysql /data/mysql3306/

2.准备3306从库的配置文件
[root@mysql-1 ~]# vim /etc/my3306.cnf
[mysqld]	
user=mysql								
port=3306							    
server_id=2							#每个MySQL数据库的server_id都设置成不同的
basedir=/usr/local/mysql				
datadir=/data/mysql3306	
log_bin=/data/mysql3306/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
socket=/data/mysql3306/mysql.sock
log_error=/data/mysql3306/mysql_err.log
character-set-server=utf8

[mysql]
socket=/data/mysql3306/mysql.sock

3.初始化3306从库
[root@mysql-2 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3306

4.准备服务管理脚本
[root@mysql-1 ~]# vim /etc/systemd/system/mysqld3306.service 
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my3306.cnf
LimitNOFILE = 5000

5.启动数据库
[root@mysql-1 ~]# systemctl daemon-reload 
[root@mysql-1 ~]# systemctl start mysqld3306

6.设置root密码
[root@mysql-2 ~]# mysqladmin -u root -P 3306 -S /data/mysql3306/mysql.sock password '123456'

7.登陆数据库
[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock
mysql>
2.2.2.搭建第二个3307从库的MySQL实例

搭建第一个从库实例,端口号为3306,server_id为2,数据路径为/data/mysql3306。

1.创建3307从库的数据目录
[root@mysql-2 ~]# mkdir /data/mysql3307
[root@mysql-2 ~]# chown -R mysql.mysql /data/mysql3307/

2.准备3307从库的配置文件
[root@mysql-1 ~]# vim /etc/my3307.cnf
[mysqld]	
user=mysql								
port=3307							    
server_id=3							#每个MySQL数据库的server_id都设置成不同的
basedir=/usr/local/mysql				
datadir=/data/mysql3307	
log_bin=/data/mysql3307/mysql-bin
gtid-mode=on
enforce-gtid-consistency=true
socket=/data/mysql3307/mysql.sock
log_error=/data/mysql3307/mysql_err.log
character-set-server=utf8

[mysql]
socket=/data/mysql3307/mysql.sock

3.初始化3307从库
[root@mysql-2 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3307

4.准备服务管理脚本
[root@mysql-1 ~]# vim /etc/systemd/system/mysqld3307.service 
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my3307.cnf
LimitNOFILE = 5000

5.启动数据库
[root@mysql-1 ~]# systemctl daemon-reload 
[root@mysql-1 ~]# systemctl start mysqld3307

6.设置root密码
[root@mysql-2 ~]# mysqladmin -u root -P 3307 -S /data/mysql3307/mysql.sock password '123456'

7.登陆数据库
[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock
mysql>

2.3.MySQL多个节点搭建完毕

MySQL多个节点已经搭建完毕了,下面来查询每个实例的server_id。

image-20220705001555462

3.配置MySQL主从复制集群

MySQL数据库的多个实例节点已经搭建完成了,下面将这些搭建的数据库实例配置成主从复制集群(一主两从)。

IP主机名端口角色
192.168.20.11mysql-13306主库
192.168.20.12mysql-23306从库
192.168.20.12mysql-23307从库

配置MySQL主从复制集群的大致步骤:

  • 主库开启Binlog日志,从库复制主库数据要通过Binlog进行复制。
  • 主库创建专门用作主从复制的用户。
  • 将主库数据进行备份,再从库中恢复。
  • 配置从库连接主库的复制信息。
  • 启动主从复制集群。

3.1.在主库开启Binlog二进制日志

主库已经开启了Binlog二进制日志,我们来查一下。

mysql> show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /data/mysql/mysql-bin       |
| log_bin_index                   | /data/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF                         |
| log_bin_use_v1_row_events       | OFF                         |
| sql_log_bin                     | ON                          |
+---------------------------------+-----------------------------+
6 rows in set (0.01 sec)

从库复制主库数据,都是通过Binlog进行传输和恢复的。

3.2.在主库上创建主从复制的用户

mysql> grant replication slave on *.* to replicas@'192.168.20.%' identified by '123456';

3.3.将主库数据备份并在从库中进行还原

如果是运行很久的主库,要升级为主从复制集群,那么建议将主库上的数据备份还原到从库上,避免从库一次性同步很多数据,浪费性能。

[root@mysql-1 ~]# mysqldump -uroot -p123456 -A --master-data=2 -R -E --triggers --single-transaction > all_db.sql

在192.168.20.12的两个从库中还原主库的备份数据。

1.将备份上传到从库的服务器上
[root@mysql-1 ~]# scp -rp all_db.sql root@192.168.20.12:/root

2.3306从库还原主库备份数据
[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock 
mysql> set sql_log_bin=0;
mysql> source /root/all_db.sql;

3.3307从库还原主库备份数据
[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock 
mysql> set sql_log_bin=0;
mysql> source /root/all_db.sql;

3.4.配置从库连接主库的复制信息

接下来我们需要配置从库连接主库的信息,包括让从库知道主库的IP、端口号、复制的用户密码、Binlog相关的信息。

1)获取主库Binlog的信息

从库是通过Binlog复制主库数据的,首先要获取主库Binlog日志的一些信息,包括主库的Binlog日志使用的是哪个、要从Binlog日志中的哪一个事件标识号处开始复制数据。

从Binlog的哪一个事件标识号处开始复制数据,尤为关键,因为主库可能运行的时间长了,也有很多的数据,一定要从合适的位置处开始复制数据,要不然也会产生很大的资源浪费。

我们是用主库头一天的全库备份,然后还原到从库上的,在主库的备份文件中就记录了从库应该从哪一个Binlog事件标识位处开始复制数据。

vim all_db.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=452;

从备份文件中得知,我们应该让从库从主库Binlog事件标识位号452处,开始复制数据。

如果主库不是运行很久的,不需要备份数据还原到从库,而是直接搭建的主从复制集群,那么直接可以从主库状态信息那里,获取Binlog的标识位号,在配置主从时,一定要指对Binlog标识位号,否则主从将会失败。

mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000001 |      452 |              |                  | 4f87bad8-fc67-11ec-be7b-005056b791aa:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)

2)配置从库连接主库进行复制的参数信息

配置从库连接主库进行复制的参数有很多,不过只需要记住这一条命令:help change master to即可,在MySQL交互式下执行此命令可以打印出从库连接主库的所有配置参数。

1.3306从库配置
[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock 
mysql> CHANGE MASTER TO
  MASTER_HOST='192.168.20.11',
  MASTER_USER='replicas',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=452,
  MASTER_CONNECT_RETRY=10;
  
1.3307从库配置
[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock 
mysql> CHANGE MASTER TO
  MASTER_HOST='192.168.20.11',
  MASTER_USER='replicas',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=452,
  MASTER_CONNECT_RETRY=10;  

参数解释:

参数含义
MASTER_HOST主库的地址
MASTER_USER主从复制的专用用户
MASTER_PASSWORD主从复制用户的密码
MASTER_PORT主库的端口号
MASTER_LOG_FILE主库的Binlog日志名
MASTER_LOG_POS从主库BInlog日志的哪一个标识位处开始复制
MASTER_CONNECT_RETRY主从连接失败的重试时间间隔

3.5.启动主从复制线程

1.3306从库配置
[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock 
mysql> start slave;

1.3307从库配置
[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock 
mysql> start slave;

4.查看主从复制集群状态

1.3306从库配置
[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock 
mysql> show slave status\G;

1.3307从库配置
[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock 
mysql> show slave status\G;

当每个从库的IO线程和SQL线程的状态都是Yes,就表示主从复制集群搭建完毕了。

image-20220706000742368

MySQL主从配置过程中从库连接主库的配置写错了应该如何解决?

只要不执行start slave,再执行一次change master to会覆盖上一次配置。

1.停止主从复制
mysql>stop slave;

2.清空从库连接主库的信息
mysql> reset slave all;

3.重新设置
mysql> CHANGE MASTER TO
  MASTER_HOST='192.168.20.11',
  MASTER_USER='replicas',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=452,
  MASTER_CONNECT_RETRY=10;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序 自定义组件和生命周期

文章目录 ⾃定义组件创建⾃定义组件声明组件编辑组件注册组件 声明引⼊⾃定义组件⻚⾯中使⽤⾃定义组件定义段与⽰例⽅法组件-⾃定义组件传参过程 小程序生命周期应用生命周期页面生命周期页面生命周期 ⾃定义组件 类似vue或者react中的自定义组件 ⼩程序允许我们使⽤⾃定义组件…

设计模式的学习笔记

设计模式的学习笔记 一. 设计模式相关内容介绍 1 设计模式概述 1.1 软件设计模式的产生背景 设计模式最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1977 年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任 Christopher Alexander 在…

【动态规划】【数学】【C++算法】18赛车

作者推荐 视频算法专题 本文涉及知识点 动态规划 数学 LeetCode818赛车 你的赛车可以从位置 0 开始,并且速度为 1 ,在一条无限长的数轴上行驶。赛车也可以向负方向行驶。赛车可以按照由加速指令 ‘A’ 和倒车指令 ‘R’ 组成的指令序列自动行驶。 当…

情人节专属--html5 canvas制作情人节告白爱心动画特效

💖效果展示 💖html展示 <!doctype html> <html> <head> <meta charset=

2023年移远车载全面开花,智能座舱加速进击

作为汽车智能化的关键组件&#xff0c;车载模组正发挥着越来越重要的作用。 移远通信进入车载模组领域近十年&#xff0c;已形成了完善的车载产品队列&#xff0c;不但在5G/4G车载通信、智能座舱、C-V2X车路协同等领域打造了一枝独秀的产品线&#xff0c;也推出了车规级Wi-Fi/蓝…

解决springboot启动报Failed to start bean ‘subProtocolWebSocketHandler‘;

解决springboot启动报 Failed to start bean subProtocolWebSocketHandler; nested exception is java.lang.IllegalArgumentException: No handlers 问题发现问题解决 问题发现 使用springboot整合websocket&#xff0c;启动时报错&#xff0c;示例代码&#xff1a; EnableW…

大数据时代的黄金机遇:阿里云大数据分析师ACP认证【一条龙服务100%通过】

扫码和我联系 随着大数据技术的迅速发展和广泛应用&#xff0c;成为了当今时代最具吸引力的技术之一。为了让更多技术人才把握这一时代机遇&#xff0c;阿里云推出了大数据分析师ACP认证&#xff08;Alibaba Cloud Certified Professional - Data Analyst&#xff09;&#xf…

数据结构:顺序栈

栈是一种先进后出的数据结构&#xff0c;只允许在一端&#xff08;栈顶&#xff09;操作&#xff0c;代码中top表示栈顶。 stack.h /* * 文件名称&#xff1a;stack.h * 创 建 者&#xff1a;cxy * 创建日期&#xff1a;2024年01月17日 * 描 述&#xff1a; …

LeetCode、2542. 最大子序列的分数【中等,排序+小顶堆】

文章目录 前言LeetCode、2542. 最大子序列的分数【中等&#xff0c;排序小顶堆】题目及类型思路及代码实现 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领…

基于Springboot的摄影分享网站系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的摄影分享网站系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

GBASE南大通用数据库GBase BI V5支持的集群部署

GBaseBI V5可以单独部署在一个服务器上&#xff0c;在单套的情况下安装成功后不需要特殊的设置即可直接使用。某些用户的应用并发数可能很多&#xff0c;单个服务器处理请求太慢&#xff0c;GBaseBI V5支持集群和分布式部署。其中集群部署如下图所示&#xff1a; 集群部署 在集…

【Vue3】2-13 : 章节总结

本书目录&#xff1a;点击进入 一、总结内容 二、习题 2.1 【选择题】以下Vue指令中&#xff0c;哪些指令具备简写方式&#xff1f; 2.2 【编程题】以下Vue指令中&#xff0c;哪些指令具备简写方式&#xff1f; &#xff1e; 效果 &#xff1e; 代码 一、总结内容 了解核…

《WebKit 技术内幕》之三(3): WebKit 架构和模块

3 Webkit2 3.1 Webkit2 架构及模块 相比于狭义的WebKit&#xff0c;WebKit2是一套全新的结构和接口&#xff0c;而并不是一个简单的升级版。Webkit2 的思想同 Chrominum 类似&#xff0c;就是将渲染过程放在单独的进程中来完成&#xff0c;独立于用户界面。 webKit2中…

ARM 1.12

norflash与nandflash的区别&#xff1a; 一、NAND flash和NOR flash的性能比较 1、NOR的读速度比NAND稍快一些。 2、NAND的写入速度比NOR快很多。 3、NAND的4ms擦除速度远比NOR的5s快。 4、大多数写入操作需要先进行擦除操作。 5、NAND的擦除单元更小&#xff0c;相应的擦除电…

嵌入式软件工程师面试题——2025校招社招通用(二十一)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

Unity关于新手引导中实现遮罩镂空效果

在新手引导每一步中实现可以遮掉其他部分而显示当前需要点击的部分&#xff0c;只需要在每一步引导的时候设置对应的镂空区域的RectTransform.效果如下图&#xff1a; 代码&#xff1a; public class SelfMaskSet : MaskableGraphic, ICanvasRaycastFilter {[SerializeField]p…

企业面临哪些能源消耗问题,能源消耗监测管理系统是如何解决这些问题?

随着全球环境问题的日益严重&#xff0c;能源问题一直被世界广泛关注。在企业运营过程中&#xff0c;能源消耗问题也是一大挑战。企业在生产和运营过程中需要大量的能源支持&#xff0c;包括电、水、气、热等多种能源。由于能源价格的不稳定性&#xff0c;使得企业在能源消耗方…

数学建模--比赛

内容来自数学建模BOOM&#xff1a;【快速入门】北海&#xff1a;数模建模基础MATLAB入门论文写作数学模型与算法(推荐数模美赛国赛小白零基础必看教程)_哔哩哔哩_bilibili 目录 1.学习内容 2.参赛须知 1&#xff09;参赛作品的组成 2)参赛作品的提交 3.软件安装 4.注意…

微图Web版如何加载吉林一号影像?

曾为你分享了如何查看调用我们已购买的上海黄浦区区县图。 这里再以该图源为例&#xff0c;为你分享在水经微图&#xff08;简称“微图”&#xff09;Web版中如何加载吉林一号影像的方法。 吉林一号图源 如果你还没有吉林一号图源&#xff0c;可以从以下网址登录后免费申请。…

《C++ Primer》第15章 面向对象程序设计(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 15.1 OOP&#xff1a;概述&#xff08;P526&#xff09; **面向对象程序设计&#xff08;object-oriented programming&#xff09;**的核心思想是数据抽象、继承和动态绑定。 继承 通过继承&#xff08;…