什么是读写分离:
在数据库集群架构中,让主库负责处理写入操作,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。当然,主数据库另外一个功能就是负责将数据变更同步到从库中,也就是写操作。
读写分离的好处:
Mycat 数据库中间件:
Mycat 是一个开源的数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的数据库系统。Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服 务是实现对主从数据库的读写分离、读的负载均衡。
DBA 或者运维人员对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集 群构成了整个完整的数据库存储
如上图所表示,数据被分到多个分片数据库后,应用如果需要读取数据,就要需要处理多个数据源的数据。 如果没有数据库中间件,那么应用将直接面对分片集群,数据源切换、事务处理、数据聚合都需要应用直接处 理,原本该是专注于业务的应用,将会花大量的工作来处理分片后的问题,最重要的是每个应用处理将是完全的 重复造轮子。 所以有了数据库中间件,应用只需要集中与业务处理,大量的通用的数据聚合,事务,数据源切换都由中间 件来处理,中间件的性能与处理能力将直接决定应用的读写性能,所以一款好的数据库中间件至关重要。
逻辑架构图
数据库中间件
中间件 | 发布商 |
---|---|
MySQL Proxy | MySQL官方 |
Atlas | 奇虎360 |
DBProxy | 美团点评 |
Amoeba | 早期阿里巴巴 |
cober | 阿里巴巴 |
MyCat | 阿里巴巴 |
MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。
准备好一个主从复制集群
准备一台新的主机放到master的前面做代理
192.168.202.130 xiaobai-master
192.168.202.132 xiaobai-slave
192.168.202.131 xiaobai-mycat
并将三台机器互做本地解析
三台机器都要安装mysql,如果机器不够可以把mycat和master放在一个机器上
关闭三台机器的防火墙和SELinux
部署Mycat需要运行的环境JDK7以上的版本,网站上可以搜到下载,也可以去oracle官网下载,Mycat也去网站上搜
我们现在在192.168.202.131 xiaobai-mycat主机
[root@xiaobai-mycat] tar xf jdk-8u211-linux-x64.tar.gz -C /usr/local/
[root@xiaobai-mycat] ln -s /usr/local/jdk1.8.0_211/ /usr/local/java
#可以写在/etc/profile文件里,我们写在/etc/profile.d目录里了
[root@xiaobai-mycat] vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
[root@xiaobai-mycat] source /etc/profile
[root@xiaobai-mycat] java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
#显示出版本信息则JDK部署好了
Mycat环境部署
[root@xiaobai-mycat ] tar xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /usr/local/
[root@xiaobai-mycat ] ls /usr/local/mycat/
bin catlet conf lib logs version.txt
#这里就是Mycat的所有文件,以下开始配置
#Mycat目前主要通过配置文件的方式来定义逻辑库和相关配置
配置server.xml
下面的用户和密码是应用程序连接到 Mycat 使用的,可以自定义配置
其中schemas 配置项所对应的值是逻辑数据库的名字,可以自定义,但是这个名字需要和后面 schema.xml 文件中配置的一致。
打开配置文件后拉到最后改
[root@xiaobai-mycat] vim /usr/local/mycat/conf/server.xml
<user name="mycatdb" defaultAccount="true">
<property name="password">123456property>
<property name="schemas">schema_xiaobai_dbproperty>
user>
####################################################################
privileges逻辑表标签解读
对用户的 schema以及表进行精细化的DML权限控制
<privileges check="false">
<schema name="schema_xiaobai_db" dml="1111" >
<table name="tb1" dml="1010">table>
<table name="tb2" dml="0000">table>
schema>
privileges>
--check 表示是否开启DML权限检查。默认是关闭。server.dtd文件中 <!ELEMENT privileges (schema)*> 说明可以有多个schema的配置
--dml 顺序说明:insert,update,select,delete
schema_xiaobai_db的权限是insert,update,select,delete
tb1的权限是insert,select
tb2的权限是啥都不能干
其他表默认是udpate,select
这里我们就不创建逻辑表了,最后查询时可能会有报错,但也能查到,想要创建的上面就是配置好的
#####################################################################
上面的配置中,假如配置了用户访问的逻辑库,那么必须在 schema.xml
文件中也配置这个逻辑库,否则启动 mycat 失败
配置 schema.xml
以下是配置文件中的每个部分的配置块解读
逻辑库和分表设置
<schema name="schema_xiaobai_db" 逻辑库名称
checkSQLschema="false" 不检查
sqlMaxLimit="100" 最大连接数
dataNode='dn1'> 数据节点名称,名称随意起
<table name="t1" dataNode="dn1"/>
<table name="t2" primaryKey="ID" type="global" dataNode="dn1" />
schema>
#以下为表的定义,和逻辑库无关
--name 表名,物理数据库中表名
--dataNode 表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
--primaryKey 主键字段名,自动生成主键时需要设置
--autoIncrement 是否自增
--type 该属性定义了逻辑表的类型,目前逻辑表只有全局表和普通表。全局表: global 普通表:无
数据节点
<dataNode name="dn1" 此数据节点的名称,与上面的节点名要相同
dataHost="localhost1" 主机组,名称随意起
database="xiaobai_db"> 真实的数据库,一定是存在的
dataNode>
主机组
<dataHost name="localhost1" 与上面的主机组要相同
maxCon="1000" minCon="10" 连接
balance="3" 负载均衡
writeType="0" 写模式配置
dbType="mysql" dbDriver="native" 数据库配置
switchType="1" slaveThreshold="100">
dataHost>
健康检查
<heartbeat>select user()heartbeat>
读写配置
<writeHost host="hostM1" 名称随意起,写主
url="192.168.202.130:3306" 真是主机名或ip加端口
user="root" password="123">
writeHost>
以下是上面解读的组合为完整的配置文件,适用于一主一从的架构
[root@xiaobai-mycat] vim /usr/local/mycat/conf/schema.xml
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="schema_xiaobai_db"
checkSQLschema="false"
sqlMaxLimit="100"
dataNode='dn1'>
schema>
<dataNode name="dn1"
dataHost="localhost1" database="xiaobai_db">
dataNode>
<dataHost name="localhost1"
maxCon="1000" minCon="10"
balance="3" writeType="0"
dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="hostM1" url="192.168.202.130:3306"
user="mycat" password="XiaoBai@123!">
<readHost host="hostS2" url="192.168.202.132:3306"
user="mycat" password="XiaoBai@123!" />
writeHost>
dataHost>
mycat:schema>
配置 log4j2.xml
[root@xiaobai-mycat] vim /usr/local/mycat/conf/log4j2.xml
<asyncRoot level="a" includeLocation="true">
配置完成后检查一下MySQL数据库中是不是真的有逻辑库映射的真实数据库
我在主服务器上创建了个xiaobai_db库,库下有个t1表,内容为“1,xiao”“2,bai”
启动Mycat
[root@xiaobai-mycat] /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@xiaobai-mycat] /usr/local/mycat/bin/mycat status
Mycat-server is running (22182).
[root@xiaobai-mycat] /usr/local/mycat/bin/mycat status
Mycat-server is not running. #此时mycat服务已经停止了
#1.mycat服务停止可能是你的内存太小
#2.可能是你的配置文件中写错了逻辑库
[root@xiaobai-mycat] ps -ef |grep java
#由于mycat是基于Java运行的,我们也可以敲ps-ef来查看java进程是否存在
mycat会在启动成功后3到5秒关闭进程和端口,如果多次启动不成功查看/usr/local/logs/wrapp.log
Exceptiion 这通常就是java程序出现了异常
而第二个红框中的内容则是说你的配置文件有错误,少了一个>或者/>
如果你的报错信息是这种
ERROR |weapper | 2020/4/5 10:00:00 |Startup failed : Timed out waiting for a signal from the JVM.
ERROR |weapper | 2020/4/5 10:00:00 |JVM did not exit on request,terminated
看到这两行解决方法:修改/usr/local/mycat/conf/wrapper.conf
wrapper.startup.timeuut=300 #超时时间300秒
wrapper.ping.timeout=120
如果你启动成功了并且也登录了,但show,use,select时卡住了没有反应
1.mycat无法连接到后端mysql
解决方法:检查mysql中是否授权mycat创建的用户访问mysql的主服务器和从服务器
2.没有创建逻辑库对应的真是库
解决方法:在主服务器上创建真实库,要保证逻辑库连的是这个真实库
mycat.log
也是可以查看启动报错信息的
测试
切换到xiaobai-master主机上给我们配置文件里的mycat用户授权
#登录mysql
mysql> grant all on *.* to 'mycat'@'%' identified by 'XiaoBai@123!';
mysql> flush privileges;
在xiaobai-mycat主机上测试mycat用户权限有效性测试是否能正常登录上主服务器和从服务器
[root@xiaobai-mycat] mysql -umycat -p'XiaoBai@123!' -h192.168.202.130 #192.168.202.130是主服务器
[root@xiaobai-mycat] mysql -umycat -p'XiaoBai@123!' -h192.168.202.132 #192.168.202.132是从服务器
注意区分mycat用户和mycatdb用户的区别,mycatdb用户是基于客户端登录mycat时使用的用户,所以不需要授权,而mycat用户则是我们的mycat服务器去往mysql服务器上查询修改的用户,所以要授权,可以理解为mycat用户是mycat服务器与mysql服务器之间内部通讯的用户!
现在我们在mycat的客户端上登录mycatdb用户,注意Mycat服务的默认端口号是8066
#这里我们把主服务器当做mycat的客户端
[root@xiaobai-master] mysql -umycatdb -p'123456' -P 8066 -h 192.168.202.131
#正常情况下是会直接登录进mysql的
mysql> show databases;
+-------------------+
| DATABASE |
+-------------------+
| schema_xiaobai_db |
+-------------------+
1 row in set (0.00 sec)
#我们可以看到只有一个我们自定义的逻辑库 schema_xiaobai_db
mysql> use schema_xiaobai_db;
mysql> select name from t1 where name='xiao';
+------+
| name |
+------+
| xiao |
+------+
1 row in set (0.01 sec)
完成操作后切回mycat机器
[root@xiaobai-mycat] grep 'name' /usr/local/mycat/logs/mycat.log |grep 192.168.202.132
#过滤有name和192.168.202.132的信息从/usr/local/mycat/logs/mycat.log下