文章目录
- 前言
- 一、使用mycat的能做什么
- 1、数据库的读写分离
- 2、数据库分库分表
- 1、水平切分(横向切分)
- 2、垂直切分(纵向切分)
- 3、结论
- 二、下载mycat
- 三、解压
- 四、操作命令
- 五、配置mycat
- 1、server.xml
- 2、schema.xml
- 2.1、配置schema
- 2.1.1、作用
- 2.1.2、配置说明
- 2.1.3、具体配置
- 2.2、配置dataNode
- 2.2.1、作用
- 2.2.2、配置说明
- 2.2.3、具体配置
- 2.3、配置dataHost
- 2.3.1、作用
- 2.3.2、配置说明
- 2.4、最终配置
- 六、测试读写分离
- 1、启动
- 2、验证
- 总结
前言
上一节讲到了mysq的主从复制,本节主要是将读写分离,去解决数据库性能的问题,减轻主从数据库的压力,进而提高每个数据库读写的性能。
本过程是我亲自操作和实验的,我将详细的过程进行了整理和记录。
一、使用mycat的能做什么
1、数据库的读写分离
通过Mycat可以自动实现写数据时操作主数据库,读数据时操作从数据库,这样能有效地减轻数据库压力,也能减轻IO压力。
实现读写分离,当主出现故障后,Mycat自动切换到另一个主上,进而提供高可用的数据库服务,当然我需要部署多主多从的模式。
如果有了Mycat,客户端直接连接Mycat,可以实现读写分离,如果主出现问题,会自动切换到从服务器上
2、数据库分库分表
分库分表指的是对数据库数据的拆分,分为两种:水平拆分和垂直拆分
1、水平切分(横向切分)
根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库服务器上面
2、垂直切分(纵向切分)
按照不同的表来切分到不同的数据库服务器之上
3、结论
1、性能有瓶颈了,可以读写分离
2、数据库容量有瓶颈了,可以分库分表
二、下载mycat
三、解压
因为是使用Java语言开发的,所以直接解压即可使用。
tar –zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
解压后的目录
四、操作命令
切换到mycat的bin路径下
#启动命令
./mycat start
#停止命令
./mycat stop
五、配置mycat
1、server.xml
主要用于配置mycat需要的服务器信息
常用配置:
配置序列生成方式
配置mycat逻辑数据库
配置mycat的访问账户和密码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<!--1为开启实时统计、0为关闭 -->
<property name="useSqlStat">0</property>
<!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
<property name="processorBufferPoolType">0</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>
<!--设置连接mycat时的用户名和密码, 逻辑库-->
<user name="mycat">
<property name="password">123456</property>
<property name="schemas">mycatdb</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">mycatdb</property>
<property name="readOnly">true</property>
</user>
2、schema.xml
用于配置的逻辑数据库的映射、表、分片规则、数据结点及真实的数据库信息;
常用配置:
配置逻辑库映射
配置垂直切分的表
配置真实的数据库
配置读写结点
2.1、配置schema
2.1.1、作用
schema用于配置逻辑库
2.1.2、配置说明
只做读写分离,不做分库分表,Mycat只是帮我们转发一下请求,读转发到从库,写转发到主库,则schema标签里面不用配置table
给schema标签加上属性dataNode,配置dataNode的名字(name)
2.1.3、具体配置
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
2.2、配置dataNode
2.2.1、作用
dataNode定义了Mycat中的数据节点,也就是我们通常说所的数据分片,一个dataNode标签就是一个独立的数据分片,通俗理解,一个分片就是一个物理数据库
2.2.2、配置说明
name
定义数据节点的名字,这个名字需要是唯一的,这个名字在schema里面会使用到;
dataHost
用于定义该分片属于哪个数据库实例的,属性值是引用dataHost标签上定义的name属性
database
用于对应真实的数据库名,必须是真实存在的;
2.2.3、具体配置
<dataNode name="dn1" dataHost="localhost1" database="test" />
2.3、配置dataHost
2.3.1、作用
定义具体的数据库实例、读写分离配置和心跳语句;
2.3.2、配置说明
balance属性
负载均衡类型,目前的取值有4种:
balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上;
balance=“1”,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
balance=“2”,所有读操作都随机的在writeHost、readhost上分发
balance=“3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
推荐balance设置为1
writeType
已过时,1.6版本就不用了
switchType属性
用于指定主服务器发生故障后的切换类型
-1 表示不自动切换
1 默认值,自动切换(推荐)
2 基于MySQL主从同步的状态决定是否切换
3 基于MySQL galary cluster的切换机制(适合集群)(1.4.1)
通常情况下,我们MySQL采用双主双从的模式下,switchType为1即可。因为双主从模式下,主从同步关系很复杂,不能根据MySQL的状态来切换。只需要在一个主出问题后,切换到另外的主。
heartbeat标签
用于和后端数据库进行心跳检查的语句,检测MySQL数据库是否正常运行
当switchType为1时,mysql心跳检查语句是select user()
当switchType为2时,mysql心跳检查语句是show slave status
当switchType为3时,mysql心跳检查语句是show status like ‘wsrep%’
writeHost与readHost标签
这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例,组合这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。
2.4、最终配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 只做读写分离,不做分库分表,Mycat只是帮我们转发一下请求,读转发到从库,写转发到主库,则schema标签里面不用配置table,给schema标签加上属性dataNode,配置dataNode的名字(name)-->
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<!-- database 是MySQL数据库的库名 -->
<dataNode name="dn1" dataHost="localhost1" database="workdb" />
<!--
dataNode节点中各属性说明:
name:指定逻辑数据节点名称;
dataHost:指定逻辑数据节点物理主机节点名称;
database:指定物理主机节点上。如果一个节点上有多个库,可使用表达式db$0-99, 表示指定0-99这100个数据库;
dataHost 节点中各属性说明:
name:物理主机节点名称;
maxCon:指定物理主机服务最大支持1000个连接;
minCon:指定物理主机服务最小保持10个连接;
writeType:指定写入类型;
0,只在writeHost节点写入;
1,在所有节点都写入。慎重开启,多节点写入顺序为默认写入根据配置顺序,第一个挂掉切换另一个;
dbType:指定数据库类型;
dbDriver:指定数据库驱动;
balance:指定物理主机服务的负载模式。
0,不开启读写分离机制;
1,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡;
2,所有的readHost与writeHost都参与select语句的负载均衡,也就是说,当系统的写操作压力不大的情况下,所有主机都可以承担负载均衡;
-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 可以配置多个主从 -->
<writeHost host="hostM1" url="192.168.111.132:3306" user="root" password="123456">
<!-- 可以配置多个从库 -->
<readHost host="hostS2" url="192.168.111.132:3307" user="root" password="123456"/>
</writeHost>
</dataHost>
</mycat:schema>
六、测试读写分离
1、启动
将修改好的配置文件上传到Mycat的conf目录下
配置好MySQL主从复制并启动主从MySQL3306和3307
启动Mycat
执行命令:
/usr/local/soft/mycat/bin/mycat start
2、验证
首先在mycatdb中添加一条数据
然后在主库3306和从库中3307都可以看到这条数据了,说明写入和同步完成。
因为3307是从库,现在将3307中新加的这条数据更改一下
然后再通过mycatdb查询
此时说明查询的是3307的从库。
总结
以上就是今天要讲的内容,如有任何问题,可以留言。