一、Mysql主从复制概述
1、Mysql主从复制概念
MySQL主从复制(是一种数据库复制和数据共享的技术,它允许数据从一个MySQL数据库(主数据库)复制到一个或多个MySQL数据库(从数据库)。这种机制主要用于提高数据的可用性、实现数据的备份、以及分担数据库查询负载
###核心概念:
1.主数据库(Master):主数据库是数据变更(包括插入、更新和删除操作)发生的地方。它记录所有的数据变更事件到二进制日志(Binary Log)中。
2.从数据库(Slave):从数据库从主数据库接收数据变更事件,并将这些变更应用到自己的数据集中,从而保持与主数据库的数据一致性。
3.二进制日志(Binary Log):这是主数据库上的一个文件,记录了所有对数据库进行更改的事件。这些记录可以被从数据库用来复制数据。
4.中继日志(Relay Log):从数据库接收到来自主数据库的二进制日志后,会先将其存储在自己的中继日志中,然后再应用这些变更到自己的数据集中。
二、MySQL主从复制的三种同步模式
1.异步复制(Asynchronous replication)
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理,
这样就会有一个问题:主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,
如果此时,强行将从提升为主,可能导致新主上的数据不完整。
2.全同步复制(Fully synchronous replication)
指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。
因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
3.半同步复制(Semisynchronous replication)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,
而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,
同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
三、主从库配置设置
1.配置文件
1.修改master数据库的配置文件my.ini,linux为 vim /etc/my.cnf文件
## server-id=1 // 主库id
## log-bin=mysql-bin // 二进制日志存放位置
## binlog-format=row // 基于行的复制(此配置不是必须)
=============================================================
2.修改slave数据库配置项
## 同时添加replicate-do-db,这个是允许复制的数据库名称。
如果没有该项,则默认复制所有数据库。如果要复制多个,需要重复写,比如:
replicate-do-db=db
replicate-do-db=db02
## server-id=2 // 从库id
## default-storage-engine=MyISAM // 一般从数据库做读数据库,不需要事务,故改成MyISAM引擎
================================================================
2.sql语句配置
master
----------------------------------------------------
###创建用户
1.master创建用户用于slave访问执行:
create user 'slave'@'%' identified by '111';
###用户授权
1.授权所有库,只授予复制权限
grant replication slave on *.* to slave@'%' identified by '111';
2.授权所有库,只能查询操作
grant select on *.* to slave@'%'identified by '111';
3.授权所有库,授予所有权限
grant all privileges on *.* to slave@'%' identified by '111';
4.直接使用root跳过创建用户,直接授权所有库并授予root复制权限
grant replication slave on *.* to root@'%'identified by '111';
###刷新master权限
1.flush privileges;
###查询master当前状态
show master status
记住FIle文件名称和Position数值,一会儿填入slave
-----------------------------------------------------------------------
slvae
---------------------------------------------------------------
###停止slave同步进程
stop slave;
###执行同步SQL设置语句
#master地址
CHANGE MASTER TO MASTER_HOST = '127.0.0.1',
#master端口
MASTER_PORT = ,
#masetr开通的账号
MASTER_USER = '',
#masetr开通的密码
MASTER_PASSWORD = '',
#masetr的file 查询主状态
MASTER_LOG_FILE = '',
masetr的pos 查询主状态
MASTER_LOG_POS = ;
### 启动slave同步进程
start slave;
###查询slave 状态
show slave status
看到 slave_IO_Running 和 slave_sql_running 同为YES 则同步成功
-------------------------------------------------------------------
=========================================================================
查看半同步状态
#主数据库执行
show status like 'Rpl_semi_sync_master_status';
show variables like 'rpl_semi_sync_master_timeout';
#从数据库执行(此时可能还是OFF状态,需要在下一步重启IO线程后,从库半同步状态才会为ON)
show status like 'Rpl_semi_sync_slave_status';
#重启从数据库上的IO线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
#在主库查询半同步状态
show status like '%Rpl_semi%';
Rpl_semi_sync_master_clients #半同步复制客户端的个数
Rpl_semi_sync_master_net_avg_wait_time #平均等待时间(默认毫秒)
Rpl_semi_sync_master_net_wait_time #总共等待时间
Rpl_semi_sync_master_net_waits #等待次数
Rpl_semi_sync_master_no_times #关闭半同步复制的次数
Rpl_semi_sync_master_no_tx #表示没有成功接收slave提交的次数
Rpl_semi_sync_master_status #表示当前是异步模式还是半同步模式,on为半同步
Rpl_semi_sync_master_timefunc_failures #调用时间函数失败的次数
Rpl_semi_sync_master_tx_avg_wait_time #事物的平均传输时间
Rpl_semi_sync_master_tx_wait_time #事物的总共传输时间
Rpl_semi_sync_master_tx_waits #事物等待次数
Rpl_semi_sync_master_wait_pos_backtraverse #可以理解为"后来的先到了,而先来的还没有到的次数"
Rpl_semi_sync_master_wait_sessions #当前有多少个session因为slave的回复而造成等待
Rpl_semi_sync_master_yes_tx #成功接受到slave事物回复的次数
3、半同步配置信息
安装条件----必须在mysql5.5版本以上
配置文件信息
-----------------------------------------------------------------------------
1.修改master--ini文件------------特别注意lib包别缺失,如果缺失从官网下载对应版本复制lib包
#半同步复制配置
#加载mysql半同步复制的插件
plugin-load=rpl_semi_sync_master=semisync_master.so (windos的后缀是so换成dll)
#或者设置为"1",即开启半同步复制功能
rpl_semi_sync_master_enabled=ON
#超时时间为1000ms,即1s
rpl_semi_sync_master_timeout=1000
2.修改slave--ini-配置信息
#半同步复制配置
## plugin-load=rpl_semi_sync_slave=semisync_slave.so (windos的后缀是so换成dll)
## rpl_semi_sync_slave_enabled=ON
--------------------------------------------------------------------------------
sql配置
================================================================
1.主库安装插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.dll';
2.从库安装插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.dll';
3.查看插件
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
4.从库重新启动同步线程
STOP/START SLAVE IO_THREAD;
5.查看运行状态
1)主库查看半同步是否在运行
show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
2)从库查看半同步是否在运行
show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
3)查看半同步超时时间,默认10秒,超时会自动降级为异步复制
show variables like "rpl_semi_sync_master_timeout";
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_timeout | 10000 |
+------------------------------+-------+
四、半同步复制转为异步复制的情况
1. 当半同步复制发生超时(由rpl_semi_sync_master_timeout参数控制,默认为10000ms,即10s),
会暂时关闭半同步复制,转而使用异步复制,也就是会自动降为异步工作。
2. 当 master dump 线程发送完一个事务的所有事件之后,如果在 rpl_semi_sync_master_timeout 内,
收到了从库的响应, 则主从又重新恢复为半同步复制
五、使用半同步复制注意点
1. 在一主多从的架构中,如果要开启半同步复制,并不要求所有的从都是半同步复制。
2. MySQL 5.7极大的提升了半同步复制的性能。
3. 5.6 版本的半同步复制,dump thread 承担了两份不同且又十分频繁的任务:
传送 binlog 给 slave ,还需要等待 slave 反馈信息,而且这两个任务是串行的,
dump thread 必须等待 slave 返回之后才会传送下一个 events 事务。
dump thread 已然成为整个半同步提高性能的瓶颈。
在高并发业务场景下,这样的机制会影响数据库整体的系统吞吐量(TPS)。
4. 5.7 版本的半同步复制中,独立出一个 ack collector thread ,
专门用于接收 slave 的反馈信息。这样 master 上有两个线程独立工作,
可以同时发送 binlog 到 slave ,和接收 slave 的反馈。
=========================================================
5.如果配置文件配置成功,无法启动半同步状态,只保留 rpl_semi_sync_master_enabled=1 ,其他配置文件删除
在主库中执行sql语句:
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 1000
在从库中执行sql语句:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
六、常用命令
-- set GLOBAL server_id=2;
-- show variables like 'server_id';
-- show variables like '%server_uuid%';
-- show variables like '%server_id%';
##更改密码
set password for root@localhost = password('Easy@0122');
七、常见问题
1.注意:Slave_io_Running=Yes 不成立 原因可能是:ip地址、用户的权限 、密码 、pos值 不正确
+--------------------------------------------------------------------------------
2.UUID相同问题
将slave虚拟机上的UUID的配置文件(auto.cnf)删除然后重启mysql服务即可
3.mysql数据库初始化
1.mysql数据库,找到bin目录文件下,执行 mysqld --initialize-insecure --user=mysql。
2.会有一个初始值密码,记住初始值密码,启动mysql服务,net .....start
3.输入mysql -uroot -p 刚才初始化的零时密码登录
注意:如果登录临时密码登不上去,请在ini文件中增加 skip-grant-tables=1 跳过登录密码,登录成功后,
在更改密码重启mysql即可