Mysql数据库--实现主从复制搭建与同步
🔻 一、mysql 同步复制有关概述
⛳ 前言、何为主从复制
一般数据库都是读取压力大于写数据压力,主从复制即为了实现数据库的负载均衡和读写分离。通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,主服务器只负责写,而从服务器只负责读。
如生产环境中,使用redis数据库作为缓存数据库,用户访问业务数据时,先从缓存数据库查询,如果缓存数据库没有,再从业务数据库读取。
⛳ 1.1 mysql支持的复制方式
- **
基于语句的复制--Statement(Statement-Based Replication,SBR)
**: 在主服务器上执行的sql
语句,在从服务器上执行同样的语句。mysql默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选择基于行的复制,每一条会修改数据的sql
都会记录在 binlog 中。 - **
基于行的复制--Row(Row-Based Replication,RBR)
**:把改变的内容复制过去,仅保存哪条记录被修改。而不是把命令在从服务器上执行一遍, 从mysql5.0开始支持。 混合类型的复制--Mixed(Mixed-Based Replication,MBR)
: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制,Statement 和 Row 的混合体。- 通过
alter user root identified by '新密码';
⛳ 1.2 mysql支持的复制类型
1.2.1🍁异步复制
mysql
数据库默认的复制方式- 异步复制指主库以异步的方式同步数据到一个从库或多个从库中。
- 主节点
不会主动推送数据
到从节点,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理。 - 主节点如果掉了,此时主节点上已经提交的事务可能并没有传到从节点上,如果此时,强行将从节点提升为主节点,可能导致新主节点上的
数据不完整
。
1.2.2🍁同步复制
- 同步复制是
mysql
主节点特有的复制方式,当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。
1.2.3🍁半同步复制
- 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到
relay log
中才返回成功信息给客户端 - 只能保证主库的
Binlog
至少传输到了一个从节点上,否则需要等待直到超时时间,然后切换成异步模式再提交。
1.2.4🍁[图解]-异步复制 / 同步复制 / 半同步复制
⛳ 1.3 mysql复制解决的问题
- **
数据分布 (Data distribution )
**—提高数据操作自然并行度,以达到最优的执行效率的目的 负载平衡(load balancing)
—主服务器只负责写,而从服务器只负责读备份(Backups)
—灾难恢复,对损坏的数据进行恢复和还原高可用性和容错行( High availability and failover)
—确保 mysql 数据库在故障和异常情况下仍然能够提供可靠的服务
⛳ 1.4 mysql复制是如何工作的
复制整体来说有
3
个步骤:
master
将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)slave
将master
的binary log events拷贝到它的中继日志(relay log)slave
重做中继日志中的事件,将改变反映它自己的数据
🔻 二、mysql 同步复制搭建
⛳ 2.1 主从节点准备
克隆两台安装好mysql8.0的虚拟机,并修改复制的db-server02(从节点)mysql server的UUID。
[root@db-server ~]# vi /var/lib/mysql/auto.cnf####修改UUID[auto]
server-uuid=83822642-0030-11ee-a2cc-000c29c2e1ad
####重启mysql服务[root@db-server ~]# systemctl restart mysqld
mysql服务器Ipdb-server(主节点)192.168.181.101db-server02(从节点)192.168.181.102
⛳ 2.2 主节点配置
2.2.1 🍁 创建log-bin二进制日志存储路径
###创建二进制日志存储路径[root@db-server /]# mkdir -p -v /var/log/mysql/mysql-bin
mkdir: created directory ‘/var/log/mysql/mysql-bin’
###赋权mysql用户组合mysql用户[root@db-server ~]# chown -R mysql:mysql /var/log/mysql[root@db-server ~]# chown -R mysql:mysql /var/log/mysql/mysql-bin
2.2.2 🍁 修改my.cnf配置文件
**
【必须参数】:
**
####添加内容[mysqld]#配置唯一的服务器ID,一般使用IP最后一位
server-id=1# 设置需要复制的数据库,默认全部记录。比如: binlog-do-db=db_master_slave
binlog-do-db=db_master_slave
#开启log-bin二进制日志,指名路径。如: 本地的路/var/log/mysql/mysql-bin
log-bin=/var/log/mysql/mysql-bin
#设置binlog格式
binlog_format=STATEMENT
**
【可选参数】:
**
# 0表示读写 (主机),1表示只读(从机)read-only=0#设置日志文件保留的时长,单位是秒
binlog_expire_logs_seconds=6000#控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=20#设置不要复制的数据库
binlog-ignore-db=test
#设置需要复制的数据库,默认全部记录。比如: binlog-do-db=dbtest01
binlog-do-db=需要复制的主数据库名字
#设置binlog格式
binlog_format=STATEMENT
2.2.3 🍁 重启mysql服务,检查是否生效
[root@db-server mysql]# systemctl restart mysqld[root@db-server mysql]# systemctl status mysqld[root@db-server mysql]# mysql -u root -p
mysql>show variables like'server_id';+---------------+-------+| Variable_name |Value|+---------------+-------+| server_id |1|+---------------+-------+1rowinset(0.02 sec)
mysql>
###开启log-bin二进制日志
mysql>show variables like'log_bin';+---------------+-------+| Variable_name |Value|+---------------+-------+| log_bin |ON|+---------------+-------+1rowinset(0.00 sec)
mysql>
##skip_networking--tcp/ip协议通信,默认是OFF关闭状态,启用后主从将无法通信
mysql>show variables like'%skip_networking%';+-----------------+-------+| Variable_name |Value|+-----------------+-------+| skip_networking |OFF|+-----------------+-------+1rowinset(0.00 sec)
mysql>
2.2.4 🍁 主节点创建主从复制账号
- mysql5.7版本:
mysql>grantreplication slave on*.*to'slave1'@'%' identified by'Zyl@123456';###用户地址可以指定从机IP192.168.181.102
- mysql8.0版本:
mysql>createuser'slave1'@'%' identified by'Zyl@123456';
Query OK,0rows affected (0.02 sec)
mysql>grantreplication slave on*.*to'slave1'@'%';
Query OK,0rows affected (0.01 sec)
mysql>alteruser'slave1'@'%' identified with mysql_native_password by'Zyl@123456';
Query OK,0rows affected (0.02 sec)
mysql>flush privileges;
Query OK,0rows affected (0.02 sec)
2.2.5 🍁 查看主节点的二进制日志的名称
- File和Position两个参数需要在从库配置中使用。
mysql>show master status;+------------------+----------+-----------------+------------------+-------------------+|File| Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+-----------------+------------------+-------------------+| mysql-bin.000004|157| db_master_slave |||+------------------+----------+-----------------+------------------+-------------------+1rowinset(0.00 sec)
mysql>
⛳ 2.3 从节点配置
2.3.1 🍁 修改my.cnf配置文件
**
【必须参数】:
**
[mysqld]#配置唯一的服务器ID,一般使用IP最后一位
server-id=2###开启中继日志,从主服务器上同步日志文件记录到本地
relay-log=relay-log-bin
**
【可选参数】:
**
[mysqld]###定义中继日志文件的位置和名称
relay-log-index=slave-relay-bin.index
2.3.2 🍁 在从节点配置需要复制的主机
####语法##
change master to
master_host='主节点IP',
master_user='主节点用户名',
master_password='用户密码',
master_log_file='mysql-bin.具体数字',
master_log_pos=具体值;####本环境配置##
mysql> change master to master_host='192.168.181.101',master_user='slave1',master_password='Zyl@123456',master_log_file='mysql-bin.000004',master_log_pos=157;
Query OK,0rows affected,8warnings(0.06 sec)
mysql>
2.3.3 🍁 在从节点开启slave同步,查看同步状态
####开启slave同步
mysql>start slave;
Query OK,0rows affected,1 warning (0.05 sec)####查看同步状态
mysql>show slave status\G
***************************1.row***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.181.101
Master_User: slave1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 157
Relay_Log_File: relay-log-bin.000006
Relay_Log_Pos: 373
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
mysql>
**⛳ 主要看这两个参数,两个参数的值都为
Yes
,即主从配置搭建成功:**
Slave_IO_Running
:IO线程,负责与主机的io通信Slave_SQL_Running
:SQL线程,责自己的slave MySQL进程
如果报错
Slave failed to initialize relay_log info structure from the repository
,需要清理之前的relay_log,重新启用新的relay_log即可。
reset slave;
⛳ 2.4 主节点创建数据库测试
- 主节点配置的
db_master_slave
库
####主节点创建数据库db_master_slave
mysql>createdatabase db_master_slave;
Query OK,1row affected (0.01 sec)
mysql>use db_master_slave
Database changed
mysql>####创建表
mysql>CREATETABLE`tab1`(->`id`intNOTNULL,->`name`varchar(255)CHARACTERSET utf8mb3 COLLATE utf8mb3_general_ci NULLDEFAULTNULL,->`class`varchar(255)CHARACTERSET utf8mb3 COLLATE utf8mb3_general_ci NULLDEFAULTNULL,->PRIMARYKEY(`id`)USINGBTREE->)ENGINE=InnoDBCHARACTERSET= utf8mb3 COLLATE= utf8mb3_general_ci ROW_FORMAT = Dynamic;
Query OK,0rows affected,6warnings(0.02 sec)
mysql>####插入测试数据
mysql>INSERTINTO`tab1`VALUES(1001,'曹操','1班');
Query OK,1row affected (0.01 sec)
mysql>INSERTINTO`tab1`VALUES(1002,'张飞','1班');
Query OK,1row affected (0.00 sec)
mysql>INSERTINTO`tab1`VALUES(1003,'项羽','3班');
Query OK,1row affected (0.00 sec)
mysql>INSERTINTO`tab1`VALUES(1004,'刘备','2班');
Query OK,1row affected (0.00 sec)
mysql>
⛳ 2.5 从节点查看同步数据
2.5.1 🍁 数据测试-主节点插入数据,从节点查看
mysql>showdatabases;
###查看tab1表数据
mysql>select*from tab1;+------+--------+-------+| id | name | class |+------+--------+-------+|1001| 曹操 |1班 ||1002| 张飞 |1班 ||1003| 项羽 |3班 ||1004| 刘备 |2班 |+------+--------+-------+4rowsinset(0.00 sec)
mysql>
2.5.2 🍁 数据测试-主节点删除数据,从节点查看
⛳ 2.6 主从同步关闭和开启
- 🍁 停止主从服务复制的功能------
从机执行
####开启slave同步
mysql>start slave;
Query OK,0rows affected,1 warning (0.05 sec)####关闭slave同步
mysql> stop slave;
Query OK,0rows affected,1 warning (0.03 sec)
🔻 三、mysql 同步复制延迟问题
⛳ 3.1 从节点配置主从同步要求
- 🍁 读库与写库数据一致(最终一致)
- 🍁 写数据必须写到写库
- 🍁 读数据不一定必须到读库
主从同步复制的内容是二进制文件,在传输过程中会
存在主从延迟
的情况,会导致用户在从库读取的数据
不是最新数据
----->即
数据不一致性
问题。
⛳ 3.2 如何解决【数据不一致性】问题
- 🍁 异步复制—
master
执行操作后直接返回给client
结果,不再等待slave
反馈同步信息,但这种方式数据一致性最弱。 - 🍁 半同步复制—只要有一个
slave
复制了该事务并成功执行完就返回成功信息给client
,这种方式提高了数据一致性,但是增加了网络延迟时间,降低了主库写的效率。 - 组复制(MGR)----mysql 5.7.17 推出的新的数据复制技术,基于Paxos协议复制,很好的弥补了前面两种复制的不足。
🔻四、总结—温故知新
❓ 了解何为主从复制
❓ mysql支持的复制类型之间区别,以及解决的问题
❓ mysql主从复制搭建
❓ mysql主从复制延迟及解决方案
👈【上一篇】
💖The End💖 点点关注,收藏不迷路💖
【下一篇】👉
版权归原作者 醉颜凉 所有, 如有侵权,请联系我们删除。