iis网站批量导入,wordpress 3.5 漏洞,胶带制作彩虹光影图片,服务器方面如何规划建设网站1. 概述
1.1 主从复制概述
在生产环境中#xff0c;随着业务量增长#xff0c;数据库的读写压力会不断加大。为了提升系统的可用性、扩展性与数据安全性#xff0c;主从复制#xff08;Replication#xff09; 成为一种常见的数据库架构方案。通过主从复制#xff1a; …1. 概述
1.1 主从复制概述
在生产环境中随着业务量增长数据库的读写压力会不断加大。为了提升系统的可用性、扩展性与数据安全性主从复制Replication 成为一种常见的数据库架构方案。通过主从复制
读写分离主库处理写操作从库处理读操作提升整体性能。高可用性主库故障后可快速切换到从库提高系统稳定性。数据备份从库作为热备份提升数据安全。数据分析从库可用于数据分析、报表查询等业务减少对主库影响。
1.2 主从复制类型
MySQL 提供多种主从复制模式
类型简介特点基于语句Statement-Based Replication, SBR复制 SQL 语句简单、可能因非确定性函数出错基于行Row-Based Replication, RBR复制变更的数据行精确、安全但数据量大混合模式Mixed-Based Replication, MBR自动在 SBR 与 RBR 之间切换综合两者优点 当前多数生产环境推荐使用 Row-BasedRBR。 2. 主从复制原理
MySQL 主从复制Replication是通过**复制主库上的二进制日志binlog**来实现从库数据同步的过程。整个过程可以分为 五个步骤 和 三个关键线程分别在主库与从库之间协作完成。
2.1 主从复制的关键线程
线程所在节点作用Binlog Dump Thread主库监听并推送 binlog 变更给从库I/O Thread从库向主库请求 binlog并写入本地中继日志relay logSQL Thread从库读取 relay log并按顺序执行日志中的 SQL 操作
2.2 主从复制的具体步骤 主库记录 binlog 日志 当主库执行 INSERT、UPDATE、DELETE 等 DML 操作时会将这些更改以事件event的形式按顺序写入到 binlog二进制日志中。这个日志记录的是数据变化的“描述”。 从库发起连接请求I/O Thread 从库通过 I/O 线程连接主库并向主库请求从某个位置指定的 binlog 文件和偏移量开始读取 binlog 数据。 主库启动 Binlog Dump Thread 发送日志 主库接收到从库连接请求后会启动一个专用的 Binlog Dump 线程实时监听 binlog 的变化并将新生成的 binlog 内容发送给对应的从库。 从库接收并写入 relay log中继日志 从库的 I/O Thread 接收到主库发送的 binlog 数据后会将这些日志写入到本地的 relay log中继日志文件中作为一个临时的日志缓冲。 从库重放 relay log 执行 SQLSQL Thread 从库的 SQL Thread 会不断读取 relay log 中的日志内容并解析并按顺序执行日志中的操作从而在从库上“重放”主库的数据更改实现数据同步。 3. 搭建主从复制环境 这里以一主一从为例假设两台服务器主库 IP 为 192.168.10.10从库 IP 为 192.168.10.20MySQL 版本为 8.0。 3.1 主库配置
1修改配置文件 my.cnf或 my.ini
[mysqld]
server-id1
log-binmysql-bin
binlog_formatrowserver-id每个节点必须唯一。log-bin启用 binlog 日志。binlog_formatrow推荐使用 RBR。
重启 MySQL 服务
sudo systemctl restart mysqldmysqld 是 MySQL 数据库服务器的核心进程负责处理所有客户端请求、SQL 执行和数据管理等核心功能。 2创建复制用户
CREATE USER repl192.168.10.% IDENTIFIED BY repl_pass;
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repl192.168.10.%;
FLUSH PRIVILEGES;3查看主库状态
SHOW MASTER STATUS;记录下 File 和 Position后续配置从库时使用。
3.2 从库配置
1修改配置文件 my.cnf
[mysqld]
server-id2
relay-logrelay-log
read_only1server-id 必须与主库不同。relay-log 指定中继日志名。read_only1 可防止从库被误写非 root 用户。
重启服务
sudo systemctl restart mysqld2连接主库配置复制信息
CHANGE MASTER TOMASTER_HOST192.168.10.10,MASTER_USERrepl,MASTER_PASSWORDrepl_pass,MASTER_LOG_FILEmysql-bin.000001,MASTER_LOG_POS120;注意MASTER_LOG_FILE 和 MASTER_LOG_POS 使用主库 SHOW MASTER STATUS 的结果。
3启动复制进程
START SLAVE;4查看复制状态
SHOW SLAVE STATUS\G重点关注
Slave_IO_Running: YesSlave_SQL_Running: Yes
如果两项均为 Yes表示复制正常。
4. 验证主从复制是否成功
你可以通过以下方式验证主从复制是否成功并生效
4.1 在主库插入数据在从库查询
主库
USE test;
CREATE TABLE test_rep (id INT PRIMARY KEY, val VARCHAR(100));
INSERT INTO test_rep VALUES (1, hello replication);从库
SELECT * FROM test.test_rep;如果看到相同数据说明复制成功。
4.2 观察从库 Seconds_Behind_Master
SHOW SLAVE STATUS\G字段 Seconds_Behind_Master 为 0 表示从库基本无延迟。
明白了以下是你博客的第五部分内容基于 ShardingSphere-JDBC 实现 Spring Boot 中的 MySQL 主从读写分离避开了繁琐的手动路由切换采用官方推荐的配置方式实现自动读写分离更贴合真实项目场景步骤完整开箱即用。
5. 应用层读写分离
在主从复制搭建完成后我们可以借助 Apache ShardingSphere-JDBC 快速实现 读写分离让应用层自动将写操作路由到主库将读操作路由到从库简化开发提升系统性能。
相比手动多数据源和注解控制的方式ShardingSphere-JDBC 更加灵活、配置集中且支持负载均衡、读写一致性策略、分库分表等高级功能。
5.1 实现原理
ShardingSphere-JDBC 在应用层以 JDBC Driver 的形式接入通过解析 SQL 并结合配置的读写策略自动将
写请求INSERT/UPDATE/DELETE 路由到主库读请求SELECT 路由到从库可设置负载均衡策略
整个过程对业务代码透明无需更改 Mapper 接口或注解。
5.2 实现步骤
5.2.1 添加依赖
dependencies!-- Spring Boot Starter Web --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdversion3.1.5/version/dependency!-- MyBatis Starter --dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.0.3/version/dependency!-- ShardingSphere JDBC --dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdshardingsphere-jdbc-core-spring-boot-starter/artifactIdversion5.4.1/version/dependency!-- Druid --dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.2.16/version/dependency!-- MySQL Connector --dependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdversion8.0.33/versionscoperuntime/scope/dependency!-- Lombok --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.30/versionscopeprovided/scope/dependency/dependencies5.2.2 配置 application.yml
spring:shardingsphere:datasource:names: master, slave1, slave2 # 定义数据源名称master:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/master_db?useSSLfalseserverTimezoneUTCusername: rootpassword: password# Druid连接池配置druid:initial-size: 5min-idle: 5max-active: 20max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000test-while-idle: truetest-on-borrow: falsetest-on-return: falsefilters: stat,wall # 监控统计和SQL防火墙slave1:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3307/slave_db1?useSSLfalseserverTimezoneUTCusername: rootpassword: passworddruid:initial-size: 5min-idle: 5max-active: 20slave2:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3308/slave_db2?useSSLfalseserverTimezoneUTCusername: rootpassword: passworddruid:initial-size: 5min-idle: 5max-active: 20masterslave:name: ms_ds # 主从数据源名称master-data-source-name: master # 主库数据源slave-data-source-names: slave1, slave2 # 从库数据源列表load-balance-algorithm-type: round_robin # 从库负载均衡策略props:sql-show: true # 打印SQL日志调试用注意这里如果不配置masterslave也可以实现数据的读取但是往数据库里面写入数据会报错因为shardingsphere无法确定哪一个是主节点默认情况下都是从节点。
5.2.3 Mapper 和 Service代码
Mapper
public interface UserMapper {Insert(INSERT INTO user (name, email) VALUES (#{name}, #{email}))void insert(User user);Select(SELECT * FROM user WHERE id #{id})User findById(Long id);
}Service
public class UserService {public void create(User user) {userMapper.insert(user); // 自动走主库}public User query(Long id) {return userMapper.findById(id); // 自动走从库}
}5.2.4 验证读写分离
启动应用后执行读写操作查看控制台打印 SQL对应的数据库连接地址即为执行的库主/从也可开启数据库日志或通过慢查询日志判断实际访问库。
示例日志片段
Logic SQL: SELECT * FROM user WHERE id ?
Actual SQL: slave ::: SELECT * FROM user WHERE id ?