MySQL主从复制

发布时间 2023-03-27 09:12:27作者: 创客未来

1.认识主从复制

  主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可以充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。

  主库会生成一个log dump线程,用来给从库I/O线程传Binlog数据。

  从库的I/O线程会去请求主库Binlog,并将得到的Binlog写到本地的relay log(中继日志)文件中。

  SQL线程,会读取real log文件中的日志,并解析成SQL语句逐一执行。

2.主从复制的类型

1)基于语句的复制

  主服务器上面执行的语句在从服务器上面再执行一遍,在MySQL-3.23版本以后支持。

  存在的问题:时间上可能不完全同步造成偏差,执行语句的用户也可能是不同一个用户。

2)基于行的复制

  把主服务器上面改编后的内容直接复制过去,而不关心到底改变该内容是由哪条语句引发的,在MySQL-5.0版本以后引入。

  存在的问题:比如一个工资表中有一万个用户,我们把每个用户的工资+1000,那么基于行的复制则要复制一万行的内容,由此造成的开销比较大,而基于语句的复制仅仅一条语句就可以了。

3)混合类型的复制

  MySQL默认使用基于语句的复制,当基于语句的复制会引发问题的时候就会使用基于行的复制,MySQL会自动进行选择。

  在MySQL主从复制架构中,读操作可以在所有的服务器上面进行,而写操作只能在主服务器上面进行。主从复制架构虽然给读操作提供了扩展,可如果写操作也比较多的话(多台从服务器还要从主服务器上面同步数据),单主模型的复制中主服务器势必会成为性能瓶颈。

3.MySQL复制的优点

   如果主库出现问题,可以快速切换到从库提供服务。

   可以在从库执行查询操作,降低主库的访问压力。

   可以在从库进行备份,以免备份期间影响主库的服务。

4.MySQL复制解决的问题

  数据分布

  负载平衡

  数据备份,保证数据安全

  高可用性和容错性

  实现读写分离,缓解数据库压力,在开发工作中,有时候会遇见某个sql语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。

5.MySQL主从复制的过程

  MySQL主从复制的两种情况:同步复制和异步复制,实际复制架构中大部分为异步复制。

  MySQL主从复制默认是异步的模式。MySQL增删改操作会全部记录在Binlog中,当slave节点连接master时,会主动从master处获取最新的Binlog文件。并把Binlog存储到本地的relay log中,然后去执行relay log的更新内容。

relay log(中继日志)

MySQL进行主主复制或主从复制的时候会在要复制的服务器下面产生相应的relay log。

Relay log是怎样产生的?

从服务器I/O线程将主服务器的Binlog日志读取过来,解析到各类Events记录到从服务器本地文件,这个文件就被称为relay log。然后SQL线程就会读取relay log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致。中继日志充当缓存区,这样master就不必等待salve执行完成才发送下一个事件。

6.MySQL主从复制主流架构模型

1)一主一从/一主多从

 

2)多主一从

 

3)双主复制

4)连级复制

7.MySQL主从复制的模式

1)异步模式

  异步模式下,主节点不会主动推送bin-log到从节点,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主节点如果崩溃掉了,此时主节点上已经提交的事务可能并没有传到从节点上,如果此时,强行将从提升为主,可能导致新主节点上的数据不完整。 

2)半同步模式

  介于异步复制和全部复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay-log中才返回成功信息给客户端(只能保证主库的bin-log至少传输到了一个从节点上,但并不能保证从节点将此事务执行更新到db中),否则需要等待直到超时时间然后切换成异步模式在提交。相对于异步复制,半同步复制提高了数据的安全性,一定程度的保证了数据能成功备份到从库,同时它也造成了一定程度的延迟,但是比全同步模式延迟要低,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。 

3)全同步模式

  指当主库执行完一个事务,然后所有的从库都复制了改事务并成功执行完才返回成功信息给客户端。因为需要等待所有从库执行完该事务才能返回成功信息,所以全同步复制的性能必然会收到严重的影响。

8.主从复制可能出现的问题

  Slave同步延迟

  因为Slave端是通过I/O thread单线程来实现数据解析入库;而Master端写Binlog由于是顺序写效率很高,当主库的TPS很高的时候,必然Master端的写效率要高过Slave端的读效率,这时候就有同步延迟的问题。

9.搭建MySQL主从复制

1.准备

三台虚拟机,每个都安装数据库,建立相同的数据库。 

 

为了后续操作mysql方便,建议每个服务器都添加环境变量。

编辑 etc/profile,添加mysql的环境变量

 

vi /etc/profile

 

添加内容:

export  PATH=$PATH:/usr/local/mysql/bin

编辑后记得刷新!

source /etc/profile

2.编辑主节点

开启bin-log日志,在CentOS中打开my.cnf文档

 

vi /etc/my.cnf

 

编辑内容:

[mysqld]
#skip-grant-tables
bind-address=0.0.0.0
port=3306
user=mysql
max_connections=10000
datadir=/var/lib/mysql
server-id = 1
log-bin=/var/lib/mysql/mysql-bin
binlog-do-db=test
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
character-set-server=utf8
collation-server=utf8_general_ci
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
[client]
default-character-set=utf8

给从服务器授权。指定网段、访问账号、密码、数据库。

3.编辑从节点

 

 

重启服务:

systemctl restart mysqld
service mysql restart

登录后修改主节点信息:

change master to master_host='10.0.0.12',master_port=3306,master_user='root',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=588;

报错:

解决方案:https://www.cnblogs.com/jackyzm/p/10273245.html

修改权限,重启mysql

chown -R mysql:mysql /usr/local/mysql

再次运行change

执行成功后,启动Slave同步进程;

查看启动状态:

show slave status \G

注意:Slave_IO_Running:yes Slave_SQL_Running:yes才算成功。

 

4.测试

主库数据表中插入数据,查看从库数据同步的结果。

从库查询:

 

 

参考:https://www.cnblogs.com/jackyzm/p/10273245.html