当前位置: 首页 > news >正文

MySQL—Keepalived+MySQL双主复制实现MySQL高可用

Keepalived原理:

Keepalived 的原理主要基于虚拟路由冗余协议(VRRP,Virtual Router Redundancy Protocol)、健康检查机制和负载均衡机制,以下为你详细介绍:

  1. VRRP 协议实现高可用:VRRP 是 Keepalived 实现高可用性的核心协议。在一个 VRRP 组中,有多台运行 Keepalived 的服务器,其中一台被选举为主(Master)服务器,其他的作为备(Backup)服务器。
    • 选举机制:通过比较设备的优先级(Priority)来确定 Master 。优先级取值范围是 1 到 254,数值越大优先级越高。默认情况下,优先级最高的设备会成为 Master 。当优先级相同时,IP 地址较大的设备会成为 Master 。Master 服务器承担实际的网络流量转发任务,而 Backup 服务器则处于监听状态。
    • 心跳检测:Master 服务器会定期(默认每隔 1 秒)向 Backup 服务器发送 VRRP 通告报文,以告知 Backup 自己的存活状态。Backup 服务器接收到通告报文后,会重置定时器。如果 Backup 服务器在一定时间(通常是几个通告间隔时间)内没有收到 Master 发送的通告报文,就会认为 Master 服务器出现故障,然后 Backup 服务器中优先级最高的设备会升级为 Master ,接管原来 Master 的工作,继续处理网络流量。
    • 状态切换:当原来的 Master 服务器恢复正常后,它会重新参与选举。如果其优先级高于当前的 Master 服务器,那么它会重新成为 Master ,而原来的 Master 则切换回 Backup 状态。
  2. 健康检查机制:Keepalived 可以对服务器的服务状态进行健康检查,以确保提供服务的服务器是正常运行的。
    • 常见检查方式:包括 TCP 端口检查、HTTP 检查、脚本检查等。例如,对于 Web 服务器,可以通过 HTTP 检查方式,向服务器的 Web 端口发送请求,根据服务器的响应来判断服务器是否正常。如果服务器没有响应或者响应状态码不符合预期,Keepalived 就会认为该服务器出现故障,将其从服务池中移除,不再将流量转发到该服务器。
    • 动态调整:通过健康检查,Keepalived 可以实时监测服务器的状态,并根据服务器的状态动态调整负载均衡的策略,保证服务的可用性和稳定性。
  3. 负载均衡机制(结合 LVS 时):Keepalived 常与 Linux 虚拟服务器(LVS)结合使用,实现负载均衡功能。
    • LVS 原理:LVS 是基于 Linux 内核的一种高性能负载均衡技术,它工作在网络层(OSI 模型的第三层),可以根据不同的调度算法(如轮询、加权轮询、最少连接等)将客户端的请求转发到后端的多个真实服务器上。
    • 协同工作:Keepalived 可以管理 LVS 的配置,监控后端真实服务器的状态。当发现某台真实服务器出现故障时,Keepalived 会自动调整 LVS 的配置,将该服务器从负载均衡的服务器池中移除,避免将请求转发到故障服务器上,从而保证服务的连续性和可用性。

综上所述,Keepalived 通过 VRRP 协议实现高可用性,通过健康检查机制确保服务器的正常运行,通过与 LVS 结合实现负载均衡,为网络服务提供了可靠的保障。

MySQL双主复制原理:

