Akemi

Mycat部署与读写分离

2024/09/10

mycat数据库分库分表的中间件

仅用于测试环境

版本mycat 1.6.7.4

mycat部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
下载解压二进制包
cd /root/
wget https://github.com/MyCATApache/Mycat-Server/releases/download/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
tar -xf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz

安装java环境
yum -y install java

测试启动
/root/bin/mycat start

ps -ef | grep mycat
#root 8552 1 0 18:34 ? 00:00:00 /root/mycat/bin/./wrapper-linux-x86-64 /root/mycat/conf/wrapper.conf wrapper.syslog.ident=mycat wrapper.pidfile=/root/mycat/logs/mycat.pid wrapper.daemonize=TRUE wrapper.lockfile=/var/lock/subsys/mycat
#root 8554 8552 15 18:34 ? 00:00:01 java -DMYCAT_HOME=. -server -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx4G -Xms1G -Djava.library.path=lib -classpath lib/wrapper.jar:conf:lib/annotations-13.0.jar:lib/asm-4.0.jar:lib/commons-collections-3.2.1.jar:lib/commons-lang-2.6.jar:lib/curator-client-2.11.0.jar:lib/curator-framework-2.11.0.jar:lib/curator-recipes-2.11.0.jar:lib/disruptor-3.3.4.jar:lib/dom4j-1.6.1.jar:lib/druid-1.0.26.jar:lib/ehcache-core-2.6.11.jar:lib/fastjson-1.2.58.jar:lib/guava-19.0.jar:lib/hamcrest-core-1.3.jar:lib/hamcrest-library-1.3.jar:lib/jline-0.9.94.jar:lib/joda-time-2.9.3.jar:lib/jsr305-2.0.3.jar:lib/kotlin-stdlib-1.3.50.jar:lib/kotlin-stdlib-common-1.3.50.jar:lib/kryo-2.10.jar:lib/leveldb-0.7.jar:lib/leveldb-api-0.7.jar:lib/libwrapper-linux-ppc-64.so:lib/libwrapper-linux-x86-32.so:lib/libwrapper-linux-x86-64.so:lib/log4j-1.2-api-2.5.jar:lib/log4j-1.2.17.jar:lib/log4j-api-2.5.jar:lib/log4j-core-2.5.jar:lib/log4j-slf4j-impl-2.5.jar:lib/mapdb-1.0.7.jar:lib/minlog-1.2.jar:lib/mongo-java-driver-3.11.0.jar:lib/Mycat-server-1.6.7.4-release.jar:lib/mysql-binlog-connector-java-0.16.1.jar:lib/mysql-connector-java-5.1.35.jar:lib/netty-3.7.0.Final.jar:lib/netty-buffer-4.1.9.Final.jar:lib/netty-common-4.1.9.Final.jar:lib/objenesis-1.2.jar:lib/okhttp-4.2.2.jar:lib/okio-2.2.2.jar:lib/reflectasm-1.03.jar:lib/sequoiadb-driver-1.12.jar:lib/slf4j-api-1.6.1.jar:lib/univocity-parsers-2.2.1.jar:lib/velocity-1.7.jar:lib/wrapper.jar:lib/zookeeper-3.4.6.jar -Dwrapper.key=sswHd36gUmLiJNeX -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=8552 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp io.mycat.MycatStartup start
ss -tunlp | grep 8066
#tcp LISTEN 0 100 [::]:8066 [::]:* users:(("java",pid=8554,fd=107))

ps -ef能看到mycat且8066端口被监听说明启动已经成功

登录mycat

1
2
3
4
5
6
7
8
9
10
11
12
server.xml 用户配置文件
schema.xml 读写分离配置文件

根据schema.xml的最后几行参数登录mycat
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
<property name="defaultSchema">TESTDB</property>
</user>
登录mycat
mysql -uuser -puser -P8066 -h127.0.0.1

mycat读写分离配置

mycat配置读写分离需要一个主库和一个从库

我目前的环境是双主多从的一个环境,就拿这个来配吧

192.168.10.126 主
192.168.10.125 主2
192.168.10.127 备
192.168.10.128 备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
1.先在主库创建两个库ws和xhy,后面要用
create database ws;
create database xhy;

2.修改配置文件schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="db01" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<schema name="db02" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"></schema>
<dataNode name="dn1" dataHost="localhost1" database="ws" />
<dataNode name="dn2" dataHost="localhost1" database="xhy" />
<dataHost name="localhost1" maxCon="500" minCon="20" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="192.168.10.126:3306" user="root" password="root">
<readHost host="slave1" url="192.168.10.127:3306" user="root" password="root"/>
<readHost host="slave2" url="192.168.10.128:3306" user="root" password="root"/>
</writeHost>
</dataHost>
</mycat:schema>

定义了两个逻辑数据库分别叫db01和db02
这两个逻辑数据库分别关联了dataNode dn1和dn2(逻辑的)
dn1和dn2关联了数据库中的两个真实库ws和xhy
同时dn1和dn2还关联了一个共同的名字叫localhost1的dataHost分组
在localhost1的dataHost中指定了心跳测试的方法
指定可写的主数据库地址192.168.10.126和密码
指定只读的从数据库地址192.168.10.127和密码
指定只读的从数据库地址192.168.10.128和密码

3.修改server.xml
删除最后几段(包括默认user也要删除)
重新定义一下用户名、密码和相关的表,将上面的虚拟表db01 db02关联上去
<user name="admin">
<property name="password">admin</property>
<property name="schemas">db01,db02</property>
<property name="readOnly">false</property>
</user>

4.重启mycat
/root/mycat/bin/mycat stop
/root/mycat/bin/mycat start
netstat -tunlp | grep 8066
#tcp6 0 0 :::8066 :::* LISTEN 9406/java

测试mycat写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
5.登录mycat
mysql -uadmin -padmin -P8066 -h 127.0.0.1
或者用navicat

在db01建一个表
use db01;
create table test01 (id int auto_increment primary key,name varchar(20) not null);
insert into test01 value(1,'ws'),(2,'xhy');

此时主库已经有这个表了
select * from ws.test01;
+----+------+
| id | name |
+----+------+
| 1 | ws |
| 2 | xhy |
+----+------+
2 rows in set (0.00 sec)

测试mycat读写分离

在从库写入数据,使其主从不同步,再从mycat进行读取,看会读取到主的数据,还是从的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
6.在从库(mysql-3)写入
mysql -uroot -proot
insert into ws.test01 value(3,'zhangsan');
select * from test01;
+----+----------+
| id | name |
+----+----------+
| 1 | ws |
| 2 | xhy |
| 3 | zhangsan |
+----+----------+
3 rows in set (0.00 sec)

在mycat中查看db01.test01
mysql -uadmin -padmin -P8066 -h 127.0.0.1
use db01;
mysql> select * from test01;
+----+----------+
| id | name |
+----+----------+
| 1 | ws |
| 2 | xhy |
| 3 | zhangsan |
+----+----------+
3 rows in set (0.00 sec)

mycat中看到的与mysql-3一致
说明mycat是从从库(mysql-3)中读取
CATALOG
  1. 1. mycat部署
  2. 2. mycat读写分离配置
  3. 3. 测试mycat写入
  4. 4. 测试mycat读写分离