mysql双机热备(主主模式)

一、环境准备

主机名ip操作系统备注
node01192.168.48.91CentOS Linux 7 (Core)mysql主库
node01192.168.48.92CentOS Linux 7 (Core)mysql主库
192.168.48.90漂移IP(VIP)

centos7镜像下载地址:

https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2207-02.iso

二、安装mysql8

node01&node02

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum update
systemctl disable --now firewalld
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
sed -i '3 s/^/# /' /etc/chrony.conf
sed -i '4 a server ntp.aliyun.com iburst' /etc/chrony.conf
systemctl restart chronyd.service
systemctl enable chronyd.service
chronyc sources
wget http://dev.mysql.com/get/mysql80-community-release-el7-8.noarch.rpm
yum localinstall -y mysql80-community-release-el7-8.noarch.rpm
yum repolist enabled | grep mysql
yum -y install mysql-community-server --nogpgcheck
rpm -qa |grep mysql
systemctl start mysqld
systemctl enable mysqld
systemctl daemon-reload
#查看mysql密码
cat /var/log/mysqld.log | grep password
#2025-08-29T05:53:37.423668Z 6 [Note] [MY-010454] [Server] A temporary password is generated for #root@localhost: Oeblh;:dK1ba
#使用密码登录
mysql -uroot -p 'Oeblh;:dK1ba'
#修改密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Admin123.';
#创建远程连接用户
create user 'root'@'%' identified with mysql_native_password by 'Admin123.';
grant all privileges on *.* to 'root'@'%' with grant option;
flush privileges;

三、mysql主主复制

流程图:

flowchart TDA[开始配置MySQL从库] --> B[修改从库配置文件my.cnf]B --> C[重启从库MySQL服务]C --> D[创建主库数据快照并导入从库]D --> E[在从库上配置主库连接信息]E --> F[启动从库复制进程]F --> G[检查从库复制状态]G --> H{Slave_IO_Running和<br>Slave_SQL_Running是否均为Yes?}H -->|是| I[主从复制建立成功]H -->|否| J[根据错误信息排查问题]J --> E

1. 修改配置文件

1.1. node01

这里开启了GTID。

vim /etc/my.cnf
[mysqld]
# 数据文件存储目录。MySQL所有的数据库数据(表、索引等)都存放在这个路径下。
datadir=/var/lib/mysql
​
# MySQL服务器监听的Unix套接字文件路径。本地客户端可以通过这个socket文件连接数据库,速度比TCP/IP更快。
socket=/var/lib/mysql/mysql.sock
​
# MySQL错误日志文件的存放路径。启动失败、运行错误等信息都会记录在这里,是排查问题的重要依据。
log-error=/var/log/mysqld.log
​
# 存储MySQL服务进程ID(PID)的文件路径。系统和管理工具通过读取这个文件来获取MySQL的进程号。
pid-file=/var/run/mysqld/mysqld.pid
​
# 服务节点ID,在复制拓扑(主从/主主)中每个实例必须具有唯一ID(1-2^32-1)。
# 主从复制中,主库和从库的server-id必须不同。
server-id=1
​
# 开启二进制日志(binlog)并设置二进制日志文件的基本名。
# binlog记录了所有更改数据的SQL语句,用于主从复制和数据恢复。
log-bin=master-bin
​
# 【谨慎使用】指定需要记录二进制日志的数据库。只有在此列表中数据库的更改才会被写入binlog。
# 基于"当前USE的数据库"进行过滤,有风险(如:在db1中更新db2的表将不会被记录)。
# 建议使用反向过滤(binlog-ignore-db)或在从库过滤,而非在此正向过滤。
binlog-do-db=your_database_name
​
# 设置中继日志的文件名。中继日志存在于从库,用于存储从主库binlog读取到的数据更改事件。
relay-log=mysql-relay-bin
​
# 【推荐方式】指定不记录二进制日志的数据库(反向过滤,更安全)。
# 通常忽略MySQL系统自带的数据库,避免不必要的复制。
binlog_ignore_db=sys                # 忽略sys系统库
binlog_ignore_db=mysql              # 忽略mysql系统库(存储用户权限等信息)
binlog_ignore_db=information_schema # 忽略information_schema虚拟库(存储元数据)
binlog_ignore_db=performance_schema # 忽略performance_schema虚拟库(存储性能指标)
​
# --- 自增字段全局配置(在多主复制架构中用于避免自增ID冲突)---
# 自增字段每次增长的步长。在双主模式下通常设置为节点的总数。
auto_increment_increment=2
# 自增字段的起始偏移量。每个实例应设置不同的偏移量(如1和2),确保ID不会冲突。
auto_increment_offset=1
​
# --- 从库复制过滤规则(通常配置在从库的my.cnf中,主库配置无效)---
# 指定从库需要复制的数据库。与binlog-do-db类似,有基于默认数据库过滤的风险。
# replicate_do_db=test
# 指定从库需要忽略的数据库。
# replicate_ignore_db=mysql
​
# --- 字符集与排序规则配置 ---
# 设置MySQL服务器的默认字符集为utf8mb4,支持存储所有的UTF-8字符,包括表情符号(emoji)。
character-set-server=utf8mb4
# 设置服务器默认的排序规则(collation)。utf8mb4_unicode_ci基于Unicode标准排序,精度高。
collation-server=utf8mb4_unicode_ci
​
# --- 事务隔离级别 ---
# 设置默认的事务隔离级别为READ-COMMITTED(读已提交)。
# 此级别可以避免脏读,但可能出现不可重复读和幻读。许多复制场景推荐使用此级别。
transaction-isolation=READ-COMMITTED
​
# --- GTID(全局事务标识符)配置 ---
# 开启GTID模式。GTID为每个提交的事务生成一个全局唯一的ID,简化了复制的维护和故障恢复。
gtid-mode=on
# 强制GTID一致性,确保所有事务都可以以事务安全的方式被记录和复制。
enforce-gtid-consistency=true
​

