手把手教你搭建MySQL主从架构
- 什么是MySQL的复制
- MySQL的主从复制可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave)上,进而可以保证数据有多份冗余。
- 默认情况下,属于异步复制,所以无需维持长连接。
- MySQL复制的原理
- slave端的IO线程发送请求给master端的binlog dump线程
- master端binlog dump线程获取二进制日志信息(文件名和位置信息)发送给slave端的IO线程
- salve端IO线程获取到的内容依次写到slave端relay log里,并把master端的bin-log文件名和位置记录到master.info里
- salve端的SQL线程,检测到relay log中内容更新,就会解析relay log里更新的内容,并执行这些操作,从而达到和master数据一致
三、MySQL复制搭建
1. 环境说明
当前环境中只有一台MySQL数据库服务器,上面已有相关业务数据。现需要在此基础上构建MySQL的主从复制架构。
-
- 系统环境说明
IP |
主机名 |
角色 |
系统版本 |
MySQL版本 |
10.1.1.10 |
master.MissHou.cc |
主(master) |
Centos 7.5 |
MySQL-5.6.35 |
10.1.1.20 |
slave.MissHou.cc |
从(slave) |
Centos 7.5 |
MySQL-5.6.35 |
-
- 数据库安装环境说明
角色 |
安装目录 |
数据目录 |
端口 |
Master |
/usr/local/mysql/ |
/usr/local/mysql/data |
3307 |
Slave |
/usr/local/mysql/ |
/usr/local/mysql/data |
3307 |
2. 从服务器安装MySQL数据库
[[email protected] ~]# id mysql
id: mysql: no such user
[[email protected] ~]# useradd -r -s /sbin/nologin mysql
[[email protected] ~]# mkdir /usr/local/mysql
[[email protected] ~]# cd /usr/src/
[[email protected] src]# ls
debug kernels mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
[[email protected] src]# tar xf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
[[email protected] src]# ls
debug kernels mysql-5.6.35-linux-glibc2.5-x86_64 mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
[[email protected] src]# cp -a mysql-5.6.35-linux-glibc2.5-x86_64/* /usr/local/mysql/
[[email protected] src]# chown -R mysql. /usr/local/mysql/
[[email protected] src]# cp support-files/mysql.server /etc/init.d/mysql
注意:
暂时不需要初始化数据库文件,只是安装好了和master相同版本的mysql数据库软件;后面向master来同步所有数据。
3. 修改主和从的配置文件
注意:
- server-id必须不能一致;
- master需要开启二进制日志
- slave需要开启中继日志
[[email protected] ~]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3307
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/db01_3307.err
character_set_server=utf8mb4
log-bin=/usr/local/mysql/data/binlog
server-id = 10
[[email protected] ~]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/db02_3307.err
character_set_server=utf8mb4
server-id=20
relay-log=/usr/local/mysql/data/relaylog
4. 主从两边初始数据保持一致
-
- 主服务器停止MySQL服务
[[email protected] ~]# mysqladmin shutdown -p123
-
- 主服务器删除auto.cnf文件
[[email protected] ~]# cd /usr/local/mysql/data/
[[email protected] data]# rm -f auto.cnf
说明:auto.cnf文件里保存的是每个数据库实例的UUID信息,代表数据库的唯一标识
-
- Master上数据同步到slave
[[email protected] ~]# rsync -av /usr/local/mysql/data/ 10.1.1.20:/usr/local/mysql/data
-
- 启动Master和Slave数据库
[[email protected] ~]# service mysql start
[[email protected] ~]# service mysql start
5. 主服务器创建复制用户
mysql> grant replication slave on *.* to 'slave'@'10.1.1.%' identified by '123';
mysql> flush privileges;
先加锁,防止两边数据不一致
mysql> flush tables with read lock;
查看当前数据库的二进制日志写到什么位置(只有打开二进制日志,这句命令才有结果)
mysql> show master status;
6. 从服务器配置同步信息
mysql> change master to master_host='10.1.1.10',master_user='slave',master_password='123',master_port=3307,master_log_file='mybinlog.000002',master_log_pos=405;
7. 从服务器启动复制线程
mysql> start slave;
mysql> show slave status\G
.....
Slave_IO_Running: Yes 代表成功连接到master并且下载日志
Slave_SQL_Running: Yes 代表成功执行日志中的SQL语句
8. 主服务器解锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
四、主从测试验证
1. 主服务器上插入数据
mysql> select * from db02.t1;
+------+-------+
| id | name |
+------+-------+
| 1 | mona |
| 2 | harry |
| 3 | jack |
+------+-------+
3 rows in set (0.00 sec)
mysql> insert into t1 values(4,'tom');
Query OK, 1 row affected (0.00 sec)
mysql> select * from db02.t1;
+------+-------+
| id | name |
+------+-------+
| 1 | mona |
| 2 | harry |
| 3 | jack |
| 4 | tom |
+------+-------+
2. 从服务器查看数据
mysql> select * from db02.t1;
+------+-------+
| id | name |
+------+-------+
| 1 | mona |
| 2 | harry |
| 3 | jack |
| 4 | tom |
+------+-------+
五、MySQL主从复制总结
- 主从复制必须保证两台数据库实例的server-id不一致
- 主服务器必须开启二进制日志;从服务器必须开启中继日志
- 主从复制搭建必须保证初始数据一致
- 主服务器必须要给从服务器创建一个复制用户,并授予复制权限
- Master—>Slave架构,主写会同步到从;而从写不会同步到主