基于DOCKER的MYSQL主从分离学习

1.MYSQL配置环境准备

1.1 启动基础镜像

选用mysql5.7镜像

docker pull mysql:5.7
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

1.2 复制配置文件及数据库

确认配置文件位置,确定本地文件位置,将master和slave的配置文件及数据库放置在不同路径下
登录容器,确认相关文件位置

docker exec -it mysql /bin/bash
ps:退出容器的命令:ctrl+p+q

在宿主机上,拷贝对应文件

sudo docker cp mysql:/etc/mysql /etc/mysql/master/mysql5.7
sudo docker cp mysql:/etc/mysql /etc/mysql/slave/mysql5.7
sudo docker cp mysql:/var/lib/mysql /var/lib/mysql/master/mysql5.7
sudo docker cp mysql:/var/lib/mysql /var/lib/mysql/slave/mysql5.7
重点:删除slave的数据文件中的auto.conf,否则,两个服务器的uuid会相同,造成后面start slave启动失败

1.3 测试

docker run --name mysql_master -e MYSQL_ROOT_PASSWORD=123456 -v /etc/mysql/master/mysql5.7:/etc/mysql -v /var/lib/mysql/master/mysql5.7:/var/lib/mysql -d mysql:5.7
docker run --name mysql_slave -e MYSQL_ROOT_PASSWORD=123456 -v /etc/mysql/slave/mysql5.7:/etc/mysql -v /var/lib/mysql/slave/mysql5.7:/var/lib/mysql -d mysql:5.7
docker ps -a

都是up状态,表示运行正常

2.配置mysql主从

2.1确定各个容器的ip地址

docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)

还可以分别连接到各个容器,查看/etc/hosts文件
本例中

/mysql_slave 172.17.0.4 map[]
/mysql_master 172.17.0.3 map[]
/mysql 172.17.0.2 map[]

2.2 配置主从

2.2.1 下载并启动一个phpmyadmin镜像

docker pull phpmyadmin:phpmyadmin
docker run --name phpmyadmin -p 10080:80 -e PMA_ARBITRARY=1 -d phpmyadmin/phpmyadmin:latest

访问http://服务器ip:10080,测试phpmyadmin是否正常
也可使用其他mysql管理端

2.2.2 配置主服务器

2.2.2.1修改配置文件
sudo vi /etc/mysql/master/mysql5.7/mysql.conf.d/mysqld.conf

添加如下内容:

## 让数据库开放监听
bind-address = 0.0.0.0

## master mysql-server
log-bin = mysql-bin
server-id = 1

## 忽略库(此处根据需要填写)
replicate-ignore-db = mysql
replicate-ignore-db = sys
replicate-ignore-db = information_schema
replicate-ignore-db = preformance_schema

## 制定复制的库,修改下面一行的内容
replicate-do-db
2.2.2.2 在主数据库服务器添加slave账户,

登入phpmyadmin
http://主机:10080/
添加账户:
例如添加’slave’账户,赋权’REPLICATION SLAVE’,访问地址%,密码设定’123456’。

2.2.2.3 记录关键数据

查看服务器状态,记录下:
File,Position两个数值

2.2.3 配置从服务器

2.2.3.1 修改配置文件
sudo vi /etc/mysql/master/mysql5.7/mysql.conf.d/mysqld.conf

添加如下内容:

## 让数据库开放监听
bind-address = 0.0.0.0

## slave mysql-server
log-bin = mysql-bin
server-id = 2 ## 此处切记不要和主服务器重复

## 忽略库(此处根据需要填写)
replicate-ignore-db = mysql
replicate-ignore-db = sys
replicate-ignore-db = information_schema
replicate-ignore-db = preformance_schema

2.2.3.2 在从数据库设置master

登入从数据库的phpmyadmin
执行:

change master to master_host='172.17.0.3',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3306;

其中:

master_host就是主服务器的docker ip地址
master_log_file就是在master服务器查询到的日志名
master_log_pos就是在master服务器查询到的position值

执行:

start slave;

查看服务器状态:

show slave status;

Slave_IO_Running Yes
Slave_SQL_Running Yes
以上两项均为’yes’,则slave正常启动
有错误时,需开启slave服务器的mysqld.conf中的error.log,进行查看,定位错误。

以上为在单一宿主机,使用docker完成主从配置的过程。

遗留问题,当没有指定服务器IP时,重启容器,容器的IP会变化,导致主从不可用

解决方案,固化容器IP地址

固化方法

在容器中添加一个网络,下例,添加一个名为mysql的网络,网段是172.18.0.0/16

docker network create --subnet=172.18.0.0/16 mysql

启动容器时,指定IP即可

docker run --name mysql_slave --net mysql --ip 172.18.0.3 -e MYSQL_ROOT_PASSWORD=123456 -v /etc/mysql/slave/mysql5.7:/etc/mysql -v /var/lib/mysql/slave/mysql5.7:/var/lib/mysql -d mysql:5.7

思考:在不同的物理机上,实现主从配置,只需要解决网络连同就可以了。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注