数据库基础之10(Mycat 分库分表)

目录

1、Mycat分库/分表:

1-1、定义

1-2、软件介绍

1-3、分片规则

1-4、工作过程:

2、环境部署

2-1、配置mycat

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";

2-6、在节点数据库上设置表名不区分字母大小写

3、测试配置


1、Mycat分库/分表:

1-1、定义

  • – 通过某种特定条件,将存放在一个数据库(主机)中的数据,分散存放到多个数据库(主机)中。
  • ---以达到分散单台设备负载的效果,即分库分表
  • – 数据的切分根据其切分规则的类型,分为2种切分模式
  • – 垂直分割(纵向) 和 水平分割(横向)
  • --Mycat 是基于Java的分布式数据库系统中间层,为高并发下的分布式提供解决方案
  • 垂直分割(纵向切分)

– 把单一的表,拆分成多个表,并分散到不同的数据库(主机)上。
– 一个数据库由多个表构成,每个表对应不同的业务,可以按照业务对表进行分类,将其分布到不同的数据库(主机)上,实现专库专用,让不同的库(主机)分担不同的业务。

  • 水平分割(横向切分)

– 按照表中某个字段的某种规则,把向表中写入的记录分散到多个库(主机)中。
– 简单来说,就是按照数据行切分,将表中的某些行存储到指定的数据库 (主机) 中。

1-2、软件介绍

Mycat 是基于Java的分布式数据库系统中间层,为高并发下的分布式提供解决方案

  1. – 支持JDBC形式连接
  2. – 支持MySQL、Oracle、Sqlserver、Mongodb等
  3. – 提供数据读写分离服务
  4. – 可以实现数据库服务器的高可用
  5. – 提供数据分片服务
  6. – 基于阿里巴巴Cobar进行研发的开源软件
  7. – 适合数据大量写入数据的存储需求

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、工作过程:

  1. 当Mycat收到一个SQL时,会先解析这个SQL查找涉及到的表
  2. 然后看此表的定义, 如果有分片规则,则获取到SQL里分片字段的值,并匹配分片函数,得到该SQL对应的分片列表
  3. 然后将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)

感谢您的拜读,喜欢请点赞!!!

猜你喜欢

转载自blog.csdn.net/Perfect11_1/article/details/81253391