MySQL 主主复制(也称为双主复制)是一种特殊的复制模式,两台 MySQL 服务器都可以作为主服务器,同时接受写入操作,并将各自的更改复制到对方,实现双向的数据同步。其原理主要涉及以下几个关键部分:

  1. 二进制日志(Binary Log):每台 MySQL 服务器都启用二进制日志功能,用于记录所有对数据库进行修改的操作,如 INSERT、UPDATE、DELETE 等。二进制日志以事件的形式存储,包含了操作的具体内容和相关信息。例如,当在主服务器 A 上执行一个 INSERT 语句插入一条新记录时,该操作会被记录到主服务器 A 的二进制日志中。
  2. I/O 线程:在主主复制中,每台服务器都有一个 I/O 线程。当一台服务器(假设为服务器 A)上有数据更改并记录到二进制日志后,另一台服务器(服务器 B)的 I/O 线程会连接到服务器 A,请求读取服务器 A 的二进制日志。I/O 线程将读取到的二进制日志事件记录到本地的中继日志(Relay Log)中。例如,服务器 B 的 I/O 线程会定期检查服务器 A 的二进制日志是否有更新,如果有更新则读取并写入到自己的中继日志中。
  3. 中继日志(Relay Log):中继日志用于存储从主服务器复制过来的二进制日志事件。服务器 B 的 I/O 线程将从服务器 A 读取的二进制日志事件写入中继日志后,由服务器 B 的 SQL 线程来处理这些事件。
  4. SQL 线程:每台服务器的 SQL 线程负责读取中继日志中的事件,并在本地数据库上执行这些事件,从而实现数据的同步。例如,服务器 B 的 SQL 线程读取中继日志中来自服务器 A 的 INSERT 操作事件,并在服务器 B 的数据库中执行相同的 INSERT 操作,插入相同的记录。
  5. 设置唯一标识:为了避免循环复制(即一台服务器将另一台服务器复制过来的数据又复制回去),每台服务器都需要设置一个唯一的服务器 ID(server-id)。在 MySQL 的配置文件(如 my.cnf 或 my.ini)中可以设置 server-id 参数,且每台服务器的 server-id 必须不同。例如,服务器 A 的 server-id 设置为 1,服务器 B 的 server-id 设置为 2。
  6. 双向复制配置:要实现主主复制,需要在两台服务器上分别进行配置。每台服务器都要配置对方为自己的主服务器,指定对方的 IP 地址、端口、用户名、密码等连接信息。例如,在服务器 A 上配置服务器 B 为其主服务器,在服务器 B 上配置服务器 A 为其主服务器。

一、环境准备

操作系统

主机

描述

安装服务

Centos 7.9

A

MySQL主机

MySQL、Keepalived

Centos 7.9

B

MySQL主机

MySQL、Keepalived

二、MySQL主主复制部署

注意事项:

在做主主同步前,需要特别注意的一个问题:

主主复制和主从复制有一些区别,因为多主中都可以对服务器有写权限,所以设计到自增长重复问题,例如:

出现的问题(多主自增长ID重复)

1)首先在A和B两个库上创建test表结构;

2)停掉A,在B上对数据表test(存在自增长属性的ID字段)执行插入操作,返回插入ID为1;

3)然后停掉B,在A上对数据表test(存在自增长属性的ID字段)执行插入操作,返回的插入ID也是1;

4)然后 同时启动A,B,就会出现主键ID重复

解决方法:

只要保证两台服务器上的数据库里插入的自增长数据不同就可以了

如:A插入奇数ID,B插入偶数ID,当然如果服务器多的话,还可以自定义算法,只要不同就可以了

在下面例子中,在两台主主服务器上加入参数,以实现奇偶插入!

记住:在做主主同步时需要设置自增长的两个相关配置,如下:

auto_increment_offset 表示自增长字段从那个数开始,取值范围是1 .. 65535。这个就是序号。如果有n台mysql机器,则从第一台开始分为设1,2...n

auto_increment_increment 表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535。如果有n台mysql机器,这个值就设置为n。

在主主同步配置时,需要将两台服务器的:

auto_increment_increment 增长量都配置为2

auto_increment_offset 分别配置为1和2。这是序号,第一台从1开始,第二台就是2,以此类推.....

这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。(针对的是有自增长属性的字段)。

1、在A、B节点上安装mysql服务

#步骤一:解压
mkdir -p /opt/sumscope
cd /opt/sumscope
tar -zxvf  mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.44-linux-glibc2.12-x86_64 mysql#步骤二:在/opt/sumscope/mysql目录下创建data logs目录
cd /opt/sumscope/mysql 
mkdir data logs#步骤三:初始化MySQL
cd /opt/sumscope/mysql/bin
./mysqld --defaults-file=/opt/sumscope/mysql/my.cnf --basedir=/opt/sumscope/mysql --datadir=/opt/sumscope/mysql/data --user=root --initialize#步骤四:自定义启动命令
vim /opt/sumscope/mysql/support-files/mysql.server
basedir=/opt/sumscope/mysql
datadir=/opt/sumscope/mysql/data#步骤五:将启动脚本放在/etc/init.d目录下
cp /opt/sumscope/mysql/support-files/mysql.server /etc/init.d/mysql#步骤六:创建mysql用户
useradd mysql 
chown -R mysql.mysql /opt/sumscope/mysql/#步骤七:启动MySQL,修改root用户密码service mysql start cat /opt/sumscope/mysql/logs/mysql_error.log##修改root用户的密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'ppp';##使用utf-8编码创建数据库tbook
create database tbook character set utf8 collate utf8_bin;##授权stc用户远程登录tbook数据库 grant all privileges on tbook.* to stc@'%' identified by 'ppp';

