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)
完成!