MyCAT实现MySQL的读写分离、主从切换、分库分表

       在进行mycat的读写分离,主从切换操作之前,需要先进行mysql的主从复制,详情请参考此处,请戳我~     接下来在参考网上资料和自己动手实践的基础上,给出mycat的操作过程,希望能帮到大家~  

第一步 Mycat或者Mycat-eye(非必需)安装

   Mycat-eye是一款可视化的Mycat web管理工具,Mycat或者Mycat-eye下载官网地址:http://dl.mycat.io/,值的注意的是:Mycat和Mycat-eye是有版本关联的,如果你想要安装Mycat-eye,尽量下载Mycat的版本低于1.6.6-RELEASE,否则容易出现一种现象,在Mycat-eye中加入需要管理的Mycat的时候,会一直显示loading状态。Mycat-eye只不过是一种管理界面化而已,相对于命令而言,这种比较直观,便于管理和使用。

# tar -zvxf Mycat-server-1.6.5-RELEASE-20161028204710-linux.tar.gz
# 进入bin目录中,执行命令
# ./mycat status   #查看启动状态
# ./mycat start    #启动mycat
# ./mycat stop     #关闭mycat

为了方便排查mycat启动和运行问题,可以进入 logs目录
wrapper.log          跟踪启动情况
mycat.log            跟踪运行情况

Mycat-eye安装步骤如下:

1、安装zookpeeper

tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local/
cd /usr/local/zookeeper-3.4.6/
cd conf
cp zoo_sample.cfg zoo.cfg

cd /usr/local/zookeeper-3.4.6/bin/
./zkServer.sh start 

2、安装mycat eye
tar -xvf Mycat-web-1.0-SNAPSHOT-20160331220346-linux.tar.gz -C /usr/local/
如果zookpeerer不是和mycat-eye安装在同一台机器,必须修改zookeeper地址:
cd /usr/local/mycat-web/mycat-web/WEB-INF/classes
vim mycat.properties
zookeeper=zookeerper安装IP地址:2181

cd /usr/local/mycat-web/
./start.sh &

       mycat-eye在使用的过程中发现一直都残留过去的信息,导致新信息无法正常操作,建议重启mycat-eye,mycat-eye也比较好操作,只要添加mycat的基本信息配置就可,然后在监控mycat的运行。简单总结下:凡是有不知道的问题,重启mycat-eye就行了,输出jps, kill -9 对应jar的进程id即可,在重启,完美~

注意:在三大管理中,mycat服务管理,mycat-VM管理,Mysql管理都能访问,但是,mycat-VM管理貌似只能Mycat eye和mycat安装在同一台机子才能成功访问,跨主机安装一直都有no router to the host异常返回。其他能跨越不同主机访问。

第二步 了解mycat配置,本文只列出个人觉得比较重要的配置,如要很详细的学习,可以参考官网的mycat学习手册

1、server.xml文件来配置连接MyCat的用户及权限等

=======================================

参数            说明

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

======================================

- server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息。
- 逻辑库名(如上面的mycat,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!
- 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!

2、schema.xml是最主要的配置项,此文件关联mysql读写分离策略
balance的取值决定了负载均衡对非事务内的读操作的处理,balance 属性负载均衡类型,目前的取值有 4 种:

balance="0":      不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上。
balance="1"
:      读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡
balance="2"
:      读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、 readhost 上分发。
balance="3"
:      读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到 wiriterHost 对应的 readhost 执行, writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

writeType 属性,负载均衡类型,目前的取值有 3 种

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

主从切换(双主failover):switchType 属性

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

heartbeat标签

这个标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL可以使用select user(),Oracle可以使用select 1 from dual等。
主从切换的语句必须是:showslave status

第三步 Mycat读写分离(负载均衡)、主从自动切换,分库分表

配置如下:

<?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>select user()</heartbeat> -->
		<heartbeat>show slave status</heartbeat>
        <writeHost host="Mysql-node1" url="10.200.132.51:3306" user="root" password="Mysqltest@123098">
             <readHost host="Mysql-node2" url="10.200.132.45:3306" user="root" password="tjfQQ@123!">
             </readHost>
        </writeHost>
        <writeHost host="Mysql-node3" url="10.200.132.45:3306" user="root" password="tjfQQ@123!">
        </writeHost>
    </dataHost>
</mycat:schema>

schema.xml配置主从,读写分离等

......

	<user name="root" defaultAccount="true">
		<property name="password">tjfQQ@123!</property>
		<property name="schemas">mycat</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</property>
		<property name="readOnly">true</property>
	</user>

</mycat:server>

server.xml 配置可以访问的用户

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

rule.xml中可以自定义分片规则
       在上面的配置中,一定要注意各个元素的添加位置,比如,schema.xml中 ,元素<schema>要放在一起,不能放在后面。至于运行结果展示,本文就不一一列举啦。如有问题,欢迎沟通~ 。

        为了方便跟踪运行情况,证实配置的有效性,可以进入mcyat 的conf目录中,vim log4j2.xml,修改日志输出级别:默认是info级别。

<asyncRoot level="debug" includeLocation="true">
            <!--<AppenderRef ref="Console" />-->
            <AppenderRef ref="RollingFile"/>
 </asyncRoot>

       以上配置达到的效果就是10.200.132.51为主库,10.200.132.45为从库。注意:要保证10.200.132.51和10.200.132.45机器能使用root/password权限成功登录mysql数据库。同时,也一定要授权mycat机器能使用root/password权限成功登录这两台机器的mysql数据库!!这很重要,否则会导致登录mycat后,对库和表操作失败!

        根据上面的balance =1 , writeType=0,switchType=1 配置,在结合运行日志可以得出:
1、select 语句查询会随机分发到Mysql-node1和Mysql-node2上;2、insert,update,delete被分发到了Mysql-node1上;3、 将10.200.132.51 主库关闭,执行select,insert发现仍能成功,此时发现请求被分发到了Mysql-node3上,说明,主从切换成功;4、insert  系列数据,发现主键id对2取模,能够被分发到不同的库(同主机同库分表,不同主机分库分表)中。

       本文是一主一从是最简单的结构配置,MyCat支持双主多从,如果有N个主,那么就配置N个writeHost兄弟节点;如果有M个从节点,那么就配置M个readHost节点即可。 也可以有多台MySQL服务器,或者SQL Server、Oracle等,配置多个dataHost节点就可以。

发布了100 篇原创文章 · 获赞 300 · 访问量 68万+

猜你喜欢

转载自blog.csdn.net/win7system/article/details/89520554