2、在节点A上进行相关配置

2.1、修改MySQL的配置

#步骤一:修改mysql的配置
root@master ~]# vim /etc/my.cnf
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
#socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
socket=/var/lib/mysql/mysql.sock#log-bin=master1server-id = 1        
log-bin = mysql-bin  
binlog-ignore-db = mysql,information_schema
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
auto-increment-increment = 2    
auto-increment-offset = 1   
slave-skip-errors = all #步骤二:重启MySQL服务
[root@master ~]# service mysql restart

2.2、数据同步授权

MySQL [(none)]> grant replication slave,replication client on *.* to root@'192.168.179.131' identified by "ppp";MySQL [(none)]> flush privileges;
MySQL [(none)]> FLUSH TABLES WITH READ LOCK;MySQL [(none)]> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000002 |     3514 |              | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+

2.3、创建同步用户sync

CREATE USER 'sync'@'%' identified by '123456';GRANT REPLICATION SLAVE ON *.*  TO  'sync'@'%';

3、在节点B上进行相关配置

3.1、修改MySQL的配置

root@master ~]# vim /etc/my.cnf
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
#socket=/tmp/mysql.sock
socket=/var/lib/mysql/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pidserver-id = 2       
log-bin = mysql-bin  
binlog-ignore-db = mysql,information_schema
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
auto-increment-increment = 2    
auto-increment-offset = 2   
slave-skip-errors = all

3.2、数据库同步授权

数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql)同理slave也要授权给master机器远程同步数据的权限。

MySQL [(none)]> grant replication slave,replication client on *.* to root@'192.168.179.129' identified by "ppp";MySQL [(none)]> flush privileges;
MySQL [(none)]> FLUSH TABLES WITH READ LOCK;MySQL [(none)]> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000009 |     1945 |              | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+

3.3、执行主主同步操作

先在slave数据库上做同步master的设置。(确保slave上要同步的数据,提前在master上存在。最好双方数据保持一致)

MySQL [(none)]> unlock tables;MySQL [(none)]> stop slave;MySQL [(none)]> change master to master_host='192.168.179.129',master_user='root',master_password='ppp',master_log_file='mysql-bin.000002',master_log_pos=3514;MySQL [(none)]> start slave;MySQL [(none)]> show slave status \G;

4、在节点A上执行同步操作

MySQL [(none)]> unlock tables;MySQL [(none)]> stop slave;MySQL [(none)]> change master to master_host='192.168.179.131',master_user='root',master_password='ppp',master_log_file='mysql-bin.000009',master_log_pos=1945;MySQL [(none)]> start slave;MySQL [(none)]> show slave status \G;

5、测试MySQL主主同步的效果

5.1、在A、B节点上写入数据查看数据同步效果

在节点A上写入数据

5在节点B上查看数据并进行读写操作

 

5.2、测试结论

在上述测试操作后可知节点A写入的数据能被节点B进行增删改操作,节点B写入的数据也能被节点A进行增删改操作,两个MySQL数据库实现了双主复制。

三、安装Keepalived服务

1、在节点A上安装Keepalived作为master节点

#步骤一:安装编译需要的软件包
[root@master ~]# yum install -y pcre-devel openssl-devel popt-devel  #安装依赖包#步骤二:安装keepalived服务
[root@master ~]# tar zxvf keepalived-1.2.7.tar.gz
[root@master ~]# cd keepalived-1.2.7
[root@master ~]# ./configure --prefix=/usr/local/keepalived
[root@master ~]# make && make install#将keepalived配置成系统服务
[root@master ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@master ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@master ~]# mkdir /etc/keepalived/
[root@master ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@master ~]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/#步骤三:配置keepalived配置文件
########################################################配置文件###############################################
[root@master ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id keep1;                                         #keep1是本节点的标识,一般为hostnamescript_user root                                         #使用root执行            enable_script_security
}vrrp_script check_mysql {script "/etc/keepalived/check_mysql.sh"#检测MySQL状态的脚本路径interval 2                                              #检测间隔时间weight -20                                              #如果如果上述条件成立权重-20fall 2                                                  #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)rise 1                                                  #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {state MASTER                                            #主节点为MASTER,从节点为BACKUPinterface ens33                                         #本机网卡名称virtual_router_id 100                                   #虚拟路由的ID号,两个节点设置的参数必须一样,相同的VRID为一组,它将决定多播的地址。mcast_src_ip 192.168.179.131                            #本机的IP地址priority 100                                            #节点的优先级(0~254之间),MASTER比BACKUP高nopreempt                                               #优先级设置,异常恢复后再次抢占的问题。advert_int 1                                            #组播信息发送间隔,两个的参数必须一样,默认为1s。authentication {auth_type PASSauth_pass p                                           #按照实际生产的需求来(一般为root密码)}track_script {check_mysql}virtual_ipaddress {192.168.179.88                                        #虚拟IP地址,两台主机的必须一致。}
}
########################################################配置文件################################################步骤四:配置keepalived检测脚本内容
########################################################MySQL检测脚本内容###############################################
[root@master ~]# vim /etc/keepalived/check_mysql.sh    #检测MySQL服务断开就杀掉keepalived进程,使VIP漂移#!/bin/bash                     counter=$(netstat -na|grep "LISTEN"|grep ":3306 "|wc -l)if [ "${counter}" -eq 0 ]; thenservice keepalived stopfi########################################################MySQL检测脚本内容################################################步骤五:对检测脚本添加执行权限、启动keepalived服务[root@master ~]# chmod +x /etc/keepalived/check_mysql.sh[root@master ~]# /etc/init.d/keepalived start

