数据库中间MyCAT读写分离实现详解

Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的分布式数据库系统。 那么 Mycat 是什么?Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服 务。
MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。

1.部署环境

准备两台虚拟机,并实现主从复制。主从复制详细步骤
再准备一台虚拟机用来部署mycat

192.168.13.128   master
192.168.13.129   slave
192.168.13.133  mycat
mycat      192.168.13.133  
1.下载JDK
[root@mycat ~]# wget --no-cookies \
--no-check-certificate \
--header \
"Cookie: oraclelicense=accept-securebackup-cookie" \
http://download.oracle.com/otn-pub/java/jdk/8u181-\
b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-\
x64.tar.gz

#--no-check-certificate 表示不校验SSL证书,因为中间的两个302会访问https,会涉及到证书的问题,不校验能快一点,影响不大.

2.解压文件
[root@mycat ~]# tar -xf jdk-8u181-linux-x64.tar.gz   -C  /usr/local/
[root@mycat ~]# ln -s /usr/local/jdk1.8.0_181/ /usr/local/java
3.配置环境变量
[root@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@mycat ~]# source /etc/profile.d/java.sh   #使环境变量生效
2.部署mycat

1.下载mycat

[root@mycat ~]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@mycat ~]# tar -xf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local/    #解压

2.配置mycat

认识配置文件

MyCAT 目前主要通过配置文件的方式来定义逻辑库和相关配置:

  • /usr/local/mycat/conf/server.xml

    定义用户以及Mycat系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。

  • /usr/local/mycat/conf/schema.xml

    定义逻辑库,表、分片和真实库直接的映射关系等内容。

  • /usr/local/mycat/conf/rule.xml

    中定义分片规则。

先备份
[root@mycat ~]# cd /usr/local/mycat/conf/
[root@mycat conf]# cp server.xml server.xml.bak
[root@mycat conf]# cp schema.xml schema.xml.bak
[root@mycat conf]# cp rule.xml rule.xml.bak

配置 server.xml
以下为代码片段

下面的用户和密码是应用程序连接到 MyCat 使用的,可以自定义配置

而其中的schemas 配置项所对应的值是逻辑数据库的名字,也可以自定义,但是这个名字需要和后面 schema.xml 文件中配置的一致。

[root@mycat conf]# vim server.xml   #修改
<!--下面的用户和密码是应用程序连接到 MyCat 使用的.schemas 配置项所对应的值是逻辑数据库的名字,这个名字需要和后面 schema.xml 文件中配置的一致。-->
<user name="mycatdb" defaultAccount="true">
    <property name="password">123456</property>
    <property name="schemas">schema_yjssjm_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>
<!--下面是另一个用户,并且设置的访问 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_yjssjm_db"   // 逻辑库名称
        checkSQLschema="false"   // 不检查
        sqlMaxLimit="100"        // 最大连接数
        dataNode='dn1'>          // 数据节点名称
<!--这里定义的是分表的信息-->
</schema>

数据节点

<dataNode name="dn1"              // 此数据节点的名称
          dataHost="localhost1"   // 主机组
          database="yjssjm_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.13.128:3306"
           user="root" password="123">
      <!-- can have multi read hosts -->
      <readHost host="hostS1" 
                url="192.168.13.129:3306"
                user="root" password="123" 
      />
</writeHost>

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

[root@mycat conf]# vim schema.xml     #清空并添加以下内容
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

  <schema name="schema_yjssjm_db" 
          checkSQLschema="false"
          sqlMaxLimit="100" 
          dataNode='dn1'>
    <!--这里定义的是分库分表的信息-->
  </schema>

  <!--下面是配置读写分离的信息-->
  <dataNode name="dn1"
            dataHost="localhost1" database="yjssjm_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.13.128:3306"
               user="mycat" password="123">
      <!-- can have multi read hosts -->
      <readHost host="hostS1" url="192.168.13.129:3306"
                user="mycat" password="123" />
    </writeHost>
  </dataHost>
</mycat:schema>
配置 log4j2.xml
[root@mycat conf]# vim log4j2.xml 
<!--设置日志级别为 debug , 默认是 info-->
<asyncRoot level="debug" includeLocation="true">
3.启动 mycat
[root@mycat conf]# /usr/local/mycat/bin/mycat  start
Starting Mycat-server...

我们需要去master节点上给用户授权并创建相应的数据库

[root@master ~]# mysql -uroot -p123  #进入数据库
mysql> grant all on *.* to 'mycat'@'%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.04 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> create database  yjssjm_db;
Query OK, 1 row affected (0.01 sec)

3.测试

在 mycat 的机器上测试用户权限有效性

测试是否能正常登录上 主服务器

[root@mycat conf]# mysql -umycat -p'123' -h192.168.13.128
mysql: [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 4
Server version: 5.7.29-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, 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.

继续测试是否能登录上从服务器

[root@mycat conf]# mysql -umycat -p'123' -h192.168.13.129
mysql: [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.7.29 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, 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.

通过客户端进行测试是否能登录到 mycat 上

192.168.13.133 是 mycat 的主机地址

注意端口号是 8066

[root@mycat conf]# mysql -umycatdb -p123456 -P8066 -h192.168.13.133
mysql> show databases;
+-----------------+
| DATABASE        |
+-----------------+
| schema_yjssjm_db |
+-----------------+
1 row in set (0.00 sec)

继续测试读写分离策略

使用 mysql 客户端工具使用 mycat 的账户和密码登录 mycat ,
之后执行 select 语句。

[root@mycat conf]# mysql -umycatdb -p'123456' -P 8066  -h 192.168.13.133
mysql> show databases;
+-----------------+
| DATABASE        |
+-----------------+
| schema_yjssjm_db |
+-----------------+
1 row in set (0.00 sec)

之后查询 mycat 主机上 mycat 安装目录下的 logs/mycat.log 日志。

在日志重搜索查询的语句或者查询 从库的 ip 地址,应该能搜索到

[root@master mycat]# pwd
/usr/local/mycat
[root@master mycat]# cat  logs/mycat.log

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值