DOCKER部署mycat2+mysql8实现读写分离

1 篇文章 0 订阅
1 篇文章 0 订阅

DOCKER 部署MYSQL主从复制

mysql主节点部署

 docker run -d -p 6606:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql-master mysql

etc/my.cnf 修改

[mysqld]中加入以下内容
log_bin server-id=1

创建同步用户并授予权限

 create user 'mysqlSync'@'%' identified by '!@#123' require ssl;
 grant replication slave on *.* to 'mysqlSync'@'%' ;
flush privileges;
 

重启容器

docker restart mysql-master

进入容器root用户登录mysql查看主节点状态(或者直接在myql客户端操作也可以)

docker exec -it mysql-master /bin/bash
mysql -uroot -p

输入密码登录成功后查询主节点状态

show master status ; 

在这里插入图片描述
记下 file 和 Position 的值 从节点要用到

主从节点ssl通讯

将主节点/var/lib/mysql中的 ca.pem ,client-cert.pem ,client-key.pem 保存出来稍后拷贝到从节点容器中
在这里插入图片描述

mysql从节点部署

 docker run -d -p 6607:3306 -p 33061:33060 -e MYSQL_ROOT_PASSWORD=root --name mysql-slave mysql

主从节点SSL通讯

将之前从主节点保存出来的 ca.pem ,client-cert.pem ,client-key.pem 拷贝到从节点容器中,路径自定义,这里我选择/home/ca/master_ca/

etc/my.cnf 修改

[mysqld]中加入以下内容

relay_log=relay-bin
relay_log_index=slave-relay-bin
server-id=2          # 注意server-id 要唯一
# Ca
ssl-ca=/home/ca/master_ca/ca.pem
ssl-cert=/home/ca/master_ca/client-cert.pem
ssl-key=/home/ca/master_ca/client-key.pem

重启从节点容器

docker restart mysql-slave

进入容器

docker exec -it mysql-slave /bin/bash

测试主从节点的ssl通讯是否正常

mysql --ssl-ca=/home/ca/master_ca/ca.pem --ssl-cert=/home/ca/master_ca/client-cert.pem --ssl-key=/home/ca/master_ca/client-key.pem -umysqlSync -p -h 主节点ip ;

输入密码后登录成功表示正常
在这里插入图片描述

退出同步用户登录后重新使用root用户登录从节点mysql设置主节点信息

退出同步用户登录
在这里插入图片描述
重新使用root用户登录从节点mysql
在这里插入图片描述
设置主节点信息

-- 设置主节点信息
CHANGE REPLICATION SOURCE TO SOURCE_HOST='主节点ip',SOURCE_USER='mysqlSync',SOURCE_PASSWORD='!@#123',SOURCE_LOG_FILE='之前记在主节点查询到的file值',SOURCE_LOG_POS=之前在主节点查询到的Position的值,SOURCE_SSL=1,SOURCE_SSL_CA='/home/master_ca/ca.pem',SOURCE_SSL_CERT='/home/master_ca/client-cert.pem',SOURCE_SSL_KEY='/home/master_ca/client-key.pem';
-- 开启数据同步
start replica;

查询从节点状态

show slave status \G;

在这里插入图片描述

在主节点 新创建数据库或者其他操作验证主从复制成功

在主节点执行

CREATE  DATABASE nacos;

查看主节点
在这里插入图片描述
查看从节点

在这里插入图片描述
至此 docker搭建mysql主从复制成功

DOCKER 部署MYCAT

创建mycat用户

在mysql主节点执行sql

CREATE USER 'mycat'@'%' IDENTIFIED BY '!@#123';
-- 必須要複的權限 mysql8才有的
GRANT XA_RECOVER_ADMIN ON *.* TO 'root'@'%';
-- - 視情況賦值權限
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%' ;
flush privileges;

创建mycat容器

docker run -d -p 8066:8066  -e ENV DATA_SOURCE_PASSWORD=root -e ENV DATA_SOURCE_URL=jdbc:mysql://宿主机ip:6606/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8  --name mycat2  zhangyx1619/mycat2:mysql-1.2.1

