Mycat简介

一、Mycat介绍

1、是什么(数据库中间件)

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

2、Mycat关键特性

  • 支持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开发版)。

3、干什么的

(1)读写分离

(2)数据分片

  • 垂直拆分
  • 水平拆分
  • 垂直+水平拆分


(3)多数据源整合

4、原理

拦截
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户

这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用mycat还是mysql。

5、Mycat监控

  • 支持对Mycat、Mysql性能监控
  • 支持对Mycat的JVM内存提供监控服务
  • 支持对线程的监控
  • 支持对操作系统的CPU、内存、磁盘、网络的监控


6、Mycat架构

1.6版本架构

二、安装

Mycat官网:http://www.mycat.io/
可以了解下Mycat的背景和应用情况,这样使用起来比较有信心。

Mycat权威指南:http://www.mycat.io/document/mycat-definitive-guide.pdf

Mycat实体书籍:《分布式数据库架构及企业实践——基于Mycat中间件》 ISBN:978-7-121-30287-9

Mycat下载地址:http://dl.mycat.io/
官网有个文档,属于详细的介绍,初次入门,看起来比较花时间。

下载:
建议大家选择 1.6-RELEASE 版本,毕竟是比较稳定的版本。

安装:
根据不同的系统选择不同的版本。包括linux、windows、mac,作者考虑还是非常周全的,当然,也有源码版的。(ps:源码版的下载后,只要配置正确,就可以正常运行调试,这个赞一下。)
[图片上传失败...(image-7dc3fc-1578843743507)]

Mycat的安装其实只要解压下载的目录就可以了,非常简单。
安装完成后,目录如下:

目录 说明
bin mycat命令,启动、重启、停止等
catlet catlet为Mycat的一个扩展功能
conf Mycat 配置信息,重点关注
lib Mycat引用的jar包,Mycat是java开发的
logs 日志文件,包括Mycat启动的日志和运行的日志

三、配置

Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:

  • server.xml:用于配置Mycat的用户名、密码、逻辑数据库名、服务端口、读写权限等
  • schema.xml:最常用的配置文件,用于配置物理数据库信息(ip、port、username、password、database)、表的配置(表所在的数据节点、表的分片规则、主键是否自增等)、读写分离配置等
  • rule.xml:分片规则配置,mycat提供了十多种分片规则,也可以自定义分片规则
  • log4j2.xml:配置mycat的日志信息,开发的时候建议设置成debug级别

logs: Mycat打印的日志文件

  • console.log:mycat启动时的日志,启动成功一般会有有日志记录,如果没有日志记录可以通过mycat status命令来查看是否启动成功,如果启动失败可以去mycat.log中查看错误日志
  • mycat.log:mycat执行sql对应的日志,可以通过该日志知道mycat是怎么样执行sql的,一些错误日志会输出到该文件中,是一个很重要的日志文件
  • wrapper.log:错误日志也可能在这个日志文件中
  • switch.log

Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。
我们现在做一个主从、读写分离,简单分表的示例。结构如下图:

服务器 IP 说明
Mycat 192.168.0.2 mycat服务器,连接数据库时,连接此服务器
database1 192.168.0.3 物理数据库1,真正存储数据的数据库
database2 192.168.0.4 物理数据库2,真正存储数据的数据库

Mycat作为主数据库中间件,肯定是与代码弱关联的,所以代码是不用修改的,使用Mycat后,连接数据库是不变的,默认端口是8066。连接方式和普通数据库一样,如:jdbc:mysql://192.168.0.2:8066/

四:Mycat命令

# 前端启动 打印一些信息 通过ctrl+c来停止
~ bin/mycat console
# 后台启动 几乎不打印日志
~ bin/mycat start
# 打印的信息比较多
~ ./bin/startup_nowrap.sh
# 重新启动
~ bin/mycat restart

# 查看mycat是否正在运行
~ bin/mycat status
# 停止mycat
~ bin/mycat stop

