中间件的读写分离(MyCat)

MyCat读写分离

什么是MyCat读写分离

什么是读写分离:
在数据库集群架构中,让主库负责处理写入操作,而从库只负责处理select查询,让两者分工明确达到提高数据库整体读写性能。当然,主数据库另外一个功能就是负责将数据变更同步到从库中,也就是写操作。

读写分离的好处:

  1. 分摊服务器压力,提高机器的系统处理效率
  2. 在写入不变,大大分摊了读取,提高了系统性能。另外,当读取被分摊后,又间接提高了写入的性能。所以,总体性能提高了
  3. 增加冗余,提高服务可用性,当一台数据库服务器宕机后可以调整另外一台从库以最快速度恢复服务

Mycat 数据库中间件:
Mycat 是一个开源的数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的数据库系统。Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服 务是实现对主从数据库的读写分离、读的负载均衡。

DBA 或者运维人员对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集 群构成了整个完整的数据库存储
在这里插入图片描述
如上图所表示,数据被分到多个分片数据库后,应用如果需要读取数据,就要需要处理多个数据源的数据。 如果没有数据库中间件,那么应用将直接面对分片集群,数据源切换、事务处理、数据聚合都需要应用直接处 理,原本该是专注于业务的应用,将会花大量的工作来处理分片后的问题,最重要的是每个应用处理将是完全的 重复造轮子。 所以有了数据库中间件,应用只需要集中与业务处理,大量的通用的数据聚合,事务,数据源切换都由中间 件来处理,中间件的性能与处理能力将直接决定应用的读写性能,所以一款好的数据库中间件至关重要。

逻辑架构图

  • 逻辑库(schema):通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道 数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。在云计算时代,数据库中间件可以以多租户的形式给一个或多个应用提供服务,每个应用访问的可能是一个 独立或者是共享的物理库,常见的如阿里云数据库服务器 RDS。在这里插入图片描述
  • 逻辑表(table):既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可 以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
  • 分片规则(rule):数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到 某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。

数据库中间件

中间件 发布商
MySQL Proxy MySQL官方
Atlas 奇虎360
DBProxy 美团点评
Amoeba 早期阿里巴巴
cober 阿里巴巴
MyCat 阿里巴巴

MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。

读写分离

java环境部署及MyCat

准备好一个主从复制集群
准备一台新的主机放到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">123456</property>
    <property name="schemas">schema_xiaobai_db</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>
####################################################################
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

这里我们就不创建逻辑表了,最后查询时可能会有报错,但也能查到,想要创建的上面就是配置好的
#####################################################################
<!--下面是另一个用户,并且设置的访问 TESTED 逻辑数据库的权限是 只读
<user name="user">
        <property name="password">user</property>
        <property name="schemas">TESTDB</property>
        <property name="readOnly">true</property>
</user>
-->

在这里插入图片描述
上面的配置中,假如配置了用户访问的逻辑库,那么必须在 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">
      <!-- can have multi read hosts -->
      <readHost host="hostS2"    读从
                url="192.168.202.132:3306"
                user="root" password="123" 
 </writeHost>

以下是上面解读的组合为完整的配置文件,适用于一主一从的架构

[root@xiaobai-mycat] vim /usr/local/mycat/conf/schema.xml
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<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>
    <!-- can have multi write hosts -->
    <writeHost host="hostM1" url="192.168.202.130:3306"
               user="mycat" password="XiaoBai@123!">
      <!-- can have multi read hosts -->
      <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
<!--设置日志级别为 debug , 默认是 info-->
<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下

在这里插入图片描述
注:起名时尽量不要用mycatdb,mycat这些关键字

文中内容适用于初学者 @小白

发布了17 篇原创文章 · 获赞 19 · 访问量 1102

猜你喜欢

转载自blog.csdn.net/little_baixb/article/details/105229854