是什么?
数据库中间件,不存储数据。多租户环境下共用相同的系统或者程序组件,但是数据库是不同的。确保每个用户数据的隔离性。就是说处于不同租户的用户是看不到对方的信息的。
为什么?
- 作为分布式数据库中间件使用
- 实现后端数据库的读写分离及负载均衡
- 简单。新增加租户不用改代码只需要改配置
基本元素
逻辑库(schema)
- 对应用来说相当于mysql中的数据库
- 逻辑库对应后端多个实际数据库
- 逻辑库不存储数据
逻辑表(table)
- 对应用来说相当于mysql中数据表
- 逻辑表对应后端多个实际数据库中的表
- 逻辑表不存储数据
类别
- 分片表与非分片表,分片表是经过水平切分后的表,数据不存放在一个数据表中,将所有数据表中的数据进行整合才是完整的数据。
- 全局表,在所有分片中都存在的表
- ER关系表,按照ER关系进行分片的表
安装
单机
安装mycat -server http://www.mycat.io/
安装jdk(1.7以上)
集群
准备工具
- Mycat-server-6-RELEASE-20161028204710-linux.tar
- openssl-1.0.1g.tar
- keepalived-1.2.1tar
集群部署图的理解:
1、keepalived 和 haproxy (请求转发,负载均衡)必须装在同一台机器上(如 192.168.22.207 机器上,keepalived 和
haproxy 都要安装),keepalived 负责为该服务器抢占 vip(虚拟 ip),抢占到 vip 后,对该主机的访问可以通过原来的 ip(192.168.22.207)访问,也可以直接通过 vip(192.168.22.143)访问。haproxy和mycat不必安装在同一台机器上。
2、192.168.22.218 上的 keepalived 也会去抢占 vip,抢占 vip 时有优先级,配置 keepalived.conf 中的(priority 150 #数值愈大,优先级越高,192.168.22.218 上改为 120,master 和 slave 上该值配置不同)决 定。但是一般哪台主机上的 keepalived 服务先启动就会抢占到 vip,即使是 slave,只要先启动也能抢到。
3、haproxy 负责将对 vip 的请求分发到 mycat 上。起到负载均衡的作用,同时 haproxy 也能检测到 mycat是否存活,haproxy 只会将请求转发到存活的 mycat 上。
4、如果一台服务器(keepalived+haproxy 服务器)宕机,另外一台上的 keepalived 会立刻抢占 vip 并接管服务。如果一台 mycat 服务器宕机,haporxy 转发时不会转发到宕机的 mycat 上,所以 mycat 依然可用。
下面这张图是HAProxy是单机的。
搭建过程
https://blog.csdn.net/l1028386804/article/details/75331934#t6
核心配置文件
schema.xml
定义逻辑库
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"></schema>
<!—配置需要分片的表-->
<table name=“tuser” dataNode=”dn1”/></schema>
schema 标签用于定义MyCat实例中的逻辑库,MyCat可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分这些不同的逻辑库。
dataNode标签
<dataNode name="dn1" dataHost="lch3307" database="db1" ></dataNode>
dataNode 标签定义了 MyCat中的数据节点,也就是我们通常说所的数据分片。一个dataNode 对应实际的一个database(实际mysql数据库)dataHost是对应的物理主机,比如咱们的58,59。
server.xml
mycat用户信息
<user name="test"> <property name="password">test</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> <property name="benchmark">11111</property> <property name="usingDecrypt">1</property>
<privileges check="false">
<schema name="TESTDB" dml="0010" showTables="custome/mysql"> ---- 对应schema中的逻辑库
<table name="tbl_user" dml="0110"></table>
<table name="tbl_dynamic" dml="1111"></table>
</schema>
</privileges>
</user>
server
rule.xml
逻辑表(水平分片表)中分片表切分规则
- 配置水平分片的分片规则
- 配置分片规则所对应的分片函数
<tableRule name="rule1">
<rule><columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<function name="func1" class="io.mycat.route.function.PartitionByLong"> ----对应上面的<algorithm>标签
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</function>
核心技术
分库
Mycat使用前后对比
SpringCloud项目
SSM项目
auth配置使用多租户
读写分离
结合文档分析。