本文在使用docker的方式,在同一台主机,通过不容容器运行MySQL的方式,搭建了一主一从的MySQL主从数据库组。后续将使用consul搭建高可用的MySQL数据库,使用MyCat实现分库分表,读写分离,从而搭建一个稳定的,易于扩展的,高可用的数据库组。
-
获取msyql镜像
通过docker pull mysql:5.7获取mysql的官方镜像,mysql版本是5.7。
-
部署master
1. 创建文件master.cnf。server-id取值为1-()-1,在同一个主从的MySQL组中,server-id必须是唯一的。
[mysqld]
log-bin=mysql-bin
server-id=1
2. 创建master的docker容器启动脚本,容器名称为master,root密码为123456,设置timezone为Asia/Shanghai,映射配置文件master.cnf,并且将mysql的容器路径/var/lib/mysql映射的主机的/path/to/data路径实现MySQL数据的持久化。
#!/bin/bash
docker run -p 3306:3306 \
--name master \
-v /path/to/master.cnf:/etc/mysql/conf.d/master.cnf:ro \
-v /path/to/data:/var/lib/mysql \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro \
-v /path/to/timezone:/etc/timezone:ro \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
3. 运行脚本启动master,使用docker exec -it master /bin/bash进入到docker容易。执行命令mysql -u root -p,通过启动时设置的root密码登陆MySQL。可以通过以下语句修改root密码
update mysql.user set authentication_string=password('123qwe') where user='root' and Host = 'localhost';
4. 创建用户并授与replication slave权限。
CREATE USER 'dev'@'%.example.com' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'dev'@'%.example.com';
5. 使用show master status查询master的binlog的文件名和position。
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73 | test | manual,mysql |
+------------------+----------+--------------+------------------+
-
部署slave
1. 创建文件slave.cnf,设置与master不同的server-id。binlog_ingore_*是忽略某个数据库。
[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server_id=2
binlog_ignore_db=mysql
binlog_ignore_db=information_schema
binlog_ignore_db=performation_schema
binlog_ignore_db=sys
2. 创建slave的容器启动脚本,与master不同的是配置文件和持久化数据的位置不同。启动slave时通过--link连接到master,使slave能够通过master的主机名访问master。
#!/bin/bash
docker run -p 3306:3306 \
--name slave1 \
--link master \
-v /path/to/slave.cnf:/etc/mysql/conf.d/slave.cnf:ro \
-v /path/to/mysql/data1:/var/lib/mysql \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro \
-v /path/to/timezone:/etc/timezone:ro \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
3. 配置master的连接信息,是slave能够连接到master。通过docker exec -it slave1 /bin/bash法进入到slave的容器中,登录mysql执行语句
CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='dev',
MASTER_PORT=3306,
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=73;
4. 在slave中执行start slave启动slave线程。
至此,两个节点的组成的mysql主从数据库组就搭建完成。