一、准备工作
如下图
二、为mycat主机安装环境
1.部署jdk与mycat
由于mycat是基于Java研发的,需要Java的环境jdk才能运行,这里给出实验用到的jdk与mycat二进制包
mycat包
链接:https://pan.baidu.com/s/1W4RQ0tG1ev4jJBWA7mRMKw?pwd=k7qn
提取码:k7qn
jdk包
链接:https://pan.baidu.com/s/1HMy1W4kmDGlGaQ0Y3i3Auw?pwd=r66t
提取码:r66t
–来自百度网盘超级会员V4的分享
注: mycat主机可以不安装数据库,但是master与slave必须安装数据库
解压包
tar xf jdk-8u181-linux-x64.tar.gz -C /usr/local/
制作软连接
ln -s /usr/local/jdk1.8.0_181/ /usr/local/jdk
配置Java环境变量
vim /etc/profile.d/java.sh
#打开后为一个新文件,写入如下内容
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
执行脚本
. /etc/profile.d/jdk.sh
#查看java版本
java -version
安装mycat
tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
2.配置mycat
为所有节点上授权mycat机器能够远程操作的用户,我授权的是mycat用户,密码为mycat
create user mycat@'192.168.110.108' identified by 'mycat';
需要为mycat用户授权
grant all on *.* to mycat@192.168.110.108;
注: 在所有节点上创建一个相同的库(如test),在此库中创建一个同名的表(如t1),在此表中插入不同的内容,以分辨读取的哪个表中的内容。这里实验master-1插入id=1,slave-1插入id=2,master-2插入id=3,slave-2插入id=4。
首先,先在四个机子上面建表t1
mysql> create table t1(id int);
在master-1上插入id=1
mysql> insert into t1 set id=1;
在slave-1上插入id=2
mysql> insert into t1 set id=2;
在master-2上插入id=3
mysql> insert into t1 set id=3;
在slave-2上插入id=4
mysql> insert into t1 set id=4;
接下来,修改mycat的配置文件,主要是两个配置文件: server.xml, schema.xml
#进入到配置文件目录
cd /usr/local/mycat/conf
#打开配置文件
vim server.xml
找到大概中间的位置,将端口打开(取消注释),这里采用默认端口
找到文件末尾
第一个用户是client端来请求mycat的用户和密码,可以采用默认
第二个用户是只读用户,可以采用默认
打开第二个配置文件,配置如图
vim schema.xml
配置的时候注意不要写错,最开始的schema.xml文件有很多注释,可以直接删去(如不需要的话),这里也可以先做一个备份,再进行对文件的修改;
3.运行mycat
!!!这里可能会出现很多错误导致起不来mycat,但大多数是因为配置文件没有配置好,所以你可能需要比较细致的检查配置文件来排查错误;
/usr/local/mycat/bin/mycat start &
可以查看mycat错误日志来分析错误
cat /usr/local/mycat/logs/wrapper.log
查看mycat端口是否起来
netstat -tanp |grep .066
这两个端口起来了证明我们的mycat启动成功了
现在来验证一下数据库是否进行了读均衡
client端访问mycat
[root@localhost ~]# mysql -uroot -p'123456' -h 192.168.110.108 -P 8066
客户机登陆数据库后,查看数据库的数据,可以看见每次可能都不一样
为此,mycat的部署成功,关于数据库之间的主从同步,可以查阅我的博客MYSQL主从同步设置
三、一些配置信息的解释
schema 标签, 总标签, 包括虚拟库, 以及连接属性, 还有虚拟节点
name - 定义了虚拟库的名字,这个名字需要和server.xml定义一致
dataNode - 定义了虚拟节点名字,这个需要和下一级的dataNode标签里的name属性一致
dataNode 标签,包括dataNode的名字,虚拟host属性,以及要使用后端物理机那个数据库
name - 定义dataNode的名字,该属性提供给schema里的dataNode使用,须一致
dataHost - 可自定义,下一级标签需要使用该信息
database - 指定使用后端物理机的那个数据库,就是把上级标签定义的虚拟数据库映射到后端物理机上的那个真实的数据库,该数据库在后端物理机上的Mysql是真实存在的
dataHost 标签,包括后端物理机的属性,地址,端口,以及用户名密码,还有该物理机是负责写还是读,等等
name - 使用上级标签也就是dataNode里的 dataHost的名字,这个必须保持一致
balance - 读负载均衡类型,目前的取值有 4 种:
0 - 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。
1 - 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡
2 - 所有读操作都随机的在 writeHost、 readhost 上分发。
3 - 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType - 写负载均衡类型,目前的取值有 3 种:
0 - 所有写操作发送到配置的第一个writeHost,第一个挂了切到备
writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
1 - 所有写操作都随机的发送到配置的 writeHost。
2 - 没实现。
switchType - 切换类型
-1 - 表示不自动切换
1 - 默认值,自动切换
2 - 基于MySQL 主从同步的状态决定是否切换
writeHost 标签, 定义后端物理机属性,定义了该物理机是可读还是可写,可以有多个。
heartbeat 标签, 定义如何探测后端物理机是否存活,使用select user语句去探测