千家信息网

Docker实现Mariadb分库分表及读写分离功能

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,一、简介本文使用docker实现mysql主从配置,读写分离、分库分表等功能。二、环境准备1.基础环境javajava version "1.8.0_111"Java(TM) SE Runtime E
千家信息网最后更新 2026年11月02日Docker实现Mariadb分库分表及读写分离功能

一、简介

本文使用docker实现mysql主从配置,读写分离、分库分表等功能。

二、环境准备

1.基础环境

java

java version "1.8.0_111"Java(TM) SE Runtime Environment (build 1.8.0_111-b14)Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

docker

Client: Version:       18.03.0-ce API version:   1.37 Go version:    go1.9.4 Git commit:    0520e24 Built: Wed Mar 21 23:09:15 2018 OS/Arch:       linux/amd64 Experimental:  false Orchestrator:  swarmServer: Engine: Version:       18.03.0-ce API version:   1.37 (minimum version 1.12) Go version:    go1.9.4 Git commit:    0520e24 Built: Wed Mar 21 23:13:03 2018 OS/Arch:       linux/amd64 Experimental:  false

三、安装Mysql主从配置

1.部署信息

节点名称数据名称节点IP端口
mastermarster192.168.92.503306
slaveslave192.168.92.513307
mycatmycat192.168.92.508066/9066

2.主节点配置文件

创建mysql主节点配置文件

mkdir /usr/local/mysql/mastermkdir conf data

创建主节点配置文件docker.cnf

[mysqld]server-id=1log-bin=master-bin #只是读写,就只要主库配置即可.如果要做主从切换,那么主库和从库都需要开启.skip-host-cacheskip-name-resolvecollation-server = utf8_unicode_ciinit-connect='SET NAMES utf8'character-set-server = utf8[mysql] default-character-set=utf8[client] default-character-set=utf8

创建从节点配置文件 docker.conf

mkdir /usr/local/mysql/slavemkdir conf data
[mysqld]server-id=2log-bin=master-bin skip-host-cacheskip-name-resolvecollation-server = utf8_unicode_ciinit-connect='SET NAMES utf8'character-set-server = utf8[mysql] default-character-set=utf8[client] default-character-set=utf8

3.创建mysql容器

此处使用mariadb最新稳定镜像创建容器

创建主节点myslq

docker run --name master -p 3306:3306 -v /usr/local/mysql/master/conf:/etc/mysql/conf.d -v /usr/local/mysql/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -idt mariadb:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

创建从节点mysql

docker run --name slave -p 3307:3306 -v /usr/local/mysql/slave/conf:/etc/mysql/conf.d -v /usr/local/mysql/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -idt mariadb:latest --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

4.开启主从复制

step 1 进入主节点

docker exec -it master /bin/bashmysql -uroot -p

step 2 创建用户

create user 'backUser'@'%' identified by 'root';grant replication slave on *.* to 'backUser'@'%';flush privileges;show master status;MariaDB [(none)]> show master status;+-------------------+----------+--------------+------------------+| File    | Position | Binlog_Do_DB | Binlog_Ignore_DB |+-------------------+----------+--------------+------------------+| master-bin.000003 |  787 |    |     |+-------------------+----------+--------------+------------------+1 row in set (0.000 sec)

step 3 进入从节点创建用户开启同步

docker exec -it slave /bin/bashmysql -uroot -prootchange master to master_host='192.168.92.51',master_port=3306,master_user='backUser',master_password='root',master_log_file='master-bin.000003',master_log_pos=787;

开启主从复制:

start slave;

从节点设置日志和文件名要跟主节点信息对应,包括日志记录起始位置position

检查主从复制是否OK

show slave status \G;
*************************** 1. row ***************************    Slave_IO_State: Waiting for master to send event     Master_Host: 192.168.92.50     Master_User: backUser     Master_Port: 3306     Connect_Retry: 60    Master_Log_File: master-bin.000005   Read_Master_Log_Pos: 343    Relay_Log_File: mysqld-relay-bin.000002     Relay_Log_Pos: 556   Relay_Master_Log_File: master-bin.000005    Slave_IO_Running: Yes    Slave_SQL_Running: Yes

Slave出现2个YES,代表主从复制设置成功。

5、安装Mycat

下载mycat在50节点实现安装

tar -zxvf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gzmv mycat/ /usr/local/

