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

MySQL高可用搭建方案MHA

MHA架构介绍

MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~ 30秒之内自动完数据库的故障切换操作,并且能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

基于MHA的架构不像MMM那样需要搭建主主复制,只需要搭建基本的主从复制架构即可。因为MHA在主库挂掉时,是在多个从库中选取出一个从库作为新的主库。MHA集群中的各节点彼此之间均需要基于ssh 互信通信,以实现远程控制及数据管理功能。

MHA提供功能

  • 可以监控Master节点是否可用
  • 当Master不可用时,能在多个Slave中选举出新的Master
  • 提供了主从切换和故障转移功能,MHA会尝试在宕机的Master上保存binlog,在最大程度上保证事务不丢失。但如果是Master所在服务器已经无法访问,或硬件层面出现了问题,则无法成功保存binlog
  • MHA可以与半同步复制结合,避免从库之间出现数据不一致的情况
  • 支持MySQL基于GTID和基于日志点的两种复制方式

MHA故障转移过程

  1. 尝试使用 ssh登录到宕机崩溃的Master节点上保存二进制日志事件(binlog events);
  2. 从多个Slave中识别含有最新更新的Slave,将其作为备选的Master;
  3. 然后基于该Slave同步差异的中继日志(relaylog)到其他的Slave上;
  4. 接着同步从原Master上保存的二进制日志事件(binlog events);
  5. 将备选的Master提升为新的Master;
  6. 使其他的Slave连接新的Master进行复制;
  7. 在新的Master启动vip地址,保证前端请求可以发送到新的Master。

MHA架构图

本次实验所用机器说明 

操作系统: CentOS Stream  9

数据库版本:MySQL8.0.36

MHA版本:0.58

名称角色IP
manger集群管理节点192.168.0.110
master主库192.168.0.104
slave1从库192.168.0.103
slave2从库192.168.0.102

本次实验的前提是建立在已经搭建好主从复制集群的前提下,MySQL的主从复制可以参考这篇文章:MySQL5.7.43 GTID主从复制配置

但是在使用MySQL8.0.36配置主从复制的时候和MySQL5.7.43有些地方不同需要注意

等主从复制集群搭建好后就可以开始按下面的步骤开始本次实验了

配置ssh免密登陆

生成密钥

ssh-keygen

生成密钥和公钥后就可以在/root/.ssh/下面看到,当然这是默认的路径

将密钥拷贝到其他服务器上

ssh-copy-id -i /root/.ssh/id_rsa root@192.168.0.104
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.0.103
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.0.102

 然后到集群中其他节点上进行同样的操作,由于是重复的操作这里就不演示了,最后测试能否免密登陆即可

安装MHA软件包

MHA下载地址

mha4mysql-manager-0.58.tar.gz:

wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz

mha4mysql-node-0.58.tar.gz:

wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz

manager上安装mha4mysql-manager软件包


#下载依赖包
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN#进入安装目录
cd mha4mysql-manager-0.58#编译安装
perl Makefile.PL
make && make install

在所有节点上安装mha4mysql-node软件包

#下载依赖包
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN#进入安装目录
cd mha4mysql-node-0.58#编译安装
perl Makefile.PL
make && make install

关于执行perl Makefile.PL报错解决方法参考文章

Can't locate IPC/Cmd.pm in @INC (you may need to install the IPC::Cmd module

https://blog.51cto.com/u_16175492/6651879

这里模块的安装可能很慢请nai'xi

配置manger节点

创建MHA的配置文件存放目录和工作目录

[root@manager ~]# mkdir /etc/mha
[root@manager ~]# mkdir /home/mysql_mha

创建MHA的配置文件,并添加如下内容

这个组件secondary_check_script在安装的时候路径可能在/usr/bin/下面,需要移动到/usr/local/bin/下面 ,或者在下面的配置文件中更改路径

