mycat 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。
结构:三台服务器master-m,master-s,mycat ,并已经做好mysql的一主一从
一、环境准备安装jdk
修改三台的主机名,并互做本地解析(vim /etc/hosts)
将jdk上传到服务器中,也可官网找到下载地址,wget直接下载
tar xzf jdk-8u221-linux-x64.tar.gz -C /usr/local/
cd /usr/local/
mv jdk1.8.0_221/ java
vim /etc/profile #添加如下内容,设置环境变量,添加如下内容
JAVA_HOME=/usr/local/java
PATH=
J
A
V
A
H
O
M
E
/
b
i
n
:
JAVA_HOME/bin:
JAVAHOME/bin:PATH
export CLASSPATH=.:
J
A
V
A
H
O
M
E
/
l
i
b
/
d
t
.
j
a
r
:
JAVA_HOME/lib/dt.jar:
JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
source /etc/profile #使环境变量配置生效
java -version #查看安装的版本
二、安装并配置mycat
wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz #下载mycat包
tar xzvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/
cd /usr/local/mycat/conf #进入mycat配置文件目录修改server.xml和schema.xml ,最好改前先备份
vim server.xml #定义登录mycat程序的用户及密码和逻辑库。部分文件如下
------------------------------------------------------里面解释中文为本人理解,真正配置时删掉,-----------------------------------------------------
…
#在这行之上的内容不动,这里的root为登录mycat程序的用户
Qf@123! #这个为root的密码
testdb #定义逻辑库,名字自定义
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<!-- 下面<user name="user"> </user>标签 这个为定义另一个登录用户,可像我这样注释掉
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
--> 与上面<!-- 构成注释
</mycat:server>
------------------------------------vim schema.xml ,配置schema.xml逻辑库和mysql真实库连接--------------------------------------------------------------
<mycat:schema xmlns:mycat=“http://io.mycat/”>
<schema name="testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> #定义逻辑库连接到的数据节点,黄色部分为要添加
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="localhost1" database="user" /> #定义数据节点dn1要连接的真实库名(user),user在mysql上有创建。
<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
<dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />
<dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
<dataHost name="localhost1" 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="mysql-m" url="10.20.151.200:3306" user="mycat"
password="QianFeng@123!"> #写的数据库信息,mycat用户必须在mysql上创建,并登录方式为%,密码这这里一致,对user库权限为all
<!-- can have multi read hosts -->
<readHost host="mysql-s" url="10.20.151.199:3306" user="mycat" password="QianFeng@123!" /> #读的库的信息,用户也要被创建,有相应权限
</writeHost>
</dataHost>
</mycat:schema>
上面黄色部分为修改或添加,这里没有的原schema.xml上有的为删除了,这个只是只适用一主一从
简述原理(个人理解):首先要有个mycat程序登录用户(root)------>逻辑库(server.xml内定义)----->数据节点(schema.xml定义的dn1)----->真实库(user)---->mycat用户(这个用户要在mysql上有并能远程登录mysql,且对你要操作的真实库有相应权限)
上面流程走通才能操作后端真实库
vim wrapper.conf #对jvm进行配置,添加如下内容, wrapper.ping.timeout=120这行内容应该有,在它的附近加另一行就好
wrapper.startup.timeout=300 //超时时间300秒
wrapper.ping.timeout=120
/usr/local/mycat/bin/mycat start #开启mycat
jps #查看mycat是否启动 ,有如下两个内容才算启动成功,多执行几次,要一直有如下内容,或看8066端口
yum install -y mysql #下载mysql或mariad作为mycat程序的客户端
mysql -uroot -h mycat -p’Qf@123!’ -P 8066 #这里用server.xml定义的用户登录mycat程序,然后mycat程序通过schema.xml里定义的配置去登录真实库,执行成功,执行show databases;能看到你定义的逻辑库,就说明读写分离成功。
mysql -umycat -p’QianFeng@123!’ -h mysql-m #这个测试mycat用户能否远程登录真实库
当我们要实际生产中要导入数据到数据库,就要用mycat来的导入 mysql -umycat -p’QianFeng@123!’ -D 库名 < 要导入的表。或者直接到数据库服务器用root本地导入。
当我们做了读写分离,不论是何种语言写的代码,在代码中连接数据库文件中参考下面的写法,因为是通过mycat连接数据库
mysqldb config
mysql_host=‘mycat服务器ip’
mysql_port=8066
mysql_user=‘登录mycat程序的用户默认root’
mysql_password=‘登录mycat程序的用户’
mysql_database=‘逻辑库’
补充schema.xml文件配置小知识:
balance 属性
负载均衡类型,目前的取值有 3 种:
- balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
- balance=“1”, 全部的 readHost 与 writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
- balance=“2”, 所有读操作都随机的在 writeHost、readhost 上分发。
- balance=“3”, 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力, #注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性
负载均衡类型 - writeType=“0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切换到还生存的第二个writeHost,重新启动后已切换后的为准.
- writeType=“1”,所有写操作都随机的发送到配置的 writeHost,#版本1.5 以后废弃不推荐。