使用mycat搭建mysql集群并实现分库分表,读写分离

一、什么是mycat

      mycat是一个开源的数据库中间件  ,它由阿里曾经的开源产品Cobar演变而来。mycat的核心功能是分库分表,可以将一个大表水平分割为N个小表,把数据库分成N个分片,存储在mysql服务器里或者其他数据库里,还可以实现读写分离,容灾备份等。

使用mycat搭建mysql集群并实现分库分表,读写分离_第1张图片

二、安装mycat并实现mysql分库分表

1.在两台或两台以上Linux服务器上安装mysql并启动(具体步骤省略,推荐mysql是5.5以上版本,启动后注意要设置远程登录权限)

2.mycat安装及启动

下载mycat安装包,下载地址:

https://github.com/MyCATApache/Mycat-download

第一步:将下载好的安装包上传到服务器


第二步:使用命令tar -zxvf Mycat-server-1.4-release-20151019230038-linux.tar.gz mycat将压缩包解压缩

第三步:进入mycat目录的bin目录,启动mycat


mycat的默认端口为:8066

3.mycat分片配置

(1)配置schma.xml

schma.xmls mycat中很重要的配置之一,管理mycat的逻辑库。逻辑表以及对应的分片规则等。

schema标签用于定义mycat实例的逻辑库,Table标签定义mycat中的逻辑表,rule用于指定分片规则,dataNode标签定义mycat中的数据节点,也就是数据分片,dataHost标签定义mycat具体的数据库实例,读写分离配置和心跳语句。

在已安装好mysql的2台服务器上分别创建数据库db1、db2

修改schema.xml如下:

writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

select user()

password="mysql密码">

writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

select user()

password="mysql密码">

(2)配置server.xml

server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。在system中添加UTF-8字符集设置,否则存储中文会出现问号

utf8

修改user的配置,可修改用户名,密码等(注意schema的属性值要与schema配置文件中一致)

test

TESTDB

123456

TESTDB

4.mycat分片测试

(1)使用Navicat for MySQL工具连接到mycat


使用mycat搭建mysql集群并实现分库分表,读写分离_第2张图片

进入到mycat,执行以下语句创建一个表:

CREATE TABLE tb_test (

  id BIGINT(20) NOT NULL,

  title VARCHAR(100) NOT NULL ,

  PRIMARY KEY (id)

) ENGINE=INNODB DEFAULT CHARSET=utf8

插入一些数据:

INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'data1');

INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'data2');

INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'data3');

INSERT INTO TB_TEST(ID,TITLE) VALUES(4,'data4);

注意:如果报错ERROR 3009 (HY000):Java.lang.IllegalArgumentException: Invalid DataSource:0 ,按下面的解决方案解决:

把mysql中的mysql.user表中的root 用户的 host改为%后,重启mysql,mycat连接后就可以操作表了。

我们会发现这些数据被写入到第一个节点中了,那么怎样才能把数据写入到第二个节点呢?插入下面的数据就可以插入到第二个节点了

INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'data5000001');

INSERT INTO TB_TEST(ID,TITLE) VALUES(5000002,'data5000002');

因为我们采用的分片规则是每节点存储500万条数据,所以当ID大于5000000则会存储到第二个节点上,分片规则在rule.xml文件中配置

在rule.xml中找到

id

rang-long

接着找rang-long的定义

class="org.opencloudb.route.function.AutoPartitionByLong">

autopartition-long.txt

再打开autopartition-long.txt,可以看到这里配置了数据范围

# range start-end ,data node index

# K=1000,M=10000.

0-500M=0

500M-1000M=1

1000M-1500M=2

上面的分片规则适用于主键id是连续的数字,有的表主键是字符串,并不是连续的数字,上面的规则就不适用了。可以使用一致性哈希murmur,将数据平均分在几个分片中,也是在schema文件中进行配置,也比较简单,这里不再叙述。

三、数据库读写分离

对于互联应用来说,数据库的访问量很大,进行读写分离很有必要。实现数据库读写分离,当主节点发生宕机时,还能从从节点查询到数据。mycat基于mysql的主从模式可实现读写分离,一个写节点Master后面跟着多个读节点,当执行增删改操作时向主节点发起请求,执行查询操作时向从节点发起请求,主节点数据发生改变后,基于mysql的主从复制模式,数据会自动同步到从节点。


使用mycat搭建mysql集群并实现分库分表,读写分离_第3张图片

配置mycat开启读写分离,也是在schema.xml中进行配置,hostM1主节点与hostS1、hostS2从节点组成了一主二从的读写分离模式,参数balance决定了哪些mysql服务器参与到读sql的负载均衡中,0为不开启读写分离

writeType="0" dbType="mysql" dbDriver="native">

select user()

/>

/>

你可能感兴趣的:(使用mycat搭建mysql集群并实现分库分表,读写分离)