# mha用于访问数据库的账户和密码
user=mha
password=密码
# 指定mha的工作目录
manager_workdir=/home/mysql_mha# mha日志文件的存放路径
manager_log=/home/mysql_mha/manager.log# 指定mha在远程节点上的工作目录
remote_workdir=/home/mysql_mha# 可以使用ssh登录的用户
ssh_user=root# 用于主从复制的MySQL用户和密码
repl_user=repl
repl_password=密码
# 指定间隔多少秒检测一次
ping_interval=1# 指定master节点存放binlog日志文件的目录
master_binlog_dir=/var/lib/mysql# 指定一个脚本,该脚本实现了在主从切换之后,将虚拟IP漂移到新的Master上
master_ip_failover_script=/usr/local/bin/master_ip_failover# 指定用于二次检查节点状态的脚本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.0.104 -s 192.168.0.103 -s 192.168.0.102# 配置集群中的节点信息
[server1]
hostname=192.168.0.104
port=3306
# 指定该节点可以参与Master选举
candidate_master=1[server2]
hostname=192.168.0.103
port=3306
candidate_master=1[server3]
hostname=192.168.0.102
port=3306
# 指定该节点不能参与Master选举
no_master=1

编写配置文件中所配置的master_ip_failover脚本,该脚本是根据MHA的官方示例修改的,MHA默认并没有提供。需要注意脚本中的几处地方需要根据实际情况进行修改,已用注释标明

