分库分表:将一台数据库中的数据,按照特定的方式进行分割,存放到多台服务器中。
垂直分割:按照业务逻辑进行分割。
水平分割:按照表中的某一个字段,以行为单位进行分割。
mycat简介:
是基于java开发的分布式数据库系统的中间件,为高并发环境的分布式数据库提供解决方案。
–适用于大量写入操作
–支持mysql,oracle,sqlserver,mongodb等数据库
–提供读写分离
–提供数据分片
mycat分片规则:
mycat有10种分片规则,在rule.xml中有写
mycat工作过程:

当mycat收到一个sql时:
1、解析sql语句中的表
2、查看对应表的配置,如果有分片规则,查看分片规则指定的字段的值,并匹配分片函数,获取分片的列表
3、将sql发送给对应的分片服务器执行
4、处理或收集所有分片的结果数据,返回给client
配置mycat分片服务器:(4.151,端口8066)
1、安装软件包:
yum -y install java-1.8.0-openjdk #mycat是基于java编写的,需要安装jdk
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz #解压软件包,免安装
mv mycat/ /usr/local #源码程序习惯于放在/usr/local目录下
ls /usr/local/mycat/ #查看mycat对应的文件
# bin:mycat命令
# catlet:扩展功能
# conf:配置文件
# lib:mycat依赖的jar包
# logs:mycat日志,mycat.log运行日志,warpper.log启动日志用于排错
2、mycat配置文件介绍:(/usr/local/mycat/conf/)
server.xml #定义client连接mycat的用户,以及mycat的逻辑数据库
schema.xml #定义数据分片
rule.xml #分片规则文件
# 这个目录下还有一个txt,properties文件,在规则文件在会使用,相当于是调用配置文件
3、定义client连接mycat的用户以及逻辑数据库:
vim /usr/local/mycat/conf/server.xml
<user name="root"> #连接mycat的用户名
<property name="password">123456</property> #密码
<property name="schemas">TESTDB</property> #逻辑数据库库名,客户机连接到mycat字后使用show databases显示的数据库名
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property> #使用这个用户登录之后是只读的
</user>
4、设置数据分片:
cp /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak #备份
sed -i '56,77d' schema.xml #删除无关配置文件
sed -i '39,42d' schema.xml
sed -i '16,18d' schema.xml
vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> #对TESTDB库下的表做分片存储,TESTDB是在server.xml中定义的逻辑库
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> #name指定了逻辑表的名字,dataNode指定了数据库节点,这个节点在下方定义,要写全
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> #primaryKey="ID"表示这个表中一定要有ID这个字段,type="global"代不分片
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="hotnews" dataNode="dn1,dn2,dn3" rule="mod-long" />
<table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="sharding-by-intfile" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id"> #子表
<childTable name="order_items" joinKey="order_id" parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />
</table>
</schema>
#定义数据库节点
<dataNode name="dn1" dataHost="mysql1" database="db1" /> #name表示节点名,要和table中的dataNode保持一致
<dataNode name="dn2" dataHost="mysql2" database="db2" /> #dataHost是主机名,自定义
<dataNode name="dn3" dataHost="mysql3" database="db3" /> #database要求要在对应的数据库节点上创建和这里相同名字的数据库
#定义mysql1主机名对应的数据库服务器ip地址(4.51)
<dataHost name="mysql1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> #name要和dataNode的dataHost相同
<heartbeat>select user()</heartbeat>
<writeHost host="mysql1" url="192.168.4.51:3306" user="admin" password="123456">
</writeHost> #host指明了url的主机名,可以自定义
</dataHost>
#定义mysql2主机名对应的数据库服务器ip地址(4.52)
<dataHost name="mysql2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> #name要和dataNode的dataHost相同
<heartbeat>select user()</heartbeat>
<writeHost host="mysql2" url="192.168.4.52:3306" user="admin" password="123456">
</writeHost> #host指明了url的主机名,可以自定义
</dataHost>
#定义mysql3主机名对应的数据库服务器ip地址(4.53)
<dataHost name="mysql3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> #name要和dataNode的dataHost相同
<heartbeat>select user()</heartbeat>
<writeHost host="mysql3" url="192.168.4.53:3306" user="admin" password="123456">
</writeHost> #host指明了url的主机名,可以自定义
</dataHost>
</mycat:schema>
5、启动mycat服务:
/usr/local/mycat/bin/mycat start #开启服务、stop、restart
数据库服务器配置:(51,52,53)
1、用户授权:
grant all on *.* to admin@"%" indentified by "123456"
# <writeHost host="mysql3" url="192.168.4.53:3306" user="admin" password="123456">
# 需要和这里的user password相同
2、创建对应的数据库:
51-->db1
52-->db2
53-->db3
# <dataNode name="dn3" dataHost="mysql3" database="db3" />
# 要和这里的相同
使用client连接:
mysql -h192.168.4.151 -P8066 -uroot -p123456
# server.xml定义的用户
mysql>show databases; #可以看到TESTDB这个逻辑表
mysql>use TESTDB; #切换数据库
mysql>show tables; #能看到在schema.xml中定义的表,这些表都是虚拟的表,只有表名,没有表结构
写总结的第四十一天!!!
Mycat分库分表实践
632

被折叠的 条评论
为什么被折叠?



