基于docker+mycat+mysql实现mysql读写分离

案例说明

软件版本
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安装

  1. 创建Mycat配置文件夹
mkdir /usr/local/mycat/conf
  1. 创建docker文件夹
mkdir /usr/local/docker/mycat/
cd /usr/local/docker/mycat
  1. 编辑/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>
  1. 下载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
  1. 创建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","&"]
  1. 构建镜像
# 注意最后还有 .
docker build -t mycat-1.6.6.1 .
  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
  1. Navicat连接
    在这里插入图片描述

至此,整合结束.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值