修改mycat目录下 conf的server.xml 文件,指定用户名和密码

                0         1        0         0         0        false        0        0        1                  64k                                1k                0                                384m                                false                                                                false                true                                123456                test        

上述配置,指定以root为用户名,密码为123456,访问虚拟逻辑数据库test。

配置rule规则

修改mycat conf 文件夹下的schema.xml 配置数据库对应规则

           
select user()

上述配置scheam name 对应server配置文件的虚拟数据库,指定了2个表信息,tb_user 表主键实现自增长,有4个数据库节点,使用userrule表规则。

dataNode 指定了真实对应的物理数据库节点,对应dataHost说明了读写指定的用户和节点信息。

配置表分片规则文件rule.xml

                                                 id                        func1                                                                                id                        jump-consistent-hash                                                0                2                160                                                                                partition-hash-int.txt                                autopartition-long.txt                                                3                                8                128                                24                                yyyy-MM-dd                2015-01-01                                partition-range-mod.txt                                        3        

上述文件重点关注第一个tableRule、rule指定了分片规则在哪个表字段,algorithm指定了分片的算法,其中 func1 与文件后面function名称为func1对应,此处使用了PartitionByLong分片算法。

conf下增加sequence_conf.properties文件,其内容如下:

TB_USER.HISIDS=TB_USER.MINID=1TB_USER.MAXID=20000TB_USER.CURID=1

主要申明了主键增长的策略。

四、Mycat分库分表实践测试

1.master节点手动创建数据库

master节点手动创建4个数据库db1,db2,db3,db4 (不要操作从节点)

此时打开slave节点,会观察到slave也会自动创建4个数据库。

2.开启mycat

使用命令 ./mycat start 开启mycat

./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态

如果启动失败,请查看 /usr/local/mycat的wrapper.log 日志文件信息。

FATAL | wrapper | 2019/04/21 14:36:09 | ERROR: Could not write pid file /usr/local/mycat/logs/mycat.pid: No such file or directory

如果遇到上述错误,请在mycat 目录创建logs 文件夹,重新启动即可。

[root@localhost mycat]# bin/mycat statusMycat-server is running (5065).

上述消息则表示mycat启动成功。

2.放行mycat通信端口

firewall-cmd --zone=public --add-port=8066/tcp --permanentfirewall-cmd --zone=public --add-port=9066/tcp --permanentfirewall-cmd --reload

使用docker镜像开启mycat容器实例

docker run --name mycat -v /usr/local/mycat/conf/schema.xml:/usr/local/mycat/conf/schema.xml -v /usr/local/mycat/conf/rule.xml:/usr/local/mycat/conf/rule.xml -v /usr/local/mycat/conf/server.xml:/usr/local/mycat/conf/server.xml -v /usr/local/mycat/conf/sequence_conf.properties:/usr/local/mycat/conf/sequence_conf.properties --privileged=true -p 8066:8066 -p 9066:9066 -e MYSQL_ROOT_PASSWORD=123456 -d longhronshens/mycat-docker 

或者关闭防火墙。

3. mycat连接

使用navicate连接mycat,端口8066(9066为管理端口)

使用命令连接mycat

[root@localhost ~]# mysql -h227.0.0.1 -uroot -p123456 -P8066 Welcome to the MariaDB monitor. Commands end with ; or \g.Your MySQL connection id is 12Server version: 5.6.29-mycat-1.6.7.1-release-20190213150257 MyCat Server (OpenCloudDB)Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]> 

管理端命令:

mysql -h227.0.0.1 -uroot -proot -P9066 

查看虚拟逻辑库:

MySQL [(none)]> show databases;+----------+| DATABASE |+----------+| test   |+----------+1 row in set (0.00 sec)MySQL [(none)]> 

使用逻辑库创建表:

