mycat部署和配置读写分离(二)

2023-12-15 01:40:25

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

1. jdk1.8安装

详见jdk环境安装

2. Mysql安装

详见mysql8.0.11源码安装,实际使用的是mysql8.0.16

3. Mysql 主从配置

详见主从同步原理mysql的主从同步详解

3.1 安装mycat服务

3.1.1 部署mycat
cd /root
wget http://dl.mycat.org.cn/1.6.7.6/20210303094759/Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz
tar -xf Mycat-server-1.6.7.6-release-20210303094759-linux.tar.gz -C /usr/local
cd /usr/local/mycat/conf
  • /usr/local/mycat/conf/server.xml:定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。
  • /usr/local/mycat/conf/schema.xml:定义逻辑库,表、分片节点等内容。
  • /usr/local/mycat/conf/rule.xml:定义分片规则
    在这里插入图片描述
3.1.2 server.xml配置文件

server.xml文件跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等(关注user标签即可),因此在这里简单说明。

<user name="mycat" defaultAccount="true">  #通过mycat登录的用户名和密码
                <property name="password">123456</property>
                <property name="schemas">mycatDB</property> <!-- #逻辑库,真实不存在的库,可以自定义修改,但一定要对应上,要不然就会报错 -->
                <property name="defaultSchema">mycatDB</property>  <!-- #逻辑库,真实不存在的库,可以自定义修改 -->
                <!-- 表级 DML 权限设置 -->
                <!--            
                <privileges check="false">
                        <schema name="TESTDB" dml="0110" >               #0000分表表示数据库的增删改查,0比表示关闭,1表示打开,如果配置 name需和前面定义的一致
                                <table name="tb01" dml="0000"></table>   #0000分表表示数据表的增删改查,0比表示关闭,1表示打开
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>           
                 -->
        </user>
        <user name="user">  <!-- 这个账号只能读不能写,见下面的定义readOnly -->
                <property name="password">user</property>
                <property name="schemas">mycatDB</property>
                <property name="readOnly">true</property>
                <property name="defaultSchema">mycatDB</property>
</user>

说明:

  • server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息。
  • 逻辑库名(如上面的mycatDB,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!
  • 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!
3.1.3 schema.xml配置文件

schema.xml是最主要的配置项,此文件关联mysql读写分离策略!读写分离、分库分表策略、分片节点都是在此文件中配置的!MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!

schema.xml文件分为三部分,分别时schema、dataNode、dataHost

  • schema
<schema name="mycatDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">  <!-- 其中name要和server.xml中定义的逻辑看必须一致;checkSQLschema 表示是否检测语法,一般不需要,因为要连接多个数据库,语法不一样;sqlMaxLimit 每个sql语句最多返回100条-->

<!-- 如果不进行分库分表,下面的配置可以不用管,注释即可 -->
                <!-- auto sharding by id (long) -->
                <!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置-->
        <!--    <table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>  -->
                <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
                        /> -->
</schema>
  • dataNode
<!-- dataNode用于配置物理数据库的名称,name可以自定义;dataHost自定义,但是需要和后面的dataHost有对应关系;database是真实存在的库 -->
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> -->
  • dataHost
<!-- dataHost 是用于配置读写分离的,name 自定义,但需要和dataNode中的dataHost完全一致;maxCon和minCon 表示最大最小连接数量;balance表示负载均衡策略;writeType已废弃,无需关注;dbType是mycat连接数据库的类型;dbDriver指数据库的驱动类型(如果dbType配的是Oracle,dbDriver则是jdbc);switchType 配置故障切换类型,需要配合下面的心跳机制heartbeat;slaveThreshold 指的是从节点的数量-->

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>  <!-- 心跳sql语句,需要配置故障切换类型 -->
                <!-- can have multi write hosts -->

                <!-- 写节点的配置:host 自定义即可;url 数据库的url连接地址;user 和 password指访问这个库的用户名和密码;如果是一主一从就配置一个writeHost和一个readHost,一主多从>就配置一个writeHost和多个readHost,多主多从就配置多个writeHost和多个readHost -->
                <writeHost host="hostM1" url="localhost:3306" user="root"
                                   password="123456">
                       <!-- can have multi read hosts -->
                       <!-- 读节点的配置: host 自定义即可;url 数据库的url连接地址;user 和 password指访问这个库的用户名和密码 -->
                       <readHost host="hostS1" url="localhost:3316" user="root" password="123456" />
                </writeHost>

                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
3.1.4 标签属性

Balance属性

  • balance=“0”:不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上。
  • balance=“1”:
    读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand
    by writeHost 参与select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与
    M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡
    balance=“2”:读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、
    readhost 上分发。
  • balance=“3”:读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到 wiriterHost
    对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType属性(已废弃,直接跳过)

  • writeType=“0”:所有写操作发送到配置的第一个
    writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties
    .
  • writeType=“1”:所有写操作都随机的发送到配置的writeHost。
  • writeType=“2”:没实现。

switchType 属性,主从切换(双主failover)

  • switchType=“-1”:不自动切换
  • switchType=“1”:默认值,自动切换
  • switchType=“2”:基于MySQL主从同步的状态来决定是否切换。需修改heartbeat语句(即心跳语句):show slave status
  • switchType=“3”:基于Mysql Galera
    Cluster(集群多节点复制)的切换机制。需修改heartbeat语句(即心跳语句):show status like ‘wsrep%’

dbType属性
指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库。例如:mongodb、oracle、spark等。

dbDriver属性
指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。

  • native
    使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。
  • JDBC
    其他类型的数据库则需要使用JDBC驱动来支持。从1.6版本开始支持postgresql的native原始协议。
    如果使用JDBC的话需要将符合JDBC 4标准的驱动JAR包放到MYCAT\lib目录下,并检查驱动JAR包中包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的Driver类名,例如:com.mysql.jdbc.Driver。
3.1.5 读写分离配置

cat server.xml

...
...
...
        <user name="mycat" defaultAccount="true">
                <property name="password">mycat123</property>
                <property name="schemas">mycatDB</property>
                <property name="defaultSchema">mycatDB</property>
        </user>
...
...
...

在这里插入图片描述
cat schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="mycatDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="external_service" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>show slave status</heartbeat>
                <writeHost host="hostM1" url="10.99.200.110:3306" user="dba" password="dba110">
                     <readHost host="hostS1" url="10.99.200.111:3306" user="dba" password="dba111" />
                </writeHost>
        </dataHost>
</mycat:schema>

在这里插入图片描述

3.1.6 启动服务

修改mycat的启动内存(/usr/local/mycat/conf/wrapper.conf)
在这里插入图片描述
启动方式

cd /usr/local/mycat/bin 
./mycat console|stop|start|restart|dump    #前台启动|停止|后台启动|导入

登录验证
主从同步ok
在这里插入图片描述
手动使得主从的数据不一致
在这里插入图片描述
验证读写分离
在这里插入图片描述
读的是从节点的数据
在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_44729138/article/details/115375299
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。