MyCat简单使用与配置

基本配置

  • 1 . 在mycat/conf目录下,MyCat核心配置文件:schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!-- 定义一个MyCat的模式,逻辑数据库名称TestDB -->
        <!-- “checkSQLschema”:描述的是当前的连接是否需要检测数据库的模式 -->
        <!-- “sqlMaxLimit”:表示返回的最大的数据量的行数 -->
        <!-- “dataNode="dn1"”:该操作使用的数据节点是dn1的逻辑名称 -->
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
        <!-- 定义数据的操作节点 -->
        <!-- “dataHost="localhost1"”:定义数据节点的逻辑名称 -->
        <!-- “database="mldn"”:定义数据节点要使用的数据库名称 -->
        <dataNode name="dn1" dataHost="localhost1" database="mldn" />
        <!-- 定义数据节点,包括了各种逻辑项的配置 -->
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <!-- 配置真实MySQL与MyCat的心跳 -->
            <heartbeat>select user()</heartbeat>
            <!-- 配置真实的MySQL的连接路径 -->
            <writeHost host="hostM1" url="192.168.1.128:3306" user="root" password="123456"></writeHost>
        </dataHost>
</mycat:schema>
  • 2 . dataHost标签上属性释义:
    • balance:负载均衡类型
      • 0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
      • 1:全部的readHost与stand by writeHost参与select语句的负载均衡,
      • 2:所有读操作都随机在writeHost、readHost上分发
      • 3:所有读请求随机分发到writeHost对应的readHost执行,writeHost不负担读压力
    • writeType:负载均衡类型
      • 0:所有写操作发送到配置的第一个writeHost,当第一个writeHost宕机时,切换到第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件:dnindex.properties
      • 1:所有写操作都随发送到配置的writeHost
      • 2:尚未实现
    • switchType:切换方式
      • -1:不自动切换
      • 1:自动切换(默认)
      • 2:基于MySql主从同步的状态来决定是否切换

读写分离

一. MycSQL主从配置
  • 1 . 前提:多台MySQL服务器主机的时间是同步的,否则无法实现主从配置

  • 2 . MASTER修改MySQL配置文件vim /usr/local/mysql/my.cnf

log-bin=mysql-bin-1 : 表示配置同步的bin的文件名称,不同的主从关系组,名称不同
server_id=196 : 表示MySQL服务的编号,这个编号一般取IP的最后一位,也可自定义

  • 3 . MASTER启动MySQL服务nohup mysqld_safe --user=root > /dev/null 2>&1 &
  • 4 . MASTER 登陆MySQL数据库:mysql -uroot -p123456,查看master状态show master stats;

其中
File(tid_set) : 表示主机名称(mysql-bin-1.000001)
Position : 表示同步的节点位置

  • 5 . MASTER建立同步用户:sync_user
GRANT REPLICCATION SLAVE,REPLICATION CLIENT ON *.* TO 'sync_user'@'192.168.1.%' IDENTIFIED BY '123456';
flush privileges;
  • 6 . SLAVE修改MySQL配置文件vim /usr/local/mysql/my.cnf

log-bin=mysql-bin-1 : 表示配置同步的bin的文件名称,不同的主从关系组,名称不同
server_id=168 : 表示MySQL服务的编号,这个编号一般取IP的最后一位,也可自定义

  • 7 . MASTER/SLAVE : 若服务已经启动,需要删除自动配置的编号文件,否则无法同步rm /usr/local/mysql/data/auto.cnf
  • 8 . SLAVE 启动MySQL服务nohup mysqld_safe --user=root > /dev/null 2>&1 &
  • 9 . SLAVE 登陆MySQL数据库:mysql -uroot -p123456
  • 10 . SLAVE进行主从关系配置
  • 若此时已经启动了从主机,必须先停止:stop slave;
  • 停止之后还想重新启动,必须清楚所有的日志信息: flush logs;
  • 定义master主机:
