文档章节

数据库中间件MyCat

沉浮_
 沉浮_
发布于 08/20 17:41
字数 1846
阅读 25
收藏 0

什么是MyCat?

查看官网的介绍是这样说的

  • 一个彻底开源的,面向企业应用开发的大数据库集群
  • 支持事务、ACID、可以替代MySQL的加强版数据库
  • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
  • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  • 一个新颖的数据库中间件产品

主要特性

  • 支持SQL92标准
  • 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法
  • 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
  • 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
  • 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
  • 基于Nio实现,有效管理线程,解决高并发问题。
  • 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
  • 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
  • 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
  • 支持多租户方案。
  • 支持分布式事务(弱xa)。
  • 支持XA分布式事务(1.6.5)。
  • 支持全局序列号,解决分布式下的主键生成问题。
  • 分片规则丰富,插件化开发,易于扩展。
  • 强大的web,命令行监控。
  • 支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
  • 支持密码加密
  • 支持服务降级
  • 支持IP白名单
  • 支持SQL黑名单、sql注入攻击拦截
  • 支持prepare预编译指令(1.6)
  • 支持非堆内存(Direct Memory)聚合计算(1.6)
  • 支持PostgreSQL的native协议(1.6)
  • 支持mysql和oracle存储过程,out参数、多结果集返回(1.6)
  • 支持zookeeper协调主从切换、zk序列、配置zk化(1.6)
  • 支持库内分表(1.6)
  • 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)

下载及安装

到官网根据系统类型进行下载:http://mycat.io/

将下载文件解压,目录如下:

各个目录简要说明:

bin:启动目录
catlet: 扩展功能
conf:配置文件目录
server.xml:是Mycat服务器参数调整和用户授权的配置文件
schema.xml:是逻辑库定义和表以及分片定义的配置文件
rule.xml: 是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT
log4j.xml: 日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug,debug级别下,会输出更多的信息,方便排查问题
autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相关的id分片规则配置文件
lib:jar包目录
logs :日志目录

进入bin目录,通过管理员身份打开DOS窗口,分别执行命令:

mycat install

mycat start

这样就可以启动mycat了。

核心配置

server.xml : 设置账号、参数等

schema.xml : 物理数据库和数据库表的配置

rule.xml : 分片(分库分表)规则

关于配置的详细介绍可以参考 https://www.cnblogs.com/joylee/p/7513038.html 或者官网 http://www.mycat.io/document/mycat-definitive-guide.pdf

示例

首次认识mycat,最容易是从示例着手去了解,比如此次示例是结合mysql完成数据的分库分表,进行横向扩展。

首先需要准备几个mysql的服务器,通过docker构建,具体怎么可以参考网上,大致步骤如下:

   1、下载mysql镜像: docker pull mysql
   2、启动容器:docker run -di -p 32768:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 mysql ,输入容器id
   3、通过容器id进入容器,docker exec -it <id> /bin/bash
   4、进入mysql:mysql -u root -p -> 123456
   5、添加远程连接用户与密码:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456';
   6、权限:flush privileges;

如果不出意外则可以连接,因为我是通过本地虚拟机安装docker,默认端口192.168.99.100。现在根据下载的镜像启动3个容器,修改不同的端口。

通过客户端工具分别连接以上三个数据库,并且建表:

创建数据库:TESTDB

建表:

