먼저 docker 이미지를 가져오고 여기서는 5.7 버전의 mysql을 사용합니다.
docker pull mysql:5.7
docker pull mysql:5.7
然后使用此镜像启动容器,这里需要分别启动主从两个容器
docker run -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
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
命令查看正在运行的容器:
此时可以使用Navicat等工具测试连接mysql
通过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
会出现如下问题:
执行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 STATUS
和SHOW BINARY LOGS
来确定复制状态。
授予复制账号REPLICATION 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日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致。
在Master进入mysql,执行show master status;
그런 다음 이 이미지를 사용하여 컨테이너를 시작합니다. 여기서는 각각 마스터 및 슬레이브 컨테이너를 시작해야 합니다.
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
명령을 사용하세요. 🎜🎜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🎜을 설치하면 다음과 같은 문제가 발생합니다:🎜🎜🎜🎜 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'@'%';
🎜🎜🎜🎜슬레이브(slave)🎜🎜 구성은 마스터(master) 구성과 동일합니다. 슬레이브 구성 파일 my.cnf에 다음 구성을 추가합니다. 🎜rrreee🎜또한 필수입니다. 구성이 완료되면 mysql 서비스와 docker 컨테이너를 다시 시작합니다. 작업은 Master 구성과 일치합니다. 🎜🎜복제 계정에REPLICATION CLIENT
권한을 부여합니다. 복제본 사용자는SHOW MASTER STATUS, SHOW SLAVE STATUS
및SHOW BINARY LOGS
를 사용하여 복제 상태를 확인할 수 있습니다. 🎜복제가 실제로 작동할 수 있도록 복제 계정에REPLICATION SLAVE
권한을 부여하세요. 🎜
🎜🎜🎜마스터(master)와 슬레이브(slave) 연결🎜🎜마스터에 mysql을 입력하고🎜릴레이 로그는 여러 측면에서 바이너리 로그와 유사합니다. 차이점은 슬레이브 서버 I/O 스레드가 마스터 서버의 바이너리 로그를 읽고 이를 슬레이브 서버의 로컬 파일에 기록한 다음 SQL 스레드가 릴레이 로그 로그의 내용을 읽고 이를 적용한다는 것입니다. 슬레이브 서버로 인해 슬레이브 서버와 마스터 서버 데이터가 일관성을 유지하게 됩니다. 🎜
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
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;
用于查看主从同步状态。
正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave
开启主从复制过程,然后再次查询主从同步状态show slave status \G;
。
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
主从复制排错:
使用start slave
开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。
测试主从复制方式就十分多了,最简单的是在Master创建一个数据库,然后检查Slave是否存在此数据库。
Master:
Slave:
最后让我们来看一下,一个 update 语句在节点 A 执行,然后同步到节点 B的完整流程图。
可以看到:主库接收到客户端的更新请求后,执行内部事务的更新逻辑,同时写入binlog。
备库B跟主库A之间维持了一个长连接。主库A内部有一个线程,专门用于服务备库B的这个长连接。
一个事务日志同步的完整过程是这样的:
change master
命令,设置主库A的IP、端口、用户名、密码、以及要从哪个位置开始请求binlog,这个位置包含文件名和日志偏移量。start slave
命令,这时侯备库会启动两个线程,io_thread 和 sql_thread。其中, io_thread负责与主库建立连接。위 내용은 Docker 기반의 MySQL 마스터-슬레이브 복제 구성 및 원리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!