change master to master_host='192.168.1.128',master_user='sync_user',master_password='123456',master_log_file='mysql-bin-1.000001',master_log_pos=435 ;

master_host表示mast的主机ip
master_user表示可同步的账号
master_password表示同步账号的密码
master_log_file表示MASTERshow master stats;查看时的File(tid_set)
master_log_pos表示MASTERshow master stats;查看时的Position

  • 启动slave:start slave;
  • 查询当前从主机状态:show slave status\G;
  • 若出现以下代码表示已经启动完成
Slave_IO_Running:YES
Slave_SQL_Running:Yes
二. MyCat读写分离配置
  • 1 . 修改MyCat的schema.xml文件vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!-- 定义一个MyCat的模式,逻辑数据库名称TestDB -->
        <!-- “checkSQLschema”:描述的是当前的连接是否需要检测数据库的模式 -->
        <!-- “sqlMaxLimit”:表示返回的最大的数据量的行数 -->
        <!-- “dataNode="dn1"”:该操作使用的数据节点是dn1的逻辑名称 -->
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
        <!-- 定义个数据的操作节点,以后这个节点会进行一些库表分离使用 -->
        <!-- “dataHost="localhost1"”:定义数据节点的逻辑名称 -->
        <!-- “database="test"”:定义数据节点要使用的数据库名称 -->
        <dataNode name="dn1" dataHost="localhost1" database="test" />
        <!-- 定义数据节点,包括了各种逻辑项的配置 -->
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <!-- 配置真实MySQL与MyCat的心跳 -->
            <heartbeat>select user()</heartbeat>
            <!-- 配置真实的MySQL的连接路径 -->
            <writeHost host="hostMaster" url="192.168.1.196:3306" user="root" password="123456">
                <readHost host="hostSlave" url="192.168.1.168:3306" user="root" password="123456"/>
            </writeHost>
        </dataHost>
</mycat:schema>
  • 2 . 对于读写分离的配置中:设置readHost读取:balance=3,设置writeHost与ReadHost共同分担读取:balance=2
  • 3 . 启动MyCat服务:/usr/local/mycat/bin/mycat console
  • 4 . 此时就完成了MyCat读写分离的相关配置

垂直分库

垂直分库实际上就是进行多表分库管理

  • 1 . 分别在多台MySQL主机上进行多个表的创建
  • 2 . 修改MyCat的配置文件vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
        <schema name="TESTDB2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"/>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.1.199:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host2" url="192.168.1.166:3306" user="root" password="123456"/>
        </dataHost>
</mycat:schema>
  • 3 . 修改MyCat用户配置文件,将多个数据库配置到server.xmlvim /usr/local/mycat/conf/server.xml
<property name="schemas">TESTDB1,TESTDB2</property>
  • 4 . 启动MyCat服务/usr/local/mycat/bin/mycat console
  • 5 . 此时即完成了垂直分库,数据操作时需要指定具体操作的是哪一个数据库

全局表

  • 1 . 全局表的作用:可充当数据字典表,这张数据表会在所有的数据库中存在,但对外而言,只是一个逻辑数据库存在的数据表,当对该表进行变更操作时,所有数据库的该表都会发生相应的变化
  • 2 . 在多台MySQL主机上分别建立各自的数据字典表
  • 3 . 修改MyCat的核心配置文件vim /usr/local/mycat/conf/schema.xml
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <table name="dict" primaryKey="did" type="global" dataNode="dn1,dn2"/>
        </schema>
        <schema name="TESTDB1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
        <schema name="TESTDB2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"/>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.1.199:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host2" url="192.168.1.166:3306" user="root" password="123456"/>
        </dataHost>
</mycat:schema>
  • 4 . 修改MyCat的用户配置文件vim /usr/local/mycat/conf/server.xml,将schema.xml配置的所有逻辑数据库,配置到该配置文件中
<property name="schemas">TESTDB1,TESTDB2,TESTDB</property>
  • 5 . 启动MyCat服务/usr/local/mycat/bin/mycat console
  • 6 . 此时就完成了全局表的配置,此时只要对TESTDB该逻辑数据库进行dict表的更新或插入操作,所有的其他数据库(TESTDB1,TESTDB2)上的dict表都会得到更新

水平分库

  • 一 .常用水平分库

  • 水平分库指的是将一个数据量庞大的数据表分别保存到不同的数据库里,即:现在有多个数据库,这个库保存同样结构的数据表,这些数据根据MyCat的算法,分别保存到符合自身要求的数据库的数据表中,MyCat的分片规则配置文件在:/usr/local/mycat/conf/rule.xml中,目前常用的分片规则有:
  • 求模分库:mod-long
  • 范围分库:auto-sharding-long
  • Hash分库:hash-int
  • 月分库:sharding-by-month
  • ER模型分库:childTable
  • 自定义分库:CustomRule(该方式需要自己实现分库算法)
  • 二 . 分片规则:编辑分片规则文件vim /usr/local/mycat/conf/rule.xml

  • A . 求模分库
    • rule.xml的配置
<tableRule name="my-mod-long">
        <rule>
                <columns>id</columns>
                <algorithm>mod-long</algorithm>
        </rule>
</tableRule>
<function name="my-mod-long" class="io.mycat.route.function.PartitionByMod">
        <property name="count">3</property><!--求模取余的数-->
</function>
  • schema.xml配置
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <table name="data" primaryKey="id" dataNode="dn1,dn2,dn3" rule="my-mod-long"/>
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataNode name="dn3" dataHost="localhost3" database="db3" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.1.199:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host2" url="192.168.1.166:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host3" url="192.168.1.176:3306" user="root" password="123456"/>
        </dataHost>
</mycat:schema>
  • server.xml配置
<property name="schemas">TESTDB</property>
  • 启动MyCat服务/usr/local/mycat/bin/mycat console
  • 使用客户端端口进行连接mysql -uroot -p123456 -h192.168.1.1 -P8066 -DTESTDB
  • 此时,就实现了MyCat的求模分片,每对3进行取余,然后自动进行分片数据保存处理
  • 序列的使用:
  • 序列的配置,在usr/local/mycat/conf/sequence_conf.properties文件中
  • 还需要在server.xml文件中配置
  • <property name="sequenceHandlerType">0</property>
  • 在SQL中使用next value for MYCATSEQ_GLOBAL表示序列增长
  • INSERT INTO data (id,title) VALUES (next value for MYCATSEQ_GLOBAL,@@hostname);
  • B . 范围分库
    • 范围分库指的是,根据id的范围进行不同数据库的保存,或者根据数据大小的不同来进行保存
    • rule.xml的配置
<tableRule name="my-auto-sharding-long">
        <rule>
                <columns>id</columns>
                <algorithm>my-auto-sharding-long</algorithm>
        </rule>
</tableRule>
<function name="my-auto-sharding-long" class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">partition-long.txt</property><!--范围规则文件-->
</function>
 - 此时需要定义一个范围分库的规则问津`partition-long.txt`,并存放在`conf`目录中`vim /usr/local/mycat/conf/partition-long.txt`
 - partition-long.txt

根据数据编号划分
0-10000=0
10001-20000=1
20001-30000=2

 - 修改`schema.xml`匹配新的分片规则
<table name="data" primaryKey="id" dataNode="dn1,dn2,dn3" rule="my-auto-sharding-long"/>
  • C . Hash分库
    • Hash分库指的是根据某个字段的的固定内容进行分片,例如:根据省份分片,根据城市分片,一般进行Hash分片处理的,都要有一些固定的值进行匹配
    • rule.xml配置
<tableRule name="my-by-intfile">
        <rule>
                <columns>title</columns>
                <algorithm>my-hash-int</algorithm>
        </rule>