1.2. node02

vim /etc/my.cnf
[mysqld]
# 数据文件存储目录。MySQL所有的数据库数据(表、索引等)都存放在这个路径下。
datadir=/var/lib/mysql
​
# MySQL服务器监听的Unix套接字文件路径。本地客户端可以通过这个socket文件连接数据库,速度比TCP/IP更快。
socket=/var/lib/mysql/mysql.sock
​
# MySQL错误日志文件的存放路径。启动失败、运行错误等信息都会记录在这里,是排查问题的重要依据。
log-error=/var/log/mysqld.log
​
# 存储MySQL服务进程ID(PID)的文件路径。系统和管理工具通过读取这个文件来获取MySQL的进程号。
pid-file=/var/run/mysqld/mysqld.pid
​
# 服务节点ID,在复制拓扑(主从/主主)中每个实例必须具有唯一ID(1-2^32-1)。
# 主从复制中,主库和从库的server-id必须不同。
server-id=2
​
# 开启二进制日志(binlog)并设置二进制日志文件的基本名。
# binlog记录了所有更改数据的SQL语句,用于主从复制和数据恢复。
log-bin=master-bin
​
# 【谨慎使用】指定需要记录二进制日志的数据库。只有在此列表中数据库的更改才会被写入binlog。
# 基于"当前USE的数据库"进行过滤,有风险(如:在db1中更新db2的表将不会被记录)。
# 建议使用反向过滤(binlog-ignore-db)或在从库过滤,而非在此正向过滤。
binlog-do-db=your_database_name
​
# 设置中继日志的文件名。中继日志存在于从库,用于存储从主库binlog读取到的数据更改事件。
relay-log=mysql-relay-bin
​
# 【推荐方式】指定不记录二进制日志的数据库(反向过滤,更安全)。
# 通常忽略MySQL系统自带的数据库,避免不必要的复制。
binlog_ignore_db=sys                # 忽略sys系统库
binlog_ignore_db=mysql              # 忽略mysql系统库(存储用户权限等信息)
binlog_ignore_db=information_schema # 忽略information_schema虚拟库(存储元数据)
binlog_ignore_db=performance_schema # 忽略performance_schema虚拟库(存储性能指标)
​
# --- 自增字段全局配置(在多主复制架构中用于避免自增ID冲突)---
# 自增字段每次增长的步长。在双主模式下通常设置为节点的总数。
auto_increment_increment=2
# 自增字段的起始偏移量。每个实例应设置不同的偏移量(如1和2),确保ID不会冲突。
auto_increment_offset=2
​
# --- 从库复制过滤规则(通常配置在从库的my.cnf中,主库配置无效)---
# 指定从库需要复制的数据库。与binlog-do-db类似,有基于默认数据库过滤的风险。
# replicate_do_db=test
# 指定从库需要忽略的数据库。
# replicate_ignore_db=mysql
​
# --- 字符集与排序规则配置 ---
# 设置MySQL服务器的默认字符集为utf8mb4,支持存储所有的UTF-8字符,包括表情符号(emoji)。
character-set-server=utf8mb4
# 设置服务器默认的排序规则(collation)。utf8mb4_unicode_ci基于Unicode标准排序,精度高。
collation-server=utf8mb4_unicode_ci
​
# --- 事务隔离级别 ---
# 设置默认的事务隔离级别为READ-COMMITTED(读已提交)。
# 此级别可以避免脏读,但可能出现不可重复读和幻读。许多复制场景推荐使用此级别。
transaction-isolation=READ-COMMITTED
​
# --- GTID(全局事务标识符)配置 ---
# 开启GTID模式。GTID为每个提交的事务生成一个全局唯一的ID,简化了复制的维护和故障恢复。
gtid-mode=on
# 强制GTID一致性,确保所有事务都可以以事务安全的方式被记录和复制。
enforce-gtid-consistency=true

