mysqlAB复制
一.概述
1.什么是MySql的AB复制?
MySql的AB复制(replication、也叫主从复制)是一个异步的复制,从一个MySql实例(Master)复制到另一个mysql 实例(Slave)。实现整个主从复制,需要由Master服务器上的IO进程,和Slave服务器上的Sql进程和IO进程共同完成。要实现主从复制,首先必须打开Master端的binary log(bin-log)功能,因为整个MySql复制过程实际上就是Slave从Master端获取相应的二进制日志,然后再在自己slave端完全顺序的执行日志中所记录的各种操作(二进制日志几乎记录了除select以外的所有针对数据库的sql操作语句)。
2.AB复制的基本过程
-
首先,MySql Slave端的IO进程连接上Master,向Master请求指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
-
当Master接收到来自Slave的IO进程的请求后,负责复制的IO进程根据Slave的请求信息,读取相应日志内容,返回给Slave 的IO进程。并将本次请求读取的bin-log文件名及位置一起返回给Slave端;
-
Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master其需要哪个位置之后的日志文件;
-
Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
AB复制是保证MySQL的高可用
集群cluster:多台机器提供一个服务
master 对外负责提供写数据
slave 读master日志写到relay-log(中继日志)
I/O进程:负责通信
SQL进程:负责写数据,根据log日志写数据。
二.部署
- 准备环境
master: 192.168.240.130
slave: 192.168.240.129
- 主从防火墙放行3306端口**(直接关闭防火墙也行)**
master:
#firewall-cmd --add-port=3306/tcp --permanent # firewall-cmd --reload
slave:
#firewall-cmd --add-port=3306/tcp --permanent # firewall-cmd --reload
- 安装数据库以mariadb为例
master and slave 同时安装:
#yum -y install mariadb*
#systemctl start mariadb
# mysql_secure_installation 初始化设置密码
- master数据库授权用户并开启binlog日志
MariaDB [(none)]> grant replication slave,replication client on *.* to ‘slave’@’%’ identified by ‘1’; Query OK, 0 rows affected (0.00 sec)
注意:如果不成功,删除以前的binlog日志
replication slave: 拥有此权限可以查看从服务器,从主服务器读取二进制日志。
replication client : 拥有此权限,可以复制客户端数据信息
#vim /etc/my.cnf \[mysqld\] datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-bin=/var/lib/mysql/master-binlog server-id=1
重启服务
如果主服务器有数据据先备份数据再把数据传给从服务器
# mysqldump -p’123’ --all-databases --single-transaction --master-data=1 --flush-logs >/all.sql //备份master的数据
#scp -r all.sql 192.168.1.132:/ //将master的备份传给slave端#master端创建一些库和表,并插入数据(模拟真实环境)
- slave服务器 在数据库中指定主服务器的相关信息并开启binlog日志
MariaDB [(none)]>help change master to CHANGE MASTER TO
MASTER_HOST=‘主服务器ip或域名’, 注意如果是域名一定要做域名解析
MASTER_USER=‘主服务器的授权的用户’, 我授权的用户名是"slave" MASTER_PASSWORD=‘主服务器授权用户的密码’, 我授权用户密码是"1" MASTER_PORT=3306, 主服务器的端口 默认"3306" MASTER_LOG_FILE=‘主服务器binlog日志的名字’, 在主服务器上用 show master status ; 查看MASTER_LOG_POS=4, 630 日志位置,下面查到的日志位置 是630
MASTER_CONNECT_RETRY=10; 连接主服务器尝试次数10次
6.主服务器查看binlog日志名字
MariaDB [test]> show master status ;
±---------------------±---------±-------------±-----------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
±---------------------±---------±-------------±-----------------+
| master-binlog.000002 | 630 | | |
±---------------------±---------±-------------±-----------------+
1 row in set (0.00 sec)
#vim /etc/my.cnf [mysqld] datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock log-bin=/var/lib/mysql/salve-binlog
server-id=2
重启服务
7.从服务器查看状态
MariaDB [(none)]>start slave;
MariaDB [(none)]> show slave status\G;
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.240.130 Master_User: slave Master_Port: 3306
Connect_Retry: 10
Master_Log_File: master-binlog.000002 Read_Master_Log_Pos: 630
Relay_Log_File: mariadb-relay-bin.000007 Relay_Log_Pos: 918
Relay_Master_Log_File: master-binlog.000002 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:
Last_Errno: 0 Last_Error: Skip_Counter: 0
Exec_Master_Log_Pos: 630
Relay_Log_Space: 1502 Until_Condition: None Until_Log_File: Until_Log_Pos: 0
Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path:
Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key:
Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error:
Replicate_Ignore_Server_Ids: Master_Server_Id: 1
1 row in set (0.00 sec) ERROR: No query specified
看到sql 进程 和io进程 双yes 表示搭建成功
问题: sql进程和io进程没起来
Slave_IO_Running:Connecting 或 Slave_IO_Running:no Slave_SQL_Running:Yes 或 Slave_SQL_Running:no
-
网络不通
-
账户密码错误
-
防火墙
-
mysql配置文件问题
-
连接服务器时语法
-
主服务器mysql权限
- 如果克隆的机器会报uuid错误 修改uuid /data/auto.cnf
或用find / -name "auto.cnf"
- 验证:
主服务器插入数据从服务器查看数据是否同步。
master:
MariaDB [(none)]> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
±-------------------+
3 rows in set (0.00 sec)
slave :
MariaDB [(none)]> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
±-------------------+
3 rows in set (0.00 sec)
主服务器插入数据
MariaDB [(none)]> create database test;
Query OK, 1 row affected (0.00 sec)
MariaDB [test]> insert into t1 values (1,‘jim’),(2,‘tom’);
Query OK, 2 rows affected (0.00 sec)Records: 2 Duplicates: 0 Warnings: 0
MariaDB [test]> select * from t1;
±-----±-----+
| id | name |
±-----±-----+
| 1 | jim |
| 2 | tom |
±-----±-----+
2 rows in set (0.00 sec)
MariaDB [(none)]> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
±-------------------+
4 rows in set (0.00 sec)
从服务器查看是否数据已生成
MariaDB [(none)]> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
±-------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> select * from test.t1;
±-----±-----+
| id | name |
±-----±-----+
| 1 | jim |
| 2 | tom |
±-----±-----+
2 rows in set (0.01 sec)
数据已同步配置完成
主从复制(gtid模式)
M-S GTID 基于事务ID复制
三.GTID
全局事务标识:global transaction identifiers
是用来代替传统复制的方法,GTID复制与普通复制模式的最大不同就是不需要指定二进制文件名和位置,不再使用
MASTER_LOG_FILE+MASTER_LOG_POS开启复制。而是使用MASTER_AUTO_POSTION=1的方式开始复制。
MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善
在传统的slave端,binlog是不用开启的,但是在GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID
GTID的组成:
GTID = source_id:transaction_id
source_id"等于"源id,用于鉴别原服务器,即mysql服务器唯一的的server_uuid,由于GTID会传递到slave,所以也可以理解为源ID。
transaction_id事务id,为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务。
示例:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
前面的一串为服务器的server_uuid,即3E11FA47-71CA-11E1-9E33-C80AA9429562,后面的23为transaction_id
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。
环境准备:
-
准备两台虚拟机
master: 192.168.240.140
slave : 192.168.240.187 -
master和slave编绎安装mysql (略)
-
主服务器配置(master配置 )
修改配置文件
#vim /etc/my.cnf [mysqld] datadir=/data
basedir=/usr/local/mysql server-id=1
log-bin=master_binlog gtid_mode=on enforce_gtid_consistency=on
gtid_mode=on //开启gtid膜式enforce_gtid_consistency=on //强制打开gtid 一至性
启动两个启用了GTID的服务器。 要启用基于GTID的复制,必须通过将gtid_mode变量设置为来启用GTID模式ON, 并在enforce_gtid_consistency 启用变量的情况 下启动每个服务器 , 以确保仅记录对基于GTID的复制安全的语句
授权用户:
mysql> grant replication slave,replication client on *.* to
‘slave’@’%’ identified by ‘1’; //授权slave用户mysql>flush privileges; //刷新授权表#service mysqld restart // 重启服务
- 从服务器配置(slave配置)
#vim /etc/my.cnf
[mysqld]
datadir=/data basedir=/usr/local/mysql server-id=2
log-bin=slave-binlog gtid_mode=on enforce_gtid_consistency=on
将副本配置为使用基于GTID的自动定位。 告诉副本使用基于GTID的事务的源作为复制数据源,并使用基于GTID的自动定位而不是基于文件的定位。CHANGE MASTER TO在副本上发出一条 语句,包括该MASTER_AUTO_POSITION 语句中的选项,以告知副本源的事务由GTID标识。
mysql>\e
change master to
MASTER_HOST=‘192.168.240.140’, MASTER_USER=‘slave’, MASTER_PASSWORD=‘1’,
MASTER_PORT=3306, MASTER_AUTO_POSITION = 1
mysql>flush privileges; mysql>start slave;
mysql> show slave status\G;
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.240.140 Master_User: slave Master_Port: 3306
Connect_Retry: 60 Master_Log_File: binlog.000011
Read_Master_Log_Pos: 194 Relay_Log_File: slave1-relay-bin.000007 Relay_Log_Pos: 401
Relay_Master_Log_File: binlog.000011 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:
Last_Errno: 0 Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 194
Relay_Log_Space: 649 Until_Condition: None Until_Log_File:
Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error:
Last_SQL_Errno: 0 Last_SQL_Error:
Replicate_Ignore_Server_Ids: Master_Server_Id: 1
Master_UUID: a2ffd480-c283-11ea-bedd-000c2945a66b Master_Info_File: /data/master.info
SQL_Delay: 0 SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400
Master_Bind: Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath:
Retrieved_Gtid_Set: a2ffd480-c283-11ea-bedd-000c2945a66b:1 Executed_Gtid_Set: a2ffd480-c283-11ea-bedd-000c2945a66b:1,
d48dd7ff-cc8c-11ea-8cfd-000c2955e9c3:1 Auto_Position: 1
Replicate_Rewrite_DB: Channel_Name:
Master_TLS_Version: 1 row in set (0.00 sec)
mysql> show master status;
±--------------±---------±-------------±-----------------±---------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±--------------±---------±-------------±-----------------±---------------------------------------+
| binlog.000011 | 194 | | | a2ffd480-c283-11ea-bedd-000c2945a66b:1 |
±--------------±---------±-------------±-----------------±---------------------------------------+
1 row in set (0.00 sec)
- 验证 摸拟主服务器插入数据 到从服务服务上看是否同步数据**.**
四. 清除AB复制
- Slave上的操作
mysql> show slave status\G
Slave_IO_State:
Master_Host: 192.168.56.100 Master_User: repliform Master_Port: 3306
Connect_Retry: 60 Master_Log_File: mysqld-bin.000001
Read_Master_Log_Pos: 1458
Relay_Log_File: localhost-relay-bin.000003 Relay_Log_Pos: 4
Relay_Master_Log_File: mysqld-bin.000001 Slave_IO_Running: No Slave_SQL_Running: Yes
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
清除复制设置
mysql> reset slave all;
Query OK, 0 rows affected (0.07 sec)
mysql> show slave status\G Empty set (0.00 sec)
删除复制用户
mysql> drop user ‘用户名’; mysql> flush privileges;
- Master上的操作
删除复制用户
mysql> drop user ‘用户名’; mysql> flush privileges;