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

一、什么是mycat

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

二、安装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如下:

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://org.opencloudb/">

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">

<!-- auto sharding by id (long) -->

<table name="tb_test" dataNode="dn1,dn2" rule="auto-sharding-long" />

</schema>

<dataNode name="dn1" dataHost="localhost1" database="db1" />

<dataNode name="dn2" dataHost="localhost2" database="db2" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"

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

<heartbeat>select user()</heartbeat>

<!-- can have multi write hosts -->

<writeHost host="hostM1" url="换成你的mysql服务器1的ip:3306" user="mysql用户名"

password="mysql密码">

<!-- can have multi read hosts -->

</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>

<!-- can have multi write hosts -->

<writeHost host="hostM1" url="换成你的mysql服务器2的ip:3306" user="mysql用户名"

password="mysql密码">

<!-- can have multi read hosts -->

</writeHost>

</dataHost>

</mycat:schema>

(2)配置server.xml

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

<property name="charset">utf8</property>

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

<user name="test">

<property name="password">test</property>

<property name="schemas">TESTDB</property>

</user>

<user name="root">

<property name="password">123456</property>

<property name="schemas">TESTDB</property>

</user>

4.mycat分片测试

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


进入到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中找到

<tableRule name="auto-sharding-long">

<rule>

<columns>id</columns>

<algorithm>rang-long</algorithm>

</rule>

</tableRule>

接着找rang-long的定义

<function name="rang-long"

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

<property name="mapFile">autopartition-long.txt</property>

</function>

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

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"

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

<heartbeat>select user()</heartbeat>

<!-- can have multi write hosts -->

<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">

<!-- can have multi read hosts -->

<readHost host="hostS1" url="localhost2:3306" user="root" password="123456"

/>

<readHost host="hostS2" url="localhost3:3306" user="root" password="123456"

/>

</writeHost>

</dataHost>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容