2、在节点B上安装Keepalived作为slave节点

安装步骤与节点A上安装的方法相同,但是配置文件需要修改

#步骤一:配置keepalived配置文件
########################################################配置文件###############################################
[root@slave ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id keep2;script_user rootenable_script_security
}vrrp_script check_mysql { script "/etc/keepalived/check_mysql.sh"     #检测脚本所在的位置interval 2weight -20fall 2rise 1
}
vrrp_instance VI_1 {state BACKUP                        #修改状态名称interface ens33                     #修改网卡名称virtual_router_id 100mcast_src_ip 192.168.179.133        #自己的IP地址priority 80                         #作为备节点权重要比主节点小advert_int 1authentication {auth_type PASSauth_pass p}track_script {check_mysql                       }virtual_ipaddress {192.168.179.88                   #虚拟IP地址}
}
########################################################配置文件################################################步骤二:配置keepalived检测脚本内容用于检测MySQL的状态
########################################################MySQL检测脚本内容###############################################
[root@master ~]# vim /etc/keepalived/check_mysql.sh    #检测MySQL服务断开就杀掉keepalived进程,使VIP漂移#!/bin/bash                     counter=$(netstat -na|grep "LISTEN"|grep ":3306 "|wc -l)if [ "${counter}" -eq 0 ]; thenservice keepalived stopfi########################################################MySQL检测脚本内容################################################步骤三:对检测脚本添加执行权限、启动keepalived服务[root@master ~]# chmod +x /etc/keepalived/check_mysql.sh[root@master ~]# /etc/init.d/keepalived start   

注意:因为keepalived中配置了MySQL状态检测脚本,keepalived在启动时会执行检测脚本,所以等MySQL服务启动成功后再启动keepalived服务,否则服务将无法启动keepalived。

四、高可用场景测试

模拟场景一:当主机MySQL出现故障(3306端口不存在)

步骤一:分别在主机和备机上添加对虚拟IP的验证方式

步骤二:关闭节点A上的MySQL服务

因为配置了权重原因虚拟IP在节点A上,关闭MySQL服务看keepalived服务是否会运行mysql状态检测脚本的内容从而使虚拟IP漂移到节点B上。

步骤三:验证虚拟IP是否漂移到节点B上

在浏览器上验证:输入:http://192.168.179.88/a.html

结论:虚拟IP从主节点漂移到从节点上

步骤四:模拟故障恢复虚拟IP自动迁回

 在浏览器上验证:输入:http://192.168.179.88/a.html

结论:因为主机故障恢复,主节点上的keepalived配置的权重要比从节点的权重要高,所以虚拟IP自动从从节点漂移到从主点上 

相关文章:

MySQL—Keepalived+MySQL双主复制实现MySQL高可用

Keepalived原理: Keepalived 的原理主要基于虚拟路由冗余协议(VRRP,Virtual Router Redundancy Protocol)、健康检查机制和负载均衡机制,以下为你详细介绍: VRRP 协议实现高可用:VRRP 是 Keep…...

CSS 使用white-space属性换行

一、white-space属性的常见值 * 原本格式: 1、white-space:normal 默认值,空格和换行符会被忽略过滤掉;宽度不够时文本会自动换行 * 宽度足够时,normal 处理后的格式 * 宽度不够时, normal 处理后的格式 2、white-spa…...

【数据结构第十六节】实现链式结构二叉树(详细递归图解—呕心沥血版!)

