数据库中间件学习笔记之Mycat读写分离

  1. 核心概念
  2. schema配置
  3. Mycat读写分离

1 核心概念

数据库中间件:对应用,mycat就是数据库服务,mycat是后端数据库集群的代理

  • schema:逻辑库,mycat数据库服务中定义、管理的数据库
  • table:逻辑表,schema中包含的需分库分表存储的表
  • datanode:数据节点(分片节点),逻辑表分片的存储节点
  • dataHost:数据主机(节点主机),数据节点所在的主机

在这里插入图片描述

2 schema配置

  1. schema
  2. table
  3. dataHost
  4. childTable
  5. heartbeat
  6. writeHost readHost

2.1 schema

  • Mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置
  • 如果不配置schema标签,所有的表配置,会属于同一个默认的逻辑库
<?xmlversion="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
	</schema>
</mycat:schema>
属性名数量限制说明
nameString(1)逻辑数据库名
dataNodeString(0.1)该库中未指定dataNode的表的默认存储节点
checkSQLschemaboolean(1)是否检查SQL语句中库名(select * from TESTDB.orders),如果设置为true,会检查;当库名与逻辑库名相同时,会去掉语句中的库名前缀,这么做的目的是避免发送到后端数据库执行时报(ERROR 1146(42502):Table ‘testdb.travelrecord’ doesn’t exist)
sqlMaxLimitint(1)对于拆分库的schema,当该值设置为某个数值时,每条执行的SQL语句,如果没有加上limit自居,Mycat会自动加上。例如,设置值为100,执行select * from TESTDB.travelrecord的效果为select * from TESTDB.travelrecord limit 100

2.2 table

Table标签定义了Mycat中的逻辑表,所有需要拆分的表都需要通过这个标签定义

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
	<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long"/>
	<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2"/>
	<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
		<childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
			<childTable name="order_items" joinKey="order_id" parentKey="id"/>
		</childTable>
	</table>
</schema>
属性名数量限制说明
nameString(1)表名,同个schema标签中定义的名字必须唯一
dataNodeString(1.*)存放表数据的数据节点名
ruleString(0.1)分片规则,规则名字在rule.xml中定义,必须与tableRule标签中name属性一致
ruleRequiredboolean(0.1)用于指定表是否绑定分片规则
primaryKeyString(1)对应真实表的主键,当分片规则使用非主键进行分片,那么在使用主键查询时,就会发送查询语句到所有配置的dn上,如果使用该属性配置了主键,那么mycat会缓存主键与具体dn的信息,再次使用非主键进行查询时就不会进行广播式的查询,会直接发送语句给具体的dn
typeString(0.1)定义逻辑表的类型,目前只有“全局表”和“普通表”两种,全局表:global
autoIncrementboolean(0.1)是否使用主键自增长
subTablesString(1)分表
needAddLimitboolean(0.1)指定表是否需要自动在每个语句后面加上limit限制。这个属性默认为true

2.3 dataHost

dataHost定义Mycat中的数据主机,数据主机定义了具体的数据库服务、读写分离配置和心跳语句。这是与物理数据库服务关联的地方。

属性名数量限制说明
maxConint(1)指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost readHost都会使用这个属性值实例连接池的最大连接数
minConint(1)指定每个读写实例连接池的最小连接
balanceint(1)负载均衡类型,目前的取值有4种:1.balance=“0”,不开启读写分离机制,所有的读操作都发送到当前可用的writeHost上;2.balance=“1”,全部的readHost与stand by writeHost参与select语句的负载均衡;3.balance=“2”,所有读操作都随机的在writeHost、readHost上分发;4.balance=“3”,所有读请求随机的分发到writeHost对应的readHost执行,writeHost不负责读压力
writeTypeint(1)1.writeType=“0”,所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties;2.writeType=“1”,所有写操作都随机的发送到配置的writeHost
switchTypeint(1)-1表示不自动切换,1默认值,自动切换;2基于MySQL主从同步的状态决定是否切换
dbTypeString(1)指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其它使用JDBC连接的数据库
dbDriverString(1)指定连接后端数据库使用的Driver,目前可选的值有native和JDBC

2.4 childTable

childTable标签用于定义E-R分片的字表,通过标签上的属性与父表进行关联。

属性名数量限制说明
nameString(1)子表名
primaryKeyString(0.1)子表的主键列名
joinKeyString(1)子表中与父表关联的列
parentKeyString(1)父表中关联的列

2.5 heartbeat

  • 这个标签内指明用于和后端数据库进行心跳检查的语句;
  • 这个标签还有一个connectionInitSql属性,主要是当使用Oracle数据库时,需要执行的初始化SQL语句就放在这里

2.6 writeHost readHost

  • 一个dataHost内可以定义多个writeHost和readHost。
  • 如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用
  • 由于writeHost宕机,系统会自动检测到,并切换到备用的writeHost上去
属性名数量限制说明
hostString(1)用于标识不同实例,一般writeHost我们使用M1,readHost用S1
urlString(1)后端实例连接地址
userString(1)连接后端实例的用户名
passwordString(1)密码

3 Mycat读写分离

配置mysql端主从的数据自动同步,mycat不负责任何的数据同步问题

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
	<heartbeat>select user()</heartbeat>
	<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
		<readHost host="hostS1" url="localhost2:3306" user="root" password="123456" weight="1">
	</writeHost>
<dataHost>
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
	<heartbeat>select user()</heartbeat>
	<writeHost host="hostM1" url="localhost:3306" user="root" password="123456"></writeHost>
	<writeHost host="hostS1" url="localhost:3307" user="root" password="123456"></writeHost>
</dataHost>

参考文章

网易云课堂《Java高级开发工程师》

结语

本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值