Loading

主从

十六、主从

1 介绍

和Redis的主从一样,mysql主从复制能使得从mysql服务器能精确得复制主mysql服务器,即master和slave的主从数据同步,并且MySQL的复制和Redis一样默认是异步的。整个过程如图所示:

image

  1. master会将变动记录到二进制日志里面
  2. master启动I/O线程将二进制日志发送到slave
  3. slave的I/O线程把master发送的二进制写入到relay日志中
  4. slave的SQL线程按照relay日志读取出数据进行同步

2 搭建过程

这里基于本地docker环境进行搭建,采用mysql5.7镜像,其中:

  • 主库:10086端口
  • 从库:10087端口

获取镜像

docker pull mysql:5.7

创建目录,用于主库目录映射。

mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/

创建配置文件

touch /home/mysql/my.cnf

从库也如此创建

mkdir /home/mysql2
mkdir /home/mysql2/conf.d
mkdir /home/mysql2/data/
touch /home/mysql2/my.cnf

修改主库的配置文件my.cnf,添加如下内容:

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
server-id=1  # 服务器id
log-bin=mysql-bin # 开启binlog日志,其中mysql-bin代表的是basename就是生成二进制日志文件的前缀部分,默认的位置在datadir目录下,也可以设置为其他的路径
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

修改从库的配置文件my.cnf,添加如下内容:

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
server-id=2  # 服务器id,不要与其它库重复
log-bin=mysql-slave-bin # 开启binlog日志
relay_log=relaylog-slave-bin  # 开启中继日志,从服务器在这里读取内容并应用到从服务器
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

配置完成后,启动主从mysql容器:

#启动主库容器(进行目录映射,端口映射成10086,初始密码为123456)
docker run  -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 10086:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

#启动从库容器(进行目录映射,端口映射成10087,初始密码为123456)
docker run  -di -v /home/mysql2/data/:/var/lib/mysql -v /home/mysql2/conf.d:/etc/mysql/conf.d -v /home/mysql2/my.cnf:/etc/mysql/my.cnf -p 10087:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

测试连接成功:
image

主库建立一个复制帐户,专门用于主从复制。连接到主库之后:

CREATE USER 'copy'@'%' IDENTIFIED BY '123';  # 创建用户
GRANT REPLICATION SLAVE ON *.* TO 'copy'@'%'; # 授权
FLUSH PRIVILEGES;  # 刷新权限

查看主库状态:

SHOW MASTER STATUS;

image

  • File:主库的binlog日志名
  • Position:当操作数据库导致bin-log日志增加时,position位点也会增加

连接从库,进行配置:

CHANGE MASTER TO master_host = '192.168.142.88',  # 主库地址
master_port=10086,  # 端口号
master_user = 'copy',  # 进行复制的用户
master_password = '123',  # 密码
master_log_file = 'mysql-bin.000004',  # 主库binlog文件名
master_log_pos = 0;  # 从position之后开始复制,设置为0即全部复制

# 启动从库,开始复制
START SLAVE;

查看从库状态:

SHOW SLAVE STATUS;

主要关注这两个参数,
image

可以看到Slave_IO_Running: Yes,即IO线程正常运行,Slave_SQL_Running: Yes,SQL线程正常运行。说明主从已经搭建成功。

3 测试主从同步

创建一些数据测试:

create DATABASE db1;
USE db1;

CREATE TABLE student ( 
	id INT primary KEY auto_increment, 
	name VARCHAR(255)
);

INSERT INTO student(name) VALUES("张三"),("李四"),("王五");

SELECT * FROM student;

切换到从库查看:

SHOW DATABASES;
USE db1;
SELECT * FROM student;

image

数据已经同步了。

posted @ 2022-01-30 18:05  yyyz  阅读(156)  评论(0编辑  收藏  举报