目录
2-2、修改配置文件/usr/local/mycat/conf/server.xml-----定义了客户端连接mycat服务时的用户名密码及访问权限
2-3、修改配置文件/usr/local/mycat/conf/schema.xml:--------定义分片信息
2-4、修改配置文件vim /usr/local/mycat/conf/rule.xml:-------定义分片规则的算法
2-5、在节点数据库上添加授权用户: grant all on *.* to yaya@"%" identified by "123456";
1、Mycat分库/分表:
1-1、定义
- – 通过某种特定条件,将存放在一个数据库(主机)中的数据,分散存放到多个数据库(主机)中。
- ---以达到分散单台设备负载的效果,即分库分表
- – 数据的切分根据其切分规则的类型,分为2种切分模式
- – 垂直分割(纵向) 和 水平分割(横向)
- --Mycat 是基于Java的分布式数据库系统中间层,为高并发下的分布式提供解决方案
- 垂直分割(纵向切分)
– 把单一的表,拆分成多个表,并分散到不同的数据库(主机)上。
– 一个数据库由多个表构成,每个表对应不同的业务,可以按照业务对表进行分类,将其分布到不同的数据库(主机)上,实现专库专用,让不同的库(主机)分担不同的业务。
- 水平分割(横向切分)
– 按照表中某个字段的某种规则,把向表中写入的记录分散到多个库(主机)中。
– 简单来说,就是按照数据行切分,将表中的某些行存储到指定的数据库 (主机) 中。
1-2、软件介绍
Mycat 是基于Java的分布式数据库系统中间层,为高并发下的分布式提供解决方案
- – 支持JDBC形式连接
- – 支持MySQL、Oracle、Sqlserver、Mongodb等
- – 提供数据读写分离服务
- – 可以实现数据库服务器的高可用
- – 提供数据分片服务
- – 基于阿里巴巴Cobar进行研发的开源软件
- – 适合数据大量写入数据的存储需求
1-3、分片规则
mycat服务提供10种分片规则。每种分片规则对应一种算法。
– 1枚举法 sharding-by-intfile --------算法为hash-int
– 2固定分片hash算法 rule1------------func1
– 3范围约定 auto-sharding-long------rang-long
– 4求模法 mod-long------------------mod-long
– 5日期列分区法 sharding-by-date------sharding-by-date
– 6通配取模 sharding-by-pattern ------->sharding-by-pattern
– 7ASCII码求模通配 sharding-by-prefixpattern ------->sharding-by-prefixpattern
– 8编程指定 sharding-by-substring ------->sharding-by-substring
– 9字符串拆分hash解析 sharding-by-stringhash ------>sharding-by-stringhash
– 10一致性hash sharding-by-murmur -------->murmur
1-4、工作过程:
- 当Mycat收到一个SQL时,会先解析这个SQL查找涉及到的表
- 然后看此表的定义, 如果有分片规则,则获取到SQL里分片字段的值,并匹配分片函数,得到该SQL对应的分片列表
- 然后将SQL发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端
2、环境部署
2-1、配置mycat
- 安装JDK
[root@localhost ~]# rpm -qa | grep -i jdk -----------------安装系统自带的即可
java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64
- 安装mycat服务软件包
[root@localhost ~]# tar -zxf Mycat-server-1.4-beta-20150604171601-linux.tar.gz #免安装,解压后即可使用
[root@localhost ~]# mv mycat/ /usr/local/
[root@localhost ~]# ls /usr/local/mycat/
bin catlet conf lib logs version.txt
- 目录结构说明
– bin ----- mycat命令 比如启动 停止 等
– catlet ------扩展功能
– conf ----------配置文件
– lib -------mycat使用的jar包 mycat是java开发的
– log ------mycat启动日志和运行日志
– wrapper.log -----mycat服务启动日志启动有问题可以看这个日志的内容
– mycat.log ------记录 sql脚本执行后的具体报错内容
- 重要配置文件说明
ls /usr/local/mycat/conf
– server.xml------设置客户端连接mycat服务的账号 、密码等
– schema.xml-------配置mycat使用的真实数据库和表
– rule.xml---------定义mycat分片规则
cp server.xml server.xml.bak----做备份
cp schema.xml schema.xml.bak----做备份
- 配置标签说明
– <user>.......</user>
定义连接mycat服务时使用的用户和密码及逻辑库的名字
一是一个用户。逻辑库是客户端访问的时候显示的库名
– <datanode>......</datanode>
指定数据节点(物理库的主机名和存储分片数据的数据库名)
– <datahost>......</datahost>
指定数据库服务器的IP地址及连接数据库时使用的授权用户名及密码
2-2、修改配置文件/usr/local/mycat/conf/server.xml-----定义了客户端连接mycat服务时的用户名密码及访问权限
<mycat:server xmlns:mycat="http://org.opencloudb/">
<user name="admin">--------------连接mycat服务时使用的用户名 admin
<property name="password">123456</property> -------使用admin用户连接mycat用户时使用的密码
<property name="schemas">TESTDB</property> ------连接上mycat服务后,访问的虚拟库的名字,可以看到的库名多个时,使用逗号分隔 (是逻辑上的库名)
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property> -----定义只读权限,使用定义的user用户连接mycat服务后只有读记录的权限
</mycat:server>
2-3、修改配置文件/usr/local/mycat/conf/schema.xml:--------定义分片信息
<mycat:schema xmlns:mycat="http://org.opencloudb/">
5 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">------TESTDB必须和连接上mycat服务后,可以看到的库名一致
6 <!-- auto sharding by id (long) -->
7 <table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" />---填充表名为travelrecord的表内容时,将表内容分片给节点名dn1,dn2的主机,并且定义了分片规则是那种分片规则
20 <table name="employee" primaryKey="ID" dataNode="dn1,dn2"--指出了该表中必须要有ID字段且为主键
21 rule="sharding-by-intfile" />
37 <dataNode name="dn1" dataHost="c1" database="db1" />----节点dn1的主机名为c1,库名为db1
38 <dataNode name="dn2" dataHost="c2" database="db2" />--- 节点dn2的主机名为c2,库名为db2
43 <dataHost name="c1" maxCon="1000" minCon="10" balance="0"
44 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
45 <heartbeat>select user()</heartbeat>
46 <!-- can have multi write hosts -->
47 <writeHost host="hostM1" url="192.168.4.152:3306" ----主机名为c1的IP地址为192.168.4.152,访问端口为3306
48 user="yaya" password="123456">-----访问时的用户名和密码为yaya,123456
55 </dataHost>
56 <dataHost name="c2" maxCon="1000" minCon="10" balance="0"
57 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
58 <heartbeat>select user()</heartbeat>
59 <!-- can have multi write hosts -->
60 <writeHost host="hostM1" url="192.168.4.153:3306" ----主机名为c1的IP地址为192.168.4.153,访问端口为3306
61 user="yaya" password="123456">-----访问时的用户名和密码为yaya,123456
68 </dataHost>
</mycat:schema>
2-4、修改配置文件vim /usr/local/mycat/conf/rule.xml:-------定义分片规则的算法
26 <tableRule name="sharding-by-intfile">--------------找到分片信息中对应的分片规则
27 <rule>
28 <columns>sharding_id</columns>------定义了分片规则是靠sharding_id字段来区分写入不同节点主机的相关数据库的相关表中
29 <algorithm>hash-int</algorithm>-------定义该分片规则对应的算法
30 </rule>
86 <function name="hash-int"--------找到对hash-int算法的功能解释
87 class="org.opencloudb.route.function.PartitionByFileMap">
88 <property name="mapFile">partition-hash-int.txt</property>--指出了该算法定义功能的文件名是什么
89 </function>
vim /usr/local/mycat/conf/partition-hash-int.txt ----打开该算法定义功能的文件
10000=0-------sharding_id字段值为10000时,将会把记录写到dn1节点对应主机的db1库中
10010=1-------sharding_id字段值为10010时,将会把记录写到dn2节点对应主机的db2库中
2-5、在节点数据库上添加授权用户: grant all on *.* to yaya@"%" identified by "123456";
2-6、在节点数据库上设置表名不区分字母大小写
Vim /etc/my.cnf
[mysqld]
……
……
lower_case_table_names = 1 --------表名不区分字母大小写
[root@localhost ~]# systemctl restart mysqld-----添加对应设置后重启mysqld服务
/usr/local/mycat/bin/mycat status------起服务
ln -s /usr/local/mycat/bin/mycat /usr/bin/mycat-----创建软连接
Netstat -untlp | grep 8806-----------查看服务是否启动
3、测试配置
• 在客户端连接mycat服务器
– mysql –hmycat服务器ip地址 – P端口 – u用户 – p密码
例如:
[root@room9pc17 ~]# mysql -h192.168.4.56 -P8066 -uadmin -p123456
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1row in set (0.00 sec)
- 建表验证
create table employee(ID int(2) primary key auto_increment,name char(15),pay float(7,2),sharding_id int(2),sex enum("boy","girl"));---------------建表时必须要有规则所定义的字段,和规则对应的算法所定义的
);
insert into employee(name,pay,sharding_id,sex) values("yangsi",10000,10000,"girl");
insert into employee(name,pay,sharding_id,sex) values("yangsan",10000,10010,"girl");
insert into employee(name,pay,sharding_id,sex) values("yanger",10000,10010,"girl");
insert into employee(name,pay,sharding_id,sex) values("yangyi",10000,10000,"girl");
- dn1本机管理员登陆本机:
mysql> select * from employee;
+----+--------+----------+-------------+------+
| ID | name | pay | sharding_id | sex |
+----+--------+----------+-------------+------+
| 1 | yangyi | 10000.00 | 10000 | girl |
| 2 | yangsi | 10000.00 | 10000 | girl |
+----+--------+----------+-------------+------+
2 rows in set (0.00 sec)
- dn2本机管理员登陆本机:
mysql> select * from employee;
+----+---------+----------+-------------+------+
| ID | name | pay | sharding_id | sex |
+----+---------+----------+-------------+------+
| 1 | yanger | 10000.00 | 10010 | girl |
| 2 | yangsan | 10000.00 | 10010 | girl |
+----+---------+----------+-------------+------+
2 rows in set (0.00 sec)
感谢您的拜读,喜欢请点赞!!!