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故障转移过程
- 尝试使用
ssh登录到宕机崩溃的Master节点上保存二进制日志事件(binlog events); - 从多个Slave中识别含有最新更新的Slave,将其作为备选的Master;
- 然后基于该Slave同步差异的中继日志(relaylog)到其他的Slave上;
- 接着同步从原Master上保存的二进制日志事件(binlog events);
- 将备选的Master提升为新的Master;
- 使其他的Slave连接新的Master进行复制;
- 在新的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_ssh和masterha_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࿱…...
分布式锁-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、…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
