Linux:Mysql5.7的主从复制,半同步

Mysql主从复制

master将改变记录到二进制日志中binlog,slave将master的binlog拷贝到自己的中继日志中,然后执行一遍sql语句就达到同步了
一个服务器当主库,另一个或多个服务器当从库,主库会把对数据库的修改操作(新增 删除
修改)记录在binlog日志中,从库连接主库获取主库的binlog,并记录在中继日志relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步

Mysql主从复制的实现原理图

Linux:Mysql5.7的主从复制,半同步_第1张图片

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

一·主从服务器的安装包

[root@server1(2) ~]# ls
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
[root@server1(2) ~]# yum install -y *.rpm

二·主数据库master修改

1·修改配置文件

[root@server1 ~]# vim /etc/my.cnf    ##添加以下内容
server-id=1     #设置serverid,这是mysql主从复制是一个很重要的标识
log-bin=mysql-bin   #启动二进制日志系统
[root@server1 ~]# /etc/init.d/mysqld start    ##开启服务

2·更改密码

[root@server1 ~]# grep password /var/log/mysqld.log   ##过滤密码,查看原始密码
[root@server1 ~]# mysql_secure_installation    ##更改密码
# 设置新密码时,必须含有大小写字母,特殊字符和数字,不少于8个字符

3·登陆mysql
主服务器授权

[root@server1 ~]# mysql -uroot -p
mysql> grant replication slave on  *.*  to  repl@'172.25.41.%' identified by 'Redhat!123';   ##授权
mysql> show databases;   ##显示
mysql> show master status;   ##查看状态

Linux:Mysql5.7的主从复制,半同步_第2张图片

三·从服务器slave修改

1.修改配置文件

[root@server2 ~]# vim /etc/my.cnf   ##添加以下内容
server-id=2     #设置serverid
[root@server2 ~]# /etc/init.d/mysqld start    ##开启服务

2从服务器授权

[root@server2 ~]# mysql -p
mysql> change master to master_host='172.25.71.1', master_user='repl', master_password='Redhat!123', master_log_file='mysql-bin.000003', master_log_pos=1003;
mysql> start slave;    #启动slave同步进程
mysql> show slave status\G;  #查看状态

Linux:Mysql5.7的主从复制,半同步_第3张图片

四·同步复制

1.普通主从服务器复制

[root@server1 ~]# mysql -p   ##在主服务器建立用户
mysql> create database test;   ##建立库
mysql> use test  ## 进入库
mysql> create table userlist (
    -> username varchar(15) not null,
    -> password varchar(25) not null);
mysql> desc userlist;
mysql> insert into userlist values ('user1','123');    ##添加用户
mysql> insert into userlist values ('user2','456');
mysql> insert into userlist values ('user3','789');

Linux:Mysql5.7的主从复制,半同步_第4张图片

在从服务器查看

[root@server2 ~]# mysql -p 
mysql> use test
mysql> select * from userlist;

Linux:Mysql5.7的主从复制,半同步_第5张图片

2.gtid主从复制

(1)主从服务器修改配置文件

[root@server1(2) ~]# vim /etc/my.cnf    ##添加以下内容
gtid_mode=ON
enforce-gtid-consistency=true
[root@server1(2) ~]# /etc/init.d/mysqld restart

(2)主服务器

[root@server1 ~]# mysql -p
mysql> show master status;   #查看状态

Linux:Mysql5.7的主从复制,半同步_第6张图片

(3)从服务器

[root@server2 ~]# mysql -p
mysql> stop slave;   #停止slave同步进程
mysql> change master to master_host='172.25.41.1', master_user='repl', master_password='Redhat!123', MASTER_AUTO_POSITION=1;
mysql> start slave;   #启动slave同步进程
mysql> show slave status\G;   ##查看状态

Linux:Mysql5.7的主从复制,半同步_第7张图片

(4)测试
主服务器删除用户:

[root@server1 ~]# mysql -p
mysql> use test
mysql> show tables;
mysql> delete from userlist where username='user3';

Linux:Mysql5.7的主从复制,半同步_第8张图片

从服务器查看:

[root@server2 ~]# mysql -p
mysql> use test
mysql> select * from userlist;

Linux:Mysql5.7的主从复制,半同步_第9张图片

五·一主两从:(既可以做从也可以做主)

server1:master
server2:master,slave
server3:slave

[root@server1 ~]# mysqldump -pRedhat\!123 test > test.sql
[root@server1 ~]# scp test.sql  server3:
[root@server3 ~]# vim test.sql 
create database test;
use test;
[root@server3 ~]# /etc/init.d/mysqld restart
[root@server3 ~]# mysql -p test < test.sql 
[root@server3 ~]# mysql -p
mysql> change master to  master_host='172.25.41.2', master_user='repl', master_password='Redhat!123', master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;

Linux:Mysql5.7的主从复制,半同步_第10张图片

[root@server2 ~]# 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
[root@server2 ~]# /etc/init.d/mysqld restart

Linux:Mysql5.7的主从复制,半同步_第11张图片

六·半同步复制

1.主服务器设置【server1】


mysql> INSTALL PLUGIN  rpl_semi_sync_master  SONAME 'semisync_master.so';  #安装插件
mysql> show global variables like '%semi%';   #环境变量
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | OFF   |  (是否启动半同步功能) 
| rpl_semi_sync_master_timeout       | 10000 |  (连接从节点的超时时间)
| rpl_semi_sync_master_trace_level   | 32    |(是否检测半同步从节点上线)
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> set global rpl_semi_sync_master_timeout=2000;

Linux:Mysql5.7的主从复制,半同步_第12张图片

2.从服务器设置【server2】

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> show global variables like '%semi%';
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;

Linux:Mysql5.7的主从复制,半同步_第13张图片

3.在主服务器验证半同步

mysql> show global status like '%semi%';

Linux:Mysql5.7的主从复制,半同步_第14张图片

重启从上的IO线程
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
如果没有重启,则默认还是异步复制,重启后,slave会在master上注册为半同步复制的slave角色。
当我们在server1删除user2.在server2查看:

4.从服务器配置

mysql> delete  from userlist where username='user2';

主服务器查看:Linux:Mysql5.7的主从复制,半同步_第15张图片

测试:

(1)
在server1建立用户
Linux:Mysql5.7的主从复制,半同步_第16张图片
在server2查看
Linux:Mysql5.7的主从复制,半同步_第17张图片
在server3从服务查看同步
Linux:Mysql5.7的主从复制,半同步_第18张图片

(1)
在server2 关闭IO

mysql> STOP SLAVE IO_THREAD;

在server1建立用户

mysql> insert into userlist values ('user6','444');

在server3查看不到建立的用户
在server2打开IO,才会看到

mysql> START SLAVE IO_THREAD;

server3查看
Linux:Mysql5.7的主从复制,半同步_第19张图片

你可能感兴趣的:(Linux:Mysql5.7的主从复制,半同步)