概述
Mycat,是一个数据库中间件,使用java语言编写,在程序和数据库之间塞一个代理层。使得操作物理数据库对我们透明化,可以像操作mysql等数据库那样操作mycat。
特性:
- 可以当做一个Mysql数据库来使用(使用方面)。
- 支持 MySQL 之外的数据库,通过 JDBC 实现。
- 支持 ZK 配置(外部配置),带监控 mycat-web。
背景:Mycat是开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新的功能在其中。青出于蓝而胜于蓝。
能干什么:
mycat主要的用途有:
- 实现数据库主从架构的读写分离。
- 解决数据库分库分表带来的诸多问题。
- 多数据源整合。
- 解决分库分表后带来的分布式事务问题。
- 解决分库分表后的全局唯一Id问题。
…
当然,上述的情况也可以在应用程序中通过逻辑代码实现,但是,这样会导致业务代码和这些逻辑代码耦合在一起,会导致应用程序跟数据库耦合在一起。并且我们还得写这些复杂的逻辑代码。
大概原理:
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库, 并将返回的结果做适当的处理,最终再返回给用户。
这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用 Mycat 还是MySQL。
核心概念:
概念 | 含义 |
---|---|
主机 | 物理主机,一个数据库服务 |
物理数据库 | 真实的数据库,比如主机的会员数据库、订单数据库 |
物理表 | 真实的数据库表,比如订单表、会员表 |
分片 | 将原来单数据库的数据按照一定规则切分后分散存储在不同数据库节点的操作 |
分片节点 | 分片以后数据存储的节点 |
分片键 | 分片依据的字段, 例如 order_info 表以 id 为依据分片,id 就是分片键, 通常是主键 |
分片算法 | 分片的规则, 例如随机、 取模、 范围、 哈希、 枚举以及各种组合算法 |
逻辑表 | 相对于物理表, 是分片表聚合后的结果, 对于客户端来说跟真实的表没有区别,就是对物理表的一层抽象封装,操作该逻辑表相当于操作物理表的多个分片节点,最后把结果聚合起来,客户端使用起来就察觉不到数据分片了 |
逻辑数据库 | 相对于物理数据库, 是数据节点聚合后的结果,比如会员库分成了三个物理库,里面的表都一样,然后逻辑库就是对物理库的抽象封装 |
安装
前提:需要配置好了JDK环境,因为Mycat是java写的。
-
下载:
地址:http://www.mycat.org.cn/
-
解压到/usr/local目录下:
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local
目录说明:
bin:启动目录。
catlet:空目录。
conf:配置文件目录。
logs:日志目录。
lib:依赖jar包目录。
version.txt:版本信息文件。
主要配置文件:
schema.xml: 定义逻辑库,表、分片节点等内容
rule.xml: 定义分片规则
server.xml: 定义用户以及系统相关变量,如端口等
- 启动:
先修改server.xml,设置登录用户名及密码。
先别管配置是什么意思,先配启动起来先。
<!-- 可以设置多个用户 user 标签的name属性就是用户名-->
<user name="mycat">
<!-- 设置密码-->
<property name="password">123456</property>
<!-- 设置数据库,可以设置多个,逗号隔开-->
<property name="schemas">testmycat</property>
<!-- 设置是否只读-->
<property name="readOnly">false</property>
<!-- 设置默认数据库-->
<property name="defaultSchema">testmycat</property>
</user>
然后修改schema.xml,配置相关逻辑表和数据库节点信息。
把原本的内容注释掉或者删掉,重新配置好自己的内容:
<schema name="testmycat" checkSQLschema="false" sqlMaxLimit="100" randomDataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost" database="testmycat" />
<dataHost name="localhost" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.18.140:3306" user="root"
password="123456">
</writeHost>
</dataHost>
首先确定你的物理数据库是否支持远程登录,如果不行,要找相应方法解决。
启动:
有前台启动和后台启动:
到bin目录下:
./mycat console #前台启动
./mycat start #后台启动
第一次启动为了能够方便看到启动日志,就选择前台启动:
启动成功,日志信息记录在logs/mycat.log文件中。
- 登录:
有两个端口:
一个是后台管理端口(9066),负责元信息查看等操作。
一个是数据端口(8066),也就是我们平常增删改查的端口。
首先mycat服务器防火墙要开放这两个端口。
我们登录数据端口:
mysql -h 192.168.18.140 -P 8066 -umycat -p123456
登录成功,可以像使用mysql那样使用mycat就好。