>  기사  >  데이터 베이스  >  Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

步履不停
步履不停원래의
2019-07-01 16:17:482605검색

Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

왜 Docker를 기반으로 구축하나요?

  • 제한된 리소스
  • 가상 머신을 구축하려면 머신 구성이 필요하며 mysql을 설치하는 단계가 번거롭습니다.
  • 한 머신에서 여러 Docker 컨테이너를 실행할 수 있습니다
  • Docker 컨테이너는 서로 독립적이고 독립적인 IP를 가지며 작업을 수행합니다. 서로 충돌하지 않습니다
  • Docker를 사용하는 단계는 간단합니다. 몇 초 만에 컨테이너를 시작합니다.

Docker를 사용하여 마스터-슬레이브 서버를 구축합니다

먼저 docker 이미지를 가져오고 여기서는 5.7 버전의 mysql을 사용합니다.
docker pull mysql:5.7docker pull mysql:5.7
然后使用此镜像启动容器,这里需要分别启动主从两个容器

Master(主):

docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

Slave(从)

docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
Master对外映射的端口是3339,Slave对外映射的端口是3340。因为docker容器是相互独立的,每个容器有其独立的ip,所以不同容器使用相同的端口并不会冲突。这里我们应该尽量使用mysql默认的3306端口,否则可能会出现无法通过ip连接docker容器内mysql的问题。
使用docker ps命令查看正在运行的容器:

Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

此时可以使用Navicat等工具测试连接mysql

Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

配置Master(主)

通过docker exec -it 5ddad8c2f368 /bin/bash命令进入到Master容器内部,也可以通过docker exec -it mysql-master /bin/bash命令进入。5ddad8c2f368是容器的id,而mysql-master是容器的名称。
cd /etc/mysql/mysql.conf.d切换到/etc/mysql/mysql.conf.d目录下,然后vim mysqld.cnf对my.cnf进行编辑。此时会报出bash: vim: command not found,需要我们在docker容器内部自行安装vim。使用apt-get install vim命令安装vim
会出现如下问题:

Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

执行apt-get update,然后再次执行apt-get install vim即可成功安装vim。然后我们就可以使用vim编辑my.cnf,在my.cnf中添加如下配置:

[mysqld]
## 同一局域网内注意要唯一
server-id=100  
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin

配置完成之后,需要重启mysql服务使配置生效。使用service mysql restart完成重启。重启mysql服务时会使得docker容器停止,我们还需要docker start mysql-master启动容器。
下一步在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
首先连接mysql数据库
root@5ddad8c2f368:/# mysql -uroot -p123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

授予复制账号REPLICATION CLIENT权限,复制用户可以使用SHOW MASTER STATUS, SHOW SLAVE STATUSSHOW BINARY LOGS来确定复制状态。
授予复制账号REPLICATION SLAVE权限,复制才能真正地工作。

Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

配置Slave(从)

和配置Master(主)一样,在Slave配置文件my.cnf中添加如下配置:

[mysqld]  
## 设置server_id,注意要唯一  server-id=101 
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用  
log-bin=mysql-slave-bin 
## relay_log配置中继日志  
relay_log=edu-mysql-relay-bin

配置完成后也需要重启mysql服务和docker容器,操作和配置Master(主)一致。

relay log很多方面都跟binary log差不多。区别是:从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致。

Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

链接Master(主)和Slave(从)

在Master进入mysql,执行show master status; 그런 다음 이 이미지를 사용하여 컨테이너를 시작합니다. 여기서는 각각 마스터 및 슬레이브 컨테이너를 시작해야 합니다.
Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리Master(마스터):

