什么是主从复制
主从复制是用来建立一个和主数据库完全一致的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。
1.主从复制的作用
1.做数据的热备,作为后备数据库,主数据库服务器故障之后,可以切换到从数据库继续工作,避免数据丢失。
2.架构的扩展,业务量越来越大,I/O访问量过高,单机无法满足,此时做多库存储,减低磁盘I/O访问的频率,提高单个机器的I/O性能。
3.读写分离,使数据库能支撑更大的并发:
--在从服务器可以执行查询操作(读),降低主服务器的压力(主库执行写操作,从库执行读操作,从而降低压力)。
--在从服务器进行备份,避免备份期间影响主服务器服务,确保数据安全。
2.主从复制的原理
实现整个主从复制,需要由slave服务器上的I/O线程和省去了线程共同完成。
要实现主从复制,首先必须打开master端的binlog 功能
主从复制过程实际上就是slave从master端获取相应的二进制日志(binlog),然后再在自己的slave端完全按照顺序执行日志中的时间,将其执行到自己的数据库中。
---------------------------------------------------------------------------------------------
1.在主库上把数据记录到binlog日志中,
2.从库I/O线程将主库上的日志复制到自己的中继日志中。
3.从库sql线程读取中继日志中的事件,将其执行到从数据库之上
----------------------------------------------------------------------------------------------
master 负责写 A
slave relay-log B
I/O 负责通信读取binlog日志
sql 负责写数据
步骤一:主库db的更新事件(update、insert、delete)被写到binlog
步骤二:从库发起连接,连接到主库
步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.
步骤五:从库还会创建一个SQL线程,从relay log里面读取内容,将更新内容写入到slave的db.
面试题:
1.主从复制延迟比较大的原因:
主服务器配置高,从服务器配置低
并发量大导致主服务器读得慢,从服务器写得慢
网络延迟较高
从服务器的读写速度慢
从节点过多
2.从数据库的读的延迟问题了解吗?如何解决
半同步复制---解决数据丢失的问题
并行复制---解决从库复制延迟的问题
3.主从复制 一,binlog日志
首先两台机器都关闭防火墙和selinux 两台机器环境必须一致,时间也一致
# systemctl stop firewalld
# setenforce 0
可以先进行域名解析 /etc/hosts 不解析也可以 后面配置的时候就要写ip
# vim /etc/hosts
192.168.126.141 mysql-master
192.168.126.139 mysql-slave
添加两台机器的ip 即可 后面可以自定义 每台机器都要配置
如果有mysql 需要保证两台机器数据一致 所有这里进行了删除库内容删除日志等 省略了。。
配置主服务
在主服务器配置文件 /etc/my.cof 添加内容
在[mysqld]中添加
log-bin=/var/log/mysql-bin/mylog //这是binlog日志存放的位置 可以自定义
server-id=1 服务器id 两台机器不能一样
创建存放binlog日志的文件
# mkdir /var/log/mysql
# chown -R mysql.mysql /var/log/mysql
重启服务
# systemctl restart mysqld
查找密码
# grep password /var/lib/mysqld.log
修改密码
# mysqladmin -u root -p'%log6KKkmYDF' password 'Master@123'
创建主从同步用户
# mysql -uroot -pMaster@123
mysql> grant replication slave on *.* to repl@'%' identified by 'Repl@123';
mysql> flush privileges;
然后再master上操作
mysql> show master status\G
配置从服务器slave
先添加配置文件
[root@slave ~]# vim /etc/my.cnf
[mysqld]
server-id=2
启动服务
设置密码
# grep password /var/log/mysqld.log
[root@slave ~]# mysqladmin -u root -p'mmlaoG#at0S&' password 'Slave@123'
登录mysql
mysql> \e
change master to
master_host='mysql-master',
master_user='repl',
master_password='Repl@123',
master_log_file='mylog.000001',
master_log_pos=154;
启动slave并查看状态
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
IO 和sql 都显示Yes 即为成功
参数解释
change master ro
master_host='mysql-master' #主服务器ip 前面域名配置过 没配置的可以直接写ip
master_user='repl' #之前创建的主从用户
master_password='Repl@123' #主从用户的密码
master_log_file='mylog.000001' #binlog日志文件名 这是master的 直接在master机器复制
master_log_pos=154 #日志位置 都在master上有显示的
测试
在master上进行测试 创建一个库 ceshi
未创建时 master 上显示的库
slave上的库
master上创建
mysql> create database ceshi;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
在slave上查看
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
二者都有ceshi这个库 主从配置完成!
4.主从复制二,GTID基于事务ID复制
GTID 全局事务标识:global transaction identifiers
是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置。
1.GTID工作原理
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
2.配置主服务器master
还是关闭防火墙和selinux 两台机器环境一致 推荐删库删配置文件重安mysql
两台机器域名解析
vim /etc/hosts
192.168.126.141 mysql-master
192.168.126.139 mysql-slave
和上面一样都先更改密码 ,省略
在master上操作 修改配置文件
[mysqld]
log-bin=/var/log/mysql-bin/mylog
server-id=1
gtid_mode = ON
enforce_gtid_consistency=1
gtid_mode = ON 开启gtid
enforce_gtid_consistency=1 强制gtid
开启mysql创建主从用户
mysql> grant replication slave on *.* to yonghu@'%' identified by 'Yonghu@123'
-> ;
mysql> flush privileges;
在slave上操作
[mysqld]
log-bin=/var/log/mysql-bin/mylog
server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
进入mysql
mysql>\e
change master to
master_host='mysql-master',
master_user='yonghu',
master_password='Yonghu@123',
master_auto_position=1;
启动slave 查看状态
mysql> start slave;
mysql> show slave status\G
双Yes即可
3.测试
初始状态master
初始状态slave
在master中创建一个ceshi库
mysql> create database ceshi;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
在slave上查看
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
都存在ceshi库 配置成功