镜像mycat2zhangyx1619/mycat2:mysql-1.2.1 拥有以下环境变量需要根据实际情况进行设置
在这里插入图片描述

  • ENV DATA_SOURCE_URL 主数据源链接
  • ENV DATA_SOURCE_USER 主数据源登录用户
  • ENV DATA_SOURCE_PASSWORD 主数据源登录密码
  • ENV MYCAT_ROOT_PASSWORD mycat 的root用户密码

使用sqLyog链接 mycat
在这里插入图片描述
在这里插入图片描述

配置主从集群信息实现读写分离

创建逻辑库
-- 创建逻辑库
CREATE  DATABASE nacos;

此时查看 /usr/local/mycat/conf/schemas/ 发现mycat自动创建了配置文件nacos.schema.json
在这里插入图片描述
查看nacos.schema.json内容
在这里插入图片描述

  • customTables放置的是mycat默认的表的配置
  • globalTables放置的是全局表的配置
  • shardingTables放置分片表的配置
  • normalTables放置普通表的配置
修改逻辑库
-- 修改逻辑库 指定nacos逻辑库默认的targetName, mycat会自动加载nacos下已经有的物理表或者视图作为单表.
/*+ mycat:createSchema{
  "customTables":{},
  "globalTables":{},
  "normalTables":{},
  "schemaName":"nacos",
  "shardingTables":{},
  "targetName":"prototype"
} */;

此时再次查看/usr/local/mycat/conf/schemas/nacos.schema.json发现已经自动加载单表boradtable在normalTables中了
在这里插入图片描述
此时的运行架构
在这里插入图片描述

添加从库数据源
/*+ mycat:createDataSource{
"name":"reader01",
"url":"jdbc:mysql://宿主机ip:6607/?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"password":"root"
} */;
-- 查询数据源
/*+ mycat:showDataSources{} */;
更新集群信息
/*! mycat:createCluster{"name":"prototype","masters":["prototypeDs"],"replicas":["reader01"]} */;
-- 查询集群信息
/*+ mycat:showClusters{} */;

此时的运行架构
在这里插入图片描述

验证

创建表

在这里插入图片描述

在新建的表中写入数据
insert into nacos.mycat_test values('123',@@hostname);

此时 主数据状态
在这里插入图片描述
从节点数据
在这里插入图片描述

故意修改从节点数据造成主从数据不一致
-- 在从节点mysql执行此sql
UPDATE nacos.mycat_test SET NAME=@@hostname WHERE id='123'

此时从节点数据
在这里插入图片描述
此时主节点数据
在这里插入图片描述

在mycat节点连续多次查询数据发现可以查询到不同的结果验证成功

在这里插入图片描述

在这里插入图片描述
发现可以查询到不同的结果,说明查询sql确实分别分发到了主节点和从节点执行了,至此读写分离实现成功

参考文章

https://blog.csdn.net/w329636271/article/details/119729831

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用docker部署springboot+MySQL项目,可以按照以下步骤进行操作: 1. 编写Dockerfile文件,指定基础镜像、安装JDK和MySQL等依赖,将项目打包成jar包并复制到镜像中。 ```dockerfile FROM openjdk:11-jdk-slim VOLUME /tmp ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar RUN mkdir -p /var/lib/mysql RUN apt-get update && apt-get install -y mysql-server RUN echo "bind-address = 0.0.0.0" >> /etc/mysql/mysql.conf.d/mysqld.cnf RUN service mysql start && \ mysql -uroot -e "CREATE DATABASE db_name" && \ mysql -uroot -e "CREATE USER 'username'@'%' IDENTIFIED BY 'password'" && \ mysql -uroot -e "GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'%';" EXPOSE 8080 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] ``` 2. 构建镜像 在Dockerfile的目录下执行以下命令: ```shell docker build -t springboot-mysql . ``` 这里将镜像命名为springboot-mysql。 3. 运行容器 执行以下命令运行容器: ```shell docker run -d -p 8080:8080 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=db_name -e MYSQL_USER=username -e MYSQL_PASSWORD=password springboot-mysql ``` 这里将容器的8080端口映射到主机的8080端口,3306端口映射到主机的3306端口,并指定MySQL的root密码、数据库名、用户名和密码。 4. 访问应用 在浏览器中访问http://localhost:8080,即可访问应用。 注意:如果使用docker-compose进行部署,可以在docker-compose.yml文件中指定MySQL的配置,更加方便和灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值