必须有为成功付出代价的决心,然后想办法付出这个代价。云边有个稻草人-CSDN博客 这节课挺抽象(苦笑),没事,我会帮你!干就完了! (目录在路上) 正文开始—— 引言 用链表…...

mysqldump 参数详解

mysqldump 是一个用于备份 MySQL 数据库的工具。它可以生成一组 SQL 语句,这些语句可以用来重现原始数据库对象定义和表数据。以下是一些常用的 mysqldump 参数及其详细解释: 常用参数 基本参数 --host=host_name, -h host_name: 指定 MySQL 数据库主机地址,默认为 localh…...

Vue-Flow绘制流程图(Vue3+ElementPlus+TS)简单案例

本文是vue3Elementplusts框架编写的简单可拖拽绘制案例。 1.效果图&#xff1a; 2.Index.vue主代码&#xff1a; <script lang"ts" setup> import { ref, markRaw } from "vue"; import {VueFlow,useVueFlow,MarkerType,type Node,type Edge } fro…...

【11】RUST使用cargo组织crate

文章目录 使用cargo组织crate重导出编译文档生成测试 cargo组织工作空间 TODOcrate.io账号 TODO暂时不看发布crate 使用cargo组织crate 重导出 在模块顶部使用pub use self::重导出&#xff0c;方便使用模块时候直接使用use mod_X::xxx。从而隐藏crate内部模块的结构。方便向…...

开放标准(RFC 7519):JSON Web Token (JWT)

开放标准&#xff1a;JSON Web Token 前言基本使用整合Shiro登录自定义JWT认证过滤器配置Config自定义凭证匹配规则接口验证权限控制禁用session缓存的使用登录退出单用户登录Token刷新双Token方案单Token方案 前言 JSON Web Token &#xff08;JWT&#xff09; 是一种开放标准…...

Linux上用C++和GCC开发程序实现不同MySQL实例下单个Schema之间的稳定高效的数据迁移

设计一个在Linux上运行的GCC C程序&#xff0c;同时连接两个不同的MySQL实例&#xff0c;两个实例中分别有两个Schema的表结构完全相同&#xff0c;复制一个实例中一个Schema里的所有表的数据到另一个实例中一个Schema里&#xff0c;使用以下快速高效的方法&#xff0c;加入异常…...

【Windows】Windows常用命令

目录 文件和目录相关命令系统信息查看命令网络相关命令进程管理命令磁盘管理命令用户和权限管理命令计划任务和脚本命令其他常用命令1. 文件和目录相关命令 命令作用示例cd切换目录cd C:\Usersdir列出目录内容dirmkdir创建新目录mkdir NewFolderrmdir删除空目录rmdir OldFolder…...

趣讲TCP三次握手

一、TCP三次握手简介 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP连接中&#xff0c;只有两方进行通信&#xff0c;它使用校验和、确认和重传机制来保证数据的可靠传输。…...

vue3中的标签属性中的Ref

用在普通 DOM 标签上&#xff0c;获取的是 DOM 节点&#xff1a; 当你在一个普通的 HTML 标签&#xff08;例如 <div>、<input> 等&#xff09;上使用 ref 属性时&#xff0c;ref 会返回该 DOM 元素的直接引用。这使得你可以在 JavaScript 代码中方便地访问和操作…...

vue3.2 + vxe-table4.x 实现多层级结构的 合并、 展开、收起 功能

<template><div style"padding: 20px"><vxe-table border :data"list" :height"800" :span-method"rowspanMethod"><vxe-column title"一级类目" field"category1"><template #defaul…...

DeepSeek R1 + 飞书机器人实现AI智能助手

效果 TFChat项目地址 https://github.com/fish2018/TFChat 腾讯大模型知识引擎用的是DeepSeek R1&#xff0c;项目为sanic和redis实现&#xff0c;利用httpx异步处理流式响应&#xff0c;同时使用buffer来避免频繁调用飞书接口更新卡片的网络耗时。为了进一步减少网络IO消耗&…...

Java虚拟机监控工具

在Java应用高频出现的OOM、卡顿、线程阻塞等问题背后&#xff0c;往往隐藏着复杂的JVM运行机制异常。本文将通过真实案例场景&#xff0c;演示6款主流工具的组合使用技巧&#xff0c;助你快速定位90%以上的线上故障。 一、基础监控三板斧 1. jstat&#xff1a;GC性能透视仪 …...

利用python和gpt写一个conda环境可视化管理工具