# 有时候启动失败是端口占用了,找到它,杀死它,重启启动
~ lsof -i:8066
~ kill -9 PID
~ bin/mycat start

五:Mycat的配置文件

server.xml文件

文件用途:

  • 配置系统相关参数
  • 配置哦用户访问权限
  • 配置SQL防火墙及SQL拦截功能
  • 几乎保存了所有 mycat 需要的系统配置信息。

server.xml配置详解

1、system 标签
该标签内嵌套的所有 property 标签都与系统配置有关。

<system>
    <!-- mycat服务的端口号  -->  
    <property name="serverPort">3306</property>  
    <!-- mycat管理的端口号  -->
    <property name="managerPort">9066</property>
    <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
    <property name="nonePasswordLogin">0</property> 
    <!-- mycat 服务监听的 IP 地址,默认值为 0.0.0.0 -->
    <property name="bindIp">0.0.0.0</property> 
    <!-- 前端写队列大小默认值2048 -->
    <property name="frontWriteQueueSize">4096</property>

    <property name="charset">utf8</property>
    <!-- 前端连接的初始化事务隔离级别,只在初始化的时候使用,后续会根据客户端传递过来的属性对后端数据库连接进行同步。默认为 REPEATED_READ,设置值为数字默认 3。 -->
    <property name="txIsolation">3</property>
    <!-- 用于指定系统可用的线程数,默认值为机器 CPU 核心线程数 -->
    <property name="processors">8</property> 
    <!-- 指定连接的空闲超时时间。某连接在发起空闲检查下,发现距离上次使用超过了空闲时间,那么这个连接会被回收,就是被直接的关闭掉。默认 30 分钟,单位毫秒 -->
    <property name="idleTimeout">300000</property>
    <!-- SQL 执行超时的时间,Mycat 会检查连接上最后一次执行 SQL 的时间,若超过这个时间则会直接关闭这连接。默认时间为 300 秒,单位秒。 -->
    <property name="sqlExecuteTimeout">300</property>
    <!-- 1为开启实时统计、0为关闭 -->
    <property name="useSqlStat">0</property>  
    <!-- 1为开启全加班一致性检测、0为关闭 -->
    <property name="useGlobleTableCheck">0</property>  
    <!-- 指定使用 Mycat 全局序列的类型。 0 为本地文件方式,1 为数据库方式,2 为时间戳序列方式,3 为分布式ZK ID 生成器,4 为 zk 递增 id 生成 -->
    <property name="sequnceHandlerType">2</property>
    <!-- MyCat默认返回数据集大小 -->
    <property name="defaultMaxLimit">100</property>
    <!-- 指定 Mysql 协议可以携带的数据最大长度。默认 16M。 -->
    <property name="maxPacketSize">104857600</property>
</system>

2、user 标签
该标签主要用于定义登录 mycat 的用户和权限。示例定义了一个用户,用户名为 test、密码为123456,可访问的 schema 也只有 TESTDB 一个。

<user name="test">
    <property name="password">123456</property>  
    <property name="schemas">mycat1,mycat2,mycat3</property>  
    <property name="readOnly">false</property>  
</user>

<user name="root" defaultAccount="true">
    <property name="password">123456</property>  
    <property name="schemas">mycat1</property>  
    
    <!-- 表级 DML 权限设置 -->   
    <privileges check="false">
        <schema name="mycat1" dml="0110" >
            <table name="tb01" dml="0000"></table>
            <table name="tb02" dml="1111"></table>
        </schema>
    </privileges>       
</user>

用户密码加密

java -cp /usr/local/mycat/lib/Mycat-server-1.6.5-release.jar io.mycat.util.DecryptUtil 0:root:123456
# 启用并更改密码为密文,0表示前端加密,root表示用户名,123456为用户密码
<property name="usingDecrypt">1</property>
<property name="password">xasdfasdxSFA23</property>
# 1.5.1如下
[root@mycat01 lib]# java -cp /usr/local/mycat/lib/Mycat-server-1.5.1-RELEASE.jar org.opencloudb.util.DecryptUtil 0:root:password
a2SY+TZczkA9Fz9+QA3DoY7W7+Vp62782bp/qR1BNN8XjDXfiImfArARJyWdIcm8RMIU29p5FijneWPoHUyZgw==
# 重启mycat生效

