mysql异步复制的主从复制

1.mysql主-从复制

MySQL主从复制涉及三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点,如下图所示:
在这里插入图片描述
传统的 MySQL 复制提供了一种简单的主–从复制方法。 有一个主,以及一个或多个从。 主节点执行和提交事务,然后将它们(异步地)发送到从节点,以重新执行(在基于语句的复制中)或应用(在基于行的复制中)。 这是一个 shared-nothing 的系统,默认情况下所有 server 成员都有一个完整的数据副本。
图1.MySQL 异步复制
在这里插入图片描述

还有一个半同步复制,它在协议中添加了一个同步步骤。 这意味着主节点在提交时需要等待从节点确认它已经接收到事务。只有这样,主节点才能继续提交操作。
图2.MySQL 异步复制
在这里插入图片描述
在上面的两个图片中,可以看到传统异步 MySQL 复制协议(以及半同步)的图形展示。 蓝色箭头表示在不同 server 之间或者 server 与 client 应用之间的信息交互。

2.mysql默认的基于二进制文件的主从复制

1.获取压缩包并解压、安装

[root@server1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@server1 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar 
[root@server1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-devel-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-minimal-debuginfo-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
mysql-community-server-minimal-5.7.24-1.el7.x86_64.rpm
mysql-community-test-5.7.24-1.el7.x86_64.rpm
[root@server1 ~]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm

在这里插入图片描述

2.打开log-bin日志

[root@server1 ~]# vim /etc/my.cnf
 29 log-bin=mysql-bin
 30 server-id=1

在这里插入图片描述

3.启动mysql,配置密码

[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# ls
[root@server1 mysql]# cd 
[root@server1 ~]# systemctl start mysqld
[root@server1 ~]# cd -
/var/lib/mysql
[root@server1 mysql]# ls
auto.cnf         ib_logfile1       performance_schema
ca-key.pem       ibtmp1            private_key.pem
ca.pem           mysql             public_key.pem
client-cert.pem  mysql-bin.000001  server-cert.pem
client-key.pem   mysql-bin.000002  server-key.pem
ib_buffer_pool   mysql-bin.index   sys
ibdata1          mysql.sock
ib_logfile0      mysql.sock.lock

在这里插入图片描述

[root@server1 mysql]# cat /var/log/mysqld.log | grep password			##获取密码
[root@server1 mysql]# mysql_secure_installation			##安全初始化
[root@server1 mysql]# mysql -uroot -pRedhat1.			##登陆测试
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

在这里插入图片描述

4.server2进行和server1同样的配置,但配置文件my.cnf的server-id=2

[root@server2 ~]# ls
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@server2 ~]# yum install * -y
[root@server2 ~]# vim /etc/my.cnf
 29 server-id=2
[root@server2 ~]# systemctl start mysqld
[root@server2 ~]# grep password /var/log/mysqld.log 
[root@server2 ~]# mysql_secure_installation
[root@server2 ~]# mysql -uroot -pRedhat1.
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

5.在作为主库的server1上写入信息

mysql> grant replication slave on *.* to repl@'172.25.80.%' identified by 'Redhat1.';
mysql> SHOW MASTER STATUS;	#查看配置从机所需要的信息
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      691 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

6.在作为从库的server2上进行配置

mysql> change master to master_host='172.25.80.1', master_user='repl', master_password='Redhat1.', master_log_file='mysql-bin.000002', master_log_pos=691;
Query OK, 0 rows affected, 2 warnings (0.13 sec)
mysql> start slave;		##启动slave
Query OK, 0 rows affected (0.03 sec)
mysql> show slave status\G;		##查看slave的信息

             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes			##两个yes表示配置成功

7.测试

在master的server1上建立表

mysql> CREATE DATABASE redhat;
Query OK, 1 row affected (0.03 sec)

mysql> USE redhat;
Database changed
mysql> CREATE TABLE usertb (
    -> username varchar(10) not null,
    -> password varchar(15) not null);
Query OK, 0 rows affected (0.10 sec)

mysql> DESC usertb;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(10) | NO   |     | NULL    |       |
| password | varchar(15) | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> INSERT INTO usertb values ('user1','123');
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
+----------+----------+
1 row in set (0.00 sec)

在这里插入图片描述
在slave的server2上查看数据是否成功同步

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| redhat             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> USE redhat
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SHOW TABLES;
+------------------+
| Tables_in_redhat |
+------------------+
| usertb           |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
+----------+----------+
1 row in set (0.00 sec)

在这里插入图片描述
可以看到数据已经同步成功!

3.mysql基于jtid的主从复制

1.将master和slave的mysql关闭,修改配置文件

在server1上(master)

[root@server1 ~]# vim /etc/my.cnf
 29 log-bin=mysql-bin
 30 server-id=1
 31 gtid_mode=ON
 32 enforce-gtid-consistency=true
[root@server1 ~]# systemctl start mysqld

在这里插入图片描述
在server2上(slave)

[root@server2 ~]# vim /etc/my.cnf
 29 server-id=2
 30 gtid_mode=ON
 31 enforce-gtid-consistency=true
[root@server2 ~]# systemctl start mysqld

在这里插入图片描述

2. 在master上给从库授权

mysql> SHOW PLUGINS;   ##查看规则
ysql> SHOW MASTER STATUS;	##查看从库需要的信息
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'172.25.80.%' IDENTIFIED BY 'Redhat1.';			##授权,写上数据库密码和要授权的ip
Query OK, 0 rows affected, 1 warning (0.02 sec)

在这里插入图片描述

3.在slave上设置master

mysql> stop slave;		
mysql> change master to master_host='172.25.80.1', #主库ip
master_user='repl', #使用的用户(主库那边授权的用户身份)
master_password='Redhat1.', 	#密码
master_auto_position=1;		#自动开启gtid的复制方式
Query OK, 0 rows affected, 2 warnings (0.07 sec)
mysql> start slave;
mysql> show slave status\G;
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

在这里插入图片描述

4.测试

在主库写入信息并在从库查看
server1:

mysql> USE redhat
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql>  INSERT INTO usertb values ('user2','123');
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 123      |
+----------+----------+

在这里插入图片描述
server2:

mysql> SELECT * FROM redhat.usertb;
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 123      |
+----------+----------+
2 rows in set (0.00 sec)

在这里插入图片描述
完成!

猜你喜欢

转载自blog.csdn.net/qq_43511217/article/details/90050699
今日推荐