案例说明
软件版本
mycat Mycat-server-1.6.5
mysql 5.7
java:8
简介
mysql使用一主一备 3339端口为主 3340端口为备
使用mycat两个用户
root 负责写
user 负责读
mysql安装
前提: 安装好 docker
拉取mysql的docker镜像
docker pull mysql:5.7
启动主从两个容器
主
docker run -p 3339:3306 --name mysqlmaster -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
从
docker run -p 3340:3306 --name mysqlslaver -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
使用docker ps命令查看是否启动成功,启动成功后可使用navicat连接
配置主从
方式1:容器内部文件修改
可以通过docker exec -it 容器 /bin/bash命令进入到Master容器内部,
cd /etc/mysql
使用vi my.cnf的方式修改,
这种方式会报出bash: vi: command not found,还要在容器中安装vim,所以不推荐
我们使用外部挂载的方式实现
方式2: 外部配置文件挂载
首先先把我们上面的两个容器卸载
docker rm 容器id -- 删除上面我们创建的两个容器,(虽然这有点啰嗦了)
mkdir /usr/local/docker
mkdir /usr/local/docker/mysql/master
cd /usr/local/docker/mysql/master
-- 在这个目录创建 my.cnf 用户挂载到主机
my.cnf
[mysqld] #注意要加上这一行
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
mkdir /usr/local/docker/mysql/slave
cd /usr/local/docker/mysql/slave
-- 在这个目录创建 my.cnf 用于挂载到备机
my.cnf
[mysqld] #注意要加上这个
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
启动主从
-- 启动主
docker run -p 3339:3306 --name mysqlmaster -v /usr/local/docker/mysql/master:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
-- 启动从
docker run -p 3340:3306 --name mysqlslaver -v /usr/local/docker/mysql/slave:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
使用 docker ps 查看状态
查询Master的地址
指的是容器的独立ip,可以通过docker inspect --format=’{{.NetworkSettings.IPAddress}}’ 容器名称|容器id查询容器的ip
登陆主mysql
-- 在linux中执行
docker exec -it 0fcdf204f77f /bin/bash
--登陆 mysql
mysql -u root -p
123456
--在Master数据库创建数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,
--用于在主从库之间同步数据。
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
在Master进入mysql,执行show master status;
查看一下File mysql-bin.000001,下面从服务中会用到
登陆从mysql
-- 在linux中执行
docker exec -it 70c960acbd02 /bin/bash
--登陆 mysql
mysql -u root -p
123456
--执行
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 154, master_connect_retry=30;
master_host :Master的地址,指的是容器的独立ip 可以通过docker inspect --format=’{{.NetworkSettings.IPAddress}}’ 容器名称|容器id查询容器的ip
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在Slave 中的mysql终端执行show slave status \G;用于查看主从同步状态。
正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。开启主从复制过程,
start slave;
然后再次查询主从同步状态
show slave status \G;。
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
测试主从复制
从主机中创建数据库 创建表, 看从服务器有没有同步
Mycat安装
- 创建Mycat配置文件夹
mkdir /usr/local/mycat/conf
- 创建docker文件夹
mkdir /usr/local/docker/mycat/
cd /usr/local/docker/mycat
- 编辑/usr/local/mycat/conf/目录下的server.xml,schema.xml等配置文件。
3.1 server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<!-- 读写都可用的用户 -->
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">mycat_testdb</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<!-- 只读用户 -->
<user name="user">
<property name="password">user</property>
<property name="schemas">mycat_testdb</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
3.2 schema.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- TESTDB1 是mycat的逻辑库名称,链接需要用的 -->
<schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<!-- database 是MySQL数据库的库名 -->
<dataNode name="dn1" dataHost="localhost1" database="test" />
<!--
dataNode节点中各属性说明:
name:指定逻辑数据节点名称;
dataHost:指定逻辑数据节点物理主机节点名称;
database:指定物理主机节点上。如果一个节点上有多个库,可使用表达式db$0-99, 表示指定0-99这100个数据库;
dataHost 节点中各属性说明:
name:物理主机节点名称;
maxCon:指定物理主机服务最大支持1000个连接;
minCon:指定物理主机服务最小保持10个连接;
writeType:指定写入类型;
0,只在writeHost节点写入;
1,在所有节点都写入。慎重开启,多节点写入顺序为默认写入根据配置顺序,第一个挂掉切换另一个;
dbType:指定数据库类型;
dbDriver:指定数据库驱动;
balance:指定物理主机服务的负载模式。
0,不开启读写分离机制;
1,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡;
2,所有的readHost与writeHost都参与select语句的负载均衡,也就是说,当系统的写操作压力不大的情况下,所有主机都可以承担负载均衡;
-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 可以配置多个主从 -->
<writeHost host="hostM1" url="192.168.254.135:3339" user="root" password="123456">
<!-- 可以配置多个从库 -->
<readHost host="hostS2" url="192.168.254.135:3340" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
- 下载mycat安装包 并上传到 /usr/local/docker/mycat
Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
mv Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz mycat.tar.gz
tar -zxvf mycat.tar.gz
cp -r mycat/conf/ /usr/local/mycat
- 创建Dockerfile文件
#基于java:8 创建镜像,
#必须保证已安装了java:8,否则就需要在Dockerfile文件中也ADD进来
FROM java:8
#将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
#将mycat解压到/usr/local目录中,得到 /usr/local/mycat
ADD mycat.tar.gz /usr/local
#容器数据卷,用于数据保存和持久化工作
#将mycat的配置文件的地址暴露出映射地址,启动时直接映射宿主机的文件夹
VOLUME /usr/local/mycat
WORKDIR /usr/local/mycat
#用来在构建镜像过程中设置环境变量
ENV MYCAT_HOME=/usr/local/mycat
#暴露出MyCat的所需端口
EXPOSE 8066 9066
#以前台进程的方式启动MyCat服务
CMD ["/usr/local/mycat/bin/mycat", "console","&"]
- 构建镜像
# 注意最后还有 .
docker build -t mycat-1.6.6.1 .
- 启动容器
#容器券:-v /usr/local/mycat/conf/:/usr/local/mycat/conf/
#冒号前是本机路径,冒号后是容器内的目录路径
#创建多个容器卷,尤其是配置文件和日志
docker run --name mycat -p 8066:8066 -p 9066:9066 -v /usr/local/mycat/conf/:/usr/local/mycat/conf/ -v /usr/local/mycat/logs/:/usr/local/mycat/logs/ -d mycat-1.6.6.1
- Navicat连接
至此,整合结束.