docker容器名 | 地址+端口 |
---|---|
mysql_master | 192.168.56.120:3307 |
mysql_slave1 | 192.168.56.120:3308 |
mysql_slave2 | 192.168.56.120:3309 |
mysql_router | 192.168.56.120:3310 |
依次创建目录,用于存放节点配置文件,避免在 docker 容器中修改
mkdir -p /mydata/mysql_cluster/master
mkdir -p /mydata/mysql_cluster/slave1
mkdir -p /mydata/mysql_cluster/slave2
创建 Master 节点的 my.cnf 配置文件,并写入如下内容
vim /mydata/mysql_cluster/master/my.cnf
## 修改内容 ##
# 开启 binlog
log-bin=mysql-bin
# 实例 ID
server-id=1
# 需要同步的数据库名
binlog-do-db=vsr_basic
#不需要同步的数据库名
# binlog-ignore-db=
创建 Slave1 和 Slave2 节点的 my.cnf 配置文件,并写入如下内容
vim /mydata/mysql_cluster/slave1/my.cnf
vim /mydata/mysql_cluster/slave2/my.cnf
## 依次修改内容(slave1 和slave2 内容一致,除了 server-id ) ##
[mysqld]
server-id=2
log-bin=mysql-bin
replicate-do-db=vsr
# replicate-ignore-db=
Docker 网络环境准备
在 Docker 中创建自定义网络,因启动 Docker 容器的时候,使用默认的网络是不支持指派固定IP的
docker network create --subnet=172.18.0.0/16 mynetwork
查看自定义网络是否创建成功 (若打印出 mynetwork 说明创建成功)
docker network ls
一、构建 Master 节点
使用 docker 创建 mysql_master 容器
docker run --name mysql_master -v /mydata/mysql_cluster/master/:/etc/mysql/conf.d/ -e MYSQL_ROOT_PASSWORD=自定义数据库密码 -p 3307:3306 --net mynetwork --ip 172.18.0.2 -d mysql:5.7
二、构建 Slave1 节点
使用 docker 创建 mysql_slave1 容器
docker run --name mysql_slave1 -v /mydata/mysql_cluster/slave1/:/etc/mysql/conf.d/ -e MYSQL_ROOT_PASSWORD=自定义数据库密码 -p 3308:3306 --net mynetwork --ip 172.18.0.3 -d mysql:5.7
三、构建 Slave2 节点
使用 docker 创建 mysql_slave2 容器
docker run --name mysql_slave2 -v /mydata/mysql_cluster/slave2/:/etc/mysql/conf.d/ -e MYSQL_ROOT_PASSWORD=自定义数据库密码 -p 3309:3306 --net mynetwork --ip 172.18.0.4 -d mysql:5.7
四、设置主从连接
依次使用数据库连接工具打开 slave1 和 slave2 对应节点的 mysql 命令行,执行如下命令
mysql> change master to master_host='192.168.56.120',master_port=3307,master_user='root',master_password='Master节点的数据库密码';
启动 slave 实现主从连接
mysql> start slave;
查看主从连接是否成功启动 (若成功,可见 I/O 线程 和 SQL 线程 状态信息为 " yes ")
mysql> show slave status;
五、测试主从复制状态
自行在 Master 节点中创建 之前在配置文件中配置的数据库,然后在从节点查看是否同步创建了相应数据库即可验证是否成功实现了主从连接;
六、Mysql Router
1. 介绍
MySQL路由器是高可用性(HA)解决方案的基础。它通过智能地将连接路由到MySQL服务器来简化应用程序开发,从而提高性能和可靠性。
MySQL路由器是InnoDB集群的一部分,是轻量级的中间件,提供应用程序和后端MySQL服务器之间的透明路由。它用于各种各样的用例,比如通过将数据库流量路由到适当的后端MySQL服务器来提供高可用性和可伸缩性。可插入的体系结构还允许开发人员扩展MySQL路由器以适应定制用例。
为了让客户机应用程序处理故障转移,它们需要了解InnoDB集群拓扑结构,并知道哪个MySQL实例是主实例。虽然应用程序可以实现这种逻辑,但MySQL Router可以为您提供并处理这种功能。
MySQL使用组复制来跨多个服务器复制数据库,同时在服务器发生故障时执行自动故障转移。当与MySQL InnoDB集群一起使用时,MySQL路由器充当代理来隐藏网络中的多个MySQL实例,并将数据请求映射到一个集群实例。只要有足够的在线副本,并且组件之间的通信是完整的,应用程序就能够联系其中的一个。MySQL路由器也可以让应用程序连接到MySQL路由器,而不是直接连接到MySQL。
2. 使用MySQL InnoDB集群部署路由器
docker run --name mysql_router -p 3310:3310 --net mynetwork --ip 172.18.0.5 -itd centos:centos7
docker cp /opt/mysql-router-8.0.19-el7-x86_64.tar.gz mysql_router:/opt
docker exec -it mysql_router /bin/bash
cd /opt
tar -zxvf /opt/mysql-router-8.0.19-el7-x86_64.tar.gz
ln -s /opt/mysql-router-8.0.19-el7-x86_64 /usr/local/mysqlrouter
vi ~/.bashrc
## 新增内容 ##
export MYSQL_ROUTER_HOME=/usr/local/mysqlrouter
export PATH=$PATH:$MYSQL_ROUTER_HOME/bin
source ~/.bashrc
mysqlrouter --help
cp /usr/local/mysqlrouter/share/doc/mysqlrouter/sample_mysqlrouter.conf /usr/local/mysqlrouter/share/doc/mysqlrouter/mysqlrouter.conf
vi /usr/local/mysqlrouter/share/doc/mysqlrouter/mysqlrouter.conf
## 新增内容 ##
[DEFAULT]
# 设置日志目录
logging_folder = /usr/local/mysqlrouter/logs
[logger]
# 定义日志级别
level = INFO
[routing:basic_failover]
# Router 地址
bind_address = 0.0.0.0
# Router 端口
bind_port = 3310
# 读写模式
mode = read-write
# 目标服务器
destinations = 192.168.56.120:3307,192.168.56.120:3308,192.168.56.120:3309
mkdir -p /usr/local/mysqlrouter/logs
vi ~/.bashrc
# 在底部新增以下命令,即可实现启动 docker 容器自启动 mysql router 进程
mysqlrouter -c /usr/local/mysqlrouter/share/doc/mysqlrouter/mysqlrouter.conf
source ~/.bashrc
至此,基于 Docker 架构 Mysql 集群 + Mysql Router 搭建完毕。