Mycat安装与配置读写分离


今天,给大家带来一篇Mycat在MySQL主从复制的基础上实现读写分离,这里大家需要注意的是MySQL的主从复制是依赖的MySQL自己的主从复制机制,Mycat不负责MySQL的主从复制,有关MySQL的主从复制配置,大家可以参考博文《MySQL之——主从复制的配置》,好了,我们接下来进入今天的主题内容。

MyCat读写分离

Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的分布式数据库系统

mycat是一个数据库中间件,也可以理解为是数据库代理。在架构体系中是位于数据库和应用层之间的一个组件,并且对于应用层是透明的,即数据库 感受不到mycat的存在,认为是直接连接的mysql数据库(实际上是连接的mycat,mycat实现了mysql的原生协议)

mycat的三大功能:分表、读写分离、主从切换

  • 分表
    对于数据量很大的表(千万级以上),mysql性能会有很大下降,因此尽量控制在每张表的大小在百万级别。对于数据量很大的一张表,可以考虑将这 些记录按照一定的规则放到不同的数据库里面。这样每个数据库的数据量不是太大,性能也不会有太大损失。
    mycat分表的实现:首先在mycat的scheme.xml中配置逻辑表,并且在配置中说明此表在哪几个物理库上。此逻辑表的名字与真实数据库中的名字一致!然后需要配置分片规则,即按照什么逻辑分库!

  • 读写分离
    经过统计发现,对数据库的大量操作是读操作,一般占到所有操作70%以上。所以做读写分离还是很有必要的,如果不做读写分离,那么从库也是一种很大的浪费。

  • .MyCat 基本元素
    1.逻辑库,mycat中存在,对应用来说相当于mysql数据库,后端可能对应了多个物理数据库,逻辑库中不保存数据
    2.逻辑表,逻辑库中的表,对应用来说相当于mysql的数据表,后端可能对应多个物理数据库中的表,也不保存数据
    逻辑表分类
    1.分片表,进行了水平切分的表,具有相同表结构但存储在不同数据库中的表,所有分片表的集合才是一张完整的表
    2.非分片表,垂直切分的表,一个数据库中就保存了一张完整的表
    3.全局表,所有分片数据库中都存在的表,如字典表,数量少,由mycat来进行维护更新
    4.ER关系表,mycat独有,子表依赖父表,保证在同一个数据库中

1 Mycat简介

2 什么是读写分离

注意: 实现读写分离前需要实现主从复制
大家可以参考我之前文章《MySQL主从同步配置》

在实际的生产环境中, 数据的读写操作如果都在同一个数据库服务器中进行, 当遇到大量的并发读或 者写操作的时候,是没有办法满足实际需求的,数据库的吞吐量将面临巨大的瓶颈压力.

  • 主从复制
    通过搭建主从架构, 将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责 处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改 善。

  • 读写分离
    读写分离就是让主库处理事务性操作,从库处理select查询。数据库复制被用来把事务性查询导 致的数据变更同步到从库,同时主库也可以select查询。

读写分离的数据节点中的数据内容是一致。

在这里插入图片描述

3 环境安装/配置

因为MyCat是用Java开发的,因此MyCat运行需要安装JDK(准确来说是JRE就够了),并且需要JDK1.7或以上版本

官网下载MyCat:http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/

  1. 解压缩文件拷贝到 linux下/usr/local/

    tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local/
    
  2. 解压完进入conf目录,修改server.xml
    server.xml的里面配置账号信息如下(主要是配置默认账号、数据库、只读账号、密码):

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
    	- you may not use this file except in compliance with the License. - You 
    	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
    	- - Unless required by applicable law or agreed to in writing, software - 
    	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
    	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
    	License for the specific language governing permissions and - limitations 
    	under the License. -->
    <!DOCTYPE mycat:server SYSTEM "server.dtd">
    <mycat:server xmlns:mycat="http://org.opencloudb/">
    	<system>
    	<!-- 这里配置的都是一些系统属性,可以自己查看mycat文档 -->
    	<property name="defaultSqlParser">druidparser</property>
    	<property name="charset">utf8mb4</property>
    	</system>
     
    							
    	<!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群 -->
    	<user name="user1">
    		<property name="password">123456</property>
    		<property name="schemas">pcx_schema</property>
    	</user>
    							
    	<!-- 用户2,只读权限-->
    	<user name="user2">
    		<property name="password">123456</property>
    		<property name="schemas">pcx_schema</property>
    		<property name="readOnly">true</property>
    	</user>
     
    </mycat:server>
    
  3. 打开conf文件夹下的schema.xml文件,配置如下:

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://org.opencloudb/">
    	
    	<!-- 定义MyCat的逻辑库 -->
    	<schema name="pcx_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema>
     
    	<!-- 定义MyCat的数据节点 -->
    	<dataNode name="pcxNode" dataHost="dtHost" database="pcx" />
     
    	
    	<!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一-->
    	<!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 -->
    	<!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
    	<!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost-->
    	<!--方式二-->
    	<dataHost name="dtHost" maxCon="500" minCon="20" balance="1"
    		writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
    		<!--心跳检测 -->
    		<heartbeat>select user()</heartbeat>
    		
    		<!--配置后台数据库的IP地址和端口号,还有账号密码 -->
    		<writeHost host="hostMaster" url="192.168.1.50:3306" user="root" password="123456" />
    		<writeHost host="hostSlave" url="192.168.1.51:3306" user="root" password="123456" />
    	</dataHost>
    	
    </mycat:schema>
    

    还有第二种配置dataHost

    <dataHost name="dtHost" maxCon="500" minCon="20" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostMaster" url="192.168.1.50:3306" user="root" password="123456">
            <readHost host="hostSlave" url="192.168.1.51:3306" user="root" password="123456" />
        </writeHost>
    </dataHost>
    

    回到bin路径下执行命令启动:./mycat start
    以上两种配置第二种当写挂了读不可用,第一种可以继续使用,所以推荐第一种配置。

4 重点属性详解

以下仅介绍常用配置标签,其他可查阅官网

balance:

对于dataHost标签的balance属性备注(写操作都是在主机上的):

1、Balance="0"时,不开启读写分离操作,所有读操作会发往第一个writeHost(不会发readHost)
2、Balance="1"时,全部的 readHost 与 stand by 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 没有

一般设置成“1”为:双主双从

writeType:

1、writeType="0"时,所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties
2、writeType="1"时,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐

switchType:

1、switchType="-1"时,不自动切换
2、writeType="1"时,默认值,自动切换
3、writeType="2"时,基于 MySQL 主从同步的状态决定是否切换

5 测试mycat读写分离

MyCat默认端口是8066

  1. 用Navicat连接MyCat,密码在server.xml配置,默认为123456
    在这里插入图片描述
  2. 在主库和从库创建user数据库,字符集utf8mb4,排序规则默认就好,并新建user表。
    在这里插入图片描述

之后就可以进行测试了,因为之前已经配置了主备,所以插入数据时是先将数据插入到主机然后同步到从机的。
验证读写分离的话,我们只需要改变从机的数据,看MyCat断是否读取的从机数据就好。
我这里手动修改的从数据库数据
在这里插入图片描述

到这里整个《Mycat安装与配置读写分离》就已经完成啦~

猜你喜欢

转载自blog.csdn.net/qq_38055805/article/details/119913286