Linux----------mysql主从复制和基于GTID主从复制

一、 传统mysql主从复制

主从复制步骤:
主库将所有的写操作记录到binlog日志中并生成一个log dump线程,将binlog日志传给从库的I/O线程
从库生成两个线程,一个I/O线程,一个SQL线程
I/O线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中
SQL线程,会读取relay log文件中的日志,并解析成具体操作回放,来实现主从的操作一致,达到最终数据一致的目的

//传统主从复制的配置及验证请参考《mysql主从及高可用》

二、 基于GTID主从复制

基于GTID的复制是从Mysql5.6开始支持的一种新的复制方式,此方式与传统基于日志的方式存在很大的差异,在原来的基于日志的复制中,从服务器连接到主服务器并告诉主服务器要从哪个二进制日志的偏移量开始执行增量同步,这时我们如果指定的日志偏移量不对,这与可能造成主从数据的不一致,而基于GTID的复制会避免。
在基于GTID的复制中,首先从服务器会告诉主服务器已经在从服务器执行完了哪些事务的GTID值,然后主库会有把所有没有在从库上执行的事务,发送到从库上进行执行,并且使用GTID的复制可以保证同一个事务只在指定的从库上执行一次,这样可以避免由于偏移量的问题造成数据不一致。
什么是GTID,也就是全局事务ID,其保证为每一个在主上提交的事务在复制集群中可以生成一个唯一的ID。
一个GITD由两部分组成的,分别是source_id 和transaction_id,GTID=source_id:transaction_id,其中source_id就是执行事务的主库的server-uuid值,server-uuid值是在mysql服务首次启动生成的,保存在数据库的数据目录中,在数据目录中有一个auto.conf文件,这个文件保存了server-uuid值(唯一的)。而事务ID则是从1开始自增的序列,表示这个事务是在主库上执行的第几个事务,Mysql会保证这个事务和GTID是一比一的关系。

配置主数据库服务器需要做的大概和传统的主从配置差不多,需要起码的在主服务器上建立复制账号,还要配置数据库日志文件的目录,这是必须的启动bin_log日志。
可以指定bin_log存放目录,而不是用数据目录,分开存储是个好习惯,特别是如果把日志和数据放在不同的磁盘分区上,这样不但可以避免日志的增长把数据磁盘分区占满,也可以提高了磁盘IO。
bin_log = /usr/local/mysql/log/mysql-bin。

三、GTID主从复制和传统主从复制相比

优点
A:很方便的进行故障转移,因为GTID是全局唯一的标识符,所以就很简单知道哪些事务在从服务器没有执行,在多个从服务器也没必要进行多个日志偏移量配置了.
B:从库和主库的数据一致性。
缺点
A:故障处理比日志处理复杂。
B:执行语句的一些限制。
C:仅支持5.6以后较晚的版本

四、基于GTID主从复制的配置

4.1 主服务器配置

主服务器:

//修改主配置文件
vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
log-bin = mysql-bin
server-id = 1
log-error = /var/log/mysqld.log
binlog-format = row
log-slave-updates = true
enforce-gtid-consistency = true
gtid-mode = on
//重启服务
service mysqld restart
//进入mysql
mysql
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> show global variables like '%uuid%';
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 91284b51-76b6-11e9-bc39-000c291926d0 |
+---------------+--------------------------------------+
1 row in set (0.01 sec)

mysql> show global variables like '%gtid%';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| binlog_gtid_simple_recovery      | ON    |
| enforce_gtid_consistency         | ON    |
| gtid_executed                    |       |
| gtid_executed_compression_period | 1000  |
| gtid_mode                        | ON    |
| gtid_owned                       |       |
| gtid_purged                      |       |
| session_track_gtids              | OFF   |
+----------------------------------+-------+
8 rows in set (0.00 sec)
grant replication  slave on *.* to root@'192.168.43.%' identified by '123456';  //ip段与账号密码
flush privileges;  //刷新权限

4.2 从服务器配置

//将当前sql文件拷贝到从服务器,这里使用scp命令
scp    root@192.16843.166:/root/all.sql   .
//拷贝完之后,进入从服务器Mysql终端,创建目标数据库,然后倒入到从库
mysql  < all.sql
//配置主配置文件
vim  /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
server-id = 3
relay-log = relay-log-bin
log-error = /var/log/mysqld.log
binlog-format = row
log-slave-updates = true
enforce-gtid-consistency = true
gtid-mode = on
read_only = on
//重启服务
service mysqld restart
//进入mysql
mysql
//使用change master配置主从
change master to master_host='192.168.136.142',master_user='root',master_passwrd='123456',master_auto_position=1;
//配置完成启动slave
start slave;  

4.3 验证

主服务器:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
| wang               |
+--------------------+
6 rows in set (0.00 sec)

mysql> create database bbb;
Query OK, 1 row affected (0.00 sec)

mysql> 

从服务器:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| bbb                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

配置完后再主服务器上查看一下

mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|         3 |      | 3306 |         1 | dfba03e6-76fe-11e9-9e19-000c29559ac8 |
+-----------+------+------+-----------+--------------------------------------+

1 row in set (0.00 sec)
posted @ 2019-05-15 12:21  A学无止境A  阅读(288)  评论(0编辑  收藏  举报