docker 搭建 MySQL 主从同步/读写分离(传统的 My
2021-07-15 本文已影响0人
fanderboy
一.拉取 MySQL 容器镜像
docker pull mysql:5.7.26
二.创建 MySQL 容器
1.创建主数据库容器
#!/bin/bash
echo "======configuration variables======"
container_name=mysql-master
image_name=mysql
version=5.7.26
host_port=3306
container_port=3306
passwrod=123456
echo "======rm container======"
docker stop ${container_name}
docker rm ${container_name}
echo "======run container======"
docker run -itd \
--name=${container_name} \
-v /var/lib/${container_name}/conf:/etc/mysql \
-v /var/lib/${container_name}/data:/var/lib/mysql \
-v /var/lib/${container_name}/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=${passwrod} \
-e TZ="Asia/Shanghai" \
--restart=always \
-p ${host_port}:${container_port} \
${image_name}:${version}
2.创建从数据库容器
#!/bin/bash
echo "======configuration variables======"
container_name=mysql-slave-1
image_name=mysql
version=5.7.26
host_port=3307
container_port=3306
passwrod=123456
echo "======rm container======"
docker stop ${container_name}
docker rm ${container_name}
echo "======run container======"
docker run -itd \
--name=${container_name} \
-v /var/lib/${container_name}/conf:/etc/mysql \
-v /var/lib/${container_name}/data:/var/lib/mysql \
-v /var/lib/${container_name}/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=${passwrod} \
-e TZ="Asia/Shanghai" \
--restart=always \
-p ${host_port}:${container_port} \
${image_name}:${version}
三.配置数据库
1.配置主数据库
拷贝my-default.cnf到/var/lib/mysql-master/conf下并命名为my.cnf,在 [mysqld] 段添加以下配置:
#[必须]启用二进制日志
log-bin=mysql-bin
#[必须]服务器标识ID,每台服务器唯一
server-id=1
2.配置从数据库
拷贝my-default.cnf到/var/lib/mysql-slave-1/conf下并命名为my.cnf,在 [mysqld] 段添加以下配置:
#[必须]启用二进制日志
log-bin=mysql-bin
#[必须]服务器标识ID,每台服务器唯一
server-id=2
3.重启容器后验证my.cnf是否生效
查看mysqld读取my.cnf的顺序:
mysqld --verbose --help --pid-file=/var/run/mysqld/mysqld.pid | grep -A 1 "Default options"
结果:
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
注意:配置文件可以是多个,相同的设置,会以最后一个配置文件的设置为准。
如果是下面的结果:
mysqld: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
意思是配置文件权限全局可写,任何一个用户都可以写。mysql担心这种文件被其他用户恶意修改,所以忽略掉这个配置文件,需要修改文件权限,如:chmod 644 /etc/mysql/my.cnf
查看server-id变量是否生效:
show variables like '%server%';
+---------------------------------+--------------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------------+
| character_set_server | latin1 |
| collation_server | latin1_swedish_ci |
| innodb_ft_server_stopword_table | |
| server_id | 1 |
| server_id_bits | 32 |
| server_uuid | 1ccab822-e518-11eb-8293-0242ac110002 |
+---------------------------------+--------------------------------------+
6 rows in set (0.01 sec)
server_id值和配置的server_id值一致说明配置生效。
4.配置 MySQL 主从复制
首先连接 master 服务器,查看数据库状态:
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
记录 File 的值和 Position 的值,等会配置 slave 服务器的时候要用。
接下来连接 slave 服务器,配置主从复制:
change master to
master_host='ip',
master_port=3306,
master_user='root',
master_password='123456',
master_log_file='mysql-bin.000003',
master_log_pos=154;
参数含义:
change master to
master_host='ip', //master数据库主机ip
master_port=3306, //master数据库主机端口号
master_user='root', //master数据库用户名
master_password='123456', //master数据库密码
master_log_file='mysql-bin.000003', //master数据库File 的值
master_log_pos=154; //master数据库Position 的值
启动从服务器复制功能
start slave;
如果不小心配置错, 输入 stop slave; 然后重新录入一遍就可以了。
查看主从连接状态:
show slave status\G;
结果:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个必须是 Yes,为 No 或者 Connecting 说明没有连接上。
重启容器,使配置生效
分别重启 mysql-master 和 mysql-slave-1 容器
docker restart mysql-master
docker restart mysql-slave-1
四.测试
在 master 数据库中创建一个数据库test:
create database test;
然后在 slave 数据库中查看:
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
发现已经同步过来了。