MySQL高可用-主从同步(实现读写分离)
一、简介
数据库架构可以分为三大类:主从架构、集群架构和分布式架构。
在主从架构类别中,又可以分 7 小类,分别是。
- 传统主从复制,有时候也称为异步复制。
- 基于 GTID 的主从复制,从 MySQL 5.6 版本后,推荐使用这种方式的复制。
- 主主复制
- 级连复制
- 多源复制
- 延迟复制,备份中会用到,尤其是当数据量特别大的情况。
- 半同步复制,对数据一致性要求比较高的业务场景,可以考虑用。
在集群架构类别中,又可以分为 6 小类,分别是:
- MySQL Group Replication;
- Percona XtraDB Cluster;
- MySQL Galera Cluster;
- MySQL NDB Cluster,有时候也称为 MySQL Cluster;
- MySQL + 共享存储方案;
- MySQL + DRBD 方案。
在分布式架构类别中,又可以分为 2 小类,分别是:
- 基于分布式事务的数据库,如 Google Cloud Spanner 和 TiDB。
- 基于分布式存储的数据库,如极数云舟的 ArkDB、Aurora、PolarDB
主从多用于网站架构,因为主从的同步机制是异步的,数据的同步有一定延迟,也就是说有可能会造成数据的丢失,但是性能比较好,因此网站大多数用的是主从架构的数据库,读写分离必须基于主从架构来搭建
二、开始搭建主从同步(本实验基于RedhatLinux环境下)
一、主服务器(master)配置
1.追加信息到/etc/my.cnf
[root@master ~]# vim /etc/my.cnf.d
log-bin=mysql-bin
server-id=1
2.重启mysql服务
[root@master ~]# systemctl restart mysqld
3.进入mysql创建用户并给予相应权限
[root@master ~]# mysql -uroot -p
mysql> create user 'rep1'@'%' identified by 'Test@1234';
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.* to 'rep1'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
4.查询mysql主服务器信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 156 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
二、从服务器配置
1.进入配置文件修改配置
[root@slave ~]# vim /etc/my.cnf.d/mysql-server.cnf
log-bin=mysql-bin
server-id=2
2.重启mysql服务
[root@slave ~]# systemctl restart mysqld
3.进入mysql创建与主服务器相同的用户,并给予权限
[root@slave ~]# mysql -uroot -p
mysql> create user 'rep1'@'%' identified by 'Test@1234';
Query OK, 0 rows affected (0.01 sec)
mysql> grant replication slave on *.* to 'rep1'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
4.配置主服务器的信息,master_log_pos为上面查询到的主服务器的position,master_log_file为上方查到的日志名(以防主从不同步)
mysql> change master to master_host='192.168.108.142',
master_port=3306,
master_user='rep1',
master_password='Test@1234',
master_log_pos=156,
master_log_file='mysql-bin.000004';
5.在从服务器上启动同步
mysql> start slave;
6.查看从服务器状态
mysql> show slave status\G;
都为yes,且没有错误 ,表示主从配置成功。
7.在从服务器上找到通用日志
mysql> show variables like '%general%';
+------------------+--------------------------+
| Variable_name | Value |
+------------------+--------------------------+
| general_log | ON |
| general_log_file | /var/lib/mysql/slave.log |
+------------------+--------------------------+
2 rows in set (0.00 sec)
如果通用日志没有打开,使用以下命令打开
mysql> set @@global.general_Log=on;
Query OK, 0 rows affected (0.01 sec)
8.跟踪日志
[root@slave mysql]# tail -f /var/lib/mysql/slave.log
9.在主服务器上创建数据库
mysql> create database masterdbtest;
Query OK, 1 row affected (0.01 sec)
#在跟踪的日志中会出现:
2021-08-12T16:07:09.866623Z 12 Query create database masterdbtest
10.在从服务器数据库中查询数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| masterdbtest |