目录
Linux+MySQL+MyCat实现读写分离,主从同步的解决方案
前言
在项目建设过程中,根据项目业务需求考虑到数据量大、复杂,且需要承受巨大的访问量(在项目中使用关系型数据库RDBMS,MySQL)。一般情况下,如果采用传统的Master-Slave复制模式,此时的数据库服务器的压力承载量受限于Master数据库服务和其负载量。
所以,采用了分库分表方法,将其服务能力和负载量进行横向扩展,并且选择了 PartitionByPattern分表的策略(注:在进行分表时,根据自身业务需求选择合适的分表策略,将会大大提高分表的效果,当然,如果分表策略选择不当,可能会导致分表后的出现冷热数据的情况,达不到预期的效果,这个就需要Team-Leader来衡量了)。本文主要实现,在Linux系统中实现MySQL的分库分表,通过MyCat数据库中间件来实现!
前面对MyCat进行了详细的全方位的介绍,这儿就不再做详细的介绍了,可以点击下列连接翻阅查看,如下:
Linux+MySQL+MyCat实现读写分离,主从同步的解决方案
一、Linux下MySQL数据库服务的安装与部署
参考博主的另一篇文章进行《基于MySQL Yum存储库在Linux-7.2上安装MySQL-5.7.21数据库服务》
二、下载Linux MyCat
CSDN 下载:【Linux MyCat+文档下载】
官网下载:【MyCat官网下载】
三、上传Linux服务器,并解压
Linux下输入指令:tar -zxvf
并移动到本地目录:mv mycat /usr/local/
[root@localhost software]# tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
[root@localhost software]# mv mycat /usr/local/
四、MyCat主要的配置文件概述
MyCat配置文件:/usr/local/mycat/conf
如下图:
说明:
配置文件 | 说明 |
---|---|
schema.xml | Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。 |
server.xml | server.xml几乎保存了所有mycat需要的系统配置信息。其在代码内直接的映射类为SystemConfig类。 |
rule.xml | rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标签。 |
描述:
将需要进行分片的表分别存储到三个数据节点上,这儿为了便于进行测试,准备三个MySQL数据库实例即可,这儿就创建几个测试库。
* 注意:如果是Linux版本的MySQL服务器,在配置MyCat分片之前,还需要配置MySQL的大小写,否则为存在找不到表的问题,在MySQL的配置文件 “vi /etc/my.cnf”中新增一行配置 “lower_case_table_names = 1”,如下:
五、创建据库实例
在本文章中,主要未来演示分库分表的效果,通过创建三个数据库实例来实现(三个实例中均没有数据表),在实际的项目部署过程中,一个数据库实例对应了一个实际的MySQL数据库服务。创建好后,如下图:
六、配置逻辑库
在 server.xml配置文件的末尾处配置一个MyCat的逻辑库名称,如果一个用户需要访问数据库中的数据,则直接通过该名称即可实现访问,如下图:
具体内容如下:
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">b2c_aiyou</property>
<property name="defaultSchema">b2c_aiyou</property>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
<!-- 表级 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">b2c_aiyou</property>
<property name="readOnly">true</property>
<property name="defaultSchema">b2c_aiyou</property>
</user>
七、配置数据库节点
在 schema.xml配置文件配置实际的数据库节点,数据库连接地址,用户名密码等。如下图:
具体内容如下:
<schema name="b2c_aiyou" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
<!-- auto sharding by id (long) -->
<!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置-->
<table name="tb_item,tb_item_cat,tb_item_desc" dataNode="dn1,dn2,dn3" rule="b2c_auto_id" splitTableNames ="true"/>
<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
/> -->
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="b2c_aiyou_data_host" database="b2c_aiyou_01" />
<dataNode name="dn2" dataHost="b2c_aiyou_data_host" database="b2c_aiyou_02" />
<dataNode name="dn3" dataHost="b2c_aiyou_data_host" database="b2c_aiyou_03" />
<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
<dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />
<dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
<dataHost name="b2c_aiyou_data_host" 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="192.168.159.128:3306" user="root"
password="Huazai12345!">
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
八、配置分库分表的规则
在 rule.xml配置文件中,配置相关规则,如下图:
具体内容如下:
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="b2c_auto_id">
<rule>
<columns>id</columns>
<algorithm>b2c_aiyou_item_id</algorithm>
</rule>
</tableRule>
定义的规则函数内容如下:
<function name="b2c_aiyou_item_id"
class="io.mycat.route.function.PartitionByPattern">
<property name="patternValue">3072</property>
<property name="mapFile">b2c_aiyou_item_id.txt</property>
</function>
如果需要配置其它规则,可以在源码包中找到,如下图:
下载地址:【Mycat 2-1.06 源码包CSDN下载】
在当前目录下,也就是 MyCat的 conf目录下,新增 b2c_aiyou_item_id.txt规则定义文件,并且授权 “ chmod 777 b2c_aiyou_item_id.txt” 的最高权限,添加如下内容:
0-1023=0
1024-2047=1
2048-3072=2
九、测试分库分表八步走(天龙八步)
第一步,启动MyCat Server,进入 MyCat的bin目录下,输入指令 “ ./mycat start ”
当然,还有其它:
./mycat { console | start | stop | restart | status | dump }
第二步,连接到 MyCat Server,需要注意的是,MyCat的默认端口为8066,连通后如下图:
连接成功后,是没有任何数据表的,如下图:
第二部,在MyCat服务上,创建一个测试的数据表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tb_item
-- ----------------------------
DROP TABLE IF EXISTS `tb_item`;
CREATE TABLE `tb_item` (
`ID` int(11) NOT NULL,
`NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
第三步,向MyCat上的tb_item表插入数据(确保每个库中的tb_item表中一条数据,根据上面配置的rule规则范围来添加)
在Linux服务器上,直接通过指令连接到MyCat服务器,输入如下指令:
[root@localhost conf]# mysql -uroot -p123456 -h192.168.159.128 -P8066 -Db2c_aiyou
连接到MyCat服务器后,可以通过指令 “ show databases; ” 看到,在上面配置的schema.name 为 b2c_aiyou,如下图:
当然如果要查看方才创建的tb_item表,则可以通过指令 “ show tables; ” 查看咯,
第四步,向MyCat服务中的tb_item表插入三条数据,id的定义,可以根据配置rule.xml中的id分配规则,确保三个库中都有一条数据,方便更直观的查看MyCat分表是否成功咯,
insert into tb_item(id,name) values(1001,'huazai');
insert into tb_item(id,name) values(1598,'wangwu');
insert into tb_item(id,name) values(98291,'zhangsan');
第五步,查看MyCat服务上的tb_item表中数据是否插入成功,数据查询指令 “ select * from tb_item; ” ,如下图:
第六步,查看MySQL服务上的每个数据库中tb_item表中的数据,即b2c_aiyou_01~03.tb_item,
通过如下指令连接到MySQL数据库服务
[root@localhost conf]# mysql -uroot -pHuazai12345! -h192.168.159.128 -P3306
查看测试的数据库实例,如下图:
查看每个库下tb_item表中的数据,通过指令 “ select * from b2c_aiyou_01~03.tb_item; ”,如下图:
第七步,小技巧-》更快捷的查询方法,不用像查询输入查询指令那样,这么麻烦,通过Navicat工具来查询,一条查询语句,然后在数据库栏的下拉列表中选择相应的数据库,即可查询了,如下图:
第八步,收尾管理
庆祝自己,通过不懈的努力,终于一步一的,在Linux下通过MyCat数据库中间件实现了分库分表了,给自己点掌声!!!
参考文献:
MyCat官网:【MyCat官方网站】
GitHub:【MyCATApache】
Issues:【Mycat-Server-issues】
MyCat指南:【MyCat指南CSDN】
好了,关于 Linux+MySQL+MyCat实现分库分表,通过MyCat数据库中间件实现分库分表配置实战 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。
作 者: | 华 仔 |
联系作者: | who.seek.me@java98k.vip |
来 源: | CSDN (Chinese Software Developer Network) |
原 文: | https://blog.csdn.net/Hello_World_QWP/article/details/105662439 |
版权声明: | 本文为博主原创文章,请在转载时务必注明博文出处! |