CREATE TABLE `employee` (
  `id` int(11) NOT NULL,
  `name` varchar(56) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1、修改server.xml配置文件

    <user name="root" defaultAccount="true">
        <property name="password">123456</property>

        <!-- 连接时用这个名字,比如 jdbc:mysql://localhost:8066/TESTDB -->
        <property name="schemas">TESTDB</property>
    </user>

2、修改schema.xml

    <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">

        <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"  rule="mod-long" />

    </schema>
    <!-- name节点名,与上对应;dataHost:真实数据库配置;database:数据库表配置 -->
    <dataNode name="dn1" dataHost="host1" database="TESTDB" />
    <dataNode name="dn2" dataHost="host2" database="TESTDB" />
    <dataNode name="dn3" dataHost="host3" database="TESTDB" />

    <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select 1</heartbeat>
        <writeHost host="hostS1" url="192.168.99.100:32768" user="root" password="123456" />
    </dataHost>
    <dataHost name="host2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select 1</heartbeat>
        <writeHost host="hostS2" url="192.168.99.100:32769" user="root" password="123456" />
    </dataHost>
    <dataHost name="host3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select 1</heartbeat>
        <writeHost host="hostS3" url="192.168.99.100:39770" user="root" password="123456" />
    </dataHost>

3、修改rule.xml

上面<table>配置了rule="mod-long",在rule.xml有相关的描述,修改下面参数,与上面dataNode数量对应

    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">3</property>
    </function>

这样mycat的配置就完成了,由于修改了配置,我们将mycat重启,进入bin,mycat restart。

测试

由于之前使用了mybatis-plus+springboot的项目,所有就用了这个:

application-mycat.properties:

mybatis-plus.mapper-locations=classpath*:com/sucl/sbmp/*/mapper/**Mapper.xml
mybatis-plus.type-aliases-package=com.sucl.sbmp.*.entity
mybatis-plus.global-config.refresh=true
#mybatis-plus.global-config.db-config.db-type=mysql
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false


mp.datasource.driver-class-name=com.mysql.jdbc.Driver
mp.datasource.url=jdbc:mysql://localhost:8066/TESTDB?useUnicode=true&useSSL=false&characterEncoding=utf8
mp.datasource.username=root
mp.datasource.password=123456
mp.datasource.validation-query=select '1'
mp.datasource.testOnBorrow=true

实体:

@Data
public class Employee {

    @TableId(type = IdType.INPUT)
    private long id;

    @TableField(value = "name")
    private String name;
}

mapper:

public interface EmployeeMapper extends BaseMapper<Employee> {

}

service:

@Service
@Transactional
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper,Employee> implements EmployeeService {

}

测试:

@ActiveProfiles("mycat")
@RunWith(SpringRunner.class)
@SpringBootTest
public class SbmpTest {
    @Autowired
    private EmployeeService employeeService;

    @Transactional
    @Rollback(false)
    @Test
    public void save(){
        List<Employee> employees = new ArrayList<>();
        for(int i=0;i<100;i++){
            Employee employee = new Employee();
            employee.setId(i);
            employee.setName("name"+i);
            employees.add(employee);
        }
        employeeService.saveBatch(employees);
    }

    @Test
    public void get(){
        List<Employee> employees = employeeService.list(null);
        employees.stream().forEach(System.out::println);
    }

}

分别执行两个方法,会根据id在三个数据库中分别插入数据:

查询时则可以查看三个表中所有的数据,可见数据是根据id离散在不同表中,具体的策略在于之前的mod-long相关配置。

此章主要对mycat做一个初步认识,同时根据简单的示例了解其基本的工作原理,当然mycat可以帮助我们实现实现数据库的读写分离、数据库水平垂直拆分、集群等功能,但同时不得不面对相应情况下的问题。

© 著作权归作者所有

上一篇: OAuth2.0授权协议
下一篇: Redis集群
沉浮_
粉丝 5
博文 54
码字总数 68681
作品 0
武汉
程序员
私信 提问
Mycat - 实现数据库的读写分离与高可用

mysql主从实现 Mycat不负责任何的数据同步问题,mysql的主从复制还得从mysql层面来实现;如果没有实现mysql的主从复制,后文就都成 如果想学习Java工程化、高性能及分布式、深入浅出。微服务...

编程SHA
02/20
194
0
数据库中间件01-认识mycat

简述 Mycat是国产的一套免费开源的分布式数据库中间件。想必做开发或者运维的朋友对中间件这个词应该是比较熟悉了,我们见到过java中间件,消息中间件等等,这里又来了一个数据库中间件。那么...

细节探索者
2018/05/11
67
0
JAVAEE——宜立方商城13:订单系统实现、订单生成、Mycat数据库分片

1. 学习计划 1、订单系统实现 2、订单生成 3、Mycat数据库分片 2. 订单系统 2.1. 功能分析 1、在购物车页面点击“去结算”按钮,跳转到订单确认页面 a) 必须要求用户登录 b) 使用拦截器实现。...

kent鹏
2018/08/07
0
0
MyCat数据库的基础配置及使用

一、为什么需要分布式数据据库 随着计算机和信息技术的迅猛发展,行业应用系统的规模迅速扩大,行业应用所产生的数据量呈爆炸式增长,动辄达到数百TB甚至数百PB的规模,已远远超出传统计算技...

宜信技术学院
09/10
3.3K
1
DDM的成熟在一个细微之处的体现

前言 我们都知道DDM是华为云的非常优秀的分布式数据库中间件,在性能、易用性等方面在业界是遥遥领先的。他的成熟不仅仅体现在具有快速水平平滑扩容,支持多种分布式事物类型等等这些高大上的...

中间件小哥
01/08
10
0

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
今天
4
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部