MySQL实操系列
- MySQL实操(一)——CentOS7安装MySQL5.7及基础配置_DreamEhome的博客-CSDN博客_centos7 中安装mysql5.7配置表名忽略大小写
- MySQL实操(二)——MySQL主从同步实战_DreamEhome的博客-CSDN博客
- MySQL实操(三)——使用Mycat实现分库分表+读写分离_DreamEhome的博客-CSDN博客
- MySQL实操(四)——使用Haproxy+keeplived实现Mycat高可用_DreamEhome的博客-CSDN博客
目录
整体架构
实现目标
- 搭建MySQL主从复制集群
- 安装Mycat并配置分库分表+读写分离
环境准备
- 虚拟机三台(演示用的CentOS7,其中两台为MySQL主从,一台Mycat服务器,三台服务器均需开启远程访问功能)
- 已安装配置完成的MySQL两台虚拟机(可参考MySQL实操(一)——CentOS7安装MySQL5.7及基础配置(开机启动+初始密码修改+开启远程访问+不区分大小写)_DreamEhome的博客-CSDN博客_centos7 中安装mysql5.7配置表名忽略大小写)
- 两个MySQL搭建完成主从复制(可参考MySQL实操(二)——MySQL主从同步实战_DreamEhome的博客-CSDN博客,IP及主从配置同参考)
- Mycat服务器需配置Java环境变量
- 相关服务虚拟机地址
- MySQL-Master:192.168.237.135
- MySQL-Slave : 192.168.237.136
- Mycat : 192.168.237.134
环境搭建
1.Mycat下载
可从以下网址下载Mycat:
CSDN下载:Mycat-server-1.6.6.1ForLinux-CentOS文档类资源-CSDN下载
Mycat官网地址:MyCat2
Mycat Gitee地址:Mycat2: Mycat2是Mycat社区开发的一款分布式关系型数据库(中间件)。它支持分布式SQL查询,兼容MySQL通信协议,以Java生态支持多种后端数据库,通过数据分片提高数据查询处理能力
Mycat GitHub地址:GitHub - MyCATApache/Mycat-Server
具体下载哪个版本以发布为准,推荐稳定最新版,当前演示使用1.6.6.1
2.Mycat下载安装、配置、启动、测试
2.1 Mycat下载安装
将下载的压缩包上传到Mycat服务器的/usr/soft/mycat目录下,执行解压命令
tar -zxvf Mycat-server-1.6.6.1-release-linux.tar.gz
解压后文件路径及目录如下
进入mycat,目录说明如下
目录 | 说明 |
---|---|
bin | mycat命令,启动、重启、停止等 |
catlet | catlet为Mycat的一个扩展功能 |
conf | Mycat 配置信息,重点关注:主要配置文件为rule.xml、schema.xml和server.xml三个 |
lib | Mycat依赖的jar包,Mycat是java开发的 |
logs | 日志文件,包括Mycat启动日志wrapper.log和运行日志mycat.log |
2.2 Mycat配置
进入mycat/conf目录下,修改rule.xml、schema.xml和server.xml三个配置文件
配置文件下载地址:Mycat配置文件,请配合博客使用-Linux文档类资源-CSDN下载
修改server.xml
#进入conf配置目录
cd /usr/soft/mycat/mycat/conf
#修改server.xml
vim server.xml
只修改server.xml中的user标签
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
...
<!--
name:登录mycat的用户名
property.password:登录mycat的密码
property.schemas:mycat的逻辑库(虚拟库)
-->
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">mydb</property>
</user>
</mycat:server>
修改schema.xml(Mycat的主要配置文件)
vim schema.xml
schema.xml所有内容及备注如下
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mydb" checkSQLschema="false" sqlMaxLimit="100">
<!--
name: 分表
dataNode:拆分后的数据切片的位置
rule:拆分规则,在rule.xml中配置,如mod-long为平均分配
-->
<table name="user" dataNode="dn1,dn2" rule="mod-long" />
</schema>
<!--
name:对应schema-table标签下的dataNode
dataHost:对应下面的dataHost
-->
<dataNode name="dn1" dataHost="localhost1" database="mydb01" />
<dataNode name="dn2" dataHost="localhost1" database="mydb02" />
<!--
dataHost:设置读写分离的主机地址
balance:读请求的负载均衡
0:不开启读写分离,所有的读操作 都发送到writehost中
1:全部的readhost和stand by writehost都参与 读操作的负责均衡
2:读请求 随机发送给readhost、writehost
3:读请求随机发送给writehost中的readhost (writehost不参与读请求) 》》》推荐
writeType:写请求的负载均衡
0:写请求先发送给schema.xml中的第一个writehost。当第一个writehost挂掉,再自动切换到其他的writehost中 。切换的记录 会被记录在 conf/dnindex.properties 》》》推荐
1:写请求随机发送到所有的wirtehost中
switchType: 是否允许 “读操作”在readhost和writehost上自动切换(解决延迟问题:当从readhost中读取数据中 出现网络延迟等问题时,自动从writehost中读数据)
-1:不许
1:默认,允许
2:根据“主从同步的状态” 自动选择是否 切换。
主从之间 会持续发送心跳。 当心跳检测机制发送了IO延迟,则readhost自动切换到writehost;
否则不切换。 必须将心跳设置 show slave status 》》》推荐
-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- Mysql主从的心跳 -->
<heartbeat>select user()</heartbeat>
<!--
readHost在writeHost标签中,默认为主从读写架构,在此架构中写默认为主节点,读默认为从节点
host:自主命名
-->
<writeHost host="hostM1" url="192.168.237.135:3306" user="root" password="123456">
<readHost host="hostS2" url="192.168.237.136:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
修改rule.xml
vim rule.xml
如在schema.xml中引用的rule(拆分规则)为mod-long,则到rule.xml中找到mod-long并修改其配置;并设置数据库节点数量及拆分后的切换数量
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
...
<!--
平均拆分
rule.columns:平均拆分依据的列
-->
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
...
<function name="murmur"
class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默认是0 -->
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function>
...
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- 拆分后的切片个数 -->
<property name="count">2</property>
</function>
...
</mycat:rule>
2.3 Mycat启动
进入mycat/bin目录下,启动mycat
#进入mycat的bin目录
cd /usr/soft/mycat/mycat/bin
#启动mycat
./mycat start
Mycat其他命令
#启动
./mycat start
#停止
./mycat stop
#前台运行
./mycat console
#添加到系统自动启动
./mycat install
#取消随系统自动启动
./mycat remove
#重启服务
./mycat restart
#暂停
./mycat pause
#查看启动状态
./mycat status
2.4 Mycat分库分表读写分离测试
测试之前要确保的问题:
1.两台Mysql服务器主从同步成功
2.确保MySqlMaster中mydb01和mydb02两个数据库存在(在schema.xml中配置的dataNode.database属性)
3.确保MySqlMastermydb01和mydb02两个库中都有user表,且表的字段相同(在schema.xml中配置的schema.table属性)
4.通过Mycat执行的SQL语句和SQL92基本一致,语法相对较为严格。如下所示
--可执行的
INSERT INTO user (id,userName,userPwd,age,address) VALUES (1, 'admin', '123', 100, '3');
--不可执行的
INSERT INTO user VALUES (1, 'admin', '123', 100, '3');
方式一:在Mysql服务器上登录Mycat进行测试
说明:不能直接在Mycat服务器上测试的原因是因为Mycat服务器上没有安装Mysql,无法执行mysql之类的命令,如果mycat和mysql服务在同一台服务器上,可以直接进行测试
登录mycat进行操作
#登录Mycat
# -u 登录名 用户名和密码为在server.xml中配置的name和password
# -p 密码
# -h Mycat服务器地址
# -P Mycat端口号,默认8066
mysql -uroot -p123456 -h192.168.237.134 -P8066;
登录数据库查看是否分库分表
方式二:通过SQL管理工具测试
以navicat为例,在navicat中新建Mysql连接:主机为Mycat服务器IP,Mycat端口默认8066,用户名和密码为在server.xml中配置的name和password,其余测试均同方式一一致