文章目录

  • 一、mysql级联复制
  • 1.复制server2上的mysql到server3的指定目录下
  • 2.在server3上创建mysql用户并初始化、安装,编辑/etc/my.cnf文件,设置环境变量
  • 3.备份数据库中已有的文件并导入server3数据库中
  • 4.在server2上编辑/etc/my.cnf并重启mysql
  • 5.在server2上授权
  • 6.在server3上作slave设置,开启slave
  • 7.在server1数据库中添加新的内容,看server3上是否同步
  • 二、设置使用gtid进行复制
  • 1.配置
  • 2.测试
  • 三、半同步复制
  • 1.半同步复制下的两种模式
  • 2.配置


一、mysql级联复制

这里我们使用三台虚拟机来做这个实验:
所谓级联复制是指采用A(B的master)->B(A的slave,C的master)->C(B的slave)方式复制
在此次实验中A对应server1,B对应server2,C对应server3

1.复制server2上的mysql到server3的指定目录下

cd /usr/local/
scp -r mysql/ server3:/usr/local/
scp /etc/my.cnf server3:/etc/
scp /etc/init.d/mysqld server3:/etc/init.d/

mysql 级联从_数据库

2.在server3上创建mysql用户并初始化、安装,编辑/etc/my.cnf文件,设置环境变量

[root@server3 local]# cd mysql/data/
[root@server3 data]# pwd
/usr/local/mysql/data
[root@server3 data]# rm -rf *
[root@server3 ~]# useradd -M -d /usr/local/mysql/data/ -s /sbin/nologin mysql
[root@server3 ~]# vim .bash_profile 
[root@server3 ~]# source .bash_profile 
[root@server3 ~]# mysqld --initialize --user=mysql
[root@server3 ~]# /etc/init.d/mysqld start
[root@server3 ~]# mysql_secure_installation

[root@server3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
symbolic-links=0

mysql 级联从_数据库_02


mysql 级联从_数据库_03


mysql 级联从_mysql 级联从_04


mysql 级联从_二进制日志_05

3.备份数据库中已有的文件并导入server3数据库中

由于进行主从复制之前必须要保证数据库中的文件同步,因此需要先把之前在server1和server2上做主从复制时创建的数据表导入到server3数据库中以达到初始数据同步的目的

之前在server1数据库中创建数据表并添加数据的步骤:
mysql> create database westos;
Query OK, 1 row affected (0.00 sec)

mysql> show database;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'database' at line 1
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| westos             |
+--------------------+
5 rows in set (0.00 sec)

mysql> use westos;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table user_tb(
    -> username varchar(25) not null,
    -> password varchar(50) not null);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into user_tb values ('user1','1111');
Query OK, 1 row affected (0.01 sec)

mysql> insert into user_tb values ('user2','2222');
Query OK, 1 row affected (0.01 sec)

mysql> exit

mysql 级联从_mysql_06

[root@server1 etc]# mysqldump -uroot -pwestos westos > dump.db      %dump server1数据库中的数据
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@server1 etc]# mv dump.db /root/
[root@server1 ~]# scp dump.db server3:    %将dump出的数据复制到server3中

mysql 级联从_mysql_07

在server3上导入server1上的备份数据:
[root@server3 ~]# mysqladmin create westos -pwestos
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
[root@server3 ~]# mysql -pwestos westos < dump.db 
mysql: [Warning] Using a password on the command line interface can be insecure.

mysql 级联从_mysql_08


mysql 级联从_mysql 级联从_09

4.在server2上编辑/etc/my.cnf并重启mysql

[root@server2 data]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
symbolic-links=0

server-id=2             %下面两行是新增的
log-slave-updates       %从库回放主库的二进制日志后,会把所做的事情重新写入到自己的二进制日志中去,供自己的从库去复制回放
log-bin=mysql-bin       %主库的二进制日志

mysql 级联从_二进制日志_10


关于log-slave-updates参数的详细解释可参考下面的链接:.

5.在server2上授权

[root@server2 data]# mysql -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.31-log Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> grant replication slave on *.* to repl@'%' identified by 'westos';      %授权
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      437 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> exit

