Mysql主从复制和读写分离

本文介绍了MySQL主从复制原理,包括异步复制过程、由三个进程完成、复制类型及实操步骤,还提及主从复制存在的问题及解决方法。此外,阐述了MySQL读写分离原理,即主写从读,并给出读写分离案例,涉及环境搭建、配置及测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mysql主从复制原理

1、原理
MySQL 主从复制就是将一个 MySQL 实例(Master)中的数据实时复制到另一个 MySQL 实
例(slave)中,而且这个复制是一个异步复制的过程。
实现整个复制操作主要由三个进程完成的,其中两个进程在 Slave(sql_thread 和
IO_thread),另外一个进程在 Master(IO 进程)上。
2.主从复制过程
在这里插入图片描述
1.Master将用户对数据库更新的操作以二进制格式保存到 Binary Log日志文件中
2.Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
3.Master接收到来自Slave的1o进程的请求后,通过负责复制的I0进程根据请求信息读取制定日志指定位置之后的日志信息,返回给 Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置;
4.Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的
relay-log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”;
5.Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
3.MySQL主从复制类型
基于语句的复制(默认)
在主服务器上执行的语句,从服务器执行同样的语句
基于行的复制
把改变的内容复制到从服务器
混合类型的复制
一旦发现基于语句无法精确复制时,就会采用基于行的复制
4.主从复制实操
1.环境
三台centos7服务器 同一安装mysql5.7版本的
一台做master
两台做slave
主 :192.168.174.52 server-id 1
从 :192.168.174.53 server-id 2
从 :192.168.174.54 server-id 3
2.配置时间同步ntp
Master服务器配置

vi /etc/ntp.conf
restrict 192.168.174.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0 //设置回环地址
fudge 127.127.1.0 stratum 8 //设置时间服务器的层级为8级

配置master主服务器的mysql

vi /etc/my.cnf //在[mysqld]下面配置
server-id = 1
log_bin=master_bin //设置日志开启
log_slave_updates=true //开启日志更新

进入数据库
//为所有从服务器授权所以数据库

mysql >grant replication slave on *.* to ‘myslave’@192.168.174.%’ identified by ‘zhf1021.’;// 给从服务器授权,允许20.0.0.网段的服务器使用myslave访问所有库的所有表
mysql> show grants for 'myslave'@'192.168.174.%';//查询授权

在这里插入图片描述

mysql>show master status;  //查看主服务器状态,日志用于从服务器同步,position是当前定位

在这里插入图片描述
配置MySQL从服务器1
vi /etc/my.cnf //在[mysqld]下面配置

server-id = 1
relay_log=relay_log_bin //从主服务器上同步日志文件记录到本地
relay_log_index=slave-relay-bin.index //建立索引文件,定义relay-log的位置和名称

配置MySQL从服务器2

vi /etc/my.cnf //在[mysqld]下面配置
server-id = 2
relay_log=relay_log_bin //从主服务器上同步日志文件记录到本地
relay_log_index=slave-relay-bin.index //建立索引文件,定义relay-log的位置和名称
mysql>change master to master_host='192.168.174.52' ,master_user='myslav
e',master_password='zhf1021',master_log_file='master_bin.000005',master_log_pos=306;//从主服务器上获取文件进行复制
mysql> show slave status\G;//查看进程是否开启

在这里插入图片描述
问题及解决方法
mysql主从复制存在的问题:

  • 主库宕机后,数据可能丢失
  • 从库只有一个sql Thread,主库写压力大,复制很可能延时
    解决方法:
  • 半同步复制—解决数据丢失的问题
  • 并行复制----解决从库复制延迟的问题

半同步复制

mysql semi-sync(半同步复制)
半同步复制:

  • 确保事务提交后binlog至少传输到一个从库

  • 不保证从库应用完这个事务的binlog

  • 性能有一定的降低,响应时间会更长

  • 网络异常或从库宕机,卡主主库,直到超时或从库恢复

并行复制

mysql并行复制
并行是指从库多线程apply binlog
库级别并行应用binlog,同一个库数据更改还是串行的(5.7版并行复制基于事务组)

MySQL读写分离

原理
只在主服务器上写,只在从服务器上读
主数据库处理事务性查询,从数据库处理SELECT查询数据库复制用于将事务性查询的变更同步到集群中的从数据库
工作过程
在这里插入图片描述
读写分离案例
环境:
一台centos7服务器当做client

一台centos7服务器作为Amoeba服务器

三台centos7服务器作为mysql数据库服务器,一主二从 (主从复制在上面已经搭建好了 直接拿来使用)
主服务器

mysql> grant all privileges on *.* to test@'192.168.174.%' identified by '123.com';//允许所以从服务器登录

安装JDK

--安装JDK-——---
tar xf jdk-8u144-linux-x64.tar. gzcp -rv jdk1.8.0_144/ /usr/local/ javavi /etc/profile
export JAVA_HOME=/usr/local/ javaexport JRE_HOME=/usr/ local/ java/ jreexport PATH=$PATH:/usr/ local/ java/bin
export CLASSPATH=./ : /usr/local/java/lib:/usr/local/java/jre/lib
source /etc/profile
安装amoeba
      #JVM_OPTIONS=" -server -Xms256m -Xmx1024m -Xss196k -XX: PermSize=16m-XX:MaxPermSize=96m"
     33         JvM_OPTIONS=" -server -Xms1024m -Xmx1024m -XsS256k"
cd /usr/local/amoeba/bin/
 launcher

