搭建一主二从的mysql拓扑。其中先搭建新的master和一台slave;然后在master新增数据,再模拟从已有数据的master中搭建新的一台slave。
创建Master
- 拉取镜像
$ docker pull mysql
- 创建
myql
数据目录和配置文件$ cd /your/path $ mkdir -p mysql-master/data #用于挂载mysql数据目录 $ touch mysql-master/my.cnf # 用户挂载mysql配置文件 $ mkdir -p mysql-slave/data $ touch mysql-slave/my.cnf $ mkdir -p mysql-slave1/data $ touch mysql-slave1/my.cnf
- 修改配置文件
my.cnf
$ vi /your/path/mysql-master/my.cnf [mysqld] server-id=1 #主从集群中唯一 log-bin=mysql-bin user=mysql relay-log=slave-relay-bin log-error=/var/lib/mysql/error.log
- 启动容器
$ docker run --name mysql-master -p 3307:3306 -p 33070:33060 \ -v /Users/yangweixin/Workspace/data/docker/mysql-master/data:/var/lib/mysql \ -v /Users/yangweixin/Workspace/data/docker/mysql-master/my.cnf:/etc/mysql/my.cnf \ -e MYSQL_ROOT_PASSWORD=1234567890 \ -d mysql
- 检查容器
$ docker ps -a
- 创建从机账号
进入容器
进入数据库$ docker exec -it mysql-master bash +----------------+---------+------------------------+----------------+--------------+---------------------------+-------------+ | CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES | +-----------------------------------------------------------------------------------------------------------------------------+ | 04e4c05ff3f9 | mysql | "docker-entrypoint.s…" | 1 minutes ago | Up 1 minutes | 0.0.0.0:3307- >3306/tcp, |mysql-master++ | | | | | | 0.0.0.0:33070+>33060/tcp | | +----------------+---------+------------------------+----------------+--------------+---------------------------+-------------+
创建从用户并赋予权限root@04e4c05ff3f9:/# mysql -u root -p
至此,mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '1234567890'; mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; mysql> flush privileges;
master
创建完毕。 - 查看
master
属性,以备后用mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 73 | | | +------------------+----------+--------------+------------------+
- 查看容器ip,在物理机上执行
$ docker inspect mysql-master --format='{{.NetworkSettings.IPAddress}}' 172.17.0.2
从新Master创建Slave
- 修改配置文件
$ vi /your/path/mysql-slave/my.cnf server-id=10 # 集群所有mysql服务中唯一 log-bin=mysql-bin user=mysql relay-log=slave-relay-bin log-error=/var/lib/mysql/error.log
- 启动容器
$ docker run --name mysql-slave -p 3308:3306 -p 33080:33060 \ -v /Users/yangweixin/Workspace/data/docker/mysql-slave/data:/var/lib/mysql \ -v /Users/yangweixin/Workspace/data/docker/mysql-slave/my.cnf:/etc/mysql/my.cnf \ -e MYSQL_ROOT_PASSWORD=1234567890 \ -d mysql
- 检查容器
同master
- 配置
slave
,连接master
进入容器
进入mysql$ docker exec -it mysql-slave bash
配置master连接root@8c6cba7418c9:/# mysql -u root -p mysql>
mysql> CHANGE MASTER TO -> MASTER_HOST='172.17.0.2', -> MASTER_USER='slave', -> MASTER_PASSWORD='1234567890', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=73;
- 启动
slave
mysql> start slave;
- 观察
slave
是否启动成功
当前两者为Yes时,slave启动成功;否则后两个字段会有具体错误信息。mysql> show slave status; +--------------------+---------------------+------------------+-------------------+ | Slave_IO_Runing | Slave_Sql_Runing | Last_IO_Error | Last_Sql_Error | +---------------------------------------------------------------------------------+ | Yes | Yes | 0 | | +--------------------+---------------------+------------------+-------------------+
slave
启动成功后,在master新建库、表、行,然后在slave
上确认是否同步创建。
从已有数据的Master上创建Slave1
-
备份
master
已有数据
进入master
容器$ docker exec -it mysql-master bash
备份数据
root@04e4c05ff3f9:/# mysqldump --all-databases --master-data=2 -u root -p > /tmp/dbdump.db
–master-data:默认等于1,将dump起始(change master to)binlog点和pos值写到结果中,等于2是将change master to写到结果中并注释。
-
将
master
备份文件拷贝到物理机$docker cp mysql-master:/tmp/dbdump.db /tmp/
-
查看备份的坐标
$ head -30 /tmp/dbdump.db ... CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=39586; ...
记住
MASTER_LOG_FILE
和MASTER_LOG_POS
这两个值。 -
修改
slave1
配置$ vi /your/path/mysql-slave1/my.cnf server-id=11 # 集群所有mysql服务中唯一 log-bin=mysql-bin user=mysql relay-log=slave-relay-bin log-error=/var/lib/mysql/error.log
-
启动容器
$ docker run --name mysql-slave1 -p 3309:3306 -p 33090:33060 \ -v /Users/yangweixin/Workspace/data/docker/mysql-slave1/data:/var/lib/mysql \ -v /Users/yangweixin/Workspace/data/docker/mysql-slave1/my.cnf:/etc/mysql/my.cnf \ -e MYSQL_ROOT_PASSWORD=1234567890 \ -d mysql
-
检查容器是否启动
-
拷贝
master
备份到slave1
$ docker cp /tmp/dbdump.db mysql-slave1:/tmp/
-
进入
slave1
,导入备份数据$ docker exec -it mysql-slave1 bash root@66a8fd04cd47:/# mysql -u root -p < /tmp/dbdump.db
-
确认备份数据已导入
登录slave1
数据库,确认再上一步中插入的数据是否存在。 -
配置连接
master
进入mysqlroot@66a8fd04cd47:/# mysql -u root -p mysql>
配置连接
mysql> CHANGE MASTER TO -> MASTER_HOST='172.17.0.2', -> MASTER_USER='slave', -> MASTER_PASSWORD='1234567890', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=39586;
MASTER_LOG_FILE
和MASTER_LOG_POS
这两个值就是在备份中读取的值。 -
启动slave模式
mysql> start slave;
-
观察
slave
是否启动成功mysql> show slave status;
至此,slave1也配置完成
最终验证
在master
中插入数据,验证slave
和slave1
是否同步插入了数据。