目录
一、读写分离的概念
在数据库集群架构中,让主库负责处理写入操作,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。当然,主数据库另外一个功能就是负责将数据变更同步到从库中,也就是写操作。
二、读写分离的好处
- 分摊服务器压力,提高机器的系统处理效率。
- 在写入不变,大大分摊了读取,提高了系统性能。另外,当读取被分摊后,又间接提高了写入的性能。所以,总体性能提高了。
- 增加冗余,提高服务可用性,当一台数据库服务器宕机后可以调整另外一台从库以最快速度恢复服务。
三、Mycat 数据库中间件
1、简介
Mycat 是一个开源的数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存储引擎,所以并不是完全意义的数据库系统。
Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务是实现对主从数据库的读写分离、读的负载均衡。
2、常见的数据库中间件
3、配置文件
MyCAT 目前主要通过配置文件的方式来定义逻辑库和相关配置
配置文件 | 说明 |
---|---|
mycat/conf/server.xml | 定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。 |
mycat/conf/schema.xml | 定义逻辑库,表、分片节点等内容。 |
mycat/conf/wrapper.conf | jvm |
(1)server.xml
(2)schema.xml
4、日志
warpper 日志:
mycat启动,停止,添加为服务等都会记录到此日志文件,如果系统环境配置错误或缺少配置时,导致 Mycat 无法启动,可以通过查看
warrpper.log
定位具体错误原因。 warrpper.log可以删除,删除后会自动重新生成该日志。
5、实例
准备一台新的主机放到master的前面做代理
192.168.246.133 mysql-mycat
并将三台机器互做本地解析
192.168.130.173 master --主服务器
192.168.130.171 slave --从服务器
在mysql主从复制实现的基础上,利用mycat做读写分离,架构图如下
1、部署环境
MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7
中的一些特性,所以要求必须在 JDK7 以上的版本上运行。
(1)安装jdk
tar xzf jdk-8u221-linux-x64.tar.gz -C /usr/local/ 解压
cd /usr/local/
mv jdk1.8.0_221/ java 重命名
(2)设置环境变量
vim /etc/profile 添加如下内容
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
(3)刷新
source /etc/profile
2、部署mycat
(1)下载mycat,并解压到/usr/local下
wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/
(2)配置mycat
认识配置文件
MyCAT 目前主要通过配置文件的方式来定义逻辑库和相关配置:
/usr/local/mycat/conf/server.xml #定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。
/usr/local/mycat/conf/schema.xml #定义逻辑库,表、分片节点等内容。
3、配置server.xml
下面的用户和密码是应用程序连接到 MyCat 使用的,可以自定义配置
而其中的schemas 配置项所对应的值是逻辑数据库的名字,也可以自定义,但是这个名字需要和后面 schema.xml 文件中配置的一致。
[root@mycat ~]# cd /usr/local/mycat/conf/
[root@mycat conf]# vim server.xml
...
<!--下面的用户和密码是应用程序连接到 MyCat 使用的.schemas 配置项所对应的值是逻辑数据库的名字,这个名字需要和后面 schema.xml 文件中配置的一致。-->
<user name="root" defaultAccount="true">
<property name="password">Qf@12345!</property>
<property name="schemas">testdb</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<!--
<!--下面是另一个用户,并且设置的访问 TESTED 逻辑数据库的权限是 只读。可以注释掉
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
-->
</mycat:server>
注:上面的配置中,假如配置了用户访问的逻辑库,那么必须在 schema.xml
文件中也配置这个逻辑库,否则报错,启动 mycat 失败
效果图,可供参考
4、配置schema.xml
以下是配置文件中的每个部分的配置块儿
逻辑库和分表设置
<schema name="testdb" // 逻辑库名称,与server.xml的一致
checkSQLschema="false" // 不检查sql
sqlMaxLimit="100" // 最大连接数
dataNode="dn1"> // 数据节点名称
<!--这里定义的是分表的信息-->
</schema>
数据节点
<dataNode name="dn1" // 此数据节点的名称
dataHost="localhost1" // 主机组虚拟的
database="testdb" /> // 真实的数据库名称
主机组
<dataHost name="localhost1" // 主机组
maxCon="1000" minCon="10" // 连接
balance="0" // 负载均衡
writeType="0" // 写模式配置
dbType="mysql" dbDriver="native" // 数据库配置
switchType="1" slaveThreshold="100">
<!--这里可以配置关于这个主机组的成员信息,和针对这些主机的健康检查语句-->
</dataHost>
balance 属性
负载均衡类型,目前的取值有 3 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1", 全部的 readHost 与 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 没有。
writeType 属性
负载均衡类型
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切换到还生存的第二个writeHost,重新启动后已切换后的为准.
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,#版本1.5 以后废弃不推荐。
健康检查
<heartbeat>select user()</heartbeat>
对后端数据进行检测,执行一个sql语句,user()内部函数
读写配置
<writeHost host="hostM1" url="192.168.246.135:3306" user="mycat" password="Qf@12345!">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.246.136:3306" user="mycat" password="Qf@12345!" />
</writeHost>
以下是组合为完整的配置文件,适用于一主一从的架构
[root@mycat ~]# cd /usr/local/mycat/conf/
[root@mycat conf]# cp schema.xml schema.xml.bak
[root@mycat conf]# vim 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="testdb" />
<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-master" url="mysql-master:3306" user="mycat" password="Qf@1234!">
<!-- can have multi read hosts -->
<readHost host="mysql-slave" url="mysql-slave:3306" user="mycat" password="Qf@1234!" />
</writeHost>
</dataHost>
</mycat:schema>
配置两从节点,分别为一个写节点,两个读节点,效果图如下
5、真实数据库创建授权用户
mysql> grant all on testdb.* to mycat@'%' identified by 'Qf@456789';
对库testdb有所有权限
mysql> flush privileges;
在另一台客户端,测试创建的用户远程登录:
mysql -umycat -p'Qf@456789' -h mysql-master
6、调整JVM
在/usr/local/conf/wrapper.conf
中添加
vim wrapper.conf
wrapper.startup.timeout=300 //超时时间300秒
wrapper.ping.timeout=120
7、启动Mycat
/usr/local/mycat/bin/mycat start 需要稍微等待一会
Starting Mycat-server...
查看mycat是否启动
[root@mycat ~]# jps
13377 WrapperSimpleApp
13431 Jps
[root@mycat ~]# netstat -lntp | grep java
8、测试mycat
将master当做mycat的客户端
mysql -uroot -h mysql-mycat -p'Qf@456789' -P 8066
注意:端口号是8066
6、报错信息
通过
/logs/warpper.log
日志进行分析
错误一:Error: missing server' JVM at
C:\Program Files (x86)\Java\jre1.8.0_131\bin\server\jvm.dll’.
解决办法:修改wrapper.conf,指向本机默认Java地址
wrapper.java.command= C:\Java\jdk1.8.0_92\bin\java.exe
错误二:Caused by: io.mycat.config.util.ConfigException: SelfCheck### schema testdb refered by user test is not exist!
解决办法:Server.xml 不要写小写的 testdb, 要写大写的TESTDB
或者下面的user部分没有注释掉