Docker | 安装mysql及mycat实现读写分离

参考博客:https://www.cnblogs.com/kelelipeng/p/10346276.html

1.准备docker镜像

mysql 5.7的镜像,mycat镜像

 2.安装镜像文件生成容器

docker run -itd --name mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mmfw%123 mysql-mmfw:5.7
docker run -itd --name mysql2 -p 3307:3307 -e MYSQL_ROOT_PASSWORD=mmfw%123 mysql-mmfw:5.7
docker run -itd --name mysql3 -p 3308:3308 -e MYSQL_ROOT_PASSWORD=mmfw%123 mysql-mmfw:5.7

安装后生成三个mysql容器,如图所示:

 3. 进入docker容器,修改对应的配置:

docker exec -it mysql1 /bin/bash
vim etc/mysql/my.cnf

 数据库主库设置:

3306主:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
port=3306
lower_case_tables_names=1 #关闭大小写敏感 默认0开启,1关闭

#主从数据库设置
server-id = 1 #[必须]服务器唯一ID,默认是1
log-bin = mysql-bin #[必须]启用二进制日志
binlog-do-db = mmfw #指定对名称为test_db的数据库记录二进制日志 #
binlog-ignore-db = mysql #指定不对名称为mysql的数据库记录二进制日志 #
binlog-ignore-db = information_schema #指定不对名称为information_schema的数据库记录二进制日志 #
binlog_format = mixed #binlog日志格式,mysql默认采用,如果从服务器slave有别的slave要复制那么该slave也需要这一项#
expire_logs_days = 7 #超过7天的binlog删除#

3306主库修改后的配置文件

 同样步骤在从库部署一下:

3307,3308 从库:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
port=3307 # 修改端口号,mysql2为3307,mysql3为3308
lower_case_tables_names=1 #关闭大小写敏感 默认0开启,1关闭
server-id = 2 # 修改server_id,mysql2为2,mysql3为3
replicate-do-db = mmfw #复制名称为test_db的数据库
replicate-ignore-db = mysql #不需要(忽略)复制名称为mysql的数据库 #
replicate-ignore-db = information_schema #不需要(忽略)复制名称为information_schema的数据库

配置完成后,退出容器,并重启:使用工具连接测试是否安装成功

4.docker安装mycat

(1)创建挂载目录

mkdir -p /home/mycat


(2)将修改后的server.xml,schma.xml上传到服务器的/home/mycat文件夹下

server.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">  
        <system>  
           
                <property name="defaultSqlParser">druidparser</property>  
                <property name="mutiNodeLimitType">1</property>  
                <property name="serverPort">8066</property>  
                <property name="managerPort">9066</property> 
                <property name="sequnceHandlerType">1</property>
    <!--    sequnceHandlerType参数主要配合主键自增情况,后续进行说明-->  
        </system>  
        <!-- 任意设置登陆 mycat 的用户名,密码,数据库  -->  
        <user name="root">  
                <property name="password">mmfw%123</property>  
                <property name="schemas">MMFW</property>  
        </user>  
 
        
</mycat:server>

schma.xml

<?xml version="1.0"?>  
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">  
 
    <!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致  -->  
    <schema name="MMFW" checkSQLschema="false" sqlMaxLimit="100" dataNode="node_db03" ></schema>  
 
    <!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->  
    <dataNode name="node_db03" dataHost="dataHost01" database="mmfw" />  
 
    <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->  
   <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">  
            <heartbeat>select user()</heartbeat>  
            <writeHost host="hostM1" url="172.19.12.41:3306" user="root" password="mmfw%123">
            <readHost host="hostS1" url="172.19.12.41:3307" user="root" password="mmfw%123" />
            </writeHost>
    </dataHost>  
</mycat:schema>

(3)创建容器启动

docker run --name mycat -p 8066:8066 -p 9066:9066 -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

5.主从配置,使用工具连接数据库

(1)查看主master的状态,如果没有数据,需要在my.cnf 中配置

show master status;

注意:show master status; 只有在my.cnf中配置了log-bin开启生成数据库二进制记录才会显示数据

(2)配置从库,查看该slave的状态,只有该slave执行命令start slave; 后才有显示记录

show slave status;
stop slave; #停止从服务器
reset slave; #重置从服务器
start slave; #启动服务器
从服务器关联到主服务器
change master to master_user='root', master_password='mmfw%123', master_host='172.19.12.41',master_port=3306, master_log_file='mysql-bin.000002',master_log_pos=519;

其中:

master_host:为主库安装地址
master_port:为主库端口号
master_log_file:查询master状态中的File结果
master_log_pos:查询master状态中的Position结果

master_log_pos

在两个从库分别执行以上操作后,进入容器内查看从库状态

show slave statusG

是否成功就看

Slave_IO_Running: Yes 
Slave_SQL_Running: Yes

是否都为Yes

如果有出现以上结果,则配置成功!

原文地址:https://www.cnblogs.com/flafly/p/14447614.html