mycat实现mariadb读写分离、分库
部署信息
节点名称 | 节点IP | 端口 |
---|---|---|
master | 127.0.0.1 | 3306 |
slave | 127.0.0.1 | 3305 |
mycat | 127.0.0.1 | 8066/9066 |
一、mariadb主从配置
1、mariadb安装
-
新建主节点配置文件(docker启动时会把此文件挂载到容器中)
mkdir /opt/software/mariadb_master/ cd /opt/software/mariadb_master/ mkdir conf data cd conf #创建主节点配置文件docker.cnf vim docker.cnf
配置文件内容
[mysqld] server-id=1 log-bin=master-bin skip-host-cache skip-name-resolve collation-server = utf8mb4_general_ci init-connect='SET NAMES utf8mb4' character-set-server = utf8mb4 [mysql] default-character-set=utf8mb4 [client] default-character-set=utf8mb4
-
启动mariadb
docker run --name mariadb-master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mypass -v /opt/software/mariadb_master/conf:/etc/mysql/conf.d -v /opt/software/mariadb_master/data:/var/lib/mysql -d mariadb:10.5.6 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
进入容器中修改配置文件/etc/mysql/my.cnf区分大小写
lower_case_table_name=1
-
重新启动 mariadb
-
同样的步骤安装mariadb从节点
配置文件内容
[mysqld] server-id=2 log-bin=master-bin skip-host-cache skip-name-resolve collation-server = utf8mb4_general_ci init-connect='SET NAMES utf8mb4' character-set-server = utf8mb4 [mysql] default-character-set=utf8mb4 [client] default-character-set=utf8mb4
启动命令
docker run --name mariadb-slave -p 3305:3306 -e MYSQL_ROOT_PASSWORD=mypass -v /opt/software/mariadb_slave/conf:/etc/mysql/conf.d -v /opt/software/mariadb_slave/data:/var/lib/mysql -d mariadb:10.5.6 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
2、开启主从复制
-
进入主节点,可以通过控制台或者Navicat这样的客户端管理软件
docker exec -it mariadb-master /bin/bash mysql -uroot -p
-
创建用户
create user 'user001'@'%' identified by 'mypass'; grant replication slave on *.* to 'user001'@'%'; flush privileges; ##查看主节点状态 show master status;
-
进入从节点创建用户开启同步
docker exec -it slave /bin/bash mysql -uroot -proot change master to master_host='127.0.0.1',master_port=3306,master_user='user001',master_password='mypass',master_log_file='master-bin.000005',master_log_pos=28102042;
开启主从复制
start slave; show slave status
出现2个YES,代表主从复制设置成功。
3、注意
- 在更改配置文件后一定要重启mariadb。我执行show master status时显示为空,就是忘记重启、配置log-bin没起作用
- master_password、master_log_file的设置要与master status的内容匹配
- 如果slave status为非yes状态,则一定要确定防火墙、网络是否通、用户名、密码是否正确。
二、mycat配置、安装
mycat下载地址:http://www.mycat.org.cn/ http://dl.mycat.org.cn/1.6.7.4/
我这里选用的是Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
cd /opt/software/mycat/
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
-
配置文件修改
server.xml主要更改部分如下:
<user name="root" defaultAccount="true"> <property name="password">mypass</property> <property name="schemas">mydb</property> <property name="defaultSchema">mydb</property> </user>
schema.xml主要更改部分如下:
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="mydb" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1"> <!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置--> <table name="data_detail_a,data_detail_b" dataNode="dn1,dn2" rule="sharding-by-month" splitTableNames ="true"/> <table name="dual" dataNode="dn1" splitTableNames ="true"/> <table name="data_param" dataNode="dn1" splitTableNames ="true"/> </schema> <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="localhost1" database="mydb_1" /> <dataNode name="dn2" dataHost="localhost1" database="mydb_2" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="localhost:3306" user="root" password="mypass"> <readHost host="hostS2" url="localhost:3305" user="root" password="mypass" /> </writeHost> </mycat:schema>
大致内容为将mydb_1、mydb_2组合为逻辑库mydb(server.xml与schema.xml的要对应);向hostM1写,从hostS2读。
-
启动命令为./bin目录下
./mycat start 启动 ./mycat stop 停止 ./mycat console 前台运行 ./mycat restart 重启服务 ./mycat pause 暂停 ./mycat status 查看启动状态
如果启动失败,可以查看 ./logs下wrapper.log中的信息。
-
注意:
-
开放端口。使用navicate连接mycat,端口8066(9066为管理端口)
firewall-cmd --zone=public --add-port=8066/tcp --permanent firewall-cmd --zone=public --add-port=9066/tcp --permanent firewall-cmd --reload
-
java代码连接时采用8066端口
-
三、报错记录
-
启动时报错can't find table define in schema DUAL schema:mydb
原因:mycat 有些版本没有dual 这个表,需要在你的逻辑库里面手动创建一个dual中间表。且设置不区分大小写。
<table name="dual" dataNode="dn1" splitTableNames ="true"/>
-
插入数据时报错Can't find a valid data node for specified node index
原因:插入数据时选用了规则rule="sharding-by-month",而其底层的partbymonth如下:
<function name="partbymonth" class="io.mycat.route.function.PartitionByMonth"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2015-01-01</property> </function>
sBeginDate 表示开始的月份,只能搞2015年的月分片,如果是16年的就会报错。改成2021-01-01即可。
参考文章: