Mycat读写分离,主从切换,分库分表(未使用)记录

1、MyCat简单介绍

MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理(类似于Mysql Proxy),用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

Mycat关键特性:

-  支持SQL92标准
-  遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理
-  基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群
-  支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
-  基于Nio实现,有效管理线程,高并发问题
-  支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页
-  支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join
-  支持通过全局表,ER关系的分片策略,实现了高效的多表join查询
-  支持多租户方案
-  支持分布式事务(弱xa)
-  支持全局序列号,解决分布式下的主键生成问题
-  分片规则丰富,插件化开发,易于扩展
-  强大的web,命令行监控
-  支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉
-  支持密码加密
-  支持服务降级
-  支持IP白名单
-  支持SQL黑名单、sql注入攻击拦截
-  支持分表(1.6)
-  集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)

2、Mycat不适合的应用场景

-  设计使用Mycat时有非分片字段查询,请慎重使用Mycat,可以考虑放弃!
-  设计使用Mycat时有分页排序,请慎重使用Mycat,可以考虑放弃!
-  设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使用Mycat,可以考虑放弃!
-  设计使用Mycat时如果有分布式事务,Mycat并没有根据二阶段提交协议实现 XA事务,而是只保证 prepare 阶段数据一致性的 弱XA事务。得先看是否得保证事务得强一致性,否则请慎重使用Mycat,可以考虑放弃

详细介绍:https://blog.csdn.net/u013235478/article/details/53178657

3、安装MyCat实现读写分离

1、上传安装Mycat-server-1.6.5-release-20180122220033-linux.tar

2、解压安装包tar –zxvf  

3、配置schema.xml 和server.xml

4、客户端连接端口号: 8066

文件

说明

server.xml

Mycat的配置文件,设置账号、参数等

schema.xml

Mycat对应的物理数据库和数据库表的配置

rule.xml

Mycat分片(分库分表)规则

 

4、server.xml配置

<mycat:server xmlns:mycat="http://io.mycat/">

	<!--
		=======================================
	参数           说明
	user          用户配置节点
	name          登录的用户名,也就是连接Mycat的用户名。
	password      登录的密码,也就是连接Mycat的密码
	schemas       数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs
	privileges    配置用户针对表的增删改查的权限
	readOnly      mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false。
	=======================================
	-->
   

   <!-- 读写都可用的用户 -->
    <user name="root" defaultAccount="true">
        <property name="password">123456</property>
        <property name="schemas">mycat_testdb</property>

        <!-- 表级 DML 权限设置 -->
        <!--        
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>       
         -->
    </user>

    <!-- 只读用户 -->
    <user name="user">
        <property name="password">user</property>
        <property name="schemas">mycat_testdb</property>
        <property name="readOnly">true</property>
    </user>
	


</mycat:server>

5、schema.xml配置

配置文件

<mycat:schema xmlns:mycat="http://io.mycat/">


    <!-- TESTDB1 是mycat的逻辑库名称,链接需要用的 -->
	<!--
	name               逻辑数据库名,与server.xml中的schema对应
	checkSQLschema     数据库前缀相关设置,建议看文档,这里暂时设为folse
	sqlMaxLimit    select 时默认的limit,避免查询全表
	-->	
    <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
	
	
	
    <!-- database 是MySQL数据库的库名 -->
	<!--
	dataNode节点中各属性说明:
    name:指定逻辑数据节点名称;
    dataHost:指定逻辑数据节点物理主机节点名称;
    database:指定物理主机节点上。如果一个节点上有多个库,可使用表达式db$0-99,     表示指定0-99这100个数据库;
	-->		
    <dataNode name="dn1" dataHost="localhost1" database="test" />
	
	
    <!--
    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.212.202:3306" user="root" password="root">
            <!-- 可以配置多个从库 -->
            <readHost host="hostS2" url="192.168.212.203:3306" user="root" password="root" />
        </writeHost>
    </dataHost>
</mycat:schema>

schemaxml文件中配置dataHost的重要参数解释

1 属性

 <dataHost name="237_15" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"switchType="1"  slaveThreshold="100">

balance

的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:

writeType

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

slaveThreshold

近似的主从延迟时间(秒)Seconds_Behind_Master < slaveThreshold ,读请求才会分发到该Slave,确保读到的数据相对较新。

switchType 

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

2、标签

heartbeat标签

这个标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL可以使用select user(),Oracle可以使用select 1 from dual等。
这个标签还有一个connectionInitSql属性,主要是当使用Oracla数据库时,需要执行的初始化SQL
 
语句就这个放到这里面来。例如:altersession set nls_date_format='yyyy-mm-dd hh24:mi:ss'
 
1.4主从切换的语句必须是:showslave status

writeHost标签、readHost标签

这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。
 
唯一不同的是:writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。
 
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。
另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。

Mycat读写分离(负载均衡)、主从自动切换

  1. balance为1:让全部的readHost及备用的writeHost参与select的负载均衡。 
  2. switchType为2:基于MySQL主从同步的状态决定是否切换。 
  3. heartbeat:主从切换的心跳语句必须为show slave status
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="cloud" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
           
    </schema>
	<dataNode name="dn1" dataHost="localhost1" database="cloud" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>show slave status</heartbeat>
		<writeHost host="hostMaster" url="10.10.26.163:3306" user="root" password="admin123">
			<readHost host="hostSlave1" url="10.10.26.162:3306" user="root" password="admin123"/>
			<readHost host="hostSlave2" url="10.10.6.143:3306" user="root" password="admin123"/>
		</writeHost>
		<writeHost host="hostMaster1" url="10.10.6.143:3306" user="root" password="admin123">
		</writeHost>
     </dataHost>
    
</mycat:schema>

 

7、分表分库功能介绍

 MyCat支持10种分片策略

1、求模算法 2、分片枚举 3、范围约定 4、日期指定 5、固定分片hash算法 6、通配取模 7、ASCII码求模通配 8、编程指定 9、字符串拆分hash解析

schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
  
        <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100">
        <table name="haha" primaryKey="id"  dataNode="kevin_db" />
        <table name="heihei" primaryKey="id" dataNode="kevin_db,grace_db" rule="mycat-rule" />
        </schema>
          
<dataNode name="kevin_db" dataHost="Mycat-node" database="kevin" />
<dataNode name="grace_db" dataHost="Mycat-node" database="grace" />
  
    <dataHost name="Mycat-node" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="Mysql-node1" url="192.168.10.205:3306" user="root" password="123456">
             <readHost host="Mysql-node2" url="192.168.10.206:3306" user="root" password="123456">
             </readHost>
        </writeHost>
        <writeHost host="Mysql-node1" url="192.168.10.206:3306" user="root" password="123456">
        </writeHost>
    </dataHost>
  
</mycat:schema>

rule.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:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
  
    <tableRule name="mycat-rule">                <!-- heihei表分片的规则名,这里定义为mycat-rule,这个需要在schema.xml文件中引用 -->
        <rule>
            <columns>id</columns>                  <!--heihei表的分片列 -->
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
  
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">2</property>        <!-- count值与分片个数相同,这里heihei表分片到kevin库和grace库里,共2份。 -->
    </function>
</mycat:rule>

http://www.mycat.io/document/mycat-definitive-guide.pdf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值