#!/usr/bin/env perluse strict;
use warnings FATAL => 'all';use Getopt::Long;my ($command, $orig_master_host, $orig_master_ip,$ssh_user,$orig_master_port, $new_master_host, $new_master_ip,$new_master_port,$orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);# 这里定义的虚拟IP可以根据实际情况进行修改
my $vip = '192.168.0.111/24';
my $brdc = '192.168.0.255';
my $ifdev = 'eth0';
my $key = '1';
# 这里的网卡名称 “eth0” 需要根据你机器的网卡名称进行修改
my $ssh_start_vip = "sudo /sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig eth0:$key down";
my $ssh_Bcast_arp= "sudo /sbin/arping -I bond0 -c 3 -A $vip";GetOptions('command=s'          => \$command,'ssh_user=s'         => \$ssh_user,'orig_master_host=s' => \$orig_master_host,'orig_master_ip=s'   => \$orig_master_ip,'orig_master_port=i' => \$orig_master_port,'orig_master_ssh_port=i' => \$orig_master_ssh_port,'new_master_host=s'  => \$new_master_host,'new_master_ip=s'    => \$new_master_ip,'new_master_port=i'  => \$new_master_port,'new_master_ssh_port' => \$new_master_ssh_port,'new_master_user' => \$new_master_user,'new_master_password' => \$new_master_password);exit &main();sub main {$ssh_user = defined $ssh_user ? $ssh_user : 'root';print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$ssh_start_vip===\n\n";if ( $command eq "stop" || $command eq "stopssh" ) {my $exit_code = 1;eval {print "Disabling the VIP on old master: $orig_master_host \n";&stop_vip();$exit_code = 0;};if ($@) {warn "Got Error: $@\n";exit $exit_code;}exit $exit_code;}elsif ( $command eq "start" ) {my $exit_code = 10;eval {print "Enabling the VIP - $vip on the new master - $new_master_host \n";&start_vip();&start_arp();$exit_code = 0;};if ($@) {warn $@;exit $exit_code;}exit $exit_code;}elsif ( $command eq "status" ) {print "Checking the Status of the script.. OK \n";exit 0;}else {&usage();exit 1;}
}sub start_vip() {`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}sub start_arp() {`ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {print"Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}

还需要给该脚本添加可执行权限,否则MHA是无法调用的

[root@manager ~]# chmod a+x /usr/local/bin/master_ip_failover

根据配置文件中remote_workdir的配置,需在其他节点上创建MHA的远程工作目录

[root@master ~]# mkdir /home/mysql_mha
[root@slave-01 ~]# mkdir /home/mysql_mha
[root@slave-02 ~]# mkdir /home/mysql_mha

在配置文件中指定了让manager使用mha这个用户来访问数据库节点,所以需要在master节点上创建mha用户

create user 'mha'@'%' identified with mysql_native_password by '密码';
grant all privileges on *.* to 'mha'@'%';
flush privileges;

完成以上所有步骤后,在manager节点上使用masterha_check_sshmasterha_check_repl 对配置进行检查,其中masterha_check_ssh用于检查ssh登录是否正常,而masterha_check_repl则用于检查主从节点的复制链路是否正常

[root@manager ~]# masterha_check_ssh --conf=/etc/mha/mysql_mha.cnf
[root@manager ~]# masterha_check_repl --conf=/etc/mha/mysql_mha.cnf
[root@fa0b3e01d810 bin]# masterha_check_ssh --conf=/etc/mha/mysql_mha.cnf
Mon Apr  8 16:54:15 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Apr  8 16:54:15 2024 - [info] Reading application default configuration from /etc/mha/mysql_mha.cnf..
Mon Apr  8 16:54:15 2024 - [info] Reading server configuration from /etc/mha/mysql_mha.cnf..
Mon Apr  8 16:54:15 2024 - [info] Starting SSH connection tests..
Mon Apr  8 16:54:18 2024 - [debug]
Mon Apr  8 16:54:16 2024 - [debug]  Connecting via SSH from root@192.168.0.103(192.168.0.103:22) to root@192.168.0.104(192.168.0.104:22)..
Mon Apr  8 16:54:17 2024 - [debug]   ok.
Mon Apr  8 16:54:17 2024 - [debug]  Connecting via SSH from root@192.168.0.103(192.168.0.103:22) to root@192.168.0.102(192.168.0.102:22)..
Mon Apr  8 16:54:17 2024 - [debug]   ok.
Mon Apr  8 16:54:18 2024 - [debug]
Mon Apr  8 16:54:16 2024 - [debug]  Connecting via SSH from root@192.168.0.102(192.168.0.102:22) to root@192.168.0.104(192.168.0.104:22)..
Mon Apr  8 16:54:17 2024 - [debug]   ok.
Mon Apr  8 16:54:17 2024 - [debug]  Connecting via SSH from root@192.168.0.102(192.168.0.102:22) to root@192.168.0.103(192.168.0.103:22)..
Mon Apr  8 16:54:18 2024 - [debug]   ok.
Mon Apr  8 16:54:18 2024 - [debug]
Mon Apr  8 16:54:15 2024 - [debug]  Connecting via SSH from root@192.168.0.104(192.168.0.104:22) to root@192.168.0.103(192.168.0.103:22)..
Mon Apr  8 16:54:17 2024 - [debug]   ok.
Mon Apr  8 16:54:17 2024 - [debug]  Connecting via SSH from root@192.168.0.104(192.168.0.104:22) to root@192.168.0.102(192.168.0.102:22)..
Mon Apr  8 16:54:17 2024 - [debug]   ok.
Mon Apr  8 16:54:18 2024 - [info] All SSH connection tests passed successfully.
Use of uninitialized value in exit at /usr/local/bin/masterha_check_ssh line 44.

 

[root@fa0b3e01d810 bin]# masterha_check_repl --conf=/etc/mha/mysql_mha.cnf
Mon Apr  8 16:54:38 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Apr  8 16:54:38 2024 - [info] Reading application default configuration from /etc/mha/mysql_mha.cnf..
Mon Apr  8 16:54:38 2024 - [info] Reading server configuration from /etc/mha/mysql_mha.cnf..
Mon Apr  8 16:54:38 2024 - [info] MHA::MasterMonitor version 0.58.
Mon Apr  8 16:54:40 2024 - [info] Multi-master configuration is detected. Current primary(writable) master is 192.168.0.104(192.168.0.104:3306)
Mon Apr  8 16:54:40 2024 - [info] Master configurations are as below:
Master 192.168.0.103(192.168.0.103:3306), replicating from 192.168.0.104(192.168.0.104:3306), read-only
Master 192.168.0.104(192.168.0.104:3306), replicating from 192.168.0.103(192.168.0.103:3306)Mon Apr  8 16:54:40 2024 - [info] GTID failover mode = 1
Mon Apr  8 16:54:40 2024 - [info] Dead Servers:
Mon Apr  8 16:54:40 2024 - [info] Alive Servers:
Mon Apr  8 16:54:40 2024 - [info]   192.168.0.104(192.168.0.104:3306)
Mon Apr  8 16:54:40 2024 - [info]   192.168.0.103(192.168.0.103:3306)
Mon Apr  8 16:54:40 2024 - [info]   192.168.0.102(192.168.0.102:3306)
Mon Apr  8 16:54:40 2024 - [info] Alive Slaves:
Mon Apr  8 16:54:40 2024 - [info]   192.168.0.103(192.168.0.103:3306)  Version=8.0.36 (oldest major version between slaves) log-bin:enabled
Mon Apr  8 16:54:40 2024 - [info]     GTID ON
Mon Apr  8 16:54:40 2024 - [info]     Replicating from 192.168.0.104(192.168.0.104:3306)
Mon Apr  8 16:54:40 2024 - [info]     Primary candidate for the new Master (candidate_master is set)
Mon Apr  8 16:54:40 2024 - [info]   192.168.0.102(192.168.0.102:3306)  Version=8.0.36 (oldest major version between slaves) log-bin:enabled
Mon Apr  8 16:54:40 2024 - [info]     GTID ON
Mon Apr  8 16:54:40 2024 - [info]     Replicating from 192.168.0.104(192.168.0.104:3306)
Mon Apr  8 16:54:40 2024 - [info]     Not candidate for the new Master (no_master is set)
Mon Apr  8 16:54:40 2024 - [info] Current Alive Master: 192.168.0.104(192.168.0.104:3306)
Mon Apr  8 16:54:40 2024 - [info] Checking slave configurations..
Mon Apr  8 16:54:40 2024 - [info] Checking replication filtering settings..
Mon Apr  8 16:54:40 2024 - [info]  binlog_do_db= , binlog_ignore_db=
Mon Apr  8 16:54:40 2024 - [info]  Replication filtering check ok.
Mon Apr  8 16:54:40 2024 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.
Mon Apr  8 16:54:40 2024 - [info] Checking SSH publickey authentication settings on the current master..
Mon Apr  8 16:54:40 2024 - [info] HealthCheck: SSH to 192.168.0.104 is reachable.
Mon Apr  8 16:54:40 2024 - [info]
192.168.0.104(192.168.0.104:3306) (current master)+--192.168.0.103(192.168.0.103:3306)+--192.168.0.102(192.168.0.102:3306)Mon Apr  8 16:54:40 2024 - [info] Checking replication health on 192.168.0.103..
Mon Apr  8 16:54:40 2024 - [info]  ok.
Mon Apr  8 16:54:40 2024 - [info] Checking replication health on 192.168.0.102..
Mon Apr  8 16:54:40 2024 - [info]  ok.
Mon Apr  8 16:54:40 2024 - [info] Checking master_ip_failover_script status:
Mon Apr  8 16:54:40 2024 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.0.104 --orig_master_ip=192.168.0.104 --orig_master_port=3306IN SCRIPT TEST====root|sudo /sbin/ifconfig eth0:1 down==root|sudo /sbin/ifconfig eth0:1 192.168.0.111/24===Checking the Status of the script.. OK
Mon Apr  8 16:54:40 2024 - [info]  OK.
Mon Apr  8 16:54:40 2024 - [warning] shutdown_script is not defined.
Mon Apr  8 16:54:40 2024 - [info] Got exit code 0 (Not master dead).MySQL Replication Health is OK.

以上检测都通过后,就可以启动MHA服务了。启动命令如下

[root@manager ~]# nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf &

启动完成后,可以使用ps命令查看masterha_manager进程是否存在,如下存在则代表启动成功

[root@manager ~]# ps aux |grep masterha_manager
root       2842  0.3  1.1 299648 22032 pts/0    S    18:30   0:00 perl /usr/bin/masterha_manager --conf=/etc/mha/mysql_mha.cnf
root       2901  0.0  0.0 112728   976 pts/0    R+   18:31   0:00 grep --color=auto masterha_manager
[root@manager ~]# 

 最后我们需要到master节点上,手动去配置虚拟IP。因为MHA只会在主从切换时漂移虚拟IP到新的Master节点,而不会在第一次启动时主动去设置Master的虚拟IP,所以我们需要手动设置。设置虚拟IP的命令如下

[root@master ~]# ifconfig eth0:1 192.168.0.111/24

 

到此为止,我们就已经完成了MHA高可用架构的搭建,接下来我们对其进行一些简单的测试。例如,测试下是否能正常ping 通虚拟IP,毕竟应用端访问数据库时连接的是虚拟IP,所以首先得确保虚拟IP是能够被访问的。如下

MHA架构优缺点

优点:

  • 使用Perl脚本语言开发并且完全开源,开发者可以根据自己的需求进行二次开发
  • 能够支持基于GTID和基于日志点的复制模式
  • MHA在进行故障转移时更不易产生数据丢失
  • 在一个监控节点上可以监控多个Replication集群

缺点:

  • MHA默认不提供虚拟IP功能,需要自行编写脚本或利用第三方工具来实现虚拟IP的配置
  • MHA启动后只会对Master进行监控,不会对Slave进行监控,也无法监控复制链路的情况
  • 集群环境需要能够通过 ssh免密登录,存在一定的安全隐患
  • MHA没有提供对Slave的读负载均衡功能,需要通过第三方工具来实现

相关文章:

MySQL高可用搭建方案MHA

MHA架构介绍 MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中&am…...

【vue】用vite创建vue项目

前置要求 要有Node.js 1. 用vite创建vue项目 在cmd中,进入一个文件夹 在文件资源管理器上面的文件目录中,输入cmd,回车在cmd中通过cd命令进入对应文件夹 创建项目 npm create vitelatest # 创建项目创建项目过程中的一些选项 Ok to pro…...

内网渗透-内网环境下的横向移动总结

内网环境下的横向移动总结 文章目录 内网环境下的横向移动总结前言横向移动威胁 威胁密码安全 威胁主机安全 威胁信息安全横向移动威胁的特点 利用psexec 利用psexec.exe工具msf中的psexec 利用windows服务 sc命令 1.与靶机建立ipc连接2.拷贝exe到主机系统上3.在靶机上创建一个…...

Linux命令学习—linux 的常用命令

1.1、改变目录 cd 目录的表达方法: /根目录 .当前目录 .. 上一级目录 ~家目录 #cd / 进入到系统根目录 #cd . 进入当前目录 #cd .. 进入当前目录的父目录,返回上层目录 #cd /tmp 进入指定目录/tmp #cd ~ 进入当前用户的家目录 #cd …...

【Git教程】(十)版本库之间的依赖 —— 项目与子模块之间的依赖、与子树之间的依赖 ~

Git教程 版本库之间的依赖 1️⃣ 与子模块之间的依赖2️⃣ 与子树之间的依赖🌾 总结 在 Git 中,版本库是发行单位,代表的是一个版本,而分支或标签则只能被创建在版本库这个整体中。如果一个项目中包含了若干个子项目,…...

最新版IntelliJ IDEA 2024.1安装和配置教程 详细图文解说版安装教程

IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版 文章目录 IntelliJ IDEA 2024.1 最新版如何快速入门体验?IntelliJ IDEA 2024.1 安装和配置教程 图文解说版前言 第一步: IntelliJ IDEA 2024.1安装教程第 0 步&…...

JVM常用参数一

jvm启动参数 JVM(Java虚拟机)的启动参数是在启动JVM时可以设置的一些命令行参数。这些参数用于指定JVM的运行环境、内存分配、垃圾回收器以及其他选项。以下是一些常见的JVM启动参数: -Xms:设置JVM的初始堆大小。 -Xmx&#xff1…...

分布式锁-redission可重入锁原理

5.3 分布式锁-redission可重入锁原理 在Lock锁中,他是借助于底层的一个voaltile的一个state变量来记录重入的状态的,比如当前没有人持有这把锁,那么state0,假如有人持有这把锁,那么state1,如果持有这把锁的…...

Android Gradle开发与应用 (八) :Kotlin DSL

1. 前言 本文介绍了Gradle Kotlin DSL相关的一些知识点 2. DSL是什么 DSL是为特定领域设计的专门的语言,也就是设计了一门语言,然后解决某个特定的领域的特定问题。 2.1 举例说明 以下的这些都可以称之为DSL 正则表达式 :用于文本处理的特定语言SQ…...

phpstorm 快捷键

PHPstorm最常用的快捷键,提高开发效率 - 知乎 (zhihu.com) 四年精华PHP技术文章整理合集——PHP框架篇 (qq.com) 四年精华PHP技术文合集——微服务架构篇 (qq.com) Vue3 打印票据 预览的库:vue3打印解决方案:Vue-Plugin-HiPrint - 掘金 (j…...

浦大喜奔APP8.0智能升级,发力数字金融深化五大金融篇章服务

1. 浦大喜奔立足科技赋能持续迭代升级,筑牢用户体验护城河 浦发信用卡中心坚持数字科技与客户体验双轮驱动,以科技赋能发展,优化整体系统性能,全方位支撑浦大喜奔 APP提高线上客户服务能力与体验,积极服务民生消费&a…...

自然语言处理、大语言模型相关名词整理

自然语言处理相关名词整理 零样本学习(zero-shot learning)词嵌入(Embedding)为什么 Embedding 搜索比基于词频搜索效果好? Word2VecTransformer检索增强生成(RAG)幻觉采样温度Top-kTop-p奖励模…...

移动开发避坑指南——内存泄漏

在日常编写代码时难免会遇到各种各样的问题和坑,这些问题可能会影响我们的开发效率和代码质量,因此我们需要不断总结和学习,以避免这些问题的出现。接下来我们将围绕移动开发中常见问题做出总结,以提高大家的开发质量。本系列文章…...

太好玩了,我用 Python 做了一个 ChatGPT 机器人

毫无疑问,ChatGPT 已经是当下编程圈最火的话题之一,它不仅能够回答各类问题,甚至还能执行代码! 或者是变成一只猫 因为它实在是太好玩,我使用Python将ChatGPT改造,可以实现在命令行或者Python代码中调用。…...

STM32存储左右互搏 SDIO总线读写SD/MicroSD/TF卡

STM32存储左右互搏 SDIO总线读写SD/MicroSD/TF卡 SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元,由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡,手机领域用的TF卡实际就是MicroSD卡,尺寸比SD卡小,而电路和协…...

累积分布函数图(CDF)的介绍、matlab的CDF图绘制方法(附源代码)

在对比如下两个误差的时候,怎么直观地分辨出来谁的误差更低一点?: 通过这种误差时序图往往不容易看出来。 但是如果使用CDF图像,以误差绝对值作为横轴,以横轴所示误差对应的累积概率为纵轴,绘制曲线图&am…...

代码随想录算法训练营第四十一天|343.整数拆分、96不同的二叉搜索树

文档链接:https://programmercarl.com/ LeetCode343.整数拆分 题目链接:https://leetcode.cn/problems/integer-break/ 思路: j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘…...

全量知识系统 程序详细设计之 统一资产模型(QA-SmartChat)

Q1. 下面我们聊聊整个全知系统的设计 的矩阵和函数,矩阵表示的是“活物”,分别 类似 一个基因的活性、一个实体的辨识度和某种特征的可区分度。 函数的可微、可积和可导性 则表示 运动的控制方式 在全知系统设计中,矩阵和函数是两个核心的组…...

已解决org.springframework.web.client.HttpClientErrorException: 400异常的正确解决方法,亲测有效!!!

已解决org.springframework.web.client.HttpClientErrorException: 400异常的正确解决方法,亲测有效!!! 文章目录 问题分析 报错原因 解决思路 解决方法 总结 在日常开发过程中,通过Spring框架提供的RestTemplat…...

内网渗透-Windows内网渗透

内网渗透-Windows内网渗透 文章目录 内网渗透-Windows内网渗透前言一、信息收集 1.1、SPN1.2、端口连接1.3、配置文件1.4、用户信息1.6、会话收集1.7、凭据收集 navicat:SecureCRT:Xshell:WinSCP:VNC: 1.8、DPAPI1.9、域信任1.10、…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...