2. 重启MySQL服务

node01&node02

sudo systemctl restart mysql

3. 创建复制用户

在两台服务器上创建一个用于复制的MySQL用户,并授予必要的权限。

node01

CREATE USER 'replication'@'192.168.48.92' IDENTIFIED WITH mysql_native_password BY 'Admin123.';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.48.92';
FLUSH PRIVILEGES;
​
CHANGE MASTER TO
MASTER_HOST='192.168.48.92',
MASTER_USER='replication',
MASTER_PASSWORD='Admin123.',
MASTER_AUTO_POSITION=1;

node02

CREATE USER 'replication'@'192.168.48.91' IDENTIFIED WITH mysql_native_password BY 'Admin123.';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.48.91';
FLUSH PRIVILEGES;
​
CHANGE MASTER TO
MASTER_HOST='192.168.48.91',
MASTER_USER='replication',
MASTER_PASSWORD='Admin123.',
MASTER_AUTO_POSITION=1;

4. 开启复制

node01&node02

#开启复制
START SLAVE;
#检查复制状态
SHOW SLAVE STATUS \G
​
#两个节点以下参数均为yes说明复制正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
​

重点关注以下字段:

  • Slave_IO_Running: Yes (表示I/O线程正常运行,能从主库读取binlog)

  • Slave_SQL_Running: Yes (表示SQL线程正常运行,能重放中继日志)

  • Seconds_Behind_Master: 0 (表示主从延迟为0秒。如果值不为0,说明存在延迟;如果为NULL,则需检查错误)18

  • Last_IO_Error, Last_SQL_Error: 如果复制进程异常,这里会显示错误信息

5. 验证

node01