🎜docker run -p 3339 :3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql: 5.7🎜🎜Slave(슬레이브)🎜🎜docker run -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD= 123456 -d mysql:5.7🎜Master의 외부 매핑 포트는 3339이고, Slave의 외부 매핑 포트는 3340입니다. 도커 컨테이너는 서로 독립적이기 때문에 각 컨테이너는 고유한 독립적인 IP를 가지므로 동일한 포트를 사용하는 서로 다른 컨테이너 간에 충돌이 발생하지 않습니다. 여기서는 mysql의 기본 3306 포트를 사용하도록 노력해야 하며, 그렇지 않으면 IP를 통해 docker 컨테이너의 mysql에 연결하지 못하는 문제가 발생할 수 있습니다. 🎜실행 중인 컨테이너를 보려면 docker ps 명령을 사용하세요. 🎜🎜🎜🎜이때 Navicat과 같은 도구를 사용하여 mysql에 대한 연결을 테스트할 수 있습니다🎜🎜Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리🎜🎜구성 Master(main)🎜🎜Pass docker exec -it 5ddad8c2f368 /bin/bash 명령을 사용하여 마스터 컨테이너에 들어가거나 docker exec -it mysql-master /bin/을 사용할 수 있습니다. bash 명령을 입력합니다. 5ddad8c2f368은 컨테이너의 ID이고 mysql-master는 컨테이너의 이름입니다. 🎜cd /etc/mysql/mysql.conf.d /etc/mysql/mysql.conf.d 디렉터리로 전환한 다음 vim mysqld.cnf를 my.cnf로 전환합니다. 편집하세요. 이때 bash: vim: command notfound가 보고되며 docker 컨테이너 내부에 vim을 직접 설치해야 합니다. apt-get install vim 명령을 사용하여 vim🎜을 설치하면 다음과 같은 문제가 발생합니다:🎜🎜Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리🎜🎜 apt-get update 실행 후 apt- 다시 vim 설치를 실행하면 vim이 성공적으로 설치됩니다. 그런 다음 vim을 사용하여 my.cnf를 편집하고 my.cnf에 다음 구성을 추가할 수 있습니다. 🎜
CHANGE MASTER TO master_host = '172.17.0.2',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mysql-bin.000001',
master_log_pos = 617,
master_connect_retry = 30;
🎜구성이 완료된 후 구성을 적용하려면 mysql 서비스를 다시 시작해야 합니다. 다시 시작을 완료하려면 service mysql restart를 사용하세요. mysql 서비스를 다시 시작하면 docker 컨테이너가 중지됩니다. 컨테이너를 시작하려면 docker start mysql-master도 필요합니다. 🎜다음 단계는 마스터 데이터베이스에 데이터 동기화 사용자를 생성하고 사용자에게 슬레이브 REPLICATION SLAVE 권한과 REPLICATION CLIENT 권한을 부여하여 마스터 데이터베이스와 슬레이브 데이터베이스 간에 데이터를 동기화하는 것입니다. . 🎜먼저 mysql 데이터베이스에 연결하세요🎜root@5ddad8c2f368:/# mysql -uroot -p123456🎜CREATE USER 'slave'@'%' IDENTIFIED BY '123456';🎜 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';🎜
🎜복제 계정에 REPLICATION CLIENT 권한을 부여합니다. 복제본 사용자는 SHOW MASTER STATUS, SHOW SLAVE STATUSSHOW BINARY LOGS를 사용하여 복제 상태를 확인할 수 있습니다. 🎜복제가 실제로 작동할 수 있도록 복제 계정에 REPLICATION SLAVE 권한을 부여하세요. 🎜
🎜99d18c94 -bb78-4a0e-addc-7f915d723b9d.png🎜🎜슬레이브(slave)🎜🎜 구성은 마스터(master) 구성과 동일합니다. 슬레이브 구성 파일 my.cnf에 다음 구성을 추가합니다. 🎜rrreee🎜또한 필수입니다. 구성이 완료되면 mysql 서비스와 docker 컨테이너를 다시 시작합니다. 작업은 Master 구성과 일치합니다. 🎜
🎜릴레이 로그는 여러 측면에서 바이너리 로그와 유사합니다. 차이점은 슬레이브 서버 I/O 스레드가 마스터 서버의 바이너리 로그를 읽고 이를 슬레이브 서버의 로컬 파일에 기록한 다음 SQL 스레드가 릴레이 로그 로그의 내용을 읽고 이를 적용한다는 것입니다. 슬레이브 서버로 인해 슬레이브 서버와 마스터 서버 데이터가 일관성을 유지하게 됩니다. 🎜
🎜Snipaste_2019 -07-01_16-17-12.png🎜🎜마스터(master)와 슬레이브(slave) 연결🎜🎜마스터에 mysql을 입력하고 show master status;를 실행🎜🎜🎜

File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值变化。
在Slave 中进入 mysql,执行

CHANGE MASTER TO master_host = '172.17.0.2',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mysql-bin.000001',
master_log_pos = 617,
master_connect_retry = 30;

命令说明:
master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id查询容器的ip

Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在Slave 中的mysql终端执行show slave status \G;用于查看主从同步状态。
Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave开启主从复制过程,然后再次查询主从同步状态show slave status \G;
Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
主从复制排错:
Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

  • 网络不通
    检查ip,端口
  • 密码不对
    检查是否创建用于同步的用户和用户密码是否正确
  • pos不对
    检查Master的 Position

测试主从复制

测试主从复制方式就十分多了,最简单的是在Master创建一个数据库,然后检查Slave是否存在此数据库。
Master:
Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

Slave:
Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

完整的主备流程图

最后让我们来看一下,一个 update 语句在节点 A 执行,然后同步到节点 B的完整流程图。
Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리

可以看到:主库接收到客户端的更新请求后,执行内部事务的更新逻辑,同时写入binlog。
备库B跟主库A之间维持了一个长连接。主库A内部有一个线程,专门用于服务备库B的这个长连接。
一个事务日志同步的完整过程是这样的:

  • 1、在备库B上通过change master命令,设置主库A的IP、端口、用户名、密码、以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。
  • 2、在备库B上执行start slave命令,这时侯备库会启动两个线程,io_thread 和 sql_thread。其中, io_thread负责与主库建立连接。
  • 3、主库A校验完用户名、密码后,开始按照备库B传过来的位置,从本地读取binlog,发给B。
  • 4、备库B拿到binlog后,写到本地文件,称为中转日志(relay log)。
  • 5、sql_thread读取中转日志,解析日志里的命令,并执行。

위 내용은 Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.