MySQL [(none)]> use test;CREATE TABLE `tb_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名', `password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码,加密存储', `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注册手机号', `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注册邮箱', `created` datetime(0) NOT NULL, `updated` datetime(0) NOT NULL, PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `username`(`username`) USING BTREE, UNIQUE INDEX `phone`(`phone`) USING BTREE, UNIQUE INDEX `email`(`email`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户表' ROW_FORMAT = Compact;

可以看到mycat,mysql主从都创建了该表

在创建一张表:

CREATE TABLE `tb_category` ( `id` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名字', `sort_order` int(4) NOT NULL DEFAULT 1 COMMENT '排列序号,表示同级类目的展现次序,如数值相等则按名称次序排列。取值范围:大于零的整数', `created` datetime(0) NULL DEFAULT NULL, `updated` datetime(0) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, INDEX `updated`(`updated`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

插入一条数据:

INSERT INTO `tb_user`(id,username,password,phone,email,created,updated) VALUES (7, 'zhangsan', 'e10adc3949ba59abbe56e057f20f883e', '13488888888', 'aa@a', '2015-04-06 17:03:55', '2015-04-06 17:03:55');

为测试分库效果,我们插入不同ID的数据来观察一下:

INSERT INTO `tb_user`(id,username,password,phone,email,created,updated) VALUES (128, 'zhang02', 'e10adc3949ba59abbe56e057f20f88ss', '13488888882', 'aa@01.com', '2015-04-06 17:03:57', '2015-04-06 17:04:55');INSERT INTO `tb_user`(id,username,password,phone,email,created,updated) VALUES (256, 'zhang03', 'e10adc3949ba59abbe56e057f20f88ss', '13488888883', 'aa@02.com', '2015-04-06 17:03:57', '2015-04-06 17:04:55');INSERT INTO `tb_user`(id,username,password,phone,email,created,updated) VALUES (384, 'zhang05', 'e10adc3949ba59abbe56e057f20f88ss', '13488888885', 'aa@05.com', '2015-04-06 17:03:57', '2015-04-06 17:04:55');

可以看到数据分别分布在db1/db2/db3/db4,分布的规则取决于插入数据的主键在rule.xml 设置的分片规则约束。

查看mycat节点健康状态,在主节点输入如下命令:

[root@localhost ~]# mysql -h227.0.0.1 -uroot -p123456 -P9066 Welcome to the MariaDB monitor. Commands end with ; or \g.Your MySQL connection id is 16Server version: 5.6.29-mycat-1.6.7.1-release-20190213150257 MyCat Server (monitor)Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]> show @@heartbeat;+--------+-------+---------------+------+---------+-------+--------+---------+--------------+---------------------+-------+| NAME  | TYPE | HOST     | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME  | STOP |+--------+-------+---------------+------+---------+-------+--------+---------+--------------+---------------------+-------+| hostM1 | mysql | 192.168.92.50 | 3306 |    1 |   0 | idle  |  30000 | 1,9,6    | 2019-04-21 20:44:40 | false || hostS2 | mysql | 192.168.92.51 | 3307 |    1 |   0 | idle  |  30000 | 1,9,67381  | 2019-04-21 20:44:40 | false |+--------+-------+---------------+------+---------+-------+--------+---------+--------------+---------------------+-------+2 rows in set (0.36 sec)

上述 RS_CODE 1代表节点正常,-1代表节点异常。

查询mycat所有命令:

MySQL [(none)]> show @@help;+--------------------------------------------------------------+--------------------------------------------+| STATEMENT                          | DESCRIPTION                |+--------------------------------------------------------------+--------------------------------------------+| show @@time.current                     | Report current timestamp          || show @@time.startup                     | Report startup timestamp          || show @@version                        | Report Mycat Server version        || show @@server                        | Report server status            || show @@threadpool                      | Report threadPool status          || show @@database                       | Report databases              || show @@datanode                       | Report dataNodes              || show @@datanode where schema = ?               | Report dataNodes              || show @@datasource                      | Report dataSources             || show @@datasource where dataNode = ?             | Report dataSources             || show @@datasource.synstatus                 | Report datasource data synchronous     || show @@datasource.syndetail where name=?           | Report datasource data synchronous detail || show @@datasource.cluster                  | Report datasource galary cluster variables || show @@processor                       | Report processor status          || show @@command                        | Report commands status           || show @@connection                      | Report connection status          || show @@cache                         | Report system cache usage         || show @@backend                        | Report backend connection status      || show @@session                        | Report front session details        || show @@connection.sql                    | Report connection sql           || show @@sql.execute                      | Report execute status           || show @@sql.detail where id = ?                | Report execute detail status        || show @@sql                          | Report SQL list              || show @@sql.high                       | Report Hight Frequency SQL         || show @@sql.slow                       | Report slow SQL              || show @@sql.resultset                     | Report BIG RESULTSET SQL          || show @@sql.sum                        | Report User RW Stat            || show @@sql.sum.user                     | Report User RW Stat            || show @@sql.sum.table                     | Report Table RW Stat           || show @@parser                        | Report parser status            || show @@router                        | Report router status            || show @@heartbeat                       | Report heartbeat status          || show @@heartbeat.detail where name=?             | Report heartbeat current detail      || show @@slow where schema = ?                 | Report schema slow sql           || show @@slow where datanode = ?                | Report datanode slow sql          || show @@sysparam                       | Report system param            || show @@syslog limit=?                    | Report system mycat.log          || show @@white                         | show mycat white host           || show @@white.set=?,?                     | set mycat white host,[ip,user]       || show @@directmemory=1 or 2                  | show mycat direct memory usage       || show @@check_global -SCHEMA= ? -TABLE=? -retry=? -interval=? | check mycat global table consistency    || switch @@datasource name:index                | Switch dataSource             || kill @@connection id1,id2,...                | Kill the specified connections       || stop @@heartbeat name:time                  | Pause dataNode heartbeat          || reload @@config                       | Reload basic config from file       || reload @@config_all                     | Reload all config from file        || reload @@route                        | Reload route config from file       || reload @@user                        | Reload user config from file        || reload @@sqlslow=                      | Set Slow SQL Time(ms)           || reload @@user_stat                      | Reset show @@sql @@sql.sum @@sql.slow   || rollback @@config                      | Rollback all config from memory      || rollback @@route                       | Rollback route config from memory     || rollback @@user                       | Rollback user config from memory      || reload @@sqlstat=open                    | Open real-time sql stat analyzer      || reload @@sqlstat=close                    | Close real-time sql stat analyzer     || offline                           | Change MyCat status to OFF         || online                            | Change MyCat status to ON         || clear @@slow where schema = ?                | Clear slow sql by schema          || clear @@slow where datanode = ?               | Clear slow sql by datanode         |+--------------------------------------------------------------+--------------------------------------------+59 rows in set (0.16 sec)

遇到如下错误:

修改schema.xml 文件属性checkSQLschema:

遇到如下错误:

jvm 1  | Caused by: io.mycat.config.util.ConfigException: org.xml.sax.SAXParseException; lineNumber: 97; columnNumber: 42; Attribute "defaultAccount" must be declared for element type "user".jvm 1  |        at io.mycat.config.loader.xml.XMLServerLoader.load(XMLServerLoader.java:111)jvm 1  |        at io.mycat.config.loader.xml.XMLServerLoader.(XMLServerLoader.java:69)jvm 1  |        at io.mycat.config.loader.xml.XMLConfigLoader.(XMLConfigLoader.java:56)jvm 1  |        at io.mycat.config.ConfigInitializer.(ConfigInitializer.java:77)jvm 1  |        at io.mycat.config.MycatConfig.(MycatConfig.java:72)jvm 1  |        at io.mycat.MycatServer.(MycatServer.java:144)jvm 1  |        at io.mycat.MycatServer.(MycatServer.java:96)jvm 1  |        ... 7 morejvm 1  | Caused by: org.xml.sax.SAXParseException; lineNumber: 97; columnNumber: 42; Attribute "defaultAccount" must be declared for element type "user".

请修改server.xml 文件,将user模块的defaultAccount取消:

        123456        test

最后放一张mycat查询结果截图:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

节点 文件 数据 配置 主从 数据库 用户 规则 命令 信息 名称 权重 端口 分库 代表 内容 容器 密码 日志 物理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 汇久创客互联网科技 壕鑫互联网络科技 一五八零互联网科技 丰台科技园 互联网公司 互联网时代科技改变生活 贵州叶脉互联网科技有限公司所属行业 互联网为啥属于高科技 互联网科技人工智能实验室 如何创新互联网科技 企晟互联网信息科技有限公司 翼展科技 首家互联网医院 四川慕妮娅互联网科技有限公司 梅州GM互联网络科技有限公司 领航科技大厦互联网公司 信承诺互联网科技有限公司 全球科技与互联网公司市值变化 国产互联网科技公司 互联网科技品牌 互联网科技大会大佬 颐高云石互联网科技 科技与互联网发展 上海致骋互联网科技 昊天互联网科技有限公司 晓花互联网科技有限公司网址 互联网科技公司有风险吗 华中科技大学互联网的牛人 下一代互联网重大应用科技园 互联网公司属于科技吗 广西泛欧互联网科技有限公司 承德科技产业互联网平台
0