乐清市城乡规划建设局网站,无极任务平台网站进入,自己建网站需要服务器么,保山做网站建设本文详解MySQL主从复制原理与配置#xff0c;以及读写分离的实现方案#xff0c;从单机到高可用架构。前言
单机MySQL的问题#xff1a;
单点故障读写压力集中无法水平扩展
主从复制是MySQL高可用的基础#xff1a;
数据冗余#xff0c;提高可用性读写分离#xff0c;提升…本文详解MySQL主从复制原理与配置以及读写分离的实现方案从单机到高可用架构。前言单机MySQL的问题单点故障读写压力集中无法水平扩展主从复制是MySQL高可用的基础数据冗余提高可用性读写分离提升性能实时备份降低风险今天来详解MySQL主从复制的实战配置。一、主从复制原理1.1 复制流程┌─────────────────────────────────────────────────────────┐ │ Master │ │ ┌─────────┐ ┌─────────────┐ │ │ │ 数据变更 │ → │ Binlog │ │ │ └─────────┘ └──────┬──────┘ │ └─────────────────────────┼────────────────────────────────┘ │ ① 传输binlog ↓ ┌─────────────────────────────────────────────────────────┐ │ Slave │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ IO Thread │ → │ Relay Log │ → │ SQL Thread │ │ │ │ 接收binlog │ │ 中继日志 │ │ 回放执行 │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────────┘1.2 复制模式模式说明优缺点异步复制主库不等从库确认性能好可能丢数据半同步至少一个从库确认折中方案组复制(MGR)Paxos协议强一致复杂二、环境准备2.1 Docker Compose部署# docker-compose.ymlversion:3.8services:mysql-master:image:mysql:8.0container_name:mysql-masterenvironment:MYSQL_ROOT_PASSWORD:root123ports:-3306:3306volumes:-./master/conf:/etc/mysql/conf.d-./master/data:/var/lib/mysql-./master/logs:/var/log/mysqlcommand:--server-id1--log-binmysql-bin--binlog-formatROWmysql-slave:image:mysql:8.0container_name:mysql-slaveenvironment:MYSQL_ROOT_PASSWORD:root123ports:-3307:3306volumes:-./slave/conf:/etc/mysql/conf.d-./slave/data:/var/lib/mysql-./slave/logs:/var/log/mysqlcommand:--server-id2--log-binmysql-bin--binlog-formatROW--read-only1depends_on:-mysql-master2.2 配置文件Master配置# master/conf/my.cnf [mysqld] server-id 1 log-bin mysql-bin binlog-format ROW sync-binlog 1 # 需要同步的数据库不配则同步所有 # binlog-do-db mydb # 忽略的数据库 binlog-ignore-db mysql binlog-ignore-db information_schema binlog-ignore-db performance_schema binlog-ignore-db sys # GTID模式推荐 gtid_mode ON enforce_gtid_consistency ONSlave配置# slave/conf/my.cnf [mysqld] server-id 2 log-bin mysql-bin binlog-format ROW relay-log relay-bin read-only 1 # GTID模式 gtid_mode ON enforce_gtid_consistency ON # 跳过某些错误谨慎使用 # slave-skip-errors 10622.3 启动服务# 创建目录mkdir-p master/{conf,data,logs}slave/{conf,data,logs}# 启动docker compose up -d# 查看状态dockerps三、配置主从复制3.1 在Master创建复制用户-- 连接Mastermysql-h127.0.0.1-P3306-uroot-proot123-- 创建复制用户CREATEUSERrepl%IDENTIFIEDBYrepl123;GRANTREPLICATIONSLAVE,REPLICATIONCLIENTON*.*TOrepl%;FLUSHPRIVILEGES;-- 查看Master状态SHOWMASTERSTATUS;------------------------------------------------------------|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|------------------------------------------------------------|mysql-bin.000003|857||mysql,...|------------------------------------------------------------3.2 配置Slave-- 连接Slavemysql-h127.0.0.1-P3307-uroot-proot123-- 方式1传统位点复制CHANGE MASTERTOMASTER_HOSTmysql-master,MASTER_PORT3306,MASTER_USERrepl,MASTER_PASSWORDrepl123,MASTER_LOG_FILEmysql-bin.000003,MASTER_LOG_POS857;-- 方式2GTID复制推荐CHANGE MASTERTOMASTER_HOSTmysql-master,MASTER_PORT3306,MASTER_USERrepl,MASTER_PASSWORDrepl123,MASTER_AUTO_POSITION1;-- 启动复制STARTSLAVE;-- 查看复制状态SHOWSLAVESTATUS\G3.3 验证复制-- 关键字段Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master:0-- Master写入数据CREATEDATABASEtestdb;USEtestdb;CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(50));INSERTINTOusersVALUES(1,test);-- Slave查询验证USEtestdb;SELECT*FROMusers;----------|id|name|----------|1|test|----------四、读写分离4.1 方案对比方案优点缺点代码层面简单无额外组件代码侵入中间件透明功能丰富增加组件MySQL Router官方支持功能有限4.2 代码层实现Spring Boot// 数据源配置ConfigurationpublicclassDataSourceConfig{BeanConfigurationProperties(spring.datasource.master)publicDataSourcemasterDataSource(){returnDataSourceBuilder.create().build();}BeanConfigurationProperties(spring.datasource.slave)publicDataSourceslaveDataSource(){returnDataSourceBuilder.create().build();}BeanpublicDataSourceroutingDataSource(Qualifier(masterDataSource)DataSourcemaster,Qualifier(slaveDataSource)DataSourceslave){MapObject,ObjecttargetDataSourcesnewHashMap();targetDataSources.put(master,master);targetDataSources.put(slave,slave);RoutingDataSourceroutingnewRoutingDataSource();routing.setTargetDataSources(targetDataSources);routing.setDefaultTargetDataSource(master);returnrouting;}}// 动态数据源publicclassRoutingDataSourceextendsAbstractRoutingDataSource{OverrideprotectedObjectdetermineCurrentLookupKey(){returnDataSourceContextHolder.getDataSource();}}// 数据源上下文publicclassDataSourceContextHolder{privatestaticfinalThreadLocalStringCONTEXTnewThreadLocal();publicstaticvoidsetMaster(){CONTEXT.set(master);}publicstaticvoidsetSlave(){CONTEXT.set(slave);}publicstaticStringgetDataSource(){returnCONTEXT.get();}publicstaticvoidclear(){CONTEXT.remove();}}// AOP切面AspectComponentpublicclassDataSourceAspect{Before(annotation(readOnly))publicvoidsetReadDataSource(ReadOnlyreadOnly){DataSourceContextHolder.setSlave();}Before(annotation(org.springframework.transaction.annotation.Transactional))publicvoidsetWriteDataSource(){DataSourceContextHolder.setMaster();}After(execution(* com.example.service.*.*(..)))publicvoidclear(){DataSourceContextHolder.clear();}}4.3 中间件方案ShardingSphere# application.ymlspring:shardingsphere:datasource:names:master,slavemaster:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql://192.168.1.1:3306/mydbusername:rootpassword:root123slave:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql://192.168.1.2:3306/mydbusername:rootpassword:root123rules:readwrite-splitting:data-sources:readwrite_ds:static-strategy:write-data-source-name:masterread-data-source-names:slaveload-balancer-name:round_robinload-balancers:round_robin:type:ROUND_ROBIN五、高可用架构5.1 MHA架构┌─────────────────────────────────────────────────────┐ │ MHA Manager │ │ (监控故障转移) │ └─────────────────────────────────────────────────────┘ ↓ ↓ ↓ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Master │ │ Slave1 │ │ Slave2 │ │ (可写) │ │ (候选Master) │ │ (只读) │ └──────────────┘ └──────────────┘ └──────────────┘5.2 MGR组复制-- 所有节点配置[mysqld]server_id1gtid_modeONenforce_gtid_consistencyONbinlog_checksumNONE# 组复制配置plugin_load_addgroup_replication.sogroup_replication_group_nameaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeegroup_replication_start_on_bootOFFgroup_replication_local_address192.168.1.1:33061group_replication_group_seeds192.168.1.1:33061,192.168.1.2:33061,192.168.1.3:33061group_replication_bootstrap_groupOFF六、跨机房部署6.1 场景挑战需求 - 主库在总部机房 - 从库在分部机房异地灾备 - 两个机房网络不通 传统方案 - 专线成本高 - 公网暴露MySQL端口风险大6.2 组网方案使用组网软件如星空组网打通网络┌─────────────────────────────────────────────────────────┐ │ 组网虚拟局域网 │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 总部机房 │ │ 分部机房 │ │ │ │ │ │ │ │ │ │ Master │ │ Slave │ │ │ │ 10.10.0.1:3306 │ ←同步─│ 10.10.0.2:3306 │ │ │ │ │ │ │ │ │ └──────────────────┘ └──────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘Slave配置-- 使用组网IP连接MasterCHANGE MASTERTOMASTER_HOST10.10.0.1,-- 组网IPMASTER_PORT3306,MASTER_USERrepl,MASTER_PASSWORDrepl123,MASTER_AUTO_POSITION1;STARTSLAVE;优势不需要公网暴露3306端口加密传输安全可靠配置简单运维人员可通过组网远程管理6.3 远程运维# 通过组网IP远程连接mysql -h10.10.0.1 -P3306-uroot -p# 远程备份mysqldump -h10.10.0.1 -uroot -p mydbbackup.sql# 远程监控mysqlsh --uri root10.10.0.1:3306 --js七、监控与运维7.1 监控指标-- 复制延迟SHOWSLAVESTATUS\G-- Seconds_Behind_Master-- 线程状态SHOWPROCESSLIST;-- 复制错误SHOWSLAVESTATUS\G-- Last_Error, Last_IO_Error, Last_SQL_Error7.2 监控脚本#!/bin/bash# check_replication.shMYSQL_CMDmysql -h 127.0.0.1 -P 3307 -urepl -prepl123IO_RUNNING$($MYSQL_CMD -eSHOW SLAVE STATUS\G|grepSlave_IO_Running|awk{print$2})SQL_RUNNING$($MYSQL_CMD -eSHOW SLAVE STATUS\G|grepSlave_SQL_Running|awk{print$2})DELAY$($MYSQL_CMD -eSHOW SLAVE STATUS\G|grepSeconds_Behind_Master|awk{print$2})echoIO Thread:$IO_RUNNINGechoSQL Thread:$SQL_RUNNINGechoDelay:${DELAY}sif[$IO_RUNNING!Yes]||[$SQL_RUNNING!Yes];thenechoALERT: Replication is broken!# 发送告警fiif[$DELAY-gt60];thenechoALERT: Replication delay 60sfi7.3 常见问题处理复制中断-- 查看错误SHOWSLAVESTATUS\G-- 跳过错误谨慎STOP SLAVE;SETGLOBALSQL_SLAVE_SKIP_COUNTER1;STARTSLAVE;-- 或使用GTID跳过SETGTID_NEXTxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:N;BEGIN;COMMIT;SETGTID_NEXTAUTOMATIC;STARTSLAVE;主从切换-- 原Slave提升为MasterSTOP SLAVE;RESET SLAVEALL;SETGLOBALread_only0;-- 原Master降为SlaveCHANGE MASTERTO...;SETGLOBALread_only1;STARTSLAVE;八、性能优化8.1 并行复制# MySQL 5.7 slave_parallel_type LOGICAL_CLOCK slave_parallel_workers 4 slave_preserve_commit_order 18.2 半同步复制-- MasterINSTALL PLUGIN rpl_semi_sync_masterSONAMEsemisync_master.so;SETGLOBALrpl_semi_sync_master_enabled1;SETGLOBALrpl_semi_sync_master_timeout10000;-- SlaveINSTALL PLUGIN rpl_semi_sync_slaveSONAMEsemisync_slave.so;SETGLOBALrpl_semi_sync_slave_enabled1;STOP SLAVE;STARTSLAVE;8.3 参数优化# binlog优化 binlog_cache_size 4M max_binlog_size 500M expire_logs_days 7 # 复制优化 slave_net_timeout 60 sync_relay_log 10000 relay_log_recovery 1九、总结MySQL主从复制要点基础配置server-id唯一开启binlogGTID模式推荐使用简化管理读写分离中间件方案更优雅高可用MHA/MGR实现自动故障转移跨机房组网打通后正常同步监控告警复制状态和延迟生产环境清单☑ 主从复制配置完成 ☑ 复制用户权限最小化 ☑ 监控脚本部署 ☑ 备份策略制定 ☑ 故障切换演练参考资料MySQL官方复制文档https://dev.mysql.com/doc/refman/8.0/en/replication.htmlMySQL高可用https://dev.mysql.com/doc/mysql-ha-scalability/en/建议生产环境务必使用GTID模式配置半同步复制定期进行主从切换演练。