log4j2.xml文件

文件用途:

  • 配置输出日志的格式
  • 配置输出日志的级别

log4j2.xml配置详解

<pattern>配置MyCat日志格式
完整配置 基本上不用改,只要知道格式这些就好

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d [%-5p][%t] %m %throwable{full} (%C:%F:%L) %n"/>
        </Console>

        <RollingFile name="RollingFile" fileName="${sys:MYCAT_HOME}/logs/mycat.log"
                     filePattern="${sys:MYCAT_HOME}/logs/$${date:yyyy-MM}/mycat-%d{MM-dd}-%i.log.gz">
        <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <!--<AsyncLogger name="io.mycat" level="info" includeLocation="true" additivity="false">-->
            <!--<AppenderRef ref="Console"/>-->
            <!--<AppenderRef ref="RollingFile"/>-->
        <!--</AsyncLogger>-->
        <asyncRoot level="info" includeLocation="true">

            <!--<AppenderRef ref="Console" />-->
            <AppenderRef ref="RollingFile"/>

        </asyncRoot>
    </Loggers>
</Configuration>

<pattern>配置MyCat日志格式说明:

格式 说明
%d{yyyy-MM-dd HH:mm:ss.SSS} 表示日志的时间格式
%5p 表示输出的日志级别
%t 日志中记录线程名称
%m 输出代码中指定的消息
%n 输出一个回车换行符,window平台为 “/r/n”,
linux平台为 “\n”

level属性配置MyCAT日志级别
级别:All < Trace < Debug < Info < Warn < Error < Fatal < OFF

<asyncRoot level="info" includeLocation="true">
  <!--<AppenderRef ref="Console" />-->
  <AppenderRef ref="RollingFile"/>
</asyncRoot>

rule.xml文件

文件用途:

  • 水平分表的时候才需要,配置水平分片的分片规则
  • 指定分片规则和分片规则对应的分片函数

<tableRule>标签配置表的分片规则
<function>配置表的分片算法

<tableRule name="hash-mod-4_id">
<!-- 分片规则名称,整个配置文件唯一,分片算法-分片节点数_分片列名 -->
    <rule>
        <!-- 分片使用的列字段,必须是实际存在的列 -->
        <columns>id</columns>
        <!-- 分片的算法,取自<function>的name属性 --> 
        <algorithm>hash-mod-4</algorithm> 
    </rule>
</tableRule>

<function name="hash-mod-4" class="org.opencloudb.route.function.PartitionByHashMod">
<!-- 分片算法,唯一;JAVA类路径,1.6是"io.mycat.route.function.PartitionByHashMod"-->
        <property name="count">4</property>
        <!-- 不同分片算法属性不一样,这里是将数据分成4份 -->
</function>

常用分片算法

  • 1、简单取模-PartitionByMod:适用于整数类型的列,简单取模存储到后端节点-分片基数,数据分布比较均匀
<tableRule name="customer_login">
    <rule>
        <columns>customer_id</columns>
        <!-- 这个列整形 -->
        <algorithm>mod-long</algorithm>
    </rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <property name="count">2</property>
</function>
  • 2、hash取模-PartitionByHashMod:适用非整形类型的列,如字符串、日期,经过hash后再进行取模,数据分布可能不均匀**
<tableRule name="customer_login">
    <rule>
        <columns>login_name</columns>
        <!-- 这个列是字符串 -->
        <algorithm>mod-long</algorithm>
    </rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByHashMod">
<!-- 分片算法不一样 -->
        <property name="count">2</property>
</function>

前面两个算法是利用mycat本身算法分片,后面两算法可以人为控制

  • 3、枚举分片-PartitionByFileMap:根据可能的枚举值指定数据存储的节点位置,需要额外增加mapfile文件,适用按地区来分片业务场景**

    mapFile记录可能出现的值,及分片值对应的节点索引
<tableRule name="customer_login">
    <rule>
        <columns>login_name</columns>
        <!-- 这个列是字符串 -->
        <algorithm>filemap-int</algorithm>
    </rule>
</tableRule>

<function name="filemap-int" class="io.mycat.route.function.PartitionByFileMap">
<!-- 分片算法不一样 -->
        <property name="mapFile">partition-hash-int.txt</property>
        <!--
        partition-hash-int.txt,存在conf目录
        10000=0
        10001=1
        DEFAULT_NODE=0
        -->
        <property name="type">0</property>
        <!-- mapfile中枚举key的类型,0代表整形,非0代表string -->
        <property name="DefaultNode">0</property>
        <!-- 大于等于0启用默认节点,小于0不启用默认节点 -->
</function>
  • 4、字符串范围取模-PartitionByPrefixPattern:截取固定长度字符串进行ascii码求和,然后除以求模基数(配置文件指定),确定数据存储节点**
<tableRule name="customer_login">
    <rule>
        <columns>login_name</columns>
        <!-- 这个列是字符串 -->
        <algorithm>filemap-int</algorithm>
    </rule>
</tableRule>

<function name="filemap-int" class="io.mycat.route.function.PartitionByPrefixPattern">
<!-- 分片算法不一样 -->
        <property name="patternValue">128/property>
        <!-- 求模基数 -->
        <property name="mapFile">prefix-partition-pattern.txt</property>
        <!--
        partition-hash-int.txt,存在conf目录
        0-63=0
        64-127=1
        -->
        <property name="PrefixLength">2</property>
        <!-- 截取的字符串长度 -->
</function>

schema.xml文件

文件用途:

  • 配置逻辑库及逻辑表信息
  • 配置逻辑表所存储的数据节点
  • 配置数据节点所对应的物理数据库服务器信息

schema.xml配置详解

1、定义逻辑库

  • name:定义逻辑库的名称,名字不可重复,可以和物理库不一样。
  • checkSQLschema:判断是否检查发给mycat的sql是否含有库名。
  • sqlMaxLimit:限制前端应用的默认返回行数,如果这里没有配置,将使用server.xml中的参数值,-1表示关闭Limit限制。
<schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn_test"> </schema>
<!-- 定义逻辑库的名称,可以和物理库不一样,checkSQLschema-判断是否检查发给mycat的sql是否含有库名,sqlMaxLimit-限制前端应用的默认返回行数,如果这里没有配置,将使用server.xml中的参数值,-1表示不限制返回函数 -->

2、定义逻辑表

  • name:定义逻辑表的名称,必须和物理表名一致且唯一。
  • primaryKey:定义逻辑表主键,和物理表主键一致,可以缓存主键信息,提高查询性能。
  • dataNode:指定物理表存储的物理节点;物理节点顺序和rule.xml节点顺序必须一致;。
  • rule:指定分片规则,这里的customer_login分配规则名称对应rule.xml的tableRule名称
<table name="customer_login" primaryKey="customer_id" dataNode="logindb01,logindb02" rule="customer_login"/>
<!-- 定义逻辑表的名称,必须和物理表名一致;定义逻辑表主键,和物理表主键一致,可以缓存主键信息,提高查询性能;指定物理表存储的物理节点;物理节点顺序和rule.xml节点顺序必须一致; 指定分片规则,这里的customer_login分配规则名称对应rule.xml的tableRule名称-->

3、定义物理数据库

  • name:物理节点名称,唯一。
  • dataHost:定义分片所在的物理主机。
  • database:物理数据库名称。
<dataNode name="dn_test" dataHost="dh_10.151" database="test" />
<!-- 物理节点名称,唯一;mysql集群的名称;集群中物理数据库名称 -->

4、定义mysql集群信息