最近在学习python&#xff0c;由于不同的版本之间的差距较大&#xff0c;如果是用环境变量来配置python的话&#xff0c;会需要来回改&#xff0c;于是请教得知可以用conda来管理&#xff0c;但是conda在管理的时候老是要输入命令&#xff0c;感觉也很烦&#xff0c;于是让gpt帮…...

软件工程----统一过程模型RUP

统一过程RUP是一种以用例驱动、以体系结构为核心、迭代和增量的软件开发过程&#xff0c;由UML方法和工具支持&#xff0c;广泛应用于各类面向对象项目。 RUP本身支持可裁剪性&#xff0c;可应付给类领域软件和不同的项目规模 RUP蕴含了大量优秀的实践方法&#xff0c;如&…...

Spring的MutipartFile 会直接将流转成文件存放在临时目录嘛?

Spring 的 MultipartFile 默认会将上传的文件存储到临时目录。具体行为取决于底层的 MultipartResolver 实现。常见的实现包括&#xff1a; 1. StandardServletMultipartResolver&#xff08;默认实现&#xff09; 如果使用的是 StandardServletMultipartResolver&#xff08…...

基于大数据的空气质量数据可视化分析系统

【大数据】基于大数据的空气质量数据可视化分析系统&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本系统的实践价值在于将大数据技术与空气质量监测相结合&#xff0c;为公众、研究机构和政府…...

一文了解:部署 Deepseek 各版本的硬件要求

很多朋友在咨询关于 DeepSeek 模型部署所需硬件资源的需求&#xff0c;最近自己实践了一部分&#xff0c;部分信息是通过各渠道收集整理&#xff0c;so 仅供参考。 言归正转&#xff0c;大家都知道&#xff0c;DeepSeek 模型的性能在很大程度上取决于它运行的硬件。我们先看一下…...

国内访问Github的四种方法(2025版)

声明&#xff1a;以下内容&#xff0c;仅供学习使用&#xff0c;不得他用。如有他用&#xff0c;与本文作者无关。 国内访问GitHub及下载文件的解决方案整理如下&#xff0c;结合最新技术方案和实测有效方法&#xff1a; 一、网络层解决方案 Hosts文件修改法 通过DNS查询工具…...

企业级AI办公落地实践:基于钉钉/飞书的标准产品解决方案

一、平台化AI的崛起&#xff1a;开箱即用的智能革命 2024年企业AI应用调研数据显示&#xff1a; 73%的中型企业选择平台标准产品而非自研头部SaaS平台AI功能渗透率达89%典型ROI周期从18个月缩短至3-6个月 核心优势对比&#xff1a; 维度自研方案平台标准产品部署周期6-12个…...

金融行业专题|某基金公司基于超融合信创平台支持人大金仓数据库的性能评测

随着“自主可控”在 IT 基础设施领域不断深化&#xff0c;数据库的国产化替代也被很多金融机构提上日程。为了保证性能&#xff0c;大部分国产数据库都基于信创架构的裸金属服务器部署。在国产虚拟化/超融合平台上&#xff0c;国产数据库性能表现如何&#xff1f;尤其是搭配信创…...

Python异常处理面试题及参考答案

