一、MySQL高可用之组复制(MGR)
1.1 组复制核心特性与优势
MySQL Group Replication(MGR)是基于分布式一致性协议(Paxos)实现的高可用集群方案,核心特性包括:
自动故障检测与恢复:集群自动检测故障节点,并通过选举机制产生新主节点(单主模式)。
数据一致性保障:读写事务需经过集群多数节点(>N/2)确认后才能提交,避免数据分裂。
弹性扩展:支持动态添加 / 移除节点,无需中断集群服务。
两种运行模式:单主模式(仅 1 个可写节点)和多主模式(所有节点可写)。
1.2 组复制架构原理
组复制依赖以下核心组件:
组通信系统(GCS):负责节点间消息传递(如事务日志、心跳检测),基于 TCP 协议实现。
一致性协议层:采用 Paxos 算法确保事务在集群中的顺序一致性。
事务验证层:检测并发事务冲突(多主模式下),避免数据不一致。
工作流程简述:
(1)主节点(单主模式)或任意节点(多主模式)接收写事务。
(2)事务执行前生成预写日志(WAL),并广播至集群所有节点。
(3)所有节点验证事务合法性(如无冲突),并通过一致性协议达成提交顺序共识。
(4)多数节点确认后,事务在所有节点提交,确保全局一致。
1.3 单主模式组复制实现(实战步骤)
环境准备
IP地址 | server-id | |
候选主节点 | 192.168.168.200 | 200 |
从节点1 | 192.168.168.129 | 129 |
从节点2 | 192.168.168.130 | 130 |
步骤1:所有节点基础配置(my.cnf)
[mysqld]
# 基础配置
server-id=200 # 每个节点唯一(200/129/130)
datadir=/data/mysql
socket=/data/mysql/mysql.sock
pid-file=/data/mysql/mysql.pid
# 二进制日志与GTID(MGR依赖GTID)
log_bin=/data/mysql/binlog
binlog_format=ROW # 必须为ROW格式
log_slave_updates=ON # 从库同步的事务写入自身binlog
gtid_mode=ON # 启用GTID
enforce_gtid_consistency=ON # 强制GTID一致性
# 组复制相关配置
transaction_write_set_extraction=XXHASH64 # 事务写入集提取算法
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 集群UUID(自定义)
loose-group_replication_start_on_boot=OFF # 不自动启动组复制
loose-group_replication_local_address="192.168.168.200:33061" # 本节点组通信端口(每个节点修改IP)
loose-group_replication_group_seeds="192.168.168.200:33061,192.168.168.129:33061,192.168.168.130:33061" # 集群种子节点
loose-group_replication_bootstrap_group=OFF # 仅初始化集群时设为ON
loose-group_replication_single_primary_mode=ON # 启用单主模式
重启所有节点使配置生效:
systemctl restart mysqld
步骤2:创建组复制专用账户(所有节点执行)
登录MySQL,创建用于节点间通信的账户:
-- 创建复制用户(允许所有集群节点访问)
CREATE USER 'grp_user'@'192.168.168.%' IDENTIFIED BY 'Grp@123';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'grp_user'@'192.168.168.%';
-- 刷新权限
FLUSH PRIVILEGES;
步骤3:配置复制通道(所有节点执行)
设置基于GTID的复制通道,用于组内事务同步:
-- 停止现有复制(若有)
STOP REPLICA;
-- 配置组复制通道
CHANGE REPLICATION SOURCE TO
SOURCE_USER='grp_user',
SOURCE_PASSWORD='Grp@123',
SOURCE_AUTO_POSITION=1
FOR CHANNEL 'group_replication_recovery';
步骤4:安装组复制插件(所有节点执行)
-- 安装组复制插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
-- 验证插件是否安装成功
SHOW PLUGINS LIKE 'group_replication';
输出示例(状态为ACTIVE表示成功):
+-------------------+----------+--------------------+----------------------+---------+
| Name | Status | Type | Library | License |
+-------------------+----------+--------------------+----------------------+---------+
| group_replication | ACTIVE | GROUP REPLICATION | group_replication.so | GPL |
+-------------------+----------+--------------------+----------------------+---------+
步骤5:初始化集群(仅在第一个节点执行)
在 192.168.168.200(候选主节点)上引导集群:
-- 启动集群初始化(仅第一次执行)
SET GLOBAL group_replication_bootstrap_group=ON;
-- 启动组复制
START GROUP_REPLICATION;
-- 关闭初始化开关(避免重复初始化)
SET GLOBAL group_replication_bootstrap_group=OFF;
步骤6:添加其他节点到集群(129和130节点执行)
-- 启动组复制,自动加入集群
START GROUP_REPLICATION;
步骤7:验证集群状态
-- 启动组复制,自动加入集群 START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;
输出示例(单主模式下MEMBER_ROLE
为 PRIMARY 的是主节点):
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 200e5b9a-732b-11f0-971f-000c29d6adc7 | 192.168.168.200 | 3306 | ONLINE | PRIMARY | 8.0.40 |
| group_replication_applier | 129e5b9a-732b-11f0-971f-000c29d6adc7 | 192.168.168.129 | 3306 | ONLINE | SECONDARY | 8.0.40 |
| group_replication_applier | 130e5b9a-732b-11f0-971f-000c29d6adc7 | 192.168.168.130 | 3306 | ONLINE | SECONDARY | 8.0.40 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
1.4 单主模式故障转移测试
1.模拟主节点故障:在主节点(200)执行停机命令:
systemctl stop mysqld
2.查看集群状态:在从节点(129)执行:
SELECT * FROM performance_schema.replication_group_members;
输出中会显示原主节点状态为UNREACHABLE
,约 30 秒后集群自动选举新主(如 129 节点变为 PRIMARY)。
3.恢复原主节点:重启 200 节点后,自动以从节点身份加入集群:
systemctl start mysqld
登录 200 节点的 MySQL,启动组复制:
START GROUP_REPLICATION;
再次查看集群状态,200 节点角色变为 SECONDARY。
1.5 多主模式组复制配置(扩展)
多主模式允许所有节点同时处理写事务,适合高并发写入场景,配置差异如下:
1.修改所有节点的my.cnf:
loose-group_replication_single_primary_mode=OFF # 关闭单主模式(启用多主)
loose-group_replication_enforce_update_everywhere_checks=ON # 强制多主更新检查
2.重启节点并重新初始化集群(参考单主模式步骤5-6):
-- 在第一个节点执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
-- 其他节点执行
START GROUP_REPLICATION;
3.验证多主模式:所有节点的MEMBER_ROLE
均为 PRIMARY:
SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;
1.6 组复制监控与维护
1.查看集群健康状态:
-- 集群成员状态
SELECT * FROM performance_schema.replication_group_members;
-- 事务冲突统计(多主模式)
SELECT * FROM performance_schema.replication_group_member_stats;
2.动态添加节点:
-- 在新节点执行(参考步骤2-4配置后)
START GROUP_REPLICATION;
3.移除节点:
-- 在待移除节点执行
STOP GROUP_REPLICATION;
4.集群重启(全部节点故障后):
-- 在任意一个节点重新引导集群
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
-- 其他节点直接启动
START GROUP_REPLICATION;
总结
MySQL 组复制(MGR)通过分布式一致性协议实现了自动故障转移和数据一致性,单主模式适合读多写少场景,多主模式适合高并发写入。实际部署时需注意:
节点数至少 3 个,确保多数派机制生效;
网络延迟需控制在 100ms 以内,避免影响事务提交效率;
定期监控集群状态,及时处理故障节点。
结合业务场景选择合适的高可用架构,可有效提升 MySQL 集群的稳定性和可靠性。
二、MySQL高可用之MHA(Master High Availability)
2.1 MHA核心特性与优势
MHA 是针对 MySQL 主从复制架构的高可用解决方案,通过自动监控主库状态、实现故障检测与自动切换,核心特性包括:
自动故障转移:主库宕机后 10-30 秒内完成新主库选举与切换。
数据一致性保障:通过 binlog 补传机制减少数据丢失风险。
零数据丢失:配合半同步复制可实现接近零数据丢失。
低侵入性:无需修改 MySQL 现有配置,兼容各种主从架构。
在线切换:支持手动触发主从切换(如主库升级维护)。
2.2 MHA架构原理
MHA 由两部分组成:
MHA Manager:管理节点,负责监控集群状态、触发故障转移。
MHA Node:部署在所有 MySQL 节点,提供 binlog 复制、故障检测等功能。
故障转移流程:
1.监控阶段:Manager 通过 SSH 定期(默认 3 秒)向主库发送 ping 包检测存活状态。
2.故障确认:连续 3 次 ping 失败后,Manager 通过其他从库确认主库是否真的宕机。
3.选举新主:根据从库的日志同步进度(优先选择最接近主库的从库)选举新主。
4.故障转移:隔离旧主库(如关闭 VIP、防火墙阻断);提升新主库(执行reset slave all
);其他从库指向新主库(通过 relay log 补全差异);应用层切换至新主库(如更新 VIP 指向);
2.3 MHA实战部署(单主多从架构)
环境准备
IP地址 | 主机名 | |
MHA Manager | 192.168.168.201 | mha-manager |
MySQL 主库 | 192.168.168.200 | master |
MySQL 从库 1 | 192.168.168.129 | slave1 |
MySQL 从库 2 | 192.168.168.130 | slave2 |
步骤1:配置SSH免密登录(关键)
MHA Manager 需要免密登录所有 MySQL 节点,MySQL 节点间也需要免密互通:
# 在MHA Manager节点生成密钥
[root@mha-manager ~]# ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
# 分发密钥到所有节点(包括自身)
[root@mha-manager ~]# for host in 192.168.168.200 192.168.168.129 192.168.168.130 192.168.168.201; do
ssh-copy-id -i ~/.ssh/id_rsa.pub root@$host
done
# 验证免密登录
[root@mha-manager ~]# ssh 192.168.168.200 date
步骤2:安装MHA软件
所有节点安装MHA Node
# 安装依赖
[root@master ~]# yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
# 下载并安装node包
[root@master ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.noarch.rpm
[root@master ~]# rpm -ivh mha4mysql-node-0.58-0.el7.noarch.rpm
MHA Manager节点额外安装Manager包
[root@mha-manager ~]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.noarch.rpm
[root@mha-manager ~]# rpm -ivh mha4mysql-manager-0.58-0.el7.noarch.rpm
步骤3:配置MySQL权限
在主库创建 MHA 专用管理用户(从库会同步该用户):
-- 创建管理用户(用于监控和故障转移)
CREATE USER 'mha_admin'@'192.168.168.%' IDENTIFIED BY 'Mha@123';
GRANT ALL PRIVILEGES ON *.* TO 'mha_admin'@'192.168.168.%' WITH GRANT OPTION;
-- 确保主从复制用户已存在(参考1.2章节的rep用户)
FLUSH PRIVILEGES;
步骤4:配置MHA Manager
创建配置目录
[root@mha-manager ~]# mkdir -p /etc/mha/mysql_cluster
[root@mha-manager ~]# mkdir -p /var/log/mha/mysql_cluster
编写集群配置文件
# /etc/mha/mysql_cluster/mha.cnf
[server default]
# 管理用户
user=mha_admin
password=Mha@123
# 复制用户(主从同步用)
repl_user=rep
repl_password=rep123
# 工作目录
manager_workdir=/var/log/mha/mysql_cluster
# 日志文件
manager_log=/var/log/mha/mysql_cluster/manager.log
# SSH连接端口
ssh_port=22
# MySQL端口
mysql_port=3306
# 检测间隔(秒)
ping_interval=3
# 二次检查的从库数量
secondary_check_script=masterha_secondary_check -s 192.168.168.129 -s 192.168.168.130
# 故障转移后执行的脚本(如更新VIP)
master_ip_failover_script=/etc/mha/mysql_cluster/master_ip_failover
[server1]
hostname=192.168.168.200
port=3306
# 主库故障后禁止自动启动
no_master=1
[server2]
hostname=192.168.168.129
port=3306
# 候选主库权重
candidate_master=1
[server3]
hostname=192.168.168.130
port=3306
candidate_master=1
步骤5:编写VIP切换脚本
创建master_ip_failover
脚本实现虚拟 IP(VIP)自动漂移:
#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host,
$orig_master_ip, $orig_master_port, $new_master_host,
$new_master_ip, $new_master_port, $new_master_user,
$new_master_password
);
# VIP配置
my $vip = '192.168.168.250/24';
my $key = '0';
my $dev = 'ens33';
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,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$command======\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
eval {
print "Disabling 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 VIP on new master: $new_master_host \n";
&start_vip();
$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 \"ip addr add $vip dev $dev\"`;
`ssh $ssh_user\@$new_master_host \"arping -I $dev -c 3 -s $vip 192.168.168.1 > /dev/null 2>&1\"`;
}
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \"ip addr del $vip dev $dev\"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --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";
}
赋予执行权限:
[root@mha-manager ~]# chmod +x /etc/mha/mysql_cluster/master_ip_failover
步骤6:验证MHA环境
检查SSH连通性
[root@mha-manager ~]# masterha_check_ssh --conf=/etc/mha/mysql_cluster/mha.cnf
输出All SSH connection tests passed successfully.
表示成功。
检查主从复制状态
[root@mha-manager ~]# masterha_check_repl --conf=/etc/mha/mysql_cluster/mha.cnf
输出MySQL Replication Health is OK.
表示成功。
步骤7:启动MHA Manager
# 后台启动
[root@mha-manager ~]# nohup masterha_manager --conf=/etc/mha/mysql_cluster/mha.cnf > /var/log/mha/mysql_cluster/manager.log 2>&1 &
# 查看状态
[root@mha-manager ~]# masterha_check_status --conf=/etc/mha/mysql_cluster/mha.cnf
mysql_cluster (pid: 1234) is running(0:PING_OK), master:192.168.168.200
2.4 故障转移测试
1.模拟主库故障:在主库(200)执行关机命令
[root@master ~]# systemctl stop mysqld
2.观察MHA日志:
[root@mha-manager ~]# tail -f /var/log/mha/mysql_cluster/manager.log
日志会显示:检测到主库故障 → 选举新主(如 129)→ 转移 VIP → 完成切换。
3.验证结果:
查看VIP是否漂移到新主库:
[root@slave1 ~]# ip addr show ens33 | grep 192.168.168.250
检查从库是否指向新主:
mysql> show replica status\G
2.5 MHA日常维护
1.手动切换主库(如主库升级):
[root@mha-manager ~]# masterha_master_switch --conf=/etc/mha/mysql_cluster/mha.cnf \
--master_state=alive \
--new_master_host=192.168.168.129 \
--new_master_port=3306 \
--orig_master_is_new_slave
2.重启MHA Manager:
[root@mha-manager ~]# masterha_stop --conf=/etc/mha/mysql_cluster/mha.cnf
[root@mha-manager ~]# nohup masterha_manager --conf=/etc/mha/mysql_cluster/mha.cnf &
3.添加新从库:配置新从库与主库同步;修改 mha.cnf 添加新节点配置;重新检查并启动 MHA;
总结:
MHA 通过简洁的架构实现了 MySQL 主从集群的高可用,适合对成本敏感且已有主从架构的场景。部署时需注意:
严格配置 SSH 免密登录(核心前提);
配合半同步复制减少数据丢失;
编写可靠的 VIP 切换脚本(关键环节);
定期测试故障转移流程确保可用性;
根据业务规模和一致性要求,可选择 MHA(低成本)、MGR(强一致)或 Percona XtraDB Cluster(高并发)作为高可用解决方案。
相关文章:
MySQL集群高可用架构 - 指南
MySQL集群高可用架构 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-si…...
【WRF-VPRM 预处理器】HEG 安装(服务器)-MRT专业的工具替代
【WRF-VPRM 预处理器】HEG 安装(服务器)-MRT专业的工具替代pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New"…...
如何在Spring MVC中处理请求参数
在Spring MVC中处理请求参数是通过使用各种注解来实现的。以下是在Spring MVC中处理不同类型请求参数的方法。 使用 @RequestParam注解 当你想要从查询字符串中获取单个参数值时,你可以使用 @RequestParam注解。例如: @GetMapping("/search") public String search…...
redis实现缓存2-解决缓存穿透,缓存击穿
具体实现: ShopServiceImpl package com.hmdp.service.impl;import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.hmdp.dto.Result; import com.hmdp.entity.Shop; …...
单克隆抗体人源化:从鼠源缺陷到全人源突破,3 大阶段破解临床应用难题
单克隆抗体(McAb)凭借高特异性、强靶向性,在疾病预防、诊断与治疗中占据核心地位。1975 年,Khler 和 Milstein 创立杂交瘤技术,首次实现人工制备 McAb,为生物医药领域开辟新路径。但初代鼠源性 McAb 存在两大关键缺陷,严重限制临床应用:一是免疫原性高,进入人体后易被…...
在Kubernetes中DaemonSet无法在master节点调度的问题
在Kubernetes中,DaemonSet确保全部(或某些特定)Node运行一个Pod的副本。当有Node加入集群时,DaemonSet会自动在新加入的Node上部署Pod。这对于运行像日志收集器、监控代理或其他形式的守护进程非常有用。 默认情况下,出于安全性的考虑,Kubernetes master节点不允许调度普…...
9 12-
9 12改一道题改了一天,自闭了,总结无法描述,还是自己太糖了/ll P8776 线段树优化DP转移9 13模拟赛唯一一场没有睡着的模拟赛 T1很快想到了换根DP,秒掉 T2很快想到了 \(N^2\) 的暴力,然后经过我的观察发现转移形似杨辉三角,就推了出来 T3T4毫无思路剩下一个半小时直接跑路…...
桌面客户端的主要类型和技术方案
桌面客户端开发已经不再是传统的单一技术栈,而是衍生出了多种方案,各有优劣。下图清晰地展示了这些技术方案的演进与分类: flowchart TD A[桌面客户端技术方案] --> B1["原生开发<br>(Native App)"] A --> B2["跨平台开发<br>(Cross-Platf…...
AGX Orin平台RTC驱动导致reboot系统卡住障碍调试
AGX Orin平台RTC驱动导致reboot系统卡住障碍调试pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace …...
C 语言实现动态数组、链表、栈与队列
从代码到原理:C语言实现动态数组、链表、栈与队列 在数据结构的世界里,线性结构是构建复杂算法的基石。动态数组、链表、栈和队列作为最经典的线性结构,各自拥有独特的存储方式与操作特性,适用于不同的业务场景。本文将结合C语言实现代码,从结构定义、核心操作到实际应用,…...
git reset
在一个文件夹内,初始化其为 git 本地仓库,然后新建一个文件,提交至本地仓库,再修改这个文件,再提交至本地仓库。此时此刻的提交记录:如果用 git reset 命令回到当前所在位置,是不会有任何变化的。用 git reset 命令回到位于当前提交之前的提交,这一步操作也可以复原:如…...
ICPC 2025 网络赛第一场 M
这道题我本来是建立多层图然后跑dijkstra来解决,但是由于N=5000,所以会包空间导致RE或者MLE,注意到其实这道题是从1到n都来一遍,其实就可以考虑k-1和k的关系,k在k- 1的基础上面跑最短路,跑完了之后我们对比传送门的两个点到1的距离,这样它可以更新新的最短路。 #include…...
Brute It -TryHackMe
Brute It -TryHackMe 一、信息收集使用nmap对网站ip开放端口进行搜集使用dirsearch发现网站下面有个admin目录访问看看是一个管理员登录界面在这个页面右键源代码发现了给我们的提示,告诉我们这个网站的账户是admin,我们抓包使用yakit进行爆破二、枚举爆破接下来使用hydra对网…...
题解:P12336 第三心脏
题目链接。作者没看过第三心脏,所以作者猜测第三个心脏应该是用铁做的,由于铁粉是黑的,所以这道题目是黑。养成良好习惯,不留根号,式子变为: \[a^2+b^2+c^2+d^2=\left(a\oplus b\oplus c\oplus d\right)^2 \]注意到 \(a\ge 1\) 所以 \(a^2+b^2+c^2+d^2>d^2\) 又注意到…...
Spring篇知识点(1)
一、Spring框架的特性 IOC和DI支持:Spring 的核⼼就是⼀个⼤的⼯⼚容器,可以维护所有对象的创建和依赖关系,Spring ⼯⼚⽤于⽣成Bean,并且管理 Bean 的⽣命周期,实现⾼内聚低耦合的设计理念。 AOP编程支持:方便实现对程序进行权限拦截、运行监控等切面功能 声明式事务支持…...
在CentOS 7系统中彻底移除MongoDB数据库
彻底移除CentOS 7系统中的MongoDB数据库,需要进行以下步骤:停止MongoDB服务:首先确保MongoDB服务已经停止,可以通过下面的命令来执行这一操作:sudo systemctl stop mongod 如果您的MongoDB服务名称不是默认的 mongod,请将上述命令中的 mongod替换为实际的服务名称。删除M…...
【数学建模】烟幕干扰弹投放策略优化:模型与算法整合框架 - 实践
【数学建模】烟幕干扰弹投放策略优化:模型与算法整合框架 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&q…...
2025.9.13总结
T1 神秘结论,因为轮数是可以算出来的,然后依次把次数取 min 然后堆起来就是对的。可以 \(O(n)\) 做完。 T2 一次修改的作用是明显的。 答案最大为 2,因为可以 max->2highbit->2(highbit+1)-1。 考虑答案为 1,那么就是跨过所有 0。但是因为覆盖后后面和前面的都没了,…...
开源排名算法工具raink:利用LLM实现智能文档排序
本文介绍Bishop Fox开源的raink工具,该工具采用基于大语言模型的列表排序算法,能够解决复杂排名问题,包括将代码差异与安全公告关联,并详细说明其算法原理及在漏洞识别中的应用场景。raink:使用LLM进行文档排序 TL;DR:Bishop Fox发布了raink,这是一个使用新型基于LLM的列…...
lcjmSSL域名SSL证书免费申请
想为您的网站轻松开启HTTPS安全加密吗?lcjmSSL(来此加密)为您提供完全免费的SSL证书服务!无论是单个站点、多个域名还是需要守护整个子站群的泛域名证书,我们都能满足。单证书最高支持100个域名的极致灵活性,助您以零成本构建更安全、更可信的网站环境。立即体验,为您的…...
uniapp原生插件 TCP Socket 利用文档
uniapp原生插件 TCP Socket 利用文档pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...
【PyQt5】实现输入延迟响应:3秒无输入后自动读取内容
思路:每次输入框内容改变,都重置 QTimer 倒计时为 3 秒;当持续 3 秒无输入后,QTimer 超时,获取当前输入框内容。UI 代码(untitled.py):点击查看代码 from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName(&qu…...
线性代数基础
暂无...
微积分基础
暂无...
Windows 自带的SSH中配置X11
本文介绍了给Windows 11中自带的SSH配置X11的方法1.安装 Windows的Xserver很多如:Xming 和 VcXsrv。Xming和VcXsrv都是X服务器软件,允许在Windows系统上运行Linux图形界面应用程序。它们的关系可以从以下方面概括:历史渊源 Xming最初由Colin Harrison于2004年开发,基于X.Or…...
在Kubernetes client-go库中如何有效构建CRD的informer
在Kubernetes ecosystem中,client-go库是一个强大的集合,它提供了与Kubernetes API进行交互的工具,使得我们可以在自己的应用程序中进行创建、配置以及管理Kubernetes资源。而对于自定义资源的定义(CRD),client-go也提供了informer的机制,此机制能够帮助我们监听资源的变…...
中大型水闸安全监测的重要性及实施方法 - 指南
中大型水闸安全监测的重要性及实施方法 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !i…...
如何通过LangChain实现记忆功能的总结
真正贴近人类的智能体,关键在于拥有 “记忆能力”。就像人与人相处时,我们会记住对方的喜好、过往的交流细节,并以此调整后续的沟通方式;具备记忆的智能体,同样能在与用户的互动中,主动留存对话信息、记录关键需求,甚至沉淀用户偏好,进而在未来的交互中给出更精准、更贴…...
python 轻量级别的网页包Streamlit
Streamlit跟 Flask/Django 的区别| 维度 | Streamlit | Flask/Django ||------|-----------|--------------|| 目标 | 数据展示/分析原型 | 全功能网站 || 前端代码 | 0 行 | 需要写 HTML/JS || 开发速度 | 分钟级 | 小时/天级 || 部署 | streamlit run 即可 | 需配路由、模板、…...
完整教程:技术小白如何快速的了解opentenbase?--把握四大特色
完整教程:技术小白如何快速的了解opentenbase?--把握四大特色pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New&quo…...
9.13日模考总结
本周进行了标准OI普及组模考测试 得分情况题目名称 做法 预计得分 实际得分质数差列 模拟、素数筛 100 100旅行 二分答案 100 40小桃的物质阵列 思维 + 模拟 0 0幽邃魔窟 01背包变形 20 60感觉第二题有点可惜,忘了输出 -1 和数据范围了 第四题也有点可惜,没想到是01背包 做题…...
高斯消元
code: const int N=110; const double eps=1e-7;int n; double a[N][N];inline bool zero(double x){return fabs(x)<eps; }int gauss(){for(int i=1;i<=n;i++){int aim=i;//找出 i 列中,未确定主元的行中的最大行for(int j=1;j<=n;j++){//判断是否确定主元if(j<…...
wpf-MVVM+IOC/ID
一、MVVM+IOC/ID承接上文《WPF-理解与使用MVVM,请勿滥用》;这里讲解 MVVM+IOC/ID 的案例。本文来自博客园,作者:꧁执笔小白꧂,转载请注明原文链接:https://www.cnblogs.com/qq2806933146xiaobai/p/19089194...
uni-app iOS 性能监控全流程 多器具协作的实战优化指南
uni-app iOS 性能监控全流程 多器具协作的实战优化指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mono…...
矩阵快速幂
模板题:洛谷p1939 code: #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=5,mod=1e9+7; int n,siz=3; struct matrix{LL m[N][N];//构造函数matrix(){memset(m,0,sizeof m);}//重载*运算符matrix operator*(const matrix& B)cons…...
使用 C# 设置 Excel 单元格格式 - 教程
使用 C# 设置 Excel 单元格格式 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importan…...
grafana部署并使用harbor监控模板
1、部署grafana helm repo add grafana https://grafana.github.io/helm-charts helm repo update helm pull grafana/grafana --version 9.4.4 --untar cd grafana/# 修改values文件ingress:enabled: true # 开启ingressingressClassName: tr…...
【ARM Cache 及 MMU 系列文章 6.1 -- Cache maintenance 指令及相关寄存器有哪些?】
Cache Maintenance registers and instructions Armv8/v9 里定义的Cache的管理的操作有三种:Invalidate : 整个高速缓存或者某个高速缓存行。高速缓存上的数据会被丢弃。 Clean : 整个高速缓存或者某个高速缓存行。相应的高速缓存行会被标记为脏,数据会写回到下一级高速缓存…...
十八、CPU的控制流:正常控制流和异常控制流
目录一、什么是控制流?二、正常控制流三、异常控制流四、正常控制流 vs. 异常控制流总结与重要性一、什么是控制流? 控制流指的是程序计数器(PC或EIP/RIP)随时间变化的序列。简单来说,就是CPU执行指令的顺序。 从你按下电源键开始,CPU就在不停地取指令、执行指令,PC寄存…...
大模型基础|位置编码|RoPE|ALiBi
转自:https://zhuanlan.zhihu.com/p/650469278 Transformer 模型在处理序列数据时,其自注意力机制使得模型能够全局地捕捉不同元素之间的依赖关系,但这样做的代价是丧失了序列中的元素顺序信息。由于自注意力机制并不考虑元素在序列中的位置,所以在输入序列的任何置换下都是…...
成品app直播源码搭建,sql优化原则 - 云豹科技
成品app直播源码搭建,sql优化原则SQL 作为关系型数据库的标准语言,是 IT 从业人员必不可少的技能之一。SQL 本身并不难学,编写查询语句也很容易,但是想要编写出能够高效运行的查询语句却有一定的难度。查询优化是一个复杂的工程,涉及从硬件到参数配置、不同数据库的解析器…...
使用Clang静态分析技术追踪Heartbleed漏洞
本文详细介绍了如何利用Clang静态分析框架开发检测Heartbleed漏洞的插件,包括技术实现策略、符号执行原理、污点传播机制以及在OpenSSL代码中的实际应用效果。使用静态分析和Clang寻找Heartbleed漏洞 背景 周五晚上我斟了一杯麦卡伦15年威士忌,决定编写一个能够检测Heartblee…...
每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?) - 实践
每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…...
累死你的不是工作,而是工作方式
《浪潮之巅》的作者吴军,在《得到》专栏里,提及了Google刚进中国时候的一件事。刚开始,Google总部对中国研发团队的评价非常低,因为“出工不出活儿”,北京的三四个工程师都抵不上Google总部的一个工程师。 后来吴军帮忙分析了原因,他发现,那些工程师都不善于找到最重要的…...
川土微CA-IF1051S、CA-IF1051VS 支持CAN FD
CA-IF1051HS 具有70V故障保护的CAN收发器,支持CAN FD,符合ISO11898-2:2016和ISO11898-5:2007物理层技术规范。该系列器件设计用于高速CANFD网络,可支持高达5Mbps的传输速率。CAN总线端口提供高达70V的故障保护,满足恶劣环境中的过压保护需求。接收器输入共模范围(CMR)高达3…...
模仿玩家习惯的简单AI系统:GoCap
模仿玩家习惯的AI系统:GoCap 更拟人的AI 游戏AI通常并不以“变得不可战胜”为目的,而是朝着“更加有趣”的方向努力,就像PVP游戏中玩家匹配到不同的对手那样提供丰富体验。如果游戏AI也能像不同玩家一样就好了,可还是用设计行为树的方式来制定不同的AI的话,一定需要不少的…...
浅谈马拉车
浅谈马拉车 马拉车其实挺好理解的,写篇博客以便复习。 正题 简介 Manacher主要的思想是回文串的对称性,即在一个大回文串中,一定存在一个与\(X\)关于回文对称中心对称的子串\(Y\),故我们利用已知的回文串搞事情.算法流程考虑回文串有ABA(对称中心为一个字符)和ABBA(对称中心…...
Redisson 分布式锁的实现原理 - 教程
Redisson 分布式锁的实现原理 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...
关于前端的一些疑问整理(标签属性值和符号)
vue也可以直接在html使用class然后使用样式,但是我们不能完全写死,要实现可变化的操作的话,就需要js的介入,但是vue是js衍生的框架,一般不像原生html和css和js那样(分开放然后html文件用<link>引用css文件,用<script>引用js文件,然后通过document等dom操作…...
十七、异常和中断响应过程的时序图
目录时序图步骤详解:阶段 1: 事件发生与检测阶段 2: 硬件自动响应(纯硬件操作)阶段 3: 软件处理(操作系统内核)阶段 4: 硬件返回(纯硬件操作)这是一个描述异常和中断响应过程的时序图。它清晰地展示了硬件(CPU)和软件(操作系统)之间如何协同完成整个响应和处理流程。…...