<dataHost name="dh_10.151" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<!-- mysql集群的名称,唯一;mycat与后端数据库的最大、初始化连接数; -->
        <heartbeat>show slave status</heartbeat>
        <!-- <heartbeat>select user()</heartbeat> -->
        <!-- can have multi write hosts -->
        <writeHost host="Master_vip" url="172.16.10.151:3306" user="root" password="123456">
                <!-- can have multi read hosts -->
                <readHost host="S1_10.153" url="172.16.10.153:3306" user="root" password="123456" />
                <readHost host="S2_10.154" url="172.16.10.154:3306" user="root" password="123456" />
        </writeHost>
        <!-- <writeHost host="hostM2" url="localhost:3306" user="root" password="123456"/> -->
</dataHost>

# balance
# "0" 不开启读写分离机制,适用只有一个mysql数据库实例,或者读写敏刚应用
# "1" 全部的readhost和stand by writehost参与select语句负载均衡,适用双主双从实例
# "2" 所有的readhost和writehost都参与select语句负载均衡,适用写压力不大的应用场景
# "3" 所有readhost参与select语句的负载均衡,适用一主多从实例架构

# writeType
# "0" 默认值,所有的写请求落在第一个writehost上,当第一个writehost宕机后,才会选择第二个writehost主机
# "1" 随机将write请求分发到writehost主机上,有风险,适用PXC多写集群

# dbType
# 可以用于mongodb,用jdbc驱动

# switchType 写数据库如何进行切换
# "1" 当写主机不可用,自动切换到下一个可用写节点
# "-1" 关闭自动切换写主机功能,适用MHA管理的集群


switchType="-1,1,2,3"
--是否启用主从切换
-1:表示不启用主从切换;
1:为默认值,自动切换;
2:基于主从同步的状态,决定是否切换,与show slave status心跳对应;
3:基于多住galary集群切换,与show status like 'wsrep%'对应;


<heartbeat>show slave status</heartbeat> 
--心跳检测语句,一般为select user();
如果是switchType=2,基于主从同步状态决定是否切换,则心跳设为show slave status;
如果是switchType=3,则心跳设为show status like 'wsrep%';

5、关于balance补充

  • 1、一主一从情况下,为1有可能无法select 从库,读写均落在主库
  • 2、一主情况下,主库宕机,所有从库无法通过mycat连接
  • 3、一主多从,balance设为1,select均在从库
  • 4、一主一从,balance设为3,select在从库 通常使用该项
  • 5、一主一从,balance设为2,select会落在从库

未完待续。。。。。。

参考:
http://www.mycat.io/

http://www.mycat.io/document/mycat-definitive-guide.pdf

https://www.cnblogs.com/fyy-hhzzj/p/9044775.html

https://www.cnblogs.com/kingsonfu/p/10627802.html

https://blog.csdn.net/vbirdbest/article/details/83514361

https://blog.csdn.net/weixin_41043145/article/details/102753351

https://www.cnblogs.com/jenvid/p/10180435.html

https://blog.csdn.net/qq_30889373/article/details/103007101

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 1. 什么是mycat? 2. mycat可以应用在什么场景? 3. 什么样的表需要进行分片? 答:超过1000万...
    bernierayxu阅读 3,674评论 0 1
  • 先上官方文档: Mycat-doc Mycat 权威指南 常用配置文件间的关系 由上图可以看到 Mycat 的核心...
    端碗吹水阅读 2,212评论 0 1
  • mycat简介 mycat是一个数据库中间件,可以理解为一个数据库的代理层。 mycat的重要配置文件包括serv...
    捞月亮的阿汤哥阅读 11,735评论 0 0
  • 一、学习与实践 1.付出不亚于任何人的努力 2.要谦虚,不要骄傲 3.要每天反省 4.活着,就要感谢 5.积善行,...
    grace2039阅读 179评论 0 0
  • The day before yestoday,l don't have the concept of the m...
    寄与已阅读 278评论 1 1