mycat实现的mysql的读写分离

  mycat是一个是个中间件,可以用作进行mysql的读写分离、数据分片以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施,让架构具有很强的灵活性和扩展性,
  mycat的智能优化模块,系统的数据访问一目了然,可以根据统计的数据分析,自动或手动调整后端存储,将不同的表映射到不通的存储引擎上。
  Mycat是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而Mycat并没有存储引擎,所以并不是完全意义的分布式数据库系统。

mycat应用场景:
1. 单纯的读写分离,支持读写分离,主从切换;
2. 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;
3. 多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;
4. 报表系统,借助于Mycat的分表能力,处理大规模报表的统计;
5. 替代Hbase,分析大数据;
6. 作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,
此时Mycat可能是最简单有效的选择。

mycat的读写分离建立在mysql主从复制已经做好的情况之下。

安装mycat:
1. 首先需要配置java环境。
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

mv mycat /usr/local/

vim /etc/profile
export PATH=/usr/local/mycat/bin:$PATH

2. 创建mycat的管理用户,授权访问MyCAT的用户账号和授权信息,在修改server.xml
主库上:grant all privileges on *.* to 'mycat'@'192.168.3.111' identified by '123456';
        grant all privileges on *.* to 'mycat'@'%' identified by '123456';
从库上(只需要select权限即可):grant select on *.* to 'mycat'@'192.168.2.235' identified by '123456';

3. 修改mycat配置文件server.xml
 在</system>段配置主库的用户密码:  
     <user name="mycat">
            <property name="password">123456</property>
            <property name="schemas">test3</property>
     </user>
在server.xml配置连接主库的用户,这块的用户需要有增删改查权限。这里的test3,不需要是真实的库名,可任意指定。
但是需要跟schema.xml配置文件的库名统一即可。

4. 修改schema.xml文件:  
 <schema name="test3" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
 </schema>      <!-- 这里的test3必须要和server.xml里面的库名相同-->

 <dataNode name="dn1" dataHost="localhost1" database="test2" />   <!--这里只需要修改database为真的数据库名字即可-->
 <dataNode name="dn2" dataHost="localhost1" database="test2" />
 <dataNode name="dn3" dataHost="localhost1" database="test2" />

 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
  <!-- 修改 balance=”1″ writeType=”0″ switchType=”1″
   balance=0 不开启读写分离机制,所有读操作都发送到当前可用的writehostle .
   balance=1 全部的readhost与stand by writeHost 参与select语句的负载均衡。简单的说,双主双从模式(M1àS1,M2àS2,并且M1和M2互为主备),正常情况下,M1,S1,S2都参与select语句的复杂均衡。
   balance=2 所有读操作都随机的在readhost和writehost上分发
   
   writeType负载均衡类型,目前的取值有3种:
   writeType=”0″, 所有写操作发送到配置的第一个writeHost。
   writeType=”1″,所有写操作都随机的发送到配置的writeHost。

   writeType=”2″,不执行写操作   

   switchType
   switchType=-1 表示不自动切换
   switchType=1 默认值,自动切换
   switchType=2 基于MySQL 主从同步的状态决定是否切换
   -->
 <heartbeat>select user()</heartbeat>
 <!-- can have multi write hosts -->
 <writeHost host="master" url="192.168.3.111:3306" user="mycat" password="123456">
 <!-- can have multi read hosts -->
 <readHost host="slave" url="192.168.2.235:3306" user="mycat" password="123456" />
 </writeHost>
 </dataHost>
 
5. 启动mycat
 mycat console (控制台启动) 或者 mycat start
1)控制台启动出现:jvm 1    | MyCAT Server startup successfully. see logs in logs/mycat.log  即ok。
2)start启动查看8066和9066端口是否监听。 

报错:
Exception thrown by the agent : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHo
stException: bogon: bogon: Name or service not known
解决:在/etc/hosts里面添加本机的主机名。
--------------------------------------------------------------------------------------------------------------------------------------------------
schema.xml文件的部分详解
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <!-- 需要分片的表,在节点dn1,dn2上分片,分片规则是auto-sharding-long -->
        <table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" />
        <table name="company" primaryKey="ID" dataNode="dn2,dn1" rule="mod-long"/>
        <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
        <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2" rule="mod-long" />
        <table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />
        <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>
            <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />
        </table>
    </schema>
    <dataNode name="dn1" dataHost="201.liberalman.cn" database="db1" />
    <dataNode name="dn2" dataHost="202.liberalman.cn" database="db2" />
    <dataHost name="201.liberalman.cn" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <!-- 心跳包 -->
        <heartbeat>select user()</heartbeat>
        <!-- 后端mysql配置 -->
        <writeHost host="hostM1" url="localhost:3306" user="socho" password="Looks137"></writeHost>
    </dataHost>
    <dataHost name="202.liberalman.cn" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

        <!-- 心跳包 -->
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="localhost:3306" user="socho" password="Looks137"></writeHost>
    </dataHost>
</mycat:schema>
上面配置的是连接后端mysql的配置,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值