修改amoeba配置文件

     28                                         <property name="user">amoeba</property>
     29 
     30                                         <property name="password">123456</property>
     31 
     32                                         <property name="filter">
     33                                                 <bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">
     34                                                         <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>


    <property name="ruleLoader">
     76                         <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
     77                                 <property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
     78                                 <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
     79                         </bean>
     80                 </property>
     81                 <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
     82                 <property name="LRUMapSize">1500</property>
     83                 <property name="defaultPool">master</property>
     84 
     85 
     86                 <property name="writePool">master</property>
     87                 <property name="readPool">slaves</property>
     88 
     89                 <property name="needParse">true</property>
     90         </queryRouter>

vi /usr/local/amoeba/conf/dbServers.xml 
     28                                         <property name="user">amoeba</property>
     29 
     30                                         <property name="password">123456</property>
     31 


<property name="defaultPool">master</property>
     84 
     85 
     86                 <property name="writePool">master</property>
     87                 <property name="readPool">slaves</property>
     88 
     89                 <property name="needParse">true</property>

测试
在master新建库和表
在两台从服务器上看是否有库及表生成
MySQL [test]> insert into abc values(5,‘cc’,90); #客户机
2 mysql> select * from abc; #主
3 mysql> select * from abc; #从1
4 mysql> select * from abc; #从2

<think>嗯,用户想知道MySQL在分布式系统中如何配置主从复制读写分离,以及它们的原理。首先,我需要回忆主从复制的基本流程。主库记录二进制日志,从库通过IO线程读取这些日志,然后SQL线程重放,对吧?这确保了数据一致性。不过用户可能还需要知道具体的配置步骤,比如修改my.cnf文件,创建复制用户,还有CHANGE MASTER命令这些步骤。 然后是读写分离的部分。主库处理写操作,从库处理读操作,这样可以提升性能。但用户可能关心如何实现自动的读写分离,可能需要中间件或者框架支持,比如MyCat或ShardingSphere。这部分需要解释清楚原理,以及配置方法。 另外,用户可能对主从复制的同步机制有疑问,比如异步、半同步全同步的区别,以及各自的优缺点。异步可能性能好但有数据丢失风险,半同步则是在两者之间平衡。需要解释这些模式适用场景。 还有,读写分离带来的数据一致性问题。主从同步有延迟的话,读从库可能拿到旧数据。需要讨论如何解决,比如强制读主库或者监控延迟。用户可能在实际应用中遇到这个问题,所以解决方案很重要。 最后,用户可能想知道高可用性的扩展,比如主库故障时的切换,或者如何监控复制状态。这部分可以提到MHA或者Keepalived这样的工具,帮助提升系统的可靠性。 现在要确保回答结构清晰,分步骤讲解配置,再讲原理,最后讨论注意事项扩展。同时需要引用提供的资料,比如引用[2]提到动态切换分库分表,可能主从配置有关联。但用户的问题更聚焦在主从复制读写分离,所以重点应该放在这里。需要检查引用内容是否相关,适当引用。比如引用[3]提到集中式授权,可能权限配置有关,但可能不太直接相关。可能更多参考引用[2]关于分库分表的动态切换,但主从复制是基础,需要明确区分。 还要生成相关问题,比如主从延迟如何处理,半同步配置,或者读写分离中间件的选择。这些问题能帮助用户深入理解。确保回答中的LaTeX格式正确,数学表达式用$...$,独立公式用$$...$$,并且正确使用引用标记。</think>### MySQL主从复制读写分离的实现原理与配置 #### 一、主从复制核心原理 1. **二进制日志(Binlog)机制** 主库将所有数据变更操作记录到二进制日志中,格式为$binlog\_format=ROW|STATEMENT|MIXED$[^1]。从库通过I/O线程实时拉取主库的Binlog,并写入本地中继日志(Relay Log)。 2. **数据同步流程** $$ \begin{aligned} &\text{主库写入} \rightarrow binlog \xrightarrow[\text{网络传输}]{\text{I/O线程}} relay\ log \xrightarrow{\text{SQL线程}} \text{从库数据} \\ &\Delta t_{同步} = t_{网络} + t_{SQL解析} + t_{从库写入} \end{aligned} $$ 延迟主要受网络带宽、从库硬件性能事务复杂度影响[^2]。 #### 二、配置步骤详解 1. **主库配置** (`my.cnf`) ```ini [mysqld] server-id=1 log-bin=mysql-bin binlog_format=ROW ``` 2. **从库配置** (`my.cnf`) ```ini [mysqld] server-id=2 relay-log=mysql-relay ``` 3. **建立复制链路** ```sql -- 主库创建复制账号 CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; -- 从库执行 CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; ``` #### 三、读写分离实现方案 1. **中间件方案** 使用MyCat/ProxySQL等中间件,配置规则: ```sql -- 写路由 INSERT/UPDATE/DELETE -> 主库 -- 读路由 SELECT -> 从库(支持负载均衡) ``` 2. **客户端分离方案** 在ORM框架(如MyBatis)中通过注解指定数据源: ```java @DataSource("master") public void insertData(...); @DataSource("slave") public List<Data> queryData(...); ``` #### 四、关键注意事项 1. **复制延迟问题** - 强制读主库:`/* FORCE_MASTER */ SELECT ...` - 并行复制:设置`slave_parallel_workers=8` - 半同步复制:`rpl_semi_sync_master_timeout=1000` 2. **高可用扩展** 采用MHA+Keepalived实现主库故障自动切换,VIP漂移时间可控制在10-30秒[^3]。 ```mermaid graph TD A[应用层] --> B{SQL类型} B -->|写操作| C[主库] B -->|读操作| D[从库集群] C --> E[Binlog] E --> F[从库I/O线程] F --> G[Relay Log] G --> H[从库SQL线程] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moon-01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值