CREATE DATABASE IF NOT EXISTS your_database_name;
USE your_database_name;
​
CREATE TABLE node01 (id INT AUTO_INCREMENT PRIMARY KEY,hostname VARCHAR(100) NOT NULL,ip_address VARCHAR(15) NOT NULL,status VARCHAR(20) DEFAULT 'active',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,description TEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
​
​
​
INSERT INTO node02 (hostname, ip_address, description) 
VALUES ('master-node', '192.168.48.92', '这是主库节点01的测试数据,用于验证主从复制');
​
​

node02

USE your_database_name;
SELECT * FROM node01;

成功输出

mysql> SELECT * FROM node01;
+----+-------------+---------------+--------+---------------------+---------------------+----------------------------------------------------------------+
| id | hostname    | ip_address    | status | created_at          | updated_at          | description                                                    |
+----+-------------+---------------+--------+---------------------+---------------------+----------------------------------------------------------------+
|  1 | master-node | 192.168.48.92 | active | 2025-08-29 20:00:16 | 2025-08-29 20:00:16 | 这是主库节点01的测试数据,用于验证主从复制                     |
+----+-------------+---------------+--------+---------------------+---------------------+----------------------------------------------------------------+
1 row in set (0.00 sec)
​
​

node02

CREATE TABLE node02 (id INT AUTO_INCREMENT PRIMARY KEY,hostname VARCHAR(100) NOT NULL,ip_address VARCHAR(15) NOT NULL,status VARCHAR(20) DEFAULT 'active',created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,description TEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
​
​
​
INSERT INTO node02 (hostname, ip_address, description) 
VALUES ('master-node', '192.168.48.91', '这是主库节点02的测试数据,用于验证主从复制');
​

node01

SELECT * FROM node02;

成功输出

mysql> SELECT * FROM node02;
+----+-------------+---------------+--------+---------------------+---------------------+----------------------------------------------------------------+
| id | hostname    | ip_address    | status | created_at          | updated_at          | description                                                    |
+----+-------------+---------------+--------+---------------------+---------------------+----------------------------------------------------------------+
|  2 | master-node | 192.168.48.91 | active | 2025-08-29 20:03:52 | 2025-08-29 20:03:52 | 这是主库节点02的测试数据,用于验证主从复制                     |
+----+-------------+---------------+--------+---------------------+---------------------+----------------------------------------------------------------+
1 row in set (0.00 sec)

到此,主主复制完成

四、配置keepalived

1. 下载keepalived

node01&node02

yum install -y keepalived

2. 编写心跳检测脚本

node01&node02

cat > /etc/keepalived/mysql_check.sh << 'EOF'
#!/bin/bash
C=`ps -C mysqld --no-header | wc -l`
if [ $C -eq 0 ];thenexit 1
fi
exit 0
EOF

3. 修改配置文件

node01

cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {vrrp_mcast_group4 224.0.0.18
}
​
vrrp_script check_mysql {script "/etc/keepalived/mysql_check.sh" #脚本存放位置internal 2 #执行时间(周期,单位:秒)
}
​
vrrp_instance DB {state MASTER #这里主节点为 MASTER,其余的节点(备用节点)修改为 BACKUPinterface ens33 #网卡名称根据实际情况修改virtual_router_id 51#同一组高可用集群中的所有节点必须设置相同的 ID,不同集群必须使用不同的 ID。priority 200 #节点的权重,主节点需要大于备用节点(数字越大,权重越高,优先级越高)advert_int 1authentication {auth_type PASSauth_pass 123456#同一集群中的所有节点必须使用相同的密码。}virtual_ipaddress {192.168.48.90 #漂移地址,主备节点一致}track_script {check_mysql}
}
EOF
​

node02

cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {vrrp_mcast_group4 224.0.0.18
}
​
vrrp_script check_mysql {script "/etc/keepalived/mysql_check.sh" #脚本存放位置internal 2 #执行时间(周期,单位:秒)
}
​
vrrp_instance DB {state BACKUP#这里主节点为 MASTER,其余的节点(备用节点)修改为 BACKUPinterface ens33 #网卡名称根据实际情况修改virtual_router_id 51#同一组高可用集群中的所有节点必须设置相同的 ID,不同集群必须使用不>
同的 ID。priority 100 #节点的权重,主节点需要大于备用节点(数字越大,权重越高,优先级越高)advert_int 1authentication {auth_type PASSauth_pass 123456#同一集群中的所有节点必须使用相同的密码。}virtual_ipaddress {192.168.48.90 #漂移地址,主备节点一致}track_script {check_mysql}
}
EOF

4. 启动keepalived

node01&node02

systemctl start keepalived
systemctl enable keepalived

5. 验证故障转移

查看node01是否存在漂移IP

[root@node01 ~]# ip addr show ens33 | grep 192.168.48.90inet 192.168.48.90/32 scope global ens33

node01关闭mysql,node02查看漂移IP是否到node02。

[root@node01 ~]# systemctl stop mysqld
[root@node02 ~]# ip addr show ens33 | grep 192.168.48.90inet 192.168.48.90/32 scope global ens33

使用其他主机连接数据库的VIP。连接正常则为成功。

[root@test ~]# mysql -u root -h 192.168.48.90 -P 3306 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.43 MySQL Community Server - GPL

到此,mysql双机热备(主主模式)完成。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微积分 | 积分代换

注&#xff1a;本文为 “微积分 | 积分代换法 ” 相关合辑。 英文引文&#xff0c;机翻未校&#xff0c; 中文引文&#xff0c;略作重排。 未去重&#xff0c;如有内容异常&#xff0c;请看原文。 Integration by Substitution 积分代换法 May 23, 2018 / By Dave Peterson …

循环高级(1)

1.无限循环2.break3.coutinue4.练习1 打印矩形&#xff08;循环嵌套&#xff09;5.练习2 打印直角三角形#include<stdio.h> int main() {/*打印一个5行5列的三角形效果如下&#xff1a;***** ***** ***** ***** *****…

vpp开启nat,分片包丢包问题分析与解决

现象描述两个网口都开启nat output-feature&#xff0c;路由模式进行大包转发&#xff0c;网络不同&#xff0c;小包转发没问题。通过trace发现&#xff0c;在nat44-ed-in2out-output-slowpath节点丢包。Packet 503:50:43:447292: handoff_traceHANDED-OFF: from thread 2 trac…

深入解析交换机端口安全:Sticky MAC的工作原理与应用实践

深入解析交换机端口安全&#xff1a;Sticky MAC的工作原理与应用实践在当今企业网络环境中&#xff0c;未授权设备接入是常见的安全威胁之一&#xff0c;而Sticky MAC技术正是解决这一问题的利器。在网络安全管理中&#xff0c;端口安全是保护网络基础设施的第一道防线。Sticky…

AI接管浏览器:Anthropic发布Claude for Chrome,是效率革命还是安全噩梦?

AI智能体&#xff08;Agent&#xff09;的竞赛&#xff0c;正在以超乎想象的速度进入白热化阶段。 就在上个月&#xff0c;OpenAI刚刚凭借ChatGPT Agent&#xff0c;向世界展示了AI在云端远程操作电脑、制作PPT的强大能力。而现在&#xff0c;它的老对手Anthropic&#xff0c;…

LFI-labs靶场通关教程

目录 CMD01-06 pass01 pass02 pass03 pass04 pass05 pass06 HDR-1 hdr-1 LFI-01-14 pass01 pass02 pass03 pass04 pass05 pass06 pass07 pass08 pass09 pass10 pass11 pass12 pass13 pass14 CMD01-06 pass01 看看源码, 这里显示的是一个get参数cmd,并…

随机森林的 “Bootstrap 采样” 与 “特征随机选择”:如何避免过拟合?(附分类 / 回归任务实战)

随机森林的 “Bootstrap 采样” 与 “特征随机选择”&#xff1a;如何避免过拟合&#xff1f;&#xff08;附分类 / 回归任务实战&#xff09; 第一部分&#xff1a;揭开随机森林的神秘面纱 1.1 告别“过拟合”&#xff0c;拥抱更强大的模型 在机器学习的旅程中&#xff0c;…

Java开发 - 缓存

一、RedisUtil封装package com.qj.redis.util;import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component;import javax.annotation.Resource; import java.util.Set; import java.util.…

光伏发多少电才够用?匹配家庭用电需求

在“双碳”目标推动下&#xff0c;新能源产业迎来爆发式增长&#xff0c;家庭屋顶光伏凭借清洁环保、能降低电费的优势&#xff0c;成为越来越多家庭的选择。但很多家庭在安装前都会陷入一个核心困惑&#xff1a;到底装多大容量的光伏系统&#xff0c;发多少电才能刚好满足自家…

如何管理跨境电商多语种素材?数字资产本地化指南

核心要点&#xff1a; 问题&#xff1a; 多语言内容管理真的那么难吗&#xff1f;多语种内容素材杂乱、反复翻译浪费预算、上线延迟影响市场窗口期&#xff0c;跨境电商如何高效管理全球素材&#xff1f; 答案&#xff1a; 借助 AI 驱动的数字资产管理系统&#xff0c;跨境品…

Git 8 ,git 分支开发( 切换分支开发,并设置远程仓库默认分支 )

目录 前言 一、&#x1f4cd;环境背景 二、&#x1f4bb; 完整流程 三、&#x1f4dd; 顺序总览 四、&#x1f539;关系图例 五、❗暂存警告 六、☑️ 默认分支 七、&#x1f7e3;更多操作 前言 在团队开发或多人协作的项目中&#xff0c;Git 是最常用的版本管理工具。一个常见…

如何在mysql中执行创建数据库的脚本文件?

1、先准备好脚本文件&#xff0c;.sql扩展名的把脚本文件放在某个盘的根目录&#xff08;也可以不是根目录&#xff0c;根目录的话路径会简单一些&#xff09;,这里我放在C盘的根目录下。脚本文件内容如下&#xff1a;/* SQLyog Community v13.1.1 (32 bit) MySQL - 5.7.26 : D…

《AI智脉速递》2025 年 8 月22 日 - 29 日

欧盟 AI 法案正式生效&#xff1a;禁止社会评分&#xff0c;规范生成式 AI 内容标注 8 月 21 日&#xff0c;欧盟《人工智能法案》全面实施&#xff0c;明确禁止社会评分、实时面部识别等高风险 AI 应用&#xff0c;要求生成式 AI 内容必须标注来源。该法案被视为全球最严格的 …

iOS 审核 4.3a【二进制加固】

我们应该知道,面对iOS 上架 遇到4.3a的问题或者制作马甲包.最基础的操作就是混淆代码尤其是我们专业做上架的,需要对各种语言的编译模式,产物,以及ipa构成都需要非常了解, 每种语言开发的App的编译产物不同,针对不同的编译产物做不同的处理方式有一些经验的开发者, 应该知道 目…

使用Python脚本执行Git命令

说明&#xff1a;本文介绍如何使用Python脚本在某个目录下执行Git命令 编码 直接上代码 import os import subprocessdef open_git_bash_and_run_command(folder_path, git_command):# 检查文件夹路径是否存在if not os.path.exists(folder_path):print(f"错误&#xff1a…

2025docker快速部署Nginx UI可视化管理平台

1、nginx-ui简介 Nginx UI 是一个开源项目&#xff0c;旨在为著名的 Web 服务器和反向代理软件 Nginx 提供一个基于网页的图形化用户界面&#xff08;GUI&#xff09;。它的核心目标是让 Nginx 的配置和管理变得可视化、简单化和自动化&#xff0c;从而降低其使用门槛&#xf…

数据防泄与最小可见:ABP 统一封装行级安全(RLS)+ 列级脱敏

数据防泄与最小可见&#xff1a;ABP 统一封装行级安全&#xff08;RLS&#xff09; 列级脱敏 TL;DR&#xff1a;把“谁能看到哪些行、字段可见到哪一位”下沉到数据库强制层&#xff08;PostgreSQL&#xff1a;RLS 安全视图&#xff1b;SQL Server&#xff1a;RLS DDM&#x…

网络编程 04:TCP连接,客户端与服务器的区别,实现 TCP 聊天及文件上传,Tomcat 的简单使用

一、概述 记录时间 [2025-08-29] 前置文章&#xff1a; 网络编程 01&#xff1a;计算机网络概述&#xff0c;网络的作用&#xff0c;网络通信的要素&#xff0c;以及网络通信协议与分层模型 网络编程 02&#xff1a;IP 地址&#xff0c;IP 地址的作用、分类&#xff0c;通过 …

最小生成树——Kruskal

标题什么是生成树&#xff1f; 对于一张无向图&#xff0c;由nnn个顶点和n−1n-1n−1条边构成地联通子图&#xff0c;叫做这个无向图 生成树 最小生成树就是指边权之和最小的生成树 如何求最小生成树&#xff1f; Kruskal 介绍: 存图时只存每条边地起点、终点&#xff0c;…

ADFS 和 OAuth 的区别

ADFS 和 OAuth 的区别 ADFS(Active Directory Federation Services)和 OAuth 都是身份认证与授权领域的技术,但它们的设计目标、应用场景和实现方式有显著区别。以下从核心定义、技术特性、应用场景等方面详细对比: 核心定义与设计目标 技术 核心定义 设计目标 ADFS 微软…