MySQL数据库docker

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               |
+--------------------+

发现已经同步过来了。

上一篇下一篇

猜你喜欢

热点阅读