使用 MySQL 数据库实现主从复制配置
- 一、基本介绍
- 二、使用 MySQL 实现主从复制
- 1.主服务器配置
- 2.从服务器配置
- 3.验证同步
- 4.同步指定库
一、基本介绍
MySQL 主从复制是指 数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,也就是说从节点不用一直访问主服务器来更新自己的数据,数据的更新在远程连接上即可完成。
MySQL 支持的复制类型:
- 基于语句复制: 在 Master 数据库上执行的 SQL 语句,同样会在 Slave 数据库上执行相同的语句(默认采用该模式,效率比较高)
- 基于行复制: 把改变的内容同步过去,而不是把 SQL 在 Slave 数据库上执行一遍。
- 混合类型复制: 默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
mysql> show variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)
- MySQL 所使用的复制类型,主要就是根据
binlog_format
配置的值确定的(值:{ statement | row | mixed }
)
MySQL 主从复制工作原理:
- Master 服务器将数据库内的 所有增删改操作记录到二进制文件内。
- Slave 服务器会在一定时间间隔内对 Master 数据库的二进制文件进行探测其是否发生改变;
- 如果发生改变,则会 启动一个 I/O 线程去请求 Master 数据库的二进制事件。
- 同时,Master 数据库会为每个 I/O 线程开启一个
dump
线程,用于向其发送二进制事件,并 保存至 Slave 数据库的中继日志中。 - 接着,Slave 数据库将会 启动 SQL 线程,从中继日志内读取二进制事件,并在本地回放(重新执行)
- 最后,I/O 线程和 SQL 线程将进入睡眠状态,等待下一次被唤醒。
MySQL 读写分离介绍: 顾名思义,读写分离就是 读和写分别在不同的数据库上进行,基本上就是由主数据库提供写服务,从数据库提供读服务,从而减轻主数据库的性能压力(配置读写分离的提前需要两端处于主从同步状态)
实现方式:
- 基于程序代码内部实现: 在代码内将查询语句进行路由分支,和
insert
update
等语句进行区分。 - 基于中间代理层实现: 代理服务器接收到来自客户端的请求后,通过判断后转发到后端的数据库(常用的便是 Amoeba)
二、使用 MySQL 实现主从复制
准备工作:
1)配置时间同步
[root@Master ~]# yum -y install ntp
[root@Master ~]# sed -i '/^server/s/^/#/g' /etc/ntp.conf
[root@Master ~]# cat <<END >> /etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
END
[root@Master ~]# systemctl enable ntpd --now # 启动并配置开启自启
[root@Master ~]# netstat -nlptu | grep ntp
[root@Slave ~]# yum -y install ntpdate
[root@Slave ~]# /usr/sbin/ntpdate 192.168.1.1
2)安装 MySQL 数据库:MySQL 安装教程
1.主服务器配置
1)修改配置文件
[root@Master ~]# cat <<END >> /etc/my.cnf
server-id=1
log-bin=master-bin # 二进制文件前缀
END
[root@Master ~]# systemctl restart mysqld
2)授权配置
[root@Master ~]# mysql -uroot -p123123
mysql> grant replication slave on *.* to 'myslave'@'%' identified by '123123';
mysql> flush privileges; # 刷新权限
mysql> show master status\G # 查看 Master 信息
2.从服务器配置
1)修改配置文件
[root@Slave ~]# cat <<END >> /etc/my.cnf
server-id=2
relay-log=relay-log-bin
END
2)配置同步
[root@Slave ~]# mysql -uroot -p123123
mysql> change master to
master_host='192.168.1.1',
master_user='myslave',
master_password='123123',
master_log_file='master-bin.000001',
master_log_pos=592;
mysql> start slave;
mysql> show slave status\G
3.验证同步
1)主服务器上操作:
[root@Master ~]# mysql -uroot -p123123
mysql> create database exam;
mysql> use exam
mysql> create table t_test(ID int);
mysql> insert into t_test value(1);
mysql> insert into t_test value(2);
2)在从服务器上查看:
- 上面我们做的同步是针对所有库进行同步的,但是在有些业务场景下,可能只需要同步部分库或部份表就能够满足业务需求。
4.同步指定库
1)Master 数据库配置选项:
-
binlog-do-db
:将指定库的增删改 记录到二进制文件; -
binlog-ignore-db
:将指定库的增删改 不记录到二进制文件;
2)Slave 数据库配置选项:
-
replicate-do-db
:指定需要同步的库; -
replicate-ignore-db
:指定不需要同步的库; -
replicate-do-table
:指定需要同步的表; -
replicate-ignore-table
:指定不需要同步的表; -
replicate-wild-do-table
:指定需要同步的表(支持通配符) -
replicate-wild-ignore-table
:指定不需要同步的表(支持通配符)
1)同步指定库
[root@Master ~]# cat <<END >> /etc/my.cnf
binlog-do-db=exam
END
[root@Master ~]# systemctl restart mysqld
2)验证
[root@Master ~]# mysql -uroot -p123123
mysql> show databases;
mysql> create database zhangsan;
mysql> insert into exam_t_test value(3);
3)在从库上查看:
从上面的结果可以看出,当我们在 Master 上将指定库的增删改操作记录到二进制文件后,其它库的增删改并不会记录到二进制文件内。那么也就是说 除了我们选定的库,其它库并不会同步到从库中。(因为主从同步是根据 binlog
日志文件来同步的)
1)同步指定表
[root@Slave ~]# cat <<END >> /etc/my.cnf
replicate-do-table=exam.t_test
END
[root@Slave ~]# systemctl restart mysqld
2)验证
[root@Master ~]# mysql -uroot -p123123
mysql> use exam
mysql> create table t_zhangsan(ID int);
mysql> insert into t_test value(4);
3)在从库上查看: