mysql5.7的主从复制,基于GTID复制,并行复制,半同步复制

一 最简单的AB主从复制

MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。

实验步骤:
1)安装数据包(server3 server4)

Yum install -y mysql-community-client-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
mysql-community-server-5.7.17-1.el6.x86_64.rpm

2 )安全初始化数据库
1 首先需要的是打开数据库
/etc/init.d/mysqld start
2由于在5.7版本中打开数据库时会默认初始化数据库,也会进行密码强度检测等,所以可以查看日志文件找到初始化时生成的随机码。
grep password /var/log/mysqld.log
3 重置密码(注意有强度检测,最好大于8位且包涵大小写和特殊字符等)
mysql_secure_installation
下面提供一种忘记密码的解决办法:

1编辑vim /etc/my.cnf
最后一行增加
 skip-grant-tables#免密登陆
2 /etc/init.d/mysqld restart
3 mysql 进入数据库
4 use mysql 
5 update user set authentication_string=PASSWORD("James@123") where
user='root'; #更改密码
6 quit;退出
7 vim /etc/my.cnf  删除掉免密登陆
8 /etc/init.d/mysqld restart
9  mysql -p 进入数据库之后还会发现继续报错
10 mysql> SET PASSWORD = PASSWORD('James@123');
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show databases
-> ;
+--------------------+
| Database
|
+--------------------+| information_schema |
| mysql
|
| performance_schema |
| sys
|
+--------------------+
4 rows in set (0.00 sec)
mysql>

这样mysql就好了

3)主从复制(server4 主 server3 从)
Master 设置
1 vim /etc/my.cnf 增加以下参数
server-id=1
log-bin=mysql-bin
2 mysql -p
3 grant replication slave on . to bleach@‘172.25.1.%’ identified by ‘James@123’;
4 Flush privileges;
5 show master status;
Slave 设置
1 vim /etc/my.cnf
server-id=2
2 登陆数据库

mysql> change master to
master_host='172.25.1.5',master_user='bleach',master_password='James@123',
master_log_file='mysql-bin.000001',master_log_pos=600;
mysql> start slave;
mysql> show slave status\G

4 )进行测试
1)master创建一个james的库,然后在salve端进行查看
2 )slave端进行查看

二 在基于GTID的主从复制
Master端
1)vim /etc/my.cnf 增加以下配置
gtid-mode=on
enforce-gtid-consistency=1
2) /etc/init.d/mysqld restart
3)Mysql -p
4)grant replication slave on . to bleach@‘172.25.1.%’ identified by
‘James@123’;
5)Flush privileges;
6)show master status;
Slave端
1)mysql -p
2)如果没有关闭之前的 slave 的话会发生报错
3)stop slave
4 mysql> change master to
master_host=‘172.25.1.5’,master_user=‘bleach’,master_password=‘James@123’,
master_log_file=‘mysql-bin.000001’,master_log_pos=600;
mysql> start slave;
mysql> show slave status\G
三 并行复制
本次实验是基于GTID的主从复制的基础上进行的
在slave端
1)编辑vim /etc/my.cnf 文件增加下面参数
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
2)/etc/init.d/mysqld restart
3 )mysql -p
4)show processlist;
mysql5.7的主从复制,基于GTID复制,并行复制,半同步复制_第1张图片
从这可以看出这里有16个线程在wait 一个io线程 一个sql线程 一个调度线程 一个当前的线程,可以看出针对之前的异步复制,假如master端多个线程需要发送,而slave端只能处理一个线程,因为binlog日志是推送的,所有主库和从库之间存在一定的延迟。 这样就会造成很多问题,比如主库因为磁盘损坏等故障突然崩掉,导致binlog日志不存在,同时因为延迟binlog还没有推送到从库,从库也就会丢失很多被主库提交的事物,从而造成主从不一致。而并行复制就是针对此来优化的。
四 半同步复制

在mysql异步复制的情况下,Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Master Sever就自动返回数据给客户端,而不管slave上是否接受到了这个二进制日志。在半同步复制的架构下,当master在将自己binlog发给slave上的时候,要确保slave的IO_THREAD接收日志写入relay-log以后,才会返回数据给客户端。对比两种架构:异步复制对于用户来说,可以确保得到快速的响应结构,但是不能确保二进制日志确实到达了slave上;半同步复制对于客户的请求响应稍微慢点,但是他可以保证二进制日志的完整性。备库Crash时,主库会在某次等待超时后,关闭Semi-sync的特性,降级为普通的异步复制。

本次实验是基于GTID的主从复制的基础上进行的
Master: (server2 主 server3从)
1)install plugin rpl_semi_sync_master soname ‘semisync_master.so’; #安装插件
2)set global rpl_semi_sync_master_enabled=ON; #开启半同步
3)show variables like ‘%rpl%’;
mysql5.7的主从复制,基于GTID复制,并行复制,半同步复制_第2张图片
Slave:
1)install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;
2)set global rpl_semi_sync_slave_enabled=ON; #开启半同步
3)show variables like ‘%semi%’;
mysql5.7的主从复制,基于GTID复制,并行复制,半同步复制_第3张图片
Master端查看
show status like ‘%rpl_semi_sync%’;
mysql5.7的主从复制,基于GTID复制,并行复制,半同步复制_第4张图片
测试:
关闭 slave 关闭端
stop slave io_thread;
在 master 端增加表的值
mysql5.7的主从复制,基于GTID复制,并行复制,半同步复制_第5张图片
可以看出由于 slave 端 io 线程的关闭,master 端响应 10s 左右
关闭 Semi-sync 的特性,降级为普通的异步复制
然后我们在 slave 端进行查看
Start slave io_thread;
Start slave;
mysql5.7的主从复制,基于GTID复制,并行复制,半同步复制_第6张图片
发现打开 io 线程之后 slave 立刻复制 master 端的数据过来
再去访问 master 端就能发现失败链接次数次数,关闭半同步复制的次数,等待次数
show status like ‘%rpl_semi_sync%’;
mysql5.7的主从复制,基于GTID复制,并行复制,半同步复制_第7张图片

你可能感兴趣的:(mysql5.7的主从复制,基于GTID复制,并行复制,半同步复制)