mysql 级联从_数据库_11

6.在server3上作slave设置,开启slave

mysql> change master to master_host='172.25.0.2', master_user='repl', master_password='westos', master_log_file='mysql-bin.000001', master_log_pos=437;

mysql> start slave;

mysql 级联从_数据库_12


mysql 级联从_数据库_13

7.在server1数据库中添加新的内容,看server3上是否同步

mysql 级联从_数据库_14


mysql 级联从_数据库_15

主从复制机制:
主库中的 I/O线程负责记录主库二进制日志,从库中的I/O线程复杂将主库中的二进制日志复制到本地,之后由replication机制的SQL线程读取relay-log而执行二进制日志中的SQL语句,从而达到复制的目的,这个过程称为回放

二、设置使用gtid进行复制

Gtid采用了新的复制协议,旧协议是,首先从服务器上在一个特定的偏移量位置连接到主服务器上一个给定的二进制日志文件,然后主服务器再从给定的连接点开始发送所有的事件。
新协议有所不同,支持以全局统一事务ID (GTID)为基础的复制。当在主库上提交事务或者被从库应用时,可以定位和追踪每一个事务。GTID复制是以全部事务为基础,使得检查主从一致性变得非常简单。如果所有主库上提交的事务也同样提交到从库上,一致性就得到了保证。
相关原理参考链接:.

1.配置

每个结点上:
vim /etc/my.cnf:         %添加下述内容并重启mysql
gtid_mode=ON
enforce-gtid-consistency=ON

server2上:
mysql -pwestos
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> change master to  MASTER_HOST = '172.25.1.1', MASTER_USER = 'repl',  MASTER_PASSWORD = 'westos', MASTER_AUTO_POSITION = 1;

server3上:
[root@server3 ~]# mysql -pwestos
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> change master to  MASTER_HOST = '172.25.1.2', MASTER_USER = 'repl',  MASTER_PASSWORD = 'westos',
MASTER_AUTO_POSITION = 1;

server1上在mysql数据库中添加内容,server2和server3上自动同步

mysql 级联从_mysql 级联从_16


mysql 级联从_数据库_17

2.测试

mysql 级联从_mysql 级联从_18


mysql 级联从_mysql 级联从_19


mysql 级联从_mysql_20

三、半同步复制

传统的复制模式属于异步复制,主库只管发送二进制日志,而不关心从库是否收到,这种复制方式虽然能够保证复制的速度很快,但无法保证主从数据的一致性,这在生产环境中是不可取的。而半同步方式是指当主库发送二进制日志到从库中时,从库收到数据并存储到relay-log之后会发送一个ack确认给master,这样就保证了主从数据的一致性

mysql 级联从_mysql 级联从_21

1.半同步复制下的两种模式

mysql 级联从_mysql 级联从_22


mysql 级联从_二进制日志_23

2.配置

server1master上安装插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

每个副本上安装插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

mysql 级联从_数据库_24


mysql 级联从_mysql_25


mysql 级联从_二进制日志_26

server1上:
SET GLOBAL rpl_semi_sync_master_enabled = 1
#SET GLOBAL rpl_semi_sync_master_timeout = N     %设置最大超时时间,默认为10秒,我们可以不用更改

mysql 级联从_数据库_27


mysql 级联从_mysql_28

副本端:
SET GLOBAL rpl_semi_sync_slave_enabled = 1

STOP SLAVE IO_THREAD;     %重启IO线程
START SLAVE IO_THREAD;

mysql 级联从_mysql 级联从_29


mysql 级联从_mysql_30


mysql 级联从_数据库_31


mysql 级联从_mysql 级联从_32


mysql 级联从_数据库_33


mysql 级联从_mysql 级联从_34


mysql 级联从_二进制日志_35


mysql 级联从_mysql_36


mysql 级联从_mysql_37


mysql 级联从_mysql_38


再把server2上的I/O线程开启后server2和server3上又能同步server1上的数据,这就是半同步复制方式的优点:能够保证主从数据的一致性

mysql 级联从_mysql 级联从_39


mysql 级联从_mysql_40