首先打开虚拟机,开启docker服务
service docker start
如果已经安装Portainer的话,就先开启它
docker ps -a
查找到portainer的id号
docker start portainerID
一、MySQL的安装
1、在虚拟机运行该命令
1.搜索镜像
docker search mysql;
2.拉取镜像
docker pull mysql;
3.创建两个mysql容器,分别开放3307和3308端口,给两个mysql容器取别名,设置密码都是root。
docker run -d -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=root mysql
docker run -d -p 3308:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=root mysql
2、分别从portainer中进入已运行的mysql1和mysql2的cmd中,运行4命令,建立mysql连接
注:该条指令的意思是开放root用户,%代表任何连接都能放行,建立navicat连接
4.进入容器登录mysql并开启远程连接
alter user 'root'@'%' identified with mysql_native_password by 'root';
3、相同的步骤创建mysql2的连接,创建后在两个连接中分别创建名称相同的数据库,这里创建的是“jgs007”。我们将mysql1里jgs2007库中的表视为主表,mysql2里jgs2007库中的表视为从表,此时还没有创建表,之后才会创建,这里先说明一下。
4、进入portainer,分别点击运行的容器mysql1和mysql2,查看他们的内网地址,mysql1的是172.17.0.3,mysql2的是172.17.0.4,不同的连接会显示不同的地址。记住这两个地址,之后会用到。
二、主从配置
主配
1、先从mysql状态中退出来,更新并下载vim编辑器。mysql2也是相同的操作。
exit
apt-get update
apt-get install vim
2、vim编辑器安装完成以后,正式开始主从配置
1.增加配置
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1
binlog-do-db=dbname
创建并编辑my.cnf文件,并粘贴之后的代码,将dbname换成我们创建的库的名称“jgs2007”,保存退出。
2.进入mysql模式
mysal -uroot -p
3.创建用户
CREATE USER 'username'@'ip' IDENTIFIED WITH mysql_native_password BY '123456';
4.授予权限
GRANT REPLICATION SLAVE ON *.* TO 'username'@'ip';
5.刷新
flush privileges;
退出编辑模式后,在mysql1连接中创建一个给mysql2使用的一个用户,用户名username自定义,这里写成“jgs2007”,IP为mysql2的内网地址172.17.0.4.
然后授予该用户权限,同样输入用户名和ip,之后刷新,重启。
重启之后
6.登录mysql
7.查看日志文件和位置(file和position)
SHOW MASTER STATUS;
从配
从数据连接的配置基本相同
1.增加配置
vim /etc/my.cnf
[mysqld]
server-id=2
replicate-do-db=dbname
dbname依然是“jgs2007”
2.配置主从连接
CHANGE MASTER TO MASTER_HOST='ip', MASTER_USER='username', MASTER_PASSWORD='123456',MASTER_LOG_FILE='logname',MASTER_LOG_POS=pos;
3.开启同步
START SLAVE;
4.查看Slave的运行状态
SHOW SLAVE STATUS\G;
第2步配置主从连接需要改一些地方,首先是连接mysql1的内网地址172.17.0.3,之后填入刚刚创建的新用户的用户名username=“jgs2007”,更改logname就是刚刚查看的mysql1的文件file,pos就是position。
运行完上述步骤之后如果标点的位置的都是yes,并且连对了数据库,那么说明主从配置成功了,有一个不正确都是失败。
之后在两个两个中分别创建两张表user,因为mysql1中的为主表,可以修改增加,mysql2中的为从表,所以只能查询,不能有其他操作否则就不同了。
三、mycat配置
首先介绍一下mycat:一个项目需要一个数据库连接,但是mysql集群会出现多数据库多端口号的情况,所以有必要提供一个统一的连接服务地址。并且可以设置那些数据库可以查询,那些数据库可以修改,mycat将自动实现。
1. 在本地虚拟机中拉取镜像
docker pull fify/mycat
2. 创建挂载目录
mkdir -p /home/mycat
3.在/home/mycat/下创建server.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<!-- 1为开启实时统计、0为关闭 -->
<property name="useSqlStat">0</property>
<!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
<property name="processorBufferPoolType">0</property>
<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
<!-- off heap for merge/order/group/limit 1开启 0关闭 -->
<property name="useOffHeapForMerge">1</property>
<!-- 单位为m -->
<property name="memoryPageSize">1m</property>
<!-- 单位为k -->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!-- 单位为m -->
<property name="systemReserveMemorySize">384m</property>
</system>
<user name="root">
<property name="password">root</property>
<property name="schemas">jgs2007</property>
</user>
</mycat:server>
schemas为需要操作的数据库名,用户名和密码是root和root
4.在/home/mycat/下创建schema.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="jgs2007" checkSQLschema="true" sqlMaxLimit="100">
<table name="user1" dataNode="dn1" primaryKey="id"/>
</schema>
<!-- dataNode -->
<dataNode name="dn1" dataHost="dh1" database="jgs2007" />
<dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<!-- 心跳语句 -->
<heartbeat>select 1</heartbeat>
<!-- 写实例 -->
<writeHost host="hostM1" url="jdbc:mysql://172.17.0.3:3306?useSSL=false&serverTimezone=UTC" user="root" password="root">
<!-- 读实例 -->
<readHost host="hostS1" url="jdbc:mysql://172.17.0.4:3306?useSSL=false&serverTimezone=UTC" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
分别加入数据库名,创建的user表名,连接主从mysql的连接地址
5.将server.xml和schema.xml上传至创建的挂载目录mycat下.
6.创建mycat容器,将两个配置文件映射到容器内部(这是一条语句)
docker run --name mycat -p 8066:8066 -v /home/mycat/server.xml:/usr/local/mycat/conf/server.xml -v /home/mycat/schema.xml:/usr/local/mycat/conf/schema.xml --privileged=true -d fify/mycat
启动mycat容器成功
但是现在还不能进行统一连接,因为没有连接驱动
进入mycat的cmd命令模式,查看一下,没有mysql8.0的jdbc驱动包。
7.上传mysql8.0的jdbc驱动包
因此需要将该驱动包放入mycat中,我将下载好的驱动包放在本地的挂在目录下,通过命令复制,映射到mycat环境中。先从mycat环境中获取此时该文件目录的位置,命令pwd。再从本地映射到该路径。
映射完成以后查看一下,已经过来了,但是报红,说明权限不够,赋予权限
chmod 777 文件名,再ls查看一下。
已经绿了,说明好了
8.重启mycat容器
现在连接已经完成了