目录 什么是 Python 中的异常?程序为什么需要异常处理机制? 解释 BaseException 和 Exception 的区别 Python 的异常处理与传统的错误代码返回机制相比有哪些优势? 列出至少 5 个 Python 内置异常类型并说明触发场景 语法错误 (SyntaxError) 与运行时异常 (Runtime Erro…...

Java 实现快速排序算法:一条快速通道,分而治之

大家好&#xff0c;今天我们来聊聊快速排序&#xff08;QuickSort&#xff09;算法&#xff0c;这个经典的排序算法被广泛应用于各种需要高效排序的场景。作为一种分治法&#xff08;Divide and Conquer&#xff09;算法&#xff0c;快速排序的效率在平均情况下非常高&#xff…...

【JavaSE-1】初识Java

1、Java 是什么? Java 是一种优秀的程序设计语言,人类和计算机之间的交流可以借助 Java 这种语言来进行交流,就像人与人之间可以用中文、英语,日语等进行交流一样。 Java 和 JavaScript 两者有关系吗? 一点都没有关系!!! 前端内容:HTML CSS JS,称为网页三剑客 2、JDK 下…...

JavaScript将:;隔开的字符串转换为json格式。使用正则表达式匹配键值对,并构建对象。多用于解析cssText为style Object对象

// 使用正则表达式匹配键值对&#xff0c;并构建对象 let string2Json(s)>{const r {};s.replace(/&#xff1b;/g, ;).replace(/\;/g, \n).replace(/&#xff1a;/g, :).replace(/\n/g, \n)//合并多个换行符.split(\n).forEach(item > {const [k, v] item.split(:);(k…...

lvgl运行机制分析

lv_timer_handler() 是 LVGL 的“心脏”&#xff1a;这个函数会依次做以下事情&#xff1a; 处理定时器&#xff08;如动画、延迟回调&#xff09;。 读取输入设备&#xff08;如触摸屏、按键的状态&#xff09;。 刷新脏区域&#xff08;仅重绘屏幕上发生变化的区域&#xf…...

紧跟潮流,将 DeepSeek 集成到 VSCode

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的免费开源代码编辑器&#xff0c;自 2015 年发布以来&#xff0c;凭借其轻便、强大、且拥有丰富扩展生态的特点&#xff0c;迅速成为了全球开发者的首选工具。VSCode 支持多平台操作系统&#xff0c;包…...

Apache Tomcat RCE 稳定复现 保姆级!(CVE-2024-50379)附视频+POC

原文链接 Apache Tomcat 最新RCE 稳定复现分析 保姆级&#xff01;&#xff01;&#xff01;附复现视频POC 前言 最近爆出 Apache Tomcat条件竞争导致的RCE&#xff0c;影响范围当然是巨大的&#xff0c;公司也及时收到了相关情报&#xff0c;于是老大让我复现&#xff0c;以…...

【文献阅读】A Survey on Model Compression for Large Language Models

大语言模型模型压缩综述 摘要 大语言模型&#xff08;LLMs&#xff09;已成功变革了自然语言处理任务。然而&#xff0c;其庞大的规模和高昂的计算需求给实际应用带来了挑战&#xff0c;尤其是在资源受限的环境中。模型压缩已成为应对这些挑战的关键研究领域。本文对大语言模…...

利用shardingsphere-proxy对mysql分片

本文介绍利用shardingsphere-proxy分库分表的配置过程。shardingsphere-proxy是一个中间件&#xff0c;启动后会模拟成一个实际的mysql服务&#xff0c;我们可以通过可视化工具或jdbc操作&#xff0c;实际执行的sql会通过shardingsphere-proxy转换&#xff0c;进而在具体的mysq…...

AI智能体与大语言模型:重塑SaaS系统的未来航向

在数字化转型的浪潮中&#xff0c;软件即服务&#xff08;SaaS&#xff09;系统一直是企业提升效率、优化业务流程的重要工具。随着AI智能体和大语言模型&#xff08;LLMs&#xff09;的迅速发展&#xff0c;SaaS系统正迎来前所未有的变革契机。本文将从AI智能体和大语言模型对…...

mapbox基础,使用geojson加载heatmap热力图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️heatmap热力图层样式二、🍀使用geojs…...

python环境打包2 pytorch和cuda的安装逻辑

基本逻辑 理一理安装pytorch的一列逻辑&#xff0c;以及他的依赖。&#xff08;看完这小节再实践&#xff09; 配置pytorch&#xff0c;安装步骤为&#xff1a;显卡驱动-->python-->cuda--->pytorch。 pytorch是依赖conda的&#xff0c;conda是依赖python的。 &am…...

hot100-矩阵

240.搜索二维矩阵② 编写一个高效的算法来搜索 mxn 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 思路&#xff1a; 输入矩阵&#xff1a; 从标准输入读取矩阵的行数 n 和列数 m。 按…...

扩散模型基本概念

1. 核心思想 从最原始的DDPM来讲,扩散模型是用变分估计训练的马尔可夫链,相当于VAE+流模型。与标准化流相比,扩散模型的正向过程为预先定义的加噪过程,负责将图像 x ∼ p ( x ) x\sim{p(x)} x∼...

【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…...

网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析

1. 基本定义 HTTP&#xff08;HyperText Transfer Protocol&#xff09; 应用层协议&#xff0c;用于客户端与服务器之间的数据传输&#xff08;默认端口 80&#xff09;。 HTTP/1.0&#xff1a;早期版本&#xff0c;每个请求需单独建立 TCP 连接&#xff0c;效率低。HTTP/1.1&…...

Mysql COUNT() 函数详解

简介 COUNT()函数定义 COUNT()函数是SQL中常用的 聚合函数 &#xff0c;用于统计满足特定条件的记录数。它可以灵活地应用于各种查询场景&#xff0c;帮助用户快速获取所需的数据统计信息。该函数不仅能够计算所有行的数量&#xff0c;还能针对特定列进行计数&#xff0c;并支…...

Redis缓存一致性难题:如何让数据库和缓存不“打架”?

标题&#xff1a;Redis缓存一致性难题&#xff1a;如何让数据库和缓存不“打架”&#xff1f;&#xff08;附程序员脱发指南&#xff09; 导言&#xff1a;当数据库和缓存成了“异地恋” 想象一下&#xff1a;你刚在美团下单了一份麻辣小龙虾&#xff0c;付款后刷新页面&#…...

WIn32 笔记:本专栏课件

专栏导航 上一篇&#xff1a;在VS2019里面&#xff0c;调整代码字体大小 回到目录 下一篇&#xff1a;计算机基础&#xff1a;二进制基础01&#xff0c;比特与字节 本节前言 在之前的讲解里面&#xff0c;我讲解了 Visual Studio 软件的一些个基础操作步骤。从本节开始&am…...

设置同一个局域网内远程桌面Ubuntu

1、安装xrdp: 打开终端&#xff0c;运行以下命令来安装xrdp&#xff1a; sudo apt update sudo apt install xrdp 2、启动 XRDP 并设置开机自启 sudo systemctl start xrdp sudo systemctl enable xrdp 3、验证 XRDP 运行状态 sudo systemctl status xrdp 如果显示 active (ru…...

Spring Boot 自定义 Starter 完整实战手册

Spring Boot 自定义 Starter 完整实战手册 一、核心概念与项目结构 1. 什么是 Starter&#xff1f; 本质&#xff1a;预配置模块 依赖集合 自动配置类 默认实现核心价值&#xff1a; 统一技术栈&#xff1a;团队快速复用标准组件简化配置&#xff1a;隐藏复杂实现细节&…...

C++ 红黑树万字详解(含模拟实现(两种版本))

目录 红黑树的概念 红黑树的性质 红黑树的删除 红黑树与AVL树的比较 红黑树的应用 红黑树的模拟实现 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶…...

使用 Spring Boot 和 Keycloak 的 OAuth2 快速指南

1. 概述 本教程是关于使用 Spring Boot 和 Keycloak 通过 OAuth2 配置后端的。 我们将使用 Keycloak 作为 OpenID 提供程序。我们可以将其视为负责身份验证和用户数据&#xff08;角色、配置文件、联系信息等&#xff09;的用户服务。它是最完整的 OpenID Connect &#xff0…...

4个小时开发DeepSeek+baiduNaotu一键生成思维导图

一、引言 最近发现AI生成思维导图的解决方案普遍存在两个断层&#xff1a;用户需手动复制模型输出的JSON数据到脑图软件&#xff0c;且缺乏实时可视化反馈。基于日常使用的BaiduNaotu框架&#xff08;其轻量级架构与简洁的UI设计已满足基础需求&#xff09;&#xff0c;我决定…...

DeepSeek 开源狂欢周(一)FlashMLA:高效推理加速新时代

上周末&#xff0c;DeepSeek在X平台&#xff08;Twitter&#xff09;宣布将开启连续一周的开源&#xff0c;整个开源社区为之沸腾&#xff0c;全球AI爱好者纷纷为关注。没错&#xff0c;这是一场由DeepSeek引领的开源盛宴&#xff0c;推翻了传统推理加速的种种限制。这周一&…...

视频批量分段工具

参考原文&#xff1a;视频批量分段工具 选择视频文件 当您启动这款视频批量分段工具程序后&#xff0c;有两种便捷的方式来选择要处理的视频文件。其一&#xff0c;您可以点击程序界面中的 “文件” 菜单&#xff0c;在下拉选项里找到 “选择视频文件” 按钮并点击&#xff1b…...

【OMCI实践】ONT上线过程的omci消息(五)

引言 在前四篇文章中&#xff0c;主要介绍了ONT上线过程的OMCI交互的第一、二、三个阶段omci消息&#xff0c;本篇介绍第四个阶段&#xff0c;OLT下发配置到ONT。前三个阶段&#xff0c;每个厂商OLT和ONT都遵循相同标准&#xff0c;OMCI的交换过程大同小异。但第四个阶段&…...

git从零学起

从事了多年java开发&#xff0c;一直在用svn进行版本控制&#xff0c;如今更换了公司&#xff0c;使用的是git进行版本控制&#xff0c;所以打算记录一下git学习的点滴&#xff0c;和大家一起分享。 百度百科&#xff1a; Git&#xff08;读音为/gɪt/&#xff09;是一个开源…...