1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

时间:2018-11-16 10:52:11

相关推荐

MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

什么是MYCAT:

一个彻底开源的,面向企业应用开发的大数据库集群

支持事务、ACID、可以替代MySQL的加强版数据库

一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群

一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server

结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

一个新颖的数据库中间件产品

Mycat关键特性 :

支持SQL92标准

遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。

基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。

支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster

基于Nio实现,有效管理线程,高并发问题。

支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。

支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。

支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。

支持多租户方案。

支持分布式事务(弱xa)。

支持全局序列号,解决分布式下的主键生成问题。

分片规则丰富,插件化开发,易于扩展。

强大的web,命令行监控。

支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。

支持密码加密

支持服务降级

支持IP白名单

支持SQL黑名单、sql注入攻击拦截

支持分表(1.6)

集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。

(官方说明参考:Mycat 数据库分库分表中间件)

JDK 下载(建议要求jdk7及以上):

/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html

Linux x86 147.68 MBjdk-7u80-linux-i586.tar.gz

MyCAT 相关:

Mycat 捐赠地址:http://www.mycat.io/donate.html

Mycat 官斱网站:http://www.mycat.io/

Mycat 源码:/MyCATApache/Mycat-Server

Mycat 下载地址:/MyCATApache/Mycat-download

既然 mycat 那么强大,那就测试看看:

#测试环境:

# 有3张表 users,item,item_detail (item 的子表) 和 3 个数据库 db01,db02,db03

# 表 users 存储在数据库 db01, 表 item 和 item_detail 分布存储在数据 db01 和 db02

# 现在在3个数据库都创建相同的表

[sql]view plaincopycreatedatabasedb01; createdatabasedb02; createdatabasedb03; CREATETABLEusers( idINTNOTNULLAUTO_INCREMENT, namevarchar(50)NOTNULLdefault'', indateDATETIMENOTNULLdefault'0000-00-0000:00:00', PRIMARYKEY(id) )AUTO_INCREMENT=1ENGINE=InnoDBDEFAULTCHARSET=utf8; CREATETABLEitem( idINTNOTNULLAUTO_INCREMENT, valueINTNOTNULLdefault0, indateDATETIMENOTNULLdefault'0000-00-0000:00:00', PRIMARYKEY(id) )AUTO_INCREMENT=1ENGINE=InnoDBDEFAULTCHARSET=utf8; CREATETABLEitem_detail( idINTNOTNULLAUTO_INCREMENT, valueINTNOTNULLdefault0, namevarchar(50)NOTNULLdefault'', item_idINTNOTNULL, PRIMARYKEY(id), key(item_id) )AUTO_INCREMENT=1ENGINE=InnoDBDEFAULTCHARSET=utf8;

# JDK 安装配置

[plain]view plaincopycd/usr/local/src tarxvfjdk-7u80-linux-i586.tar.gz mkdir-p/usr/local/java mv/usr/local/src/jdk1.7.0_80/usr/local/java/ chown-Rroot:root/usr/local/java cd/usr/local/java/

#配置环境变量

[plain]view plaincopyvi/etc/profile vi~/.bash_profile exportJAVA_HOME=/usr/local/java/jdk1.7.0_80 exportPATH=$PATH:$JAVA_HOME/bin exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

#设置生效(最好重启系统)

[plain]view plaincopysource/etc/profile source~/.bash_profile

#测试是否安装成功[plain]view plaincopy[root@server1~]#java-version javaversion"1.7.0_80" Java(TM)SERuntimeEnvironment(build1.7.0_80-b15) JavaHotSpot(TM)ClientVM(build24.80-b11,mixedmode)

# Mycat 安装配置

[plain]view plaincopycd/usr/local/src tarxvfMycat-server-1.5.1-RELEASE-040517-linux.tar.gz mv/usr/local/src/mycat/usr/local/ groupaddmycat useradd-gmycatmycat passwdmycat chown-Rmycat.mycat/usr/local/mycat

#添加环境变量

[plain]view plaincopyvi/etc/profile vi~/.bash_profile exportMYCAT_HOME=/usr/local/mycat

#设置生效(最好重启系统)

[plain]view plaincopysource/etc/profile source~/.bash_profile

#服务器名和IP绑定

[plain]view plaincopyvi/etc/hosts 192.168.100.50server1 127.0.0.1server1

# 设置 mand 的java 路径

( 同时可设置-Xmx 和-Xms ,参考:mycat 启动失败 The specified size exceeds the maximum representable size)

[plain]view plaincopyvi/usr/local/mycat/conf/wrapper.conf mand=%JAVA_HOME%/bin/java

#配置 server.xml 和 schema.xml (本案例配置信息在文章底部)

[plain]view plaincopyvi/usr/local/mycat/conf/server.xml vi/usr/local/mycat/conf/schema.xml

#启动mycat服务 ./mycat{ console | start | stop | restart | status | dump }

[plain]view plaincopy/usr/local/mycat/bin/mycatconsole

[plain]view plaincopy#mycat进程 ps-ef|grepmycat #日子信息 tail-20/usr/local/mycat/logs/wrapper.log

测试:

#访问 mycat (凭据参考 /usr/local/mycat/conf/server.xml)

[plain]view plaincopymysql-utest-ptest-h127.0.0.1-P8066-DTESTDB

[sql]view plaincopymysql>showdatabases; +----------+ |DATABASE| +----------+ |TESTDB| +----------+ mysql>showtables; +------------------+ |TablesinTESTDB| +------------------+ |item| |item_detail| |users| +------------------+