</tableRule>
<function name="my-hash-int" class="io.mycat.route.function.PartitionByFileMap">
                < property name="type">1</property><!--0表示数字型分片,1表示字符串分片-->
        <property name="mapFile">partition-hash-int.txt</property><!--Hash规则文件-->
</function>
- `schema.xml`配置
<table name="data" primaryKey="title" dataNode="dn1,dn2,dn3" rule="my-by-intfile"/>
  • D . 按月分库
    • 每个月存入每个月单独的数据库中
    • rule.xml配置
<tableRule name="my-by-month">
        <rule>
                <columns>saledate</columns>
                <algorithm>my-partbymonth</algorithm>
        </rule>
</tableRule>
<function name="my-partbymonth" class="io.mycat.route.function.PartitionByMonth">
                < property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2017-01-01</property>
</function>
- `schema.xml`配置
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <!--使用$表示通配符-->
                <table name="data" primaryKey="id" dataNode="dn$1-12" rule="my-by-month"/>
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataNode name="dn3" dataHost="localhost3" database="db3" />
        <dataNode name="dn4" dataHost="localhost4" database="db4" />
        <dataNode name="dn5" dataHost="localhost5" database="db5" />
        <dataNode name="dn6" dataHost="localhost6" database="db6" />
        <dataNode name="dn7" dataHost="localhost7" database="db7" />
        <dataNode name="dn8" dataHost="localhost8" database="db8" />
        <dataNode name="dn9" dataHost="localhost9" database="db9" />
        <dataNode name="dn10" dataHost="localhost10" database="db10" />
        <dataNode name="dn11" dataHost="localhost11" database="db11" />
        <dataNode name="dn12" dataHost="localhost12" database="db12" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.1.166:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host2" url="192.168.1.199:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host3" url="192.168.1.116:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost4" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host4" url="192.168.1.150:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost5" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host5" url="192.168.1.152:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost6" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host6" url="192.168.1.177:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost7" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host7" url="192.168.1.136:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost8" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host8" url="192.168.1.153:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost9" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host9" url="192.168.1.159:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost10" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host10" url="192.168.1.176:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost11" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host11" url="192.168.1.156:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost12" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host12" url="192.168.1.136:3306" user="root" password="123456"/>
        </dataHost>
</mycat:schema>
  • E . ER模型分库
    • 根据数据库的ER模型进行分库,即进行多表关联分库管理
    • schema.xml配置
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
                <!--此处表示父表与子表的相互关联-->
                <table name="data" primaryKey="id" dataNode="dn$1-3" rule="my-mod-long">
                        <childTable name="data_details" joinKey="id" primaryKey="ddid" parentKey="id"/>
                </table>
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataNode name="dn3" dataHost="localhost3" database="db3" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host1" url="192.168.122.166:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host2" url="192.168.122.199:3306" user="root" password="123456"/>
        </dataHost>
        <dataHost name="localhost3" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host3" url="192.168.122.198:3306" user="root" password="123456"/>
        </dataHost>
</mycat:schema>
  • F . 自定义分库规则
    • 分布式数据库系统中,分片规则用于定义数据与分片的路由关系,也就是 insert,delete,update,select 的基本 sql 操作中,如何将 sql 路由到对应的分片执行。
      Mycat 的总体路由图为:
屏幕快照 2017-04-06 13.55.24.png

屏幕快照 2017-04-06 13.56.24.png

屏幕快照 2017-04-06 13.56.29.png

- 官方案例分析:

屏幕快照 2017-04-06 13.57.36.png

屏幕快照 2017-04-06 13.57.41.png

屏幕快照 2017-04-06 13.57.45.png

屏幕快照 2017-04-06 13.57.50.png

屏幕快照 2017-04-06 13.57.54.png

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

推荐阅读更多精彩内容