服务器 | IP | 说明 |
Mycat | 192.168.139.125 | mycat服务器,连接数据库时,连接此服务器 |
database1 | 192.168.139.130 | 物理数据库1,真正存储数据的数据库 |
database2 | 192.168.139.131 | 物理数据库2,真正存储数据的数据库 |
1.什么是MYCAT
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代MySQL的加强版数据库
- 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
配置mycat之前请做好准备工作,统一各个数据库的字符集.并且最好使用mysql5.6的版本进行配置.以免以为版本问题带来很多未知的麻烦!
2.安装mycat
Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。
2.11.1 安装流程
安装mysql---->安装Java环境(mycat基于java) —> 下载mycat —> 新建mycat用户 —> 解压mycat —> 配置环境变量 —> 启动mycat
2.2 安装mysql:
可以参考我的这篇文档:https://blog.csdn.net/a1779078902/article/details/82461606
2.3 安装jdk
因Mycat是用java开发的,所以需要在实验环境下安装java,官方建议jdk1.7及以上版本
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
然后我们可以用xftp传到我们linux机器上面来
[root@knightlai]# mv jdk-8u181-linux-x64.tar.gz /usr/local/src/
[root@knightlai src]# tar xzvf jdk-8u181-linux-x64.tar.gz
jdk1.8.0_181/lib/visualvm/profiler/modules/org-netbeans-lib-profiler-common.jar
jdk1.8.0_181/lib/missioncontrol/
jdk1.8.0_181/lib/missioncontrol/plugins/
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.equinox.p2.operations.nl_zh_4.4.0.v20140623020002.jar
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.equinox.p2.repository.nl_zh_4.4.0.v20140623020002.jar
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.equinox.p2.touchpoint.eclipse_2.1.200.v20140512-1650.jar
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.e4.core.di.extensions_0.12.0.v20140417-2033.jar
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.core.databinding.property.nl_ja_4.4.0.v20140623020002.jar
jdk1.8.0_181/lib/missioncontrol/plugins/org.eclipse.jetty.security_8.1.14.v20131031.jar
......................................................................
[root@knightlai src]# mv jdk1.8.0_181/ /usr/local/jdk1.8
重点是在这里配置java环境,我之前就是因为java环境没有配置一直报错:
错误代码:
INFO | jvm 1 | 2018/11/04 15:26:45 | Caused by: io.mycat.config.util.ConfigException: java.lang.NullPointerException
INFO | jvm 1 | 2018/11/04 15:26:45 | Caused by: java.lang.NullPointerException
具体原因可能各有不同,这里只是我自已遇到的问题解决办法而已。
java环境:
[root@knightlai src]# vim /etc/profile
JAVA_HOME=/usr/lib/jdk1.8
CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH
//使变量立即生效
[root@knightlai src]# source /etc/profile
基本上这里没有报错说明java配置没有语法问题
[root@localhost logs]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
2.4 mycat安装
经过了前面的铺垫,下面我们的主角登场了,我们可以到下面的地址下载相应的版本
下载mycat我这里用的是1.6
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
解压
[root@localhost logs]#tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
# 剪切到/usr/local下
[root@localhost logs]mv mycat /usr/local/
切换到mycat文件夹路径下
[root@localhost logs]cd /usr/local
# 将文件权限赋给mycat账号
[root@localhost logs]chown mycat:mycat -R mycat
3. 配置mycat
3.1 先配置server.xml
(一)先配置server.xml
找到这一段
<user name="root">
<property name="password">12345</property>
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
这里配置了两个可以来连接的用户
用户1 root 密码12345 给予了此用户TESTDB数据库的权限
用户2 user 密码user 给予了此用户TESTDB数据库的只读权限
注意
A : 这里的testdb 不一定是你数据库上的真实库名.可以任意指定.只要和接下来的schema.xml的配置文件中的库名统一即可
B:这里的配置的用户名和密码,是我们 连接mycat的用户名和密码,和 schema.xml中配置的 连接真实mysql的用户名和密码 不一定一样
3.2 配置schema.xml
因为我们现在只做库的读写分离,没用分库 没用分表这些东西.
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="zrlog" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.139.130:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.139.131:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
配置文件详解:
一, <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
这里TESTDB 就是我们对外声称的我们有数据库的名称 必须和server.xml中的用户指定的数据库名称一致
添加一个dataNode="dn1" 是指定了我们这个库只在dn1上.没有进行分库
二, <dataNode name="dn1" dataHost="localhost1" database="realdb_test_name" />
这里只需要改database的名字 realdb_test_name 就是你真实数据库服务上的数据库名 .
根据你自己的数据库名进行修改.
三,<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
这里只需要配置四个地方 balance="1"与writeType="0" ,switchType=”1”
a. balance 属性负载均衡类型,目前的取值有 4 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。
3. balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。
4. balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。
b. writeType 属性
负载均衡类型,目前的取值有 3 种:
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
2. writeType="1",所有写操作都随机的发送到配置的 writeHost。
3. writeType="2",没实现。
c. switchType 属性
-1:表示不启用主从切换;
1:为默认值,自动切换;心跳检测语句,一般为select user();
2:基于主从同步的状态,决定是否切换,与show slave status心跳对应;
3:基于多住galary集群切换,与show status like 'wsrep%'对应;
d. Seconds_Behind_Master主从复制时延,当Seconds_Behind_Master>slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据
建议组合值:
balance="1" writeType="0" switchType="2"
4.启动并测试mycat
4.1 启动Mycat
[root@localhost logs]# /usr/local/mycat/bin/mycat start
4.2 测试连接mycat
[root@localhost logs]# mysql -h127.0.0.1 -uroot -p12345 -P8066
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)
//这里会显示我们现在连接的是mycat
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)
mysql> show @@datasource;
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| dn1 | hostM1 | mysql | 192.168.139.130 | 3306 | W | 0 | 0 | 1000 | 0 | 0 | 0 |
| dn1 | hostS1 | mysql | 192.168.139.131 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
2 rows in set (0.02 sec)