mysql集群搭建-中间件集群搭建
在我们的分布式系统中,基本都会根据每个子系统来设计数据库,这些数据库除本身业务的表外一般还会有基础系统的表,这样就会出现一个数据同步的问题:如何将每个系统相同的表数据要保持一致,面对这种需求,mycat为我们提供了一个解决方案。
一、mycat的定义
mycat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
简单的来说:mycat是基于数据库的中间件,用来协调切分后的数据库,使其可以统一管理。
mycat的架构图
根据mycat的定义中介绍了一个名词:数据库切分。
数据库切分顾名思义,就是将数据库拆成多个,主要有两种方式
1.垂直切分
垂直切分就是将表按照不同的业务,分散存储到各个数据库。这是一个按业务维度的切分方式。
优点:垂直切分后数据库业务逻辑会非常清晰,拆分的规则也是根据业务来,数据库维护也很简单。
缺点:垂直切分后,由于表分散到了各个数据库,导致事务处理会很麻烦。
2.水平切分
水平切分是在垂直切分条件下,若有数据量较大或并发量较高的数据表,可以将其的数据量进行切分,分散存到多个数据库。
优点:不存在单库大数据,高并发的性能瓶颈。
缺点:数据多次扩展难度和维护量极大。
针对这两种分库策略,mycat将它们的优点整合起来,使得更加可用。
二、mycat的成员
mycat切库架构图
1.逻辑库
mycat对外暴露的一个数据库,用户可以直接操作这个库,这也是对外唯一的入口。
2.逻辑表
用户读写数据的表就是逻辑表,通常由一个或多个物理表组成。
3.数据节点
数据切分后,一个大表被分到不同的分片数据库上面,每个分片所在的数据库就是分片数据节点。可以看做是物理库提供的业务表。
4.数据主机
数据节点物理库所在的主机。
三、mycat的使用
1.mycat安装
我们这里采取docker安装:
拉取镜像:
docker pull longhronshens/mycat-docker
2.sever.xml文件
sever.xml文件主要是用来配置我们的mycat基本信息,如连接地址、用户名和密码、防火墙等等。
<?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://io.mycat/"> <system> <property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 --> <property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 --> <property name="sequnceHandlerType">0</property> <property name="processorBufferPoolType">0</property> <!--默认是65535 64K 用于sql解析时最大文本长度 --> <!--<property name="maxStringLiteralLength">65535</property>--> <!--<property name="sequnceHandlerType">0</property>--> <!--<property name="backSocketNoDelay">1</property>--> <!--<property name="frontSocketNoDelay">1</property>--> <!--<property name="processorExecutor">16</property>--> <!-- <property name="serverPort">8066</property> <property name="managerPort">9066</property> <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> --> <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志--> <property name="handleDistributedTransactions">0</property> <!-- off heap for merge/order/group/limit 1开启 0关闭 --> <property name="useOffHeapForMerge">1</property> <!-- 单位为m --> <property name="memoryPageSize">1m</property> <!-- 单位为k --> <property name="spillsFileBufferSize">1k</property> <property name="useStreamOutput">0</property> <!-- 单位为m --> <property name="systemReserveMemorySize">384m</property> <!--是否采用zookeeper协调切换 --> <property name="useZKSwitch">true</property> </system> <user name="root"> <property name="password">root</property> <property name="schemas">test</property> </user> </mycat:server>
在server.xml文件中常用的几个标签:
2.1 user标签
<user name="root"> <property name="password">root</property> <property name="schemas">test</property> </user>
name属性表示其用户名,
property标签则是设置其登录密码以及要使用的分库脚本
2.2 system标签
表示所有的配置都和系统有关。
2.3 filrewarll标签
防火墙设置标签
3. schema.xml配置文件
schema.xml配置文件主要是用来配置我们的逻辑库与物理库,也就是我们的分配库脚本。
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="test" checkSQLschema="false" sqlMaxLimit="100"> <table name="user" primaryKey="id" autoIncrement="true" dataNode="dn1" rule="userrule" /> </schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="127.0.0.1" user="root" password="root"> <readHost host="hostS2" url="127.0.0.1" user="root" password="root" /> </writeHost> </dataHost> </mycat:schema>
3.1 schema标签
<schema name="test" checkSQLschema="false" sqlMaxLimit="100"> <table name="user" primaryKey="id" autoIncrement="true" dataNode="dn1" rule="userrule" /> </schema>
schema标签表示我们的逻辑库,他有三个属性
name:逻辑库名。
checksqlSchema:检查sql语句是否带表名,这是mysql5.7提出的严格sql语句标准,建议设置false。
sqlMaxLimit:检查查询语句有没有带limit,如果没有带,则自动加上limit X,X为设置的值。
3.2 table标签
table标签表示mycat的逻辑表,它的属性有:
name:逻辑表名
dataNode:数据节点
rule:分片规则
primaryKey:主键
3.3 dataNode标签
<dataNode name="dn1" dataHost="localhost1" database="db1" />
dataNode标签配置的是我们具体的数据节点,它表示的某个具体的物理主机中,某个具体数据库,它的属性有:
name:节点名
datahost:节点主机
database:节点数据库(实际的物理库)
3.4 datahost
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="127.0.0.1" user="root" password="root"> <readHost host="hostS2" url="127.0.0.1" user="root" password="root" /> </writeHost> </dataHost>
datahost配置的就是我们的节点主机,除了作为配置逻辑库的脚本外,还能够配置mysql的主从复制(后面在来看):
name:主机名
maxCon:主机最大连接数
minCon: 主机最少连接数
balance:读写分离开关,这是作为主从复制时的配置项
writeType:负载均衡策略,值为0先发到第一个主服务器;值为1时,写操作在多个写服务器上随机执行。
dbtype:数据库类型,如:mysql
dbdriver:驱动方式,如果是mysql数据库,就用native
switchType:当主机意外宕机后,切换一个从机当主机(高可用)
slaveThreshold:时间延迟,这是主从复制的配置,如果当从机接受的数据时间和当前时间偏差过大,就不会接收这条数据,而这个偏差值就是我们设置的值
3.5 wirteHost标签
writeHost标签就是我们的物理库,它的属性有:
url:数据库连接地址
user:数据库账号
password:密码