#在 mycat 中插入数据并查询:[sql]view plaincopyinsertintousers(name,indate)values('kk',now()); insertintoitem(id,value,indate)values(1,100,now()); insertintoitem_detail(value,name,item_id)values('pad',40,1); insertintoitem_detail(value,name,item_id)values('phone',50,1); insertintoitem(id,value,indate)values(999,100,now()); insertintoitem_detail(value,name,item_id)values('pad',40,999); insertintoitem_detail(value,name,item_id)values('phone',50,999);[sql]view plaincopymysql>select*fromusers; +----+------+---------------------+ |id|name|indate| +----+------+---------------------+ |1|kk|-04-1306:28:00| +----+------+---------------------+ mysql>select*fromitem; +-----+-------+---------------------+ |id|value|indate| +-----+-------+---------------------+ |999|100|-04-1306:34:12| |1|100|-04-1306:32:58| +-----+-------+---------------------+ mysql>select*fromitem_detail; +----+-------+------+---------+ |id|value|name|item_id| +----+-------+------+---------+ |1|0|40|999| |2|0|50|999| |1|0|40|1| |2|0|50|1| +----+-------+------+---------+

#打开另一个终端,使用mysql账号登陆访问查看表情况

[plain]view plaincopymysql-uroot-ptest-p

#具体的表数据存储情况:[sql]view plaincopy----------------------------------------- mysql>select*fromdb01.users; +----+------+---------------------+ |id|name|indate| +----+------+---------------------+ |1|kk|-04-1306:28:00| +----+------+---------------------+ mysql>select*fromdb02.users; mysql>select*fromdb03.users; ----------------------------------------- mysql>select*fromdb01.item; mysql>select*fromdb02.item; +-----+-------+---------------------+ |id|value|indate| +-----+-------+---------------------+ |999|100|-04-1306:34:12| +-----+-------+---------------------+ mysql>select*fromdb03.item; +----+-------+---------------------+ |id|value|indate| +----+-------+---------------------+ |1|100|-04-1306:32:58| +----+-------+---------------------+ ----------------------------------------- mysql>select*fromdb01.item_detail; mysql>select*fromdb02.item_detail; +----+-------+------+---------+ |id|value|name|item_id| +----+-------+------+---------+ |1|0|40|999| |2|0|50|999| +----+-------+------+---------+ mysql>select*fromdb03.item_detail; +----+-------+------+---------+ |id|value|name|item_id| +----+-------+------+---------+ |1|0|40|1| |2|0|50|1| +----+-------+------+---------+

测试完成!!~数据进行了分库分表!

------------------------------------------------------------------------------------

------------------------------------------------------------------------------------

#server.xml 和 schema.xml 配置情况

[plain]view plaincopy#vi/usr/local/mycat/conf/server.xml <?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEmycat:serverSYSTEM"server.dtd"> <mycat:serverxmlns:mycat="http://org.opencloudb/"> <system> <!-- <propertyname="processors">32</property> <propertyname="processorExecutor">32</property> <propertyname="bindIp">0.0.0.0</property> <propertyname="frontWriteQueueSize">4096</property> <propertyname="idleTimeout">300000</property> <propertyname="mutiNodePatchSize">100</property> --> <propertyname="defaultSqlParser">druidparser</property> <propertyname="mutiNodeLimitType">1</property> <propertyname="serverPort">8066</property> <propertyname="managerPort">9066</property> </system> <!--任意设置登陆mycat的用户名,密码,数据库--> <username="test"> <propertyname="password">test</property> <propertyname="schemas">TESTDB</property> </user> <username="user"> <propertyname="password">user</property> <propertyname="schemas">TESTDB</property> <propertyname="readOnly">true</property> </user> <!-- <quarantine> <whitehost> <hosthost="127.0.0.1"user="mycat"/> <hosthost="127.0.0.2"user="mycat"/> </whitehost> <blacklistcheck="false"></blacklist> </quarantine> --> </mycat:server>

[plain]view plaincopy#vi/usr/local/mycat/conf/schema.xml <?xmlversion="1.0"?> <!DOCTYPEmycat:schemaSYSTEM"schema.dtd"> <mycat:schemaxmlns:mycat="http://org.opencloudb/"> <!--设置表的存储方式.schemaname="TESTDB"与server.xml中的TESTDB设置一致--> <schemaname="TESTDB"checkSQLschema="false"sqlMaxLimit="100"> <tablename="users"primaryKey="id"type="global"dataNode="node_db01"/> <tablename="item"primaryKey="id"dataNode="node_db02,node_db03"rule="mod-long"> <childTablename="item_detail"primaryKey="id"joinKey="item_id"parentKey="id"/> </table> </schema> <!--设置dataNode对应的数据库,及mycat连接的地址dataHost--> <dataNodename="node_db01"dataHost="dataHost01"database="db01"/> <dataNodename="node_db02"dataHost="dataHost01"database="db02"/> <dataNodename="node_db03"dataHost="dataHost01"database="db03"/> <!--mycat逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息--> <dataHostname="dataHost01"maxCon="1000"minCon="10"balance="0"writeType="0"dbType="mysql"dbDriver="native"> <heartbeat>selectuser()</heartbeat> <writeHosthost="server1"url="127.0.0.1:3306"user="root"password="mysql"/> </dataHost> </mycat:schema>

其他参考:

/article/-07-16/2825228(原理及应用)

/articlelist/50(理论和实践 写的好)

http://ly./29733787/viewspace-2049139/(示例) MyCAT安装使用及简单测试

/ivictor/p/5111495.html(示例) MyCAT简易入门

/database/03/385641.html(示例) Mycat水平分表,垂直分表实践(2)

/html/34/369434-3686088.html(示例)使用Mycat 做简单的读写分离(一)

来源:/kk185800961/article/details/51147029

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。