MyCat中间件高可用、读写分离、分片、主从切换、ER分片

mysql实现了主从数据自动同步,如果主服务器故障,应用程序怎么切换到非故障服务器? mysql不会自动切换;要中间件做。

mycat:数据库中间件,可以实现高可用(解决数据量太大,高并发等问题)

功能:实现主从节点自动切换(一个节点故障时可以切换到其他节点);读写分离;数据分片

具体实现:

(1)首先安装好jdk,mycat

(2)虚拟机切换到mycat文件夹下的bin文件夹

 ./mycat start开启服务

然后查看状态./mycat status

经常运行mycat:加到profile路径中:

vi /etc/profile

在文档最后,添加一行:

export PATH=/home/mycat/bin:$PATH

wq存盘退出;

输入命令:source /etc/profile,使得配置文件生效

然后直接在任何一个目录下,都可以操作mucat命令

比如输入mycat status、mycat start等等

mycat端口 :8066

mysql -uroot -p123456 -P8066 -h192.168.126.151

密码保存在server.xml中

server.xml在/mycat/conf/server.xml

(3)修改server.xml和schema.xml,进行一些配置

server.xml修改,这里是前端的应用程序连接mycat需要配置的

这里我定义用户名为root,密码为123456,连接mycat后,显示的逻辑数据库名称为FakeEasymall

<user name="root">
        <property name="password">123456</property>
        <property name="schemas">FakeEasymall</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>

配置前端对应的逻辑数据库后,mycat需要配置与之对应的真正的数据库

在schema.xml文件中,修改以下信息

checkSQLschema="false"这个参数说明前端sql查询中要不要带上FakeEasymall,false就不用带上。

这里我们定义逻辑数据库FakeEasymall中有一个表book031,并且真正数据配置在节点dn1,dn2上面

而dn1配置在localhost1集群中,dn2就配置在localhost2集群中,

并且说明真正数据库名称为easymall

每个集群可以有多个服务器节点,可以有专门写和读的节点

在集群localhost1中定义了心跳机制hearbeat,用于不断向集群节点发出请求,检测节点是否故障。

同时定义了一个写节点,IP地址是192.168.218.134

<schema name="FakeEasymall" checkSQLschema="false" sqlMaxLimit="100">
		<table name="book031" dataNode="dn1,dn2" rule="custom-sharding-long" />

	</schema>
	<dataNode name="dn1" dataHost="localhost1" database="easymall" />
	<dataNode name="dn2" dataHost="localhost2" database="easymall" />
	
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="192.168.218.134:3306" user="root"
				   password="123456">
		</writeHost>
	</dataHost>
	<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM2" url="192.168.218.135:3306" user="root"
				   password="123456">
		</writeHost>
	</dataHost>

(4)修改完后,重启mycat

mycat restart

并查看状态mycat status

(5)测试mycat的运行

使用sqlyog连接mycat这个数据库,连接的用户名和密码就是server.xml里面配置的。

连接成功后,就可以看到fakeEasyMall

然后在192.168.218.134的节点中对easymall中的表book031插入数据,那么在mycat中查询book031后,发现数据也增加了相同的数据,至此,就实现了mycat的中间件功能,当应用程序发出sql请求时,由mycat决定从哪个节点获取和修改数据。

下面实现MyCat高可用故障转移(双机热备)

 writeHost:只能是主节点;主要负责写;

多个writeHost:发生故障,自动转移;

mysql双向主从复制:仅是实时备份数据;并不是自然高可用,还要中间件mycat支持

双机热备高可用:首先要配置好双向主从复制; 

如果SwitchType=-1,则不支持;down掉第一个;读写:出错

下面实现2个写节点主从复制,mycat自动切换故障节点

这里必须一个集群里面要有2个写节点 ,然后参数switchtype等于1说明自动切换

然后一个节点垮了会自动切换到另外一个

这里记得2个写节点的名称不能一样,分别为hostM1,hostM2

mycat通过心跳机制判断节点是否宕机,然后进行自动切换

这里主从复制,那么2个写节点的数据都是相同的,因此,mycat进行查询获取数据,是随机选择一个节点进行查询的,并记录当前已经读到这个节点。

读写分离

 直接在writehost里面嵌套多个readhost节点

参数设置:

(1)switchType = -1; //不故障转移,变为1则进行转移

(2)writeType:0:所有写操作在第1个writehost中完成

   writeType :1  //随机写;1.6以上新版本不用,但兼容 ;写:一般在一台服务器上做;否则网络临时有问题,同步不了;会有一致性问题(同时写某张表的某记录);写操作很大:分片;

查看版本:select version();

(3)balance:控制读的逻辑,配合writeType=0实现

0:不开启读写分离;所有读在第1个writehost中进行

1:开启读写分离;大部分读在除了第一个writehost之外读;除非其它主机读线程全满了(并发量超大),才会到第一个writehost读

2:所有读操作,在所有的writehost和readhost中随机进行

3:所有读操作,在readhost中完成。如果集群中没有配置readhost,都到第一个writehost中完成

合理的方式:一般blance可以配置为1;writetype=0;switchType=1

分配多个从节点;进行读;readHost:只能负责读;可以是主、从。

下图就是一个经典的集群localhost

数据分片(水平分片)

 首先必须dataNode需要超过2个节点,这样才有考虑分片,分片规则为rule参数的设定

rule属性:计算分片的逻辑;默认值是auto-sharding-long

auto-sharding-long的实现在rule.xml里面配置:

autopartition-long.txt中定义:根据整数id分片;0-500W;500-1000W;1000W-1500W;1,2,3分片;:默认是3分片,我们按需修改 

我们也可以自己定义分片规则,不是根据id分片,那么修改rule的值为custom-sharding-long

<schema name="FakeEasymall" checkSQLschema="false" sqlMaxLimit="100">
        <table name="book031" dataNode="dn1,dn2" rule="custom-sharding-long" />

    </schema>
    <dataNode name="dn1" dataHost="localhost1" database="easymall" />
    <dataNode name="dn2" dataHost="localhost2" database="easymall" />
    
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="192.168.218.134:3306" user="root"
                   password="123456">
        </writeHost>
    </dataHost>
    <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM2" url="192.168.218.135:3306" user="root"
                   password="123456">
        </writeHost>
    </dataHost>

相应的,在rule.xml文件中,我们也要定义分片规则

<tableRule name="custom-sharding-long">
        <rule>
            <columns>book_id</columns>
            <algorithm>custom-rang-long</algorithm>
        </rule>
    </tableRule>

<function name="custom-rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function> 

以上都是采用auto-shrading-long: 分片按照长整型; 不能按照字符串分片

如果按照字符串分片,字符串等主键用:sharding-by-murmur: hash一致性; 分片

 下面讲解特殊的分片多张分片表关联关系的确定

(1)全局表

t_product商品表; 数据量大

t_category: 商品类别表;数据量小;变化不大;非分片

连接查询:查询商品信息以及在哪个分类;select t_product.id, t_product.t_name, t_category.id from t_product INNER JOIN t_category on t_product.cid=t_category.id

这种情况我们就设置t_category为全局表,每个节点都有相同信息,即一个表对应多个分片;不需要设置rule规则,则为全局表

在schema..xml配置如下

(2)ER分片表:跨库操作:影响效率;

t_order:订单表

t_order_item:订单明细表

2个表都很大;都要分片; 不能用全局表;

一个订单对应多个订单明细;

schema.xml实现

<table name="t_order" primaryKey="id" dataNode="dn1,dn2" rule="sharding-by-murmur">

        <childTable name="t_order_item" primaryKey="id" joinKey=" order_id " parentKey="id"/>

</table>

joinKey: 从表的字段;外键

parentKey: 主表的字段;主键

最后总结一下mycat结合mysql实现主从复制

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值