说明
- Linux-Mycat安装配置,实现MySQL主从复制+读写分离。
- 本案例默认你已经安装好了MySQL主从复制,具体参考我的相关文章。
- Mycat单独一台服务器,MySQL主从各一台服务器,总共三台服务器。
- MySQL主服务器:192.168.3.201
- MySQL从服务器:192.168.3.202
- Mycat服务器:192.168.3.205
操作步骤
》环境准备
- 配置好的MySQL主从服务器各一台
- 另一台服务器用来装Mycat,Mycat是Java项目,要求这台服务器必须安装JDK,具体可以搜索参照我的相关文章。
》安装Mycat
- 下载:https://github.com/MyCATApache/Mycat-Server/releases/
- 下载的安装包:
[root@192 Mycat]# ll
total 21512
-rw-r--r--. 1 501 games 21760812 Jan 28 11:52 Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
- 解压即可:
[root@192 Mycat]# tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
[root@192 Mycat]# mv mycat /usr/local/
[root@192 Mycat]# cd /usr/local/mycat/
[root@192 mycat]# ll
total 12
drwxr-xr-x. 2 501 games 190 Jan 29 00:36 bin
drwxr-xr-x. 2 501 games 6 Oct 22 2019 catlet
drwxr-xr-x. 4 501 games 4096 Jan 29 00:36 conf
drwxr-xr-x. 2 501 games 4096 Jan 29 00:36 lib
drwxr-xr-x. 2 501 games 6 Jan 5 2020 logs
-rwxr-xr-x. 1 501 games 227 Jan 5 2020 version.txt
》配置Mycat
- 配置文件位于:conf目录下
- 修改配置文件 server.xml:
[root@192 conf]# vi server.xml
...
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">master_slave_001</property>
<property name="defaultSchema">master_slave_001</property>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
...
- 配置说明:
- root:连接Mycat的用户名,相当于MySQL的用户名
- password:连接Mycat的密码,相当于MySQL的密码
- schemas和defaultSchema:Mycat的虚拟库名,对应MySQL的真实库名。
- 两边最好一致,否则一些MySQL客户端(比如Navicat)连接时会报错:
Table 'TESTDB.tb001' doesn't exist
。
- 修改配置文件schema.xml(这个文件改动较大,先备份):
[root@192 conf]# cp schema.xml schema.xml.default
[root@192 conf]# vi schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--
schema: 虚拟库与真实库的映射
——name: 虚拟库的名字,对应在server.xml中设置的schemas
——sqlMaxLimit: 允许最大查询记录数
——checkSQLschema:是否检查自动删除 “虚拟库名”
——dataNode: 虚拟库对应的真实database,对应<dataNode>标签的name
-->
<schema name="master_slave_001" checkSQLschema="false" sqlMaxLimit="100" dataNode="dataNode001">
<!--
table: 虚拟表配置
——name: 表名
——dataNode:表对应的分片。如果做分片,则配置多个用逗号分隔;或者使用db$0-99,代表db0到db99的database
——rule: 分片规则,如果没有则删除
-->
<!--
<table name="tb_item" dataNode="dn1" rule="sharding-by-mod2"/>
-->
</schema>
<!--
dataNode: 数据库分片,每一个dataNode就是一个数据库分片
——name: 分片名称
——dataHost:真实库的主机信息,对应<dataHost>标签的name
——database:真实MySQL中真实的物理数据库名称
-->
<dataNode name="dataNode001" dataHost="dataHost001" database="master_slave_001" />
<!--
dataHost: 真实库的主机信息
——name: 主机名
——maxCon: 最大连接
——minCon: 最小连接
——balance: 负载均衡方式,0不开启读写分离。1~3都开启,具体看下边详细说明
——writeType: 写负载均衡。永远设置0
——dbDriver: 驱动类型,推荐native,可选jdbc
——switchType:主从的自动切换,1=自动切换,-1=不自动切换,2=基于MySQL主从同步的状态决定是否切换,默认1
-->
<dataHost name="dataHost001" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="writeHost001" url="192.168.3.201:3306" user="root" password="rootroot">
<readHost host="readHost001" url="192.168.3.202:3306" user="root" password="rootroot" />
</writeHost>
</dataHost>
</mycat:schema>
- schema.name(虚拟库名)的两种方案:
- 方案一:虚拟库名和MySQL中的真实库名保持一致,这样不需要定义可访问的表就能访问所有真实库中的表。
- 方案二:虚拟库名和MySQL中的真实库名不一样,然后在schema标签中定义可访问的表。
- 如果选择第二种方案,未定义可访问表时,查询会出现
Table 'TESTDB.tb001' doesn't exist
错误。
- dataHost.balance(负载均衡方式)详细说明:
- balance=“0”:不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
- balance=“1”:全部的readHost 与 stand by writeHost 参与 select 语句的负载均衡。简单的说,适用于双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备)。正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
- balance=“2”:所有读操作都随机的在 writeHost、readhost 上分发。
- balance=“3”:所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力。对应单主单从。
》启动Mycat
- 控制台启动:
[root@192 mycat]# ./bin/mycat console
Running Mycat-server...
wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | MyCAT Server startup successfully. see logs in logs/mycat.log
- 查看日志文件位置:
[root@192 logs]# pwd
/usr/local/mycat/logs
[root@192 logs]# ll
total 28
-rw-r--r--. 1 root root 20067 Jan 29 10:55 mycat.log
-rw-r--r--. 1 root root 6 Jan 29 10:49 mycat.pid
-rw-r--r--. 1 root root 2568 Jan 29 10:49 wrapper.log
- 后台启动:
[root@192 mycat]# ./bin/mycat start
[root@192 mycat]# ./bin/mycat stop
[root@192 mycat]# ./bin/mycat restart
[root@192 mycat]# ./bin/mycat status
》远程连接测试
- Mycat默认端口:8066
- 我这里使用Navicat客户端新建MySQL连接方式,配置参数:
Host:192.168.3.205
Port:8066
UserName:root
Password:123456
- 参数说明:
- Host:Mycat所在服务器IP
- Port:Mycat作为MySQL跳板时对外访问的端口(映射到MySQL的3306)
- UserName:Mycat配置文件server.xml中定义的user元素中的”root“
- Password:Mycat配置文件server.xml中定义的user元素中的“password”
- 连接成功后,就会看到名为“master_slave_001”的数据库,里边就是MySQL中的表了。尝试进行增删改查并查看主从库的数据一切正常。
- 至此,Mycat+MySQL主从复制+读写分离已经实现。
》双主双从(双机热备)
- 核心操作就是再配置一份主从复制然后两台主服务互相复制,具体操作请关注我[手动狗头]~