mysql主从同步搭建

xiaolv
12
2023-10-26

mysql主从同步搭建

MySQL主从复制简介

MySQL Replication (MySQL 主从复制) 是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式(一级主从大概50~100 us),这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。

MySQL主从复制原理

MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点

主节点 binary log dump 线程

当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。

从节点 I/O 线程

当从节点上执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。

从节点 SQL 线程

SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。

对于每一个主从连接,都需要三个进程来完成。当主节点有多个从节点时,主节点会为每一个当前连接的从节点建一个binary log dump 进程,而每个从节点都有自己的I/O进程,SQL进程。从节点用两个线程将从主库拉取更新和执行分成独立的任务,这样在执行同步数据任务的时候,不会降低读操作的性能。比如,如果从节点没有运行,此时I/O进程可以很快从主节点获取更新,尽管SQL进程还没有执行。如果在SQL进程执行之前从节点服务停止,至少I/O进程已经从主节点拉取到了最新的变更并且保存在本地relay日志中,当服务再次起来之后,就可以完成数据的同步。

要实施复制,首先必须打开Master 端的binary log(bin-log)功能,否则无法实现。

整个复制过程实际上就是Slave 从Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。如下图所示:

复制的基本过程如下:

从节点上的I/O 进程连接主节点,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;主节点接收到来自从节点的I/O请求后,通过负责复制的I/O进程根据请求信息读取指定日志指定位置之后的日志信息,返回给从节点。返回信息中除了日志所包含的信息之外,还包括本次返回的信息的bin-log file 的以及bin-log position;从节点的I/O进程接收到内容后,将接收到的日志内容更新到本机的relay log中,并将读取到的binary log文件名和位置保存到master-info 文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log 的哪个位置开始往后的日志内容,请发给我”;Slave 的 SQL线程检测到relay-log 中新增加了内容后,会将relay-log的内容解析成在祝节点上实际执行过的操作,并在本数据库中执行。

MySQL主从同步配置的基本步骤

有很多种配置主从同步的方法,可以总结为如下的步骤:

在主服务器上,必须开启二进制日志机制和配置一个独立的ID,创建一个用来专门复制主服务器数据的账号

在每一个从服务器上,配置一个唯一的ID

在开始复制进程前,在主服务器上记录二进制文件的位置信息

如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件),备份主服务器原有数据到从服务器

配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置

MySQL主从复制搭建

实验环境:centos 7.9

主服务器:10.0.0.13 从服务器:10.0.0.14

数据库文件:mysqlmbuq43458_db.sql

Master-Server 配置

1、修改主服务器配置文件my.cnf,开启binlog ,每台服务器设置不同的 server-id

vim /etc/mysql/my.cnf
[mysqld]
#配置唯一的server-id,不设置MySQL5.7以上会报错
server-id=1 
 
#mysql会根据这个配置自动设置log_bin为on状态,即开启binlog
log_bin=master-bin 
 
#配置log_bin_index文件为你指定的文件名后跟.index获得master二进制文件名及位置
#log_bin_index=master-bin.index
 
#需要同步的数据库,除此之外,其他不同步
#binlog-do-db=test
 
 
#默认情况下备份是主库的全部操作都会备份到从库,实际可能需要忽略某些库,可以在主库中增加如下配置:
 
# 不同步哪些数据库(多个写多行)
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
#binlog-ignore-db=performance_schema
#binlog-ignore-db=sys
 
# 只同步哪些数据库,除此之外,其他不同步
#binlog-do-db=mysql
 
#自动清理 7 天前的log文件,可根据需要修改
#expire_logs_days=7

2、重启并进入数据库,创建用于数据同步的账户(目的,让从服务器来复制数据)

# 查看主数据库是否开启二进制日志
# # 查看 Master-Server中的binlog File 文件名称和 Position值位置,并且记下来 mysql-bin.000001 |       643
mysql> show master logs;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'10.0.0.%' IDENTIFIED BY '614811';
mysql> flush privileges;

Slave-Server 配置

1、修改配置文件my.cnf

[mysqld]
 
#配置唯一的server-id,不设置MySQL5.7以上会报错,不能与主库相同
server-id=2
 
#保证了主从数据的一致性,不论从机怎么出错都能保证,主从一致。
relay_log_recovery        = on
relay_log_info_repository = TABLE
master_info_repository    = TABLE
 
 
#定义relay_log的位置和名称
#relay-log=slave-relay-bin
 
#同bin-log-index
#relay-log-index=slave-relay-bin.index
 
#需要同步的数据库名(多数据库使用逗号,隔开)
#replicate-do-db=db_name  
 
#设定需要复制的表
#replicate-do-table=table_name 
 
#设定需要忽略的复制表 
#replicate-ignore-table=table_name

2、重启并进入数据库

要设置从库与主库进行通信复制,使用必要的连接信息配置从库在从库上执行以下代码

# 查看change master to 使用格式
mysql> help change master to
CHANGE MASTER TO
  MASTER_HOST='10.0.0.13',
  MASTER_USER='repluser',
  MASTER_PASSWORD='614811',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154;
​
# 启用从服务器复制
mysql> start slave;
​
#查看复制状态命令,\G表示换行查看
mysql> show slave status \G; 

检查主从复制通信状态

Slave_IO_State  #从站的当前状态
Slave_IO_Running: Yes #读取主程序二进制日志的I/O线程是否正在运行
Slave_SQL_Running: Yes #执行读取主服务器中二进制日志事件的SQL线程是否正在运行。与I/O线程一样
Seconds_Behind_Master #是否为0,0就是已经同步了

测试主从复制

创建数据库 创建表 导入数据 测试成功同步

MySQL半同步复制

从MySQL5.5开始,MySQL以插件的形式支持半同步复制。如何理解半同步呢?首先我们来看看异步,全同步的概念

异步复制(Asynchronous replication)

MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主库如果crash掉了,此时主库上已经提交的事务可能并没有传到从库上,如果此时,强行将从库提升为主库,可能导致新主库上的数据不完整。

全同步复制(Fully synchronous replication)

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

半同步复制(Semisynchronous replication)

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

动物装饰