配置MySql主从数据库,MyCat分库分表,读写分离中间件(纯干货,无美图)

先点赞,后观看,伸手要有好习惯

  • 基于Java环境开发
  • 主要配置文件 schema.xml(逻辑数据库)、rule.xml(分片规则)、server.xml(一些系统和用户)

理解:Mycat作为一个逻辑数据库,是需要依赖下面的真实数据库

配置主从

  • 坑点及建议:
    1、因为关注点在主从,别花太多时间在一台单机安装mysql两个端口,可尝试虚拟机两台
    2、mysql5.7跟之前的版本不一样,windows上面测试的朋友my.ini可以自己新建
    3、对于my.ini的各个参数的解释请随机去百度,这里有我的转载

  • 实操
    假设现在两台数据库的mysql均已正常安装,配置如下

服务器 IP 账号 密码
A AUSER APWD
B BUSER BPWD

一般进my.ini只需要更新以下所给信息(<font color="red">有则改之无则加</font>):

主库配置及步骤

[mysqld]
#binlog格式,分三种:statement level,rowlevel,mixed
#三种模式的差别介绍可以看:https://juejin.im/post/5df32b2a6fb9a01628012fb3
binlog_format=mixed
#为服务器标识,主从一定不要一样  
server-id   = 1
#清理二进制日志的时间间隔
expire_logs_days = 10
#是需要同步的数据库  
binlog-do-db
#不需要同步的数据库
binlog-ignore-db = mysql                
binlog-ignore-db = test  

#设置gtid同步方式
gtid_executed_compression_period = 1000 #1000默认
gtid_mode = on #默认off
enforce_gtid_consistency = on #默认off

1、连接主库,并进入mysql

>mysql -u数据库用户名 -p数据库密码

2、为从库创建授权用户slave,密码slave ,B为对应的IP

grant replication slave on *.* to 'slave'@'B' identified by 'slave' ;

3、刷新权限信息

flush privileges;

4、自行创建数据库和数据表并插入相应数据,mysql默认InnoDB,主库可以不用修改引擎

从库配置及步骤

my.ini文件

[mysqld]
#binlog格式,分三种:statement level,rowlevel,mixed
#三种模式的差别介绍可以看:
binlog_format=mixed
#为服务器标识,主从一定不要一样  
server-id   = 13
#清理二进制日志的时间间隔
expire_logs_days = 10
#是需要同步的数据库  
binlog-do-db
#设置gtid同步方式
gtid_executed_compression_period = 1000 #1000默认
gtid_mode = on #默认off
enforce_gtid_consistency = on #默认off

1、连接从库,并进入mysql

>mysql -u数据库用户名 -p数据库密码

2、复制一份主库的数据库到从库,并赋予slave权限

grant all privileges on *.* to 'slave'@'%' identified by 'slave' with grant option;

3、刷新权限或者退出mysql命令行重启mysql服务

4、master建立数据同步

change master to master_host='A',master_user='slave',master_password='slave',master_auto_position=1;

<font color="red" >重要说明:</font>部分教程用的master_log_file & master_log_pos 参数来指定,但是slave一旦出现问题,无法确认断节点,数据容易造成不一致,所以才引入gtid(即global transaction ID全局事务ID),想看相应介绍的可以去mysql官网里面搜寻相应的版本然后看看.

5、mysql命令查看从库数据库状态

mysql>show slave status \G;

当显示的数据内有:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
就说明可以了

6、自行验证主库更新数据对从库的影响

Mycat

mycat架构图

![avatar][basemycat]

MyCat简介

简介个毛线,[MyCat官网](http://mycat.io/)那么详细的介绍不看,非要听我在这摘录?

环境安装

由于Mycat是基于Java开发的,所以JDK环境先安装好,再去安装Mycat,安装教程一大把,我就不赘述了

实现过程

1、为简单明了的看清配置信息,会删除不影响结果的注释,且本记录只针对一个主库和一个从库,分库分表只需要加对应的配置即可,配置文件中有相应的详细说明
2、可以进入mysql把从库的引擎改成MyISAM,如果不想从库有写的功能,也可以将mysql设置成只读数据库

schema.xml 配置信息(完整的配置信息及解释在文末):
主要是配置读写数据库信息和对应表信息

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <!-- 每一个schema代表一个逻辑数据库 
        这里的name是程序端使用的数据库名称,对应的数据库账号密码在server.xml中
    -->
    <schema name="MycatDemo" checkSQLschema="true" sqlMaxLimit="100">
        <!--  auto sharding by id (long)
            每个逻辑数据库下面对应的是所有的表,下方RDB代表真实数据库
            name:对应RDB中的表名
            primaryKey:RDB中该表的主键
            dataNode:这些表对应的数据库
            rule:对应的分片规则
        -->
        <table name="article" primaryKey="article_id" autoIncrement="true" dataNode="dn1"
               rule="mod-long" />
    </schema>
    
    <!-- 各个数据结点的信息,便于上方schema使用 

    如果是多个数据结点和多个host,那就同步复制一份dataNode和dataHost数据,然后写上对应的配置信息
        name:结点的名称
        dataHost:结点的主机地址
        database:RDB数据库名称
    -->
    <dataNode name="dn1" dataHost="localhost1" database="demo" />
    
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <!-- 心跳语句检测,检测对应的mysql是否正常运行 -->
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="11.11.11.11:3306" user="root"
                   password="root">
            <!-- can have multi read hosts -->
            <readHost host="hostS2" url="22.22.22.22:3306" user="root" password="root" />
        </writeHost>
        <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
    </dataHost>
    
</mycat:schema>

rule.xml 配置信息(完整的配置信息及解释在文末):
主要定义一些分片规则和生成规则之类的

这里尤其要注意一点,有个叫mod-long的function在schema.xml中引用到了,但是我只做了一分数据库,所以这里我把默认的3改成了1,如果你有对应的多个数据库分表,则改成相应的数量。

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
    - you may not use this file except in compliance with the License. - You 
    may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
    - - Unless required by applicable law or agreed to in writing, software - 
    distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
    License for the specific language governing permissions and - limitations 
    under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
    <tableRule name="rule1">
        <rule>
            <columns>id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="rule2">
        <rule>
            <columns>user_id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="sharding-by-intfile">
        <rule>
            <columns>sharding_id</columns>
            <algorithm>hash-int</algorithm>
        </rule>
    </tableRule>
    <tableRule name="auto-sharding-long">
        <rule>
            <columns>id</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="mod-long">
        <rule>
            <columns>article_id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-murmur">
        <rule>
            <columns>id</columns>
            <algorithm>murmur</algorithm>
        </rule>
    </tableRule>
    <tableRule name="crc32slot">
        <rule>
            <columns>id</columns>
            <algorithm>crc32slot</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-month">
        <rule>
            <columns>create_time</columns>
            <algorithm>partbymonth</algorithm>
        </rule>
    </tableRule>
    <tableRule name="latest-month-calldate">
        <rule>
            <columns>calldate</columns>
            <algorithm>latestMonth</algorithm>
        </rule>
    </tableRule>
    
    <tableRule name="auto-sharding-rang-mod">
        <rule>
            <columns>id</columns>
            <algorithm>rang-mod</algorithm>
        </rule>
    </tableRule>
    
    <tableRule name="jch">
        <rule>
            <columns>id</columns>
            <algorithm>jump-consistent-hash</algorithm>
        </rule>
    </tableRule>

    <function name="murmur"
        class="io.mycat.route.function.PartitionByMurmurHash">
        <property name="seed">0</property><!-- 默认是0 -->
        <property name="count">1</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
        <property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
        <!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
        <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
            用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
    </function>

    <function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
        <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
    </function>
    <function name="hash-int"
        class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
    </function>
    <function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">1</property><!-- 只有一个数据库我改成了1,默认3 -->
    </function>

    <function name="func1" class="io.mycat.route.function.PartitionByLong">
        <property name="partitionCount">8</property>
        <property name="partitionLength">128</property>
    </function>
    <function name="latestMonth"
        class="io.mycat.route.function.LatestMonthPartion">
        <property name="splitOneDay">24</property>
    </function>
    <function name="partbymonth"
        class="io.mycat.route.function.PartitionByMonth">
        <property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2015-01-01</property>
    </function>
    
    <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
            <property name="mapFile">partition-range-mod.txt</property>
    </function>
    
    <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
        <property name="totalBuckets">3</property>
    </function>
</mycat:rule>

server.xml 配置信息(完整的配置信息及解释在文末):
主要定义sql服务相关的参数,例如账号密码,sql事务及最大文本

<?xml version="1.0" encoding="UTF-8"?>
<!--  Licensed under the Apache License, Version 2.0 (the "License"); 
    - you may not use this file except in compliance with the License. - You 
    may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
    - - Unless required by applicable law or agreed to in writing, software - 
    distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
    License for the specific language governing permissions and - limitations 
    under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
    <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
    <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

        <property name="sequnceHandlerType">2</property>
      <!--  <property name="useCompression">1</property> --> <!--1为开启mysql压缩协议-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property> --> <!--设置模拟的MySQL版本号-->
    <!-- <property name="processorBufferChunk">40960</property> -->
    <!-- 
    <property name="processors">1</property> 
    <property name="processorExecutor">32</property> 
     -->
        <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
        <property name="processorBufferPoolType">0</property>
        <!-- 默认是65535 64K 用于sql解析时最大文本长度  -->
        <property name="maxStringLiteralLength">65535</property>
        <property name="sequnceHandlerType">0</property>
        <property name="backSocketNoDelay">1</property>
        <property name="frontSocketNoDelay">1</property>
        <property name="processorExecutor">16</property>
        
            <property name="serverPort">8066</property> <property name="managerPort">9066</property> 
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property>
        <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
        <property name="handleDistributedTransactions">0</property>
        
            <!--
            off heap for merge/order/group/limit      1开启   0关闭
        -->
        <property name="useOffHeapForMerge">1</property>

        <!--
            单位为m
        -->
        <property name="memoryPageSize">1m</property>

        <!--
            单位为k
        -->
        <property name="spillsFileBufferSize">1k</property>

        <property name="useStreamOutput">0</property>

        <!--
            单位为m
        -->
        <property name="systemReserveMemorySize">384m</property>


        <!--是否采用zookeeper协调切换  -->
        <property name="useZKSwitch">true</property>


    </system>
    
    <!-- 全局SQL防火墙设置 -->
    <!-- 
    <firewall> 
       <whitehost>
          <host host="127.0.0.1" user="mycat"/>
          <host host="127.0.0.2" user="mycat"/>
       </whitehost>
       <blacklist check="false">
       </blacklist>
    </firewall>
    -->
    <!-- 相当于Mycat逻辑数据库的管理员账号 数据库名跟schema.xml中定义的保持一致-->
    <user name="mycatuser">
        <property name="password">mycatpwd</property>
        <property name="schemas">MycatDemo</property>
        <property name="defaultAccount">true</property>
        <!-- 表级 DML 权限设置 -->
        <!--        
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>       
         -->
    </user>
    <!-- 相当于Mycat逻辑数据库的只读账号 数据库名跟schema.xml中定义的保持一致-->
    <user name="user">
        <property name="password">user</property>
        <property name="schemas">MycatDemo</property>
        <property name="readOnly">true</property>
    </user>

</mycat:server>

程序中连接数据库的时候就不再是单纯的mysql的连接和账号密码了,而是上面定义的:
数据库名:MycatDemo(schema.xml中)
账号:mycatuser(server.xml中)
密码:mycatpwd(server.xml中)

验证读写分离

进入mysql命令行,开启主从两个数据库的sql日志,通过sql日志执行的情况就能判断读写使用的哪个库

查看日期情况

mysql>show variables like '%general%';

开启日志

mysql>SET GLOBAL general_log = 'On';

指定日志文件

mysql>SET GLOBAL general_log_file = '/var/lib/mysql/mysql.log';

Mycat性能监控

mycat有性能监控的WEB管理端软件,有需要的自行下载安装

配置文件说明

server.xml文件说明

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
    - you may not use this file except in compliance with the License. - You 
    may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
    - - Unless required by applicable law or agreed to in writing, software - 
    distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
    License for the specific language governing permissions and - limitations 
    under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
    <property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
    <property name="useHandshakeV10">1</property>
    <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
    <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

    <property name="sequnceHandlerType">2</property> <!--0 本地文件方式  1 数据库方式  2 时间戳方式-->
    <property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
    <!-- <property name="processorBufferChunk">40960</property> -->
    <!-- 
    <property name="processors">1</property> 
    <property name="processorExecutor">32</property> 
     -->
        <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
        <property name="processorBufferPoolType">0</property>
        <!--默认是65535 64K 用于sql解析时最大文本长度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</property>-->
        <!--
            <property name="serverPort">8066</property> <property name="managerPort">9066</property> 
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
        <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
        <property name="handleDistributedTransactions">0</property>
        
            <!--
            off heap for merge/order/group/limit      1开启   0关闭
        -->
        <property name="useOffHeapForMerge">1</property>

        <!--
            单位为m
        -->
        <property name="memoryPageSize">64k</property>

        <!--
            单位为k
        -->
        <property name="spillsFileBufferSize">1k</property>

        <property name="useStreamOutput">0</property>

        <!--
            单位为m
        -->
        <property name="systemReserveMemorySize">384m</property>


        <!--是否采用zookeeper协调切换  -->
        <property name="useZKSwitch">false</property>

        <!-- XA Recovery Log日志路径 -->
        <!--<property name="XARecoveryLogBaseDir">./</property>-->

        <!-- XA Recovery Log日志名称 -->
        <!--<property name="XARecoveryLogBaseName">tmlog</property>-->
        <!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->
        <property name="strictTxIsolation">false</property>
        
        <property name="useZKSwitch">true</property>
        
    </system>
    
    <!-- 全局SQL防火墙设置 -->
    <!--白名单可以使用通配符%或着*-->
    <!--例如<host host="127.0.0.*" user="root"/>-->
    <!--例如<host host="127.0.*" user="root"/>-->
    <!--例如<host host="127.*" user="root"/>-->
    <!--例如<host host="1*7.*" user="root"/>-->
    <!--这些配置情况下对于127.0.0.1都能以root账户登录-->
    <!--
    <firewall>
       <whitehost>
          <host host="1*7.0.0.*" user="root"/>
       </whitehost>
       <blacklist check="false">
       </blacklist>
    </firewall>
    -->

    <!--用户名是mycat-->
    <user name="mycat" defaultAccount="true">
        <!--密码是123456-->
        <property name="password">123456</property>
        <!---可访问的逻辑库有mycatdb-->
        <property name="schemas">mycatdb</property>
        
        <!-- 表级 DML 权限设置 -->
        <!--        
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>       
         -->
    </user>

    <user name="user">
        <property name="password">user</property>
        <property name="schemas">mycatdb</property>
        <!--是否只读-->
        <property name="readOnly">true</property>
    </user>

</mycat:server>

schema.xml文件说明

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <!-- checkSQLschema这个属性默认就是false,官方文档的意思就是是否去掉表前面的数据库的名称,
    ”select * from db1.testtable” ,设置为true就会去掉db1。但是如果db1的名称不是schema的名称,那么也不会被去掉,
    因此官方建议不要使用这种语法。同时默认设置为false。-->
    
    <!-- sqlMaxLimit当该值设置为某个数值时。每条执行的 SQL 语句,如果没有加上 limit 语句,MyCat 也会自动的加上所对应的值。
    例如设置值为 100,执行”select * from test_table”,则效果为“selelct * from test_table limit 100”.
    注意:如果运行的 schema 为非拆分库的,那么该属性不会生效。-->
    <schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100">
    
        <!-- name   该属性定义逻辑表的表名 -->
        <!-- dataNode   该属性定义这个逻辑表所属的 dataNode, 该属性的值需要和 dataNode 标签中 name 属性的值相互对应。 -->
        <!-- rule   该属性用于指定逻辑表要使用的规则名字,规则名字在 rule.xml 中定义,必须与 tableRule 标签中 name 属性属性值一一对应 -->
        <!-- ruleRequired   该属性用于指定表是否绑定分片规则,如果配置为 true,但没有配置具体 rule 的话 ,程序会报错。 -->
        <!-- primaryKey 该逻辑表对应真实表的主键, -->
        <!-- type   该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型。全局表定义type=”global”,不定义的就是普通表。 -->
        <!-- autoIncrement  主键是否自增长。 -->
        <!-- subTables  分表,分表目前不支持Join。 -->
        <!-- needAddLimit是否自动添加limit,默认是开启状态。关闭请谨慎。 -->
        
        <!--rule="mod-long"  指定规则在rule中配置-->
        <table name="users" primaryKey="id" dataNode="dn1"/>
        <table name="orders" primaryKey="id" dataNode="dn1"/>
        
        
        <table name="product" primaryKey="id" dataNode="dn2"/>
        <table name="news" primaryKey="id" dataNode="dn2"/>
        

    </schema>

    <!--  Name  定义数据节点的名字,这个名字需要是唯一的-->
    <!-- dataHost   该属性用于定义该分片属于哪个数据库实例 -->
    <!-- Database   该属性用于定义该分片属性哪个具体数据库实例上的具体库 -->
    <dataNode name="dn1" dataHost="localhost1" database="sharding1" />
    <dataNode name="dn2" dataHost="localhost2" database="sharding2" />

    <!--  name  唯一标识 dataHost 标签,供上层的标签使用-->
    <!-- maxCon 指定每个读写实例连接池的最大连接。 -->
    <!-- minCon 指定每个读写实例连接池的最小连接,初始化连接池的大小。 -->
    <!-- balance    负载均衡类型,目前的取值有4 种: 
    “0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。 
    “1”,全部的 readHost 与 stand by writeHost(非主非从) 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
    ”2”,所有读操作都随机的在 writeHost、readhost 上分发。
    ”3”,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压writeType 1. writeType=”0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .2. writeType=”1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。默认0就好了!-->
    <!-- dbType 指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、oracle、spark 等. -->
    <!-- dbDriver   指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。 -->
    <!-- switchType “-1” 表示不自动切换; “1” 默认值,自动切换; 
                    “2” 基于 MySQL 主从同步的状态决定是否切换心跳语句为 show slave status; 
                    “3” 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)心跳语句为 show status like ‘wsrep%’.                  
    -->
    <!--slaveThreshold:指定从节点的最大个数-->
   

    <dataHost name="localhost1" 
              maxCon="1000" 
              minCon="10" 
              balance="0"
              writeType="0" 
              dbType="mysql" 
              dbDriver="native" 
              switchType="1"  
              slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        
        <!--host    用于标识不同实例,一般 writeHost 我们使用*M1,readHost 我们用*S1。-->
        <!--url 后端实例连接地址。Native:地址:端口 JDBC:jdbc的url-->
        <!--password    后端存储实例需要的密码-->
        <!--user    后端存储实例需要的用户名字-->
        <!--weight  权重 配置在 readhost 中作为读节点的权重-->
        <!--usingDecrypt    是否对密码加密,默认0。具体加密方法看官方文档。-->
        <writeHost host="hostM1" url="47.94.158.155:3306" user="root"
                   password="TJXtjx_19991007">
        </writeHost>
    </dataHost>
    
    
    <dataHost name="localhost2" 
              maxCon="1000" 
              minCon="10" 
              balance="0"
              writeType="0" 
              dbType="mysql" 
              dbDriver="native" 
              switchType="1"  
              slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM2" url="47.94.158.155:3306" user="root"
                   password="TJXtjx_19991007">
        </writeHost>
    </dataHost>

</mycat:schema>

rule.xml文件说明

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
    - you may not use this file except in compliance with the License. - You 
    may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
    - - Unless required by applicable law or agreed to in writing, software - 
    distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
    License for the specific language governing permissions and - limitations 
    under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
    <tableRule name="rule1">
        <rule>
            <columns>id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="rule2">
        <rule>
            <columns>user_id</columns>
            <algorithm>func1</algorithm>
        </rule>
    </tableRule>

    <tableRule name="sharding-by-intfile">
        <rule>
            <columns>sharding_id</columns>
            <algorithm>hash-int</algorithm>
        </rule>
    </tableRule>
    <tableRule name="auto-sharding-long">
        <rule>
            <columns>id</columns>
            <algorithm>rang-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-murmur">
        <rule>
            <columns>id</columns>
            <algorithm>murmur</algorithm>
        </rule>
    </tableRule>
    <tableRule name="crc32slot">
        <rule>
            <columns>id</columns>
            <algorithm>crc32slot</algorithm>
        </rule>
    </tableRule>
    <tableRule name="sharding-by-month">
        <rule>
            <columns>create_time</columns>
            <algorithm>partbymonth</algorithm>
        </rule>
    </tableRule>
    <tableRule name="latest-month-calldate">
        <rule>
            <columns>calldate</columns>
            <algorithm>latestMonth</algorithm>
        </rule>
    </tableRule>
    
    <tableRule name="auto-sharding-rang-mod">
        <rule>
            <columns>id</columns>
            <algorithm>rang-mod</algorithm>
        </rule>
    </tableRule>
    
    <tableRule name="jch">
        <rule>
            <columns>id</columns>
            <algorithm>jump-consistent-hash</algorithm>
        </rule>
    </tableRule>

    <function name="murmur"
        class="io.mycat.route.function.PartitionByMurmurHash">
        <property name="seed">0</property><!-- 默认是0 -->
        <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
        <property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
        <!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
        <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
            用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
    </function>

    <function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
    </function>
    <function name="hash-int"
        class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
    </function>
    <function name="rang-long"
        class="io.mycat.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
    </function>
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!-- how many data nodes -->
        <property name="count">3</property>
    </function>

    <function name="func1" class="io.mycat.route.function.PartitionByLong">
        <property name="partitionCount">8</property>
        <property name="partitionLength">128</property>
    </function>
    <function name="latestMonth"
        class="io.mycat.route.function.LatestMonthPartion">
        <property name="splitOneDay">24</property>
    </function>
    <function name="partbymonth"
        class="io.mycat.route.function.PartitionByMonth">
        <property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2015-01-01</property>
    </function>
    
    <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
            <property name="mapFile">partition-range-mod.txt</property>
    </function>
    
    <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
        <property name="totalBuckets">3</property>
    </function>
</mycat:rule>

[basemycat]:data:image/webp;base64,UklGRnRJAABXRUJQVlA4IGhJAACw/ACdASr5ARoBPp1Cm0mlo6MhKPYdqLATiWRu+EoT6s3T2u2ANngc4BolAG+9/6PaKzT6p/R/5b9tPzA+dbm3vl9leI/yz/Fe5w70yt/cP5vzr/8v1tfrP2Fv63/bPUd6jf6x/0vVj/Tf79+3X//+IH/hft776P6z6Lnpe+s76Jf7o+tJ/7/3S+KL/S/+D1m/+Rqnf2Xupfuv+b/wPjv5RPb+6v9fZW/iP5z9mvUn7DOb/cl/Sf97/N+KfxD1BfzT+j+D/9eP8Z30mp/5z/w/7H2BfX37D+xH+e9vf5T/rf3T1H/Tf7X/0PcA/mP9b/5vr//2PCL+1/8T9ofgB/o/9q/5f+I/wfxEf23/v/yf+l/df3AfsP+f/+X+o+Av9ef2O9tn//+639yf//7xn7j//9LsYTApaUyQ353peM8xEjnXPjt/gaKmgCMEPRAz1etsf7DVT1LBXAzt3cCJKm0KdgrfuE2BlMYwlyxDt+NtMKOBBqb3KyUAILKOy5AGEKQBHhW6oVO2jOzvbUGDnqsOhJcIwP6du59ChDk7d8IS73CpQVpa34HdRG5UMgMgafU5djxzWfHqYrktZ7kAtUJe/177jsWbxIYllHKcsS+LHzHsz/wNKuxYbiBx0nORcamXqr/dP0DTHl8pb0EO5GCQDt+zAk1+zc0mB12W/y0AYUfgQJlNWSf5YslJPZgM1Nt254GcRXX47KqSYYHfiZAEWuXRdWv9l628jZ8wk5TQIKgH9Ga0loMGMdvUPnkRxo6mjv7JT5TFVADdbDZL1D1o/76OsGEreSTjyuVIPeMoh/sYM39Q1Zl8xCqEWiLXxDEwicpTFPJdD4Rkm7Pq5Da9vdZ3VfDAjgMclU4/S/HsAZlV8JM2HPd/0n1rvVun+sCGzi37PUqR+nSc/2DEC04lSYefsJyIrnRt3wtjYxr330DEhogNk9b1S/EZUXpvM8oGuB8Xe3kJMu84OdUKxQ54fqpCmdEQ+qvlYaHgF68dF/dk9tPdJCcVf/oI8Gt2LMKGdcJtZQp1+ORub3LIQ9HXYHVisbSuSc4/LdpxafRHbb1EER469Gm0GBypCNgE9lFoEJkKf2Qk9lqLdoougyiOr2WGpY2yGF437azqOoPLJNHIm21cTQMvtfZtCsQ+eFvfHB6TD5ut3Hr4FHgBcECwt//87XSQ6KV6aDzmXcbR28Fql81GxK/y+T3RMeQAfr/vNONbinSbCp4WfTZbQvGSOUsUfJc/2m1K9WzcUDk1IF4rdGIQccs4USwM2jn0ADJHiVezSC0fB6QxDi/ql32PllDDD7hgo5lAAENIzYgZQ3F+qjAihZuLJ7kRq6xgoR/pO4zXAXBsy0kKBwU70BtrJMPlSNC9vW6QwQeYafJgzX4/VC4rkgn5GUCfTYKBVd2YKiBlkK4qZsnRX2jVW7/Uw9HLdKSfHjyGJ73Ww4gxB9gw15oIk0khOXVYoRU9nk1Pc7QoZ1LrY6IM+molLITxUNTo3sWdy/3DvqZ7iuh3+qvHnN5gg7eHMKB6h4uEUICpGjff9ZSoW2vSquGnEoXyEvU4RLBVCedQXbNw7NXnVExTUytiYSddIbqom3uE8SAWFnIA8HXS4Soldpci1aoDiCJy4dDbrI7iv3lz+mnfxpU4Us99y9m512jdH4Lh5pVUMDgBLFXJTLZVcmWoi/jQ1L2pBEFzbZPfiIu4/jrft5ZDC3mdPI5WOYyZNA7wBZvqd3/hKqFD2vrKmsUQk03fF5EtzVHbRqJU/6sJ0mSnfeI7OgCzQj0uHcAeqH17xiLRx1WOj68xbSYVCEED4I9YTnwr5rFG5gyocIbG+QneN3oUOspQ4GcbDpLMcFg1IO0SOpCsG/k4PWOJLp9VuP3/svUxw/1egQeTQxbPQHKzDepRPNQD4LRAQOB35u1lWWolQ6pAZMoV9dKmFFnvEvYyB+JfQotWnJBoeJ71QVhfPNdlZ+6RamP1zf0kKQkqfmfz5VsT14hQQoUWEEobYuW8aR0vdEe+xnHfSXn3qfj2Chw4AI2HV7QiKINH+FR93u0E15ID2t60HXNfCNLjrlNaxAJl52iKNGL71l5+JyPQiwllbhrmz22WaO/kDUYqEUCtaUST81o33/VTpn3JQreVSCUhheqLE48X1tluXlHQLbEtY4kU5o48HUNobnRc5AjaIyb77Y3NXvXQ6vMbCoR99n40itFCLJrBLA9z5/+v0lEUxiuUoGJMQVlPRH7vzUa0HIi84TLZLN2eSOQkUDg0yHIYXo+dXkfvm+8lU+9VemFSNxR8F/8OBkajxKQ9ygVqHTTE7qwVQLWCLJ6BLZ3n52QkS22B6R69l8SwyhdNOv57vzKZZ7a3eaPFADe4pZprOcjofOds7dfu6/d1Y4+ZFS4ulTjZbst6Q1NjFYHw3ECA1I8nKV6ctPISF6M0l6PgugdGYpwX/XMn6E3LozsNKkK/QzVi2npiKPgqLfD1dSsLl03RkCWpcpsVzYrmxUpeyRx9WDckTH0hhKmh3M1N1AfdYy5G64WhugsML7fa+7VNKrH2TjejmZsIG6yksmcD0Wh5xrPDsQhuAsgRmkRzJ0EW1C3OHm4ulFHgt2JDPv/Zf+vNWx3Px6FiHWQbR0Acgh/zCtL3sXSsthRD8HXnbC08+5RTRcTWemCzRG/JadQS/Hutp2Y4e1txsK6LACWvxLOpeXXiV9MT/G0zAAD++yGA0U2uoFjAjpqr1Tb4i7uEXmchm+sZpeBFlMN+5F1r6JCAwGfMySIQyx/jD1ZNTSHFGr+f777O4mRgCpDYcdalc+QruCB1Ol+2MHKO9iWr0cqRNTbEAlltee1vfELDlXfAW4zzR89StO1icqbnk6/utePbB/ycE9IbfnfgRJ7IauKqJEbNQKY9EcWpXH/IfSNEPvOjTIIqQBQEFKnVK8aMBp1cLsCyvPKzg69H0OzvbFrP7UO8oz8O/dbAPR+rgqEDc/nNJD5/WWJEMyOWVZRPwG+oDFUv/UZS7xaiAO/o2rlI0R6my65YAyBIxOlX3xFHGZW/GkauQRj4q45HYN61SPvMduACBNpX6HLF/FYMuxeqVurwNBWa5ljSS7vvo8JLh88K7pv6kslELMHHDO+K2wLeEwH1Kl6mG22vrINhOaos9l54Ic8pqRJUj82owWtFZRQw38tpHfvZzgUHzlz8b7Bw2mbzzaGT+xGXkDSE+e0BKhkfCEkn1PfQtwe6feZ8hIQuejlAWyAshh/w3KhLt+BPwxLjdSiR4t6uiqofzC9aTbN56i3no9jKQv8Nm4B98z2TK32tkc1UEEaOMDK4aS8Vr1IbQjXlRxU6+cRsJsELXhpB8qD2LeQyaD2mWeaSF7nWWEGKYRu+n7p96i+CPmpAt4egyhh69PYFRtEvjQUPnIoIhwCh3O/2o/By2CFKxzUHFVmIo1BD5KdhBNhGBqXaPbETx6gcaPrCdz7uoXip9QpmG4vdO5pL+dJ2VXrpsA/UFUFp4hIUcs6UAXKK+FrNrNaPHYNHrsdLdVB41wRWt00gyH5vHydhh5hgv9CCKsiAvs+wlX8XGvTQi9e4u9VM3UdVA8okjMdvmoOmPlsOxTPsWNkn2ZRkEKmm+gNwE7jF/j5i8XL0xPOrjXVggPpPbWP/BPn3vRl/CiUqmSxp5X/MKMhfzwidnUTZyzimZWw9+4JvndySyirbsYLfDsshZgkdIdHN5z70ZRb6DxGe1B8O0/FuZV2TW+ZbQKjngBDvdfWTWLNNc/274Tpu8N0ZJDPWQjms/zaqnEAEmsura8SqozRWR1C7E99YOlya180h3EF/LxwsaxYuNFqPzgYQ1kXGokQ/SXFtDhuwFlB9TASSQP9WlL6BrvrmPxsUCEsui8om56UHoSAMecyDYyFdGFmpS1SCfziKVAYIZBFKsln8jvc/fy8VBiQ9rvezKG4ARXOtqZ5IrrZFuplBp4aa1sGnCDCNgNRSDp2f2JkxdPMolHK9QGVMYVR8yBH8p9f/LfJDBpmPLR5rioKYkiQlkKxFaQubEOnquwwHzu5t5EKo4KyUiEhSwhICDwgyvd/CHipyhAg5gvEOl4ZBbUDIfaVvhuOAbmFA7xW6zQL7eallartatKzwjDNr9cNId6Qx7vThQOI+AcPZCDg89839QBo9EqgpQq5o8/D/PuhMsI5xkTVqVbt8NT26wLCzq35jneqDX5B/y4SZfJ99mC5Uf3fprOS/IEB6s7zQ0Ii51VMcZO849t/X0lrOMsy09EyakKsOFvyTe9JMbu8rzJ6KAXGkxOo0gKEJz7tKzNF9kVaxg+DQWG5PVRbuRtZtsYRPF2b5SfP41aO+CuaLO88Yro2x0FhipyEBa0rZjA8LNC1QEPkK1h1QL70ghQkPhU5H3Zra2pQteFRZl260Gvs5TV+VidLFXmmUcQ1Sqruf4z2x72euGBzxxKS8u0/utT4dWdElrkXGMlqHEu60PLoQuzjTUGezVWFSiGLki2IWnWHhOv3wg4ARVTeLfF3EJHRKFNwkiv+2sBj8bMWfYYyLs4M29CBUF1tzajofFmB5xRRJk0ferEO+BgUzElOZS5a0wsGRxsOkxuvEabvbUiNCyReDhphkyYHCXYFZH9acPnDTlH6deGKMocNuwFI01bfHh2xEc2wQclfgdJCu+8K23iN0P2IvUexfCjBh2f16KEcI73iugRsUgkqGscnPEwNGL51MwOESExiUejFpMRMH+PY7JiZGc1PpCCTF8neBSN6CYng3mnqvJyc2AUvECMWSCWUoDivNneeMTPR2VN1otXMAtirvSoIHjv2zT/nwbOUT5fIIdrHkOhRDLdD8VpjgwVHvI1rN5OrnVvbwZeXHqMo0PV5EKZW6BqInwhfPIDJgVbMSA63UuQYgsrLJOOev7f0Pjq9/Q9JN0o9f8MHIvCvqBqJDivNnedz+LDETKp151FkDt+9K2fHf198/zmbAEw+b4RqA/2ZSgWBD3jchZ8AE8ZpZXk2LW/Sj5tsTqT6oUYYckqvoMdT+iYec3qCytCI8EZL7a8I6xdqJkYJu3LIdk1Eyg7IWtnN/GafB2FF81WzK6TM2XrJPG/pst4MC+MX7ADTB12E54XoX9Fj/mS6LYjGjsSbttwJ8E31uclZNReqe8iAmJ2+N71jNZBB5+dPwjB0R6rkzptgMqK2IHEHDBrR9WEbax25vQVFt6qm9iC0QMiu42DifXQvdI71EsqtZmOzumnsC/j16IEC5jb7u/sE2mYbsWtSWniMgQAp9KRZed3U0yHunClfotD4uRb0rYZZGnSFWZhfhPAZ7WmmF0nQmetK2lEgm2fvdYA64sJplrH8W22U6hqwSnOPcnDxkIJAHUob41cQTmcNZ8J4Du2u9q/RYSA3WQZKiOLtYnOTNMO5ZD3rk46Fn+RquVuze8h9pRERoTLWDgAQyxVOkHlpbEoCGXb71gaIs3tFNtiV5IrY3A2NOaKTEuCHcKRG75/uzyXd2YJVBxcrGddH/ZUyIC33MWVXJWK175zWMkU0gThwfhysJ9fN2gUBQMwIlvUUAfTcUdfwlOWnFDR58NU6bPpsvSjtLE8zER+QPJjs4rckx3HCON/USXApm0vh+gc/be14HvO9fKlcshikVIw/MqWKwHk8Gr8DgTxj1J22vDzKR8MTfmVvboT5T0Yb5uVc8SspGA1/dNx6BD/g7Zw3ngzt4utPDCZEkBssCICeoGu19c8AeQK4txGhrO6zrACvzT07JpnB/D5BLFqrmfLRi4MYEg8YBRV2EPF5ymZIVxftcyqA3qN+4gxdYRRE2cWoF4Nb8xm69pIGhAtVisOgoEldzEx+ouwd6lj9EG84WSYqqrU1YwE2lRWomDcUaOHv3IFvLUHGE3v319Rti4OeZDDX5p1f4wMwDPeUKMy9KdBEjRXIwl+e4DnTpx1s8tqGaJiLQvHNv/JntMXEXJaFjcoqjaocIgIPJo9OA8SPH5U6Ca12zlmjZ14Swv2sqh1MRl95HnwXjGCuhHSWQBo7TykxiM1eOWLO0gDe49ypgRhhBeq7ktVq6VZBHGIeKRwNaEukjGhgpfjx+EtkW4rTomBOaqrRWgUFJsVsU/BdAaoE1xsO5gD+L0nuArrmy3MEQUm6g0r40agj4FKWgsZ5rrEpBiVCJCgCZDgDqxObDv5rh8cdQWWihI9GevThvnYbTL3IZL4eJ8T1Sz5ap5jJ3wX5EobCWanxZarAVgBRC4Jf2okCCkNWvaHvlX7CrcoUkY6wVOTQ3FCnSD9T23CcmmWSpIPptm31dWQFi32h8f1WCkBTgYaXmN4kzImkF2XJV2nfFc48kVPpMrDwVHXFZi/zhH4f0uUGeVZgCDwCmOl5+NhaIIPskQD3Q76oeHKuS2ZRxJxh3afk9Trl8sYv19ttG5BHaFHiFTJnvJonVE0wEg7xV8WKpPJk0UIO2C9oXTQTspc8TnKQ6/18w7aKEZ2LuwiqYo4Ldm+jxpsQTzvor5b/Ot1u/KXXD7XWfAEu+QYPNK9F8W8fBrU+KRxlzMaS1T51WmKtMn7YMTeHwkn0PE3wh8dt8LouxUHIvWGzTDZSyNDARxDIaBQZmlD3Pn6pDy4rj8CJovxT80a+LobbKmeXOB1GYrg1vuliwfe7O32Vb++PdVhwccJZmgGhuTO+oxtCj4PWB5NnIEYL/QcSDlm6PPan8ps52gIAAtGHaqeFht4WoOlUPFqrNOMbXBI0EK6FJNgSKeqbYxXvC4VFlkyd/czgUrrj3YTkLZJRJUu9jeeDOvstrBYP6+97vodtGoSvMWA2QXD6AuRkxHXBtPPE3gGp2/WImQHnRGEM4UXSLOuG7LTHtT2UN6xWVkDCG8eMjrtUUqkRCqdo3t5QEhcMl8gmJez2eVQwoxA2kn9gWMjWj7Rw1PgJIhA+OymUfZgJYlLJ3zvtv183/dcYfQoryKoPTMKB6pd4vUqbmRuWhusNOF8JWgcVrRdGIMBT53/4MW0COwDVl6M1RLQQFwWeNDYQ0WeMQYFWM7sctcNDazzAOW8CsBxZoRerjdU25ziURZD746D0AksM5CWQyjhh8jwdlBS0PPJGFYWypPSuCx2o4onlcRLM8zrzV7a6qLr7UaDmmNvVh4yo2ZJwAqY+s7w0S1y4QXvbHxqmqRwxMiWxkhvCK1y6yLX9yjKQF3r+aGmc+Kusgd6/PO6NheV/OmnU6gsHrIf3AUaumgHO0xYDtyj0iOzMfZR4TPX8WgTazGms85ZfjuVTAdgnx/VygGmaK+Ilkv3SyhuROC5Reyh1/Bh4q2cjQSfxeWOAVxwBJmVJ2IxkwC/pDzjxhxoGj4K0ofMgBp6/++giOli8OybgAjDGdTyZqjkANivujDfn7WXfaeDSoXz99wayKHNr8YfzsQFBHVHQ7N9EYQKIblIqtD66sgGeiJ6KAxtdBCYRBAaDUCmVQNvmislhy3njgy7PjUq031bnebMDk63iMx18Tkdhnak3EYBb9WyDCQUY3Bu/yMAfT+iPMpASOfFaFP8qMCtwOpxYDBVyuthJwpXKGVFlf2v4UtB11BdPXCPoalQRb8Jmd64aduPiT069a66EsfLldh/94bZIWnUEbO/MfrrhrkVSd3EGjexwlNwU51Lc8By68b7vSxb4PLX2CI7HX0x0MlP4VhiOFfjj3FRZvBYvsCmsJKH87SsQqGysxqQTz9To2DbCOEz43Puxy1i6ESC0ByV/hCgCWjl9YFnHRDtI4/l/1mUGmYtc6/fTgt1JexrbS3lXHUSyYkrPFmTPN60Im91JD4lRHp8RXhyozbXQAwXUmte6ngS3EJt9g6K4FaI9ocRwtjwZTuuBAVVPWQ+o2orhj+O/+TFjfA9Bw4LXuubBG5zYQR0wCkFX4xxuC4kteQu8CMHnQ5oE2YIUrzRLyVkE5F94HUt/LGlHv2YXCOFo9soO6JG8pDKJ4WvsjaCzKi8Kgg+5q3mc7+chHcXO2IogTz/qiGlrbDkU+w6HXGmTRRqQbeF4Tc2u1Cttj8wjQEhieXOZeM93HWbCDlvqun5jo+R6cxX9BByXErznP/O3F/+DlyFAcKYOP6MHE6hmqYRt8z7xxYe9h7avzFfCgMC/8f3KH7hXvHB8LzFMpRX/EWMBig2Ww3Fb3pCAKrE9YErsdDv0PDKwY+iOKuEFBXzLopQ2LtA72EYcucIj3mnLdkZgge9ZM0DEdwbEuPrCqdZLyfCCXeGxOoFUH22Lq9sARJRsX7wb8kWnmJS10C1ryWUiC9h7xjI5HbSV71GRFcTq9e4gJZXmOsnC40hjuwe4qXvv9Olel3fX5gWiPMfRd1O0NRYfzZVIR5iS+LMvbqUnEJZb+GNf5dSmmuJ56ESHFlK8rcJiFB2o80wIyCgLr6MgHrbZtRBbOBulYATOa3bO4OZ8lkuXUTKHTpqqTLuIJnXkI2bNmDyjvThaJKQtfVAVImbHvAfy4LMbarV5W6tG5Ja2DnebMDfAO5FHIJKgsryQuW4Edh+mJ3/6G3J2yxM3vJPDJwpXlV3RBXjZu3IZoJHqUos/EP41UcT3IKtJIlQuC54NUqNT/knBa2QBfRqGuEv0lJQ1PsmYE+/u4el2yMgOsxfhQETjAmYNSbNZfKlIXCOPEnASmZlUpxZhDfniS8nRDV4N0j0Fzvfwy/eJHbXH7z7cP1hbeq7TO4MzrzEbRaR8OObdbPWUqAY9HGIjP5CgjKdd3zJNBsQHSAevKJuKfMvQHm0GpXbIcTBjDLICOoOJAjx0YMxnPJeOGVkwIK/iMm9958aJSThPwWaTJFWBoBCxOuoDyjMRqwKZtaNuTmkx/AvbDIvnb3V0f4bknkFhe551kKrHUP4t3gIvTEkDLDAX9qgs7SMQaWM+xiK93Jwzax/H/tvuZFg1fHpN+K2CibwZPrysZiSSZXcz5VPd1zj8y8X72sszCwG3qZEOnacFdluTBR893sqrwwB4vwggSn3fEtQWBaRKCKiStqSQX2GwDQaRlnIHL8VLF0MPUDwIqrClghRPJMbs1TpMZRJZj+Mctj3hzlO0Rt9drdfmzA06E0Sv/mu6TFRz5cVUykBx2UOCsFte5GvTefze7Zeq9rdWbp+qVM5/QCI3AC5kB9U+1lVSzf6ZeZsMR/PgRF7O7677i2z+r6jHIRhP4b3iNFkY9RLcy0dqd9z4FHp6Ua7C61uyKExG/nmdDe9SVxBLaVgm9TN4Da25Y3eeAY8rEy3TQ3z06SnEzGP6HP8cIbx1I3fgOB0m6vjUtnrwokp8+99maBfBUQKuZaOVswLzh70P46JVvjO+yoPBlrxVZALPJuGRPjwwCx+aFLJuTOJJcCLLOihtnn8JZt2XX4sITYiBxF6XFnknaWpChB5EnJcJYnLHdWIRtaxnsOgrgSnEDXg1MLy3CSOJE1geoTkRI7BCQkkYoQqj0Y8RTl/67jVH7UGl38DIAiDzrt5SYauLg6EsV5tqOhai0//Nx8zhVbuvh49rdlKMoz77XE/Oa7KMTvva1HoZKiIoWBsY1Rk8LJNEpmQY/E+Tr4o6OnAqCK68R9qxH45WBKatUa1ZRrlkFR11MtUFgEbkamzlt0M0+NQqi15jjbNPWx/2GXGYXPlLKeND5SyyU6Ut0KqGDXisJYwOH3bYtp8oe9QY/4PV8W78T/IPDjL83HRR23rI2hejfqzU89e8qFXm2fnRo6PHmY9Ls1BueYusmdlT8f2liujSmhDFHDmmAjFZ1ee+buGRwN90iAWUceiaPoEPpBV/V22p5V+B2nGH9bs8a3XsjXnovM8pTG4q3WQIAnIBWwz6YHqErY7I1oTDwiBmJFX4sgCSyWzgCht3zO+UQAkjdg0Uj/zG0dlm5o7Z8OKt+KKxMocSERA5CPJWR4qzsOERBs+mFAeOFBQZK4vzKxwQwFFfrN1jLb2T/HxncLLjHuT6QE16+akrQ2hfPhtHK26AGI1Vl8LsoqG8VzEgeZEp2QAAIAGckcSV3BXV7ZN6CYK4v/g9bN3JACAeghshPSHSFt71FnyLIgV98+5VjKbxeEXmWMQIIELunUr/td05UHmvD/1l54f2ulFDjqodNvIQcmZaVKwlRaQWnwQp+ptgT2JkMRQTSaIRxVIngz7I2s6+BcM8puhiOnUMVjG1+IhPO/pVOsGuWP6Cs1ztl+LuklEZCGyKeGPq3SYQvk6fAgYnEstj8OS2yb8wkJ8Yl0597E5P5RrUXHVC40bZr1hHrh8noLR5bN51IHvVQe+DU7qOqRfCOpOoHeAANizQtHEFb+67McDIsTE7ARRQWfDo8DouI6VkHcxiIbb60CYm4STA+I541l7h3nhdNusd+GZ+cMtwQ/VQTm3qUcW5/Y2aEwc1hi2fIrRIH2BpV6YbeZnS57EwECTagrk01oO1AmC3n2pvDme7cTW7vf1azjtSK9S9Pm6yq9ldMzD+tRnPbm2Es1O4hAKW5CaMR9D1aN99s3gLTdVzdwOX2jFnx72k5/vzDwcpfAp8EM4Q6oZbz9ZagRirzgUZlp9F1+XOj2dYfto5i48Z8HYN5tJLk/gMB+YQP3nq1l933dRj73A+dI6XcpWrj+FAcKLLZ6Q503Tv5ccwZNYru2FvcaIVOZ0opD05JuxmS7jT4B+tYOZWcbmTa0WbCxkLtTdX7XLX3V53Wao9U5mbAihcz3NUOiV3rjtlVxQfEDS0W2sBYaiW3jHteiX0FPFMxAPQWnElUYHcQwbK383rD6c6rWNzzl6qb+N9SsMPTm4XGtlwmmNW7DK/R/HYDheoLK4fgPXjVF+atuo4bL7LSNof9PxH+zVSJ/agscrd70KXke0DqBpxls0PMwrqFf7b/5B8JOopg6Ax7W61+sV6OZX04aI3+0myweQ+JxCMAfqz3otiXSf2V//askxmHtW3xS1s3EK8vXt254hLvec9hsuVogkccqVlrDpmOzHonEoB+JbaxNXw1Im1zCKOENjSaRxk/zmmCIj31COvk/gJ/NJ8UN/wVc7tXziNEjYId2Hijzu9DCqBdkvXwPPRptIIOKiBfiVOCTy1ovEzQk9zhNzMRPghCUL0CV7yfdcLix00waFvJazCT+RNvGag2tIN2TR2Uvoi6WTeTnFVfUzjjzzubaar9nO0M9rWBiTYKUeLDdHXyrz8/d/fEhVjXnteNye48h8qwI8VSztgDh4o41DSHMEMzK4QYeQbhiuFCK3qyieSABHG8MzrTkzLu6Zw+uHEokF1DzScXwPoUsfrZ3dHf3UOmv3+vjuY8wGuF9SUpwmyd4Z917EJL2cB1aeZMgiaEU9mbDTZEOZFqq2oQTnbfhZSw/ifmSt2sKgpBAttrLgNAB7YI+IBifWIlu+185sAwVMPL+y4KGytnUa6cOjpwfK6AtkcQx/HcF4YHealWVfuS2UQA/boZyZgM/ewV91txqvvrJ0b9K/dqLW3xEhj/jgHyulnXSG800SzIEGaQk8v+lBIFjPtCB56Whkd68g5uRwHToGbRHST2i74yVFgIvDqU3y2OZoQ8a7JtnWO1M3EoQmL5rOsVLR3Tb9UXQoy1pZiBMGY/85obFbPqTEAnOIm8pBVbj8Q5B1BvEZMNVgPzwUFR6b6F+NAgg2I+jj61hrDPCyZ57xcJwqGWLSSIpytnqAGBa4fT3V8u8uz5KFSvoPv1a0baRm4CbaKqVUKD3dUxYVIkvx26H/jnjZqxa/6A27IU0YEHpYUjAbrmguMXJfxJhqObmeWNb8r9yI/TwHgUoSWUVVXLDSJP0sB0keutzkiCaNinsdroeg/zLbctqVnhPCCPmJ75Slut3R97QBss/vfMR2jtyUuB7H6sBkgru33wN+vpTTU18RKN/Hwpgi3ZZQD+m6y8bECkEWqiS3Sh9snJaWFziN+HHCNfLBXhnhtIATo10Sprk/kbNIX1EGXUAOfj2ELPlCM523s9BEzXKUfWHudbXRE9k3FoY+74zsivMZvKoJx74LV1of34Q2BTIdUfE7AnERVueb4Qdf4S8uiEc0L0Y5WqKr7Uh/v344/Yzv+ZTODx/lL/MmbizU3EdmnQePmiTBoFmwcPxcy5ElqV3XafW1HBTP8NzVMddQ3iqX+TF5GJfuoR85ImeLeTgMYbSh6eMQ+PYORSpQr8PIdYqd2cpvhqKXY11pQP/knUmg4z0kaPaXGzizVTSc8MxDK03IRS/FgXMzf/sLWKtiACoyEgiwp6Bb4JuzLAqGLBtCgCaaqqk2FoJZLPwmL1eP9ahXgWjoFAC6F+m9npnJ14nj9m9EuYMxgEFyhCh6+sgNFcglPS2uauuQpA5IEW031RDfO4C8+N4iiERPwWKLUAYyZflSQ+I5UnordodxjRrbxfHJnP/orq05moaejXdDNQeCfyeqZy3ATFntfRAlGHevINS7QYZ95Z5h+pgq2R2kW1eF9+fSI5riL4AYqmxCW71JzcU6EMDoPLsbYFZb/gTJ/VyamYnE+ISfDaqOMRA1X+YkrQjjFCoV23XEz9QE6hOU4pfq4HB1aYxvkR4ZERuQ82S3nEK6VYJUCy1E60kUh2JZLZMUhGThZMWWJJYbZLMGqxYly7liPdZ5XY6lqcL42nAUH+f7sweQyHdE6w2uuX05nJhHgQ/ZjPgweCKbFrR14ifrxnjP/Awq81TJ12UoHWkyUmY7SCrPOoDwcj6pJWGNQmxO2omor8Xr20Utg4XoYIT/X9HqS/HO2z/KUTTmd2pIBy2JXstWbf2xaWEnebbR9V3sRaWuL5nXg/ZBn/wx615IV2SVLUt0FsdbQbDqpNza5R2CZhWCQpBE4NIzHMSpxW9yycbVODcsWuiX+aRBwKetEAMdJJDLyIatzsUgUbK3F7wutTs/upPWxATxSLBMcggRp9zqq7mFK1dugkk7p36sX+Iw0cynIXgosZUaSea1JezBhNmTsWACiVX98XLWxUxE6CvPfoH2TsjdWX7Y1gKSAtKH/KVp4yNPDOdwjtjfmJfqt+AhK9CXC2dNPCnANB687n05gLWE1W9C7cA5pNW3uh981gETYukzzGukG98D4SXYJnlYJN4CpzpLnnXMdZaHM0/WCzPl8mT52TAl3lE/8wCg/QBYx/6/QJTkQ4Z4uB2vzd8/UTYKKqr2Re+74bUuVyZcMmiZJLX1pg9KpVhmyQh5SwtVDVDVfZ7ZRVf0LAfwaYcKHZ8wooYLy8CEfALZZzKUdz8wlKN4b+zRIv7miK/yxRh77RkS+BsNVr2Nv+MDU9nyUYFuuJkC/juPoUK3Jw0flUsBhY8hrYIvhNA9zcQH3G8D74nSIkBbEmsuXwkWoS/EprMzQW5vJeKIPIBzATzJqjE8POg3s/LLOtTxjSMFMVh/l8rS1pn7+vFEIP8fwB6/hMzrtHIQNwEnvIv1cDD9QVKEXlvfU8/LU6ytH25nt+luRnzBwuFTcOr+IcW2KvXnz/ljs2CrW+oHe/PQTzGGDVzpTCr4toNSVABivSQ2yBeIXdcJ8kiCrc51p1MZyYe2jJdJcfVpzRdRkzuCev2yRgPLSrkSNmYFX7xVVEQnc9P4uUboWHQMLBFgajUdFhHAHRBV+OTkeFfqOfdhN9XBaWEvtNcP79uzrSFjQgFA3672o1+NV2jPBCKioO2B6a0IAVrgQmsn822a8MQPjTOTaT0w1UbGpTCYW4rENRQY6PhFsUiRgoNS9Vv653u25mZvNsFeYYe0hyT5i9xtG+JONqmoipOLFfMHoOJw7NvpK+UmoOm5MwO3BVXpugXQckG7KX4BuAwR3ba7yjLq8Gz6XrHQwbOq9k62bbDvUpcUexptX0sFN1j6g+lJXIfv/wOhp0YD5Fnua9YOtOT6VMyOief6nEi1YviWD2WW3fL6MwUep/nxheH6lSQHhbGbOU8cRTlu1A3+0gI7Fv4nOofoSGXlI+0w8Sgpmi+/YoIBYG2RQ9n3rVqICn9BQyqERIC68LiFBwbT+VB8TIRufoLZ1lIBCHc0vOA/7xzPH9uTznf6s4uZVVAIN8ImHdr+9f0O7vyOoAnghZsSQ0D1OnyLBum5pDX6kIjVSSQwdX5zktToMTr7bxGrCi2V0mj4xqUO7bEPbdN3VZe5ycH0OxbXvyt8yZRktFUxB2rAfxUOnjmV24+ujYzfIonVgzdFcgKQEeCBM5CA46JTHOCa317H0qsczIZAjT2MLEo0pogRgoPiezElR2ftqjTBvmLkHTjEEpR78m5n0yjz/KberemqJZZUXA0Y/aCZBNAk5bblv9C3ZRxCioM+Cl7jzMK1KQISSltYnMdVbCOcQhUpqPT9ncWK6JeNCYYTI8ZiJtQ8z73KYlelmgLCLA21lX7lCyK8qYQRADvzzcIRWrqv6ud+4RfXOizKhQDTzmhHwJLfwD10/MJIsaUVV38+tDPV9RqKl9hSKFMWNMZoMIqnm7amwbft2G1eXPL8hXvGL/0S1CUIZiDYMF/6ybarVyU34qMx2f9vscNRPkRwY3ewnTy1Xn/nFYXsRjZac+1ZojRj4axnBatYnVwSOwd1nXPL4JTIeMOV5lGRK/r+XQ0O79wdDTXI7O2E8ZDmbMX0R8tCoe+QouJrBr4Nc1rl1TdYxTfxE8x56s3WwYDZ+sNLj7c+fe5+EDJV23p7z705UDHCoWnztez3MXbFIzbJn0Kp4dVbHFghKxS2/I6m2cDJRkhKV5hEglH7FnOWOzeCUCrl50KXN+ORqEhdQA2Hl9gwKjnFHEl0dICTRCq7SBZ7V46G4h+kLkU3yueDBrvHWuNRreDdeEUIdCarfPeUl53xfP12ahDA7w3Z+q+KmA63e5bTSp8O8J7Wkzhoh61D2DDV6yOljjTQLNi2NPfF0B0Bj8GGeOfktgRWkJ8kW5SpOGs6Sva9aoO5Foz8z53qoW3il61murt9181OZJugKmjZ5VNHt0CQMd8p+ascrbABb9bJqxi+RPvy/H0vJT1OrGD6cc7Ka5cQX8TDnDgH3+y/9RGXleJiM+pIVRDtivn3Gia19y0jQhliB0cxn9yloPnHAGdQouIfXjYyM8tDY3/gfZ1kX06oSClyeBG3ECG3Vf2/Et4+VmbbFWtgsCGroKpx3o6NRhyJvUNx9MivC/ehdCrklNwy6E5YkylU/7dzRHyTJCBB+51D4orP2JpuuNEUw9k2cKa9NSJmlMNJkkXXavrF2EYyQ9h4zL5ybgN8JGGGOXvsPh8simG5vHJpUiyiKLekSvh6OrXJWGiV/rIByra/Nj1i6AzLNnpPu+CyYh96HiGCw7poxmVCXUEJt+wwvN5sSEpeYzw6BdOmvaSAn5r9Ostida9BwEJZHxWIsIpcOfy0hVQc/m+EV5jWwinP/4VzzNTziiFnJWzfpr/RXAMD+FS3RKy0cxdFYhBudE6ajnUmdPcZy4vnSVy40vhh4uLcP88VUWXR4eyX0k+xRpV57PQVCYCSsSw7es7pG0KMJBdNO2Uef1yvW++PmJIALY6/GQpTQB+NGV51DIXbsTiNKNB7gcGjGFd2+//QwG+ClYGWJskQi/kn3RkjRfjsdoi/HZj0DXsgY9EyMheeCaSeEs1PaVUFi9ECG/NClOXHz3ShatqWHCRW8nwjr0sisZlcBW2TvhbsWHrJJCCswvNd3SyfwZDTVaz9jNduhs7hpDw0Zwy00lFJVo6aCCFx/cONO1mY8ss5xFT39NfcruE8x5Dq+drE6hP5GZ+QSJnMGMwbZZpq7+Qy4Xy69YKN7EP5HmtYFROaYxMyZRL3CbTnvol0n3vbf+Ov4KZTF0mnCbXmavCitELkGiTQcoc+Ji1PTHuWm3Fs4NApCPuBu2lA4xedsAZO2vAIFkxIqb5nCdK2ouS/d+P+7eYsrJDGUOEghZbAmN7QGxC8Vp7xWvyy5QcKxQIrwgXBOYlgQQwCXphbVWkgXaFbvBBcBXB770Y7xNYVqAmupM9J2cIDB4RCw5qWKglybEufJIe8PyMBZ+VAYq9bOwCyCDGqzdfvZB/rhw+YzZBrjsjgey31Sa2fd2Cp5zezocnD78YZjeMCncMOyWwb+53A9GXyNxO0nCxkLyxGKIN6q1uwclu5WKKhcG3uDLuqz3nW3lgP/UmF57i38XzhL7hAGabGl45SQuJm2hRZFxaRBY1XV9PPQD1mY+YsvewA0fou4h9En32HKYY3jKr0Hm/ZWI6CdfYbApUF/KUG31m30shXooNM1bloyAJt++7Yyor3P+na1Rec0wPIapf0IbbEF9hA9LJ1JNYDDqTNZjsOLTNZVFHVkbdJNQzxb/SzW94pqxWybMg/xYm4VcoHQSx/ouOJvDBfBXMmYeBO4LrBAy+PxU/y9ju5E/6gHX/Il4Kqgv8Pfjt61ciA49bBVhs+Kw9i5zFUSQnsPrTdYeAwpiUZ0vSSSzuYKqshUNcOz1PvRdpiFRFlWaFC/1+IeRRe31BrQzNa/oNSFPvTT4kZtBvGvOmBsk2hjZODtB8B7sBe3jPK+Fm2KapPubJImdnGGk4TtD6T8chIe9ZMF4LOYLWZa9LHPSIsBaqFAB66aFh451WTkxhHF8GtYEkHk6xJ2J7iFSbk0P5CvUMn1V0deJew2K1YKXgZMPxO1hIJvdcFdcPnzjHEBXPBX560JQICwJnA7ESi3KZZ9X6lNWa9j1fQsIoa/O4oTzwJqTT23m3yOGNaj0bcu6ysZr2guRtgQpxcg7QQKYHEy9UJY1SErXPxRE86QMuEo3cz9edUoXR2bLs1YEXgIwRBEr49CRyM/UNSa5vfVE2KgiGDFCyDtZh8MyevHDoq3IC2xalUd/hhziozVWBsWypd2mk2bRf/azj33wpgi3ZFOm0lvBPe7wL6cOAbLEdL+oG3J6as8WrnSh/wCg+WWqMypjLNV5HB4olxhFxOZWPKWH/dmyHoB91kLSOx/CL+HAGupzwLtuUVQJ/jKzCIigsCNrs2ujOSm4+6D4SEhP9Ibf72dj6qTE6bb5Y3BGzkV57AX62fRUl6UY64uLkEJbrUwIGmjv7jO/LypiX4NCHUNUfGAIoq5QLS0EsDzgK9+9kSY1z927uaxkxUxrFCI3E96QHs7DN6oEfAnfGBjwPa205qI0jAVvaGHH9L2d1eWYQtoxhyVStnKThPgmrv0GSkvBW4dwmE6WILRMSKv8AGSHoNq8IVBgpzYe6prwN3YC5PeFOUqP90YRVu8EcGAnnXE6D304fTcfKYRh1XmLS7yvI556VoIwn+EQfqjWckbxvZv9viIMrcp2oMJO0eh7HDHg/9WuZ1Q+EoYxkmKkC+gpfYhIyXL+JI83L78lKC8zTxz/A0ryhO6j8OAAZ15GTFx9jAgxjLTZtZmMgCDMALp+gt546Kj5YIMHvqP/O7fkhoUyAuougnP/4UuHPTlegj7J8nkdeVWag1JEOcDlYy88sZeU3XmgITVsx/WxNE/onlKZzt/gx6iusJyniaNnIsh6DygCJucVrJmey9RgK5hIs1cMuAvkB5g9aQUiROwb1WRtB0SHxypcEr3Rw5DquO0UIpxUg+WawlGi8SeXHSgUWLXGIFShlf7RDOna0atFjoT530kGMjiE//woUo//kPtHslqc/8SwX5GXTSGaU/rEusPkwLEdekkfpJRE5KJLL/ZO1inrdYm9rTI9mnp902hP6aZ1Y/yZg97qhCoAglC+ylb/ddCrXCVVZDiYSHbFkKj9wf0DnmDhXthm6V+gNWYaB36AykTeLirIV+kBIkxl5HHoBjhw31U/ejb6qWVGBHfWGcm6wBhKIRVYGR2YIezNDjzfCO4nZ0ZarqjiQGBQc7IKe7Ho2gKhhH+eSZWZRfgNc2arLiJ1cbCd1DpB+1k6RNN4NUHDW+SWdH+GEMCKhOmAVM/ZHPPsamIfpwUD5be9SYhKx7sjuNoWkJruTsXtee3pr1FvGR5opXME0JglFY0BiRjZ0Gmzk4TmNvgzYGYqiyNJrZU1zUQj/eyCvRztEnSW2rTvd3RS8Nb4OjZJxERri8udCe1ldmXoHSfqrESyj5QnBVUNf1tMBzyoKG7TdtD9zPZDeXleFeMZzUt20L+HNxgsNY+ddacYsjuGZ291Bw7jpdJDVG4jtaIKsr4C8L4wAEAPyeqpHSsownz7h/jH4mKf8ICVkFsypiAuXmVrSLWJjD9NULhWMPP5BjYIoX7Wmnhl+GDiobXz7LmLlwX2xrMf1o9Alp6P4xAif9Gb64UEQkGMEgGTm1cqNgQli6IgbYUFofKqUHmqlLm9GAXpcfbWvad3pAOBqrrqDQUPdEI1dzjgzkElrWogU9g6122suszq+uwWAiew6KQKcJp6yQ5HwafS8x/ixP4KPSaBfTdoYH10q+jI/sWLVqy2JwzdkJS1V3BCsEqEs7OJJ86AERQH35W6JIAkErKhwx5Yu6e9DJSAUs8HfJ/BM/uYWka8Lc2yB8XqtsenZNl0dYzKfzRLtLqgHpGXSYityGWsMbdu+u50XApjFrooOgSFXThXR3noCM3xO6K2ADPO7JlEbp+URJFRnrsZkRBeNFPzx5MGv/sclwOhG1gW6y9C+PC5can6e525IJR4DBlWbfs6d7Uy26q2CYxckBJDF9GFXQjbzQEjTtEkLa/ffOEl9ciB7Hq8YT/AEMG/l+URKc8QV88I+PqPHBxthLiC9h0m5UAGA3yn2lGr5jjuOZHGrj68yo/iuWxyWKUzWh/lV/GmqhOLm4TARK8ssfXGyizvum1LVkEiDy3irmo8CCqo8kWXRsRO0cUAjgBxfemH1bVbwi3SRoPqg9OYXOQTiS9I6664SgAWt4LvIpdqEW5yBk5YCrlNxbz7Zo2Wn+YWlMVeEz9aVF1FBmx+FdYJUh0duqBZ5O/Wz/uD8YypiQOKFfXC5Sm9jvdBiGJerE75JOFOZtQJuURxegRjURsHONF8oXtXaAi/uWaCO7xM/M4VwuRvAwCV13IjEhXmFcDDIGbXK+PhTL+lj1cVZILAVMZNdVbulO3iEYdsqLyvlCRC0VWRXuYgqi4o7Ok4kFQIX4+9dNF6drsx36+D5lu2FoAdYNUeeoH29vnGwWu3TL/YVOM7UVTls1AgzLi2kwHuK676J9avKEaUqZc2s+lSBdVTVyRXie7BNJGPhTr9SUIWHdfk0/5qqu68eFGSqihnaSkBNTM0kQdF/62HbiPlcDnyKB/HgswKAj0z4InFHc6FqWDrOm+0cyur2SXWiSxUgEd4bvwK0nZ0sEI/XYYSEvMlwJeRv62Nnl2JR2MQrvUCR2wXZaQiximsdW7MMYeyk1mXsYqrj/My5+Ck171JMnw6N2JoNwinIoiVSNDmY729FUaem9s/VPiP2XALrp913iIFrraSmZ9DX6ERC3eP8AszMrcR4aHQJG8zs8ondrI2fGKvRbxe63Yxsnf0qYuE2wm6hhEUdVZuEDa/5IZteH35O11dlW2LFTv9ADvy8fRHZVSlst2KwO7hrwnHm7f/xl7Zygsv6SaU3mLOFWG8TYF3gHPqh6Ocaghkjp2ERquVQBFsTuACn77TyoxH9VBza7pcIKoMDF1OjpGurZZIoPB9D6BG1yrL+lrKDWkGaJ/P+6N7PlnoIzjEdZTO3PYZrSFq+9SNLD4qi0QFNG3z28LSGT/cAv+OFhj2ZFHEDQEXK6ZkkO2l7aF2GaMAbgvZI4W6RdVrBrNqLh4anEvW4uUr5/OOb17Ug+ixEll/A3N3xw1yZ+5+ZFlxAEBan0nRAYjSqyN+mNvQPN1nohri6xdnKpiF5f6M8mPVsipMNYPD3wCWPCd+L0+VXWDXKzDcT3optQCu9EN/FVzTCzGdc65pFoxELZPBHeJlrgFSXhbApOjYVvoJwJPWPf0T1iXlM3dgHZLxArd+6itvLgIc39k79vcycIwoIw3adfWjV/++dd3UWY1MnQ9SwZKTzdnlWy3Xu5ctgo4a07TcBlFIHgI1fWwlo81ejp8bsfEnxrFyZ1Ae4miu8lXDq7+2jtn3Ccl7JhApNntz3PIVp0SeknQJngAegd4QLo1D8mgBLuaBgJHbAaqg9AIvOwVTlu0DdoEhYxP6TfOS8qRliVi6/FSl4/NvAX28ITMeWVPIih5w4DGz7tgyCj+Q8RMwA8IXXIXEdJwDwGaxMo9dSe27ayopfhItdbxU+g7UtJK0QVAFksVj6IbiGmcJxuPCyrkwtPJPZ7FxK21H+jx7O9Rgs6+eCWG9Vrjjue+IL805Y5JOSN43mf5TrrB70BS3yGLxmZJJiacB7OX57NyY/a8DoChQKAeUb0fuAo6SMPI1ohTcAJHKWlbgM1HTIFEJBfNaFIBk1V8FJ51AVHXQVyrHBnm46dn2qppc1Odax2OpOBz4t5gd+6sLWUsLwFIoP1IaCNfDkoGRQubmHbAYqs2i+uhaUrOmf/padQFCuUvcTnBjRBl2Pq+e8jIKJK3ppXRTU5v21fwGD1cmIINEQjV09P3D8y0OfnlMPwE1UeY6xVE37FVx2lcoV8Ken5kTDtILz1p+0asPS539zEo6/XMXDClDhT2erVDWkaNlCnEM2AhmhijSX4yO0E/sbItNb5Wc50+09mxZuiDXzkC4jmiprf7c0runxoiiFmDAljchaNw+qWcFDTLTB8Cq7RZBLaJZGjCBqcCnJWbAE1mahhk0958rTQbPfj+OEjVIc2aGt78nYkXYJCsKqk1wS7Q9vnBVt382FwhchqYro4JutJF8Rlw/knWdc4HdCcIpmAdaP4SjAGOCHtiXltgaSIwZoVfFeC+DjJYRW/f6wkkUgGZ2cmaCiVA9Z21uHwYu9IEZWwNqSPw9NB3MTEBRbV+jddrN5S0Ze+tVCmQDJVGtgefc73VDwq7lcvSrv1gP3IvvDalpAeuqtN+RSYvqbFlX7Hwt25e4BmMNVMSP9CrvdO7CvWJtTuFUrwu2jfIcm1qBA3szqWHIBYJCtZD6Ucf2ft+lTmaLxB+RMk9JRLeWs2jh32nM5wiibbC0cYrAHUS2ouo4xICnVU/eYGXK1wE0tIbAte1oXMNtVLImokhqleGn/KuMp1ShD6xg1wU/ekDPA4hUSbQNJO5pG+Oh/j3qWjSOJinZeNqwsJmf1GCKGrW7dJldLoQ+24wureO+bGpbhyVavvwYWFYd4+CdOhdm0ZUJEUeGg13r4ebcSFsqd3V4Wf6qeQfADcf9QtmrisCb6jMr9j32zpiTK4+vTrxSEvcWf+AtWSyyP0hRPrSNIY1mtIHhYVBi3cabD3ddYMqskKU62K+d0mpLXw/+rOdl4jguCi9DAJEssky1tA0lZUmFDYs9JD2086IjAU8fKt8Thok6SaXKdUb6s1K4ZfJGaY5DFyYuu+MChyhRTQHBiVv8NVGOXwsIq0ig3pjGrVkZ5HW60MhLLTz+4F1uVbn1MzZlygkA5yOasiAxKrNUYLZBlXAHtMss0moz9QXDz3WcjcyjEAFFHyhNq6YwqXG3ee6/Qhn7C45ugwQTZZ2mf6dgrSSE6ykCq151bmj2dUxcv6GTDmHC2b+KR/Kf2dNWsAvacgzKSMDTF/yy5M/lvmDQNomeIUxVt8cqXOw3kJQ3hn0aMtODwAWQ1ETbiyV2vM2yL6Wxx/RmqsYO/1u3a3PELtwAal6h0yOZkS82gANllHMjM7Z15kMdsbThfdfxUij0pSr6hpnOzvkOaA32wiHwBIEe+JefcN6zg0uEM15k21ETW17SrXRwruqNBAXNV32g2MaGTDEKlVhTKKwoin38v5bJkqj/pWi3S0gjQhlFKAvDrRugsB/mAAnO02W56k8QtnNxhUy/333yBS28Hmtspp9P1H+TyyXGm9mKfA5uIpvSiBtqalo3zkSD2H6QGhQM/bFSw0mK24dAPu9k1DadBV6Nnqx5+Ebtn9J4AtM8zlaGKYkQhS6RxpiMjAc2jFTkdm0OHZ33eIJGfHcwXx6Tp782vEeK8VhLpLHAzerPsIUoqC/c7qs3c3cv7a4ozK30XEX3Q0PcFPghr/LEKYMeHXQfq7OfZJvZKlGPclOUlBTb7vSr5/jDWpm9bfut3MvYRH+64h/zH/gVF+uvJqn4njQy2BArCmkhnQQsx367G5bRCkrS7ttiLToglsCnuh4BrP/Fut87S5Ng397AhZ3U1MK5hDLQGQLQDTPfki4q0lcF7hwxwflR0d0OKAOlGzdBzhrLXlZ8r+sx6qX274lxIbms/StvBT1ApL2tRCjQRCAsMy1ffZkGgdeDYHZZuNZ+aq7UegZQ4rOPLB+jjdoXiG3ygDPPoveF4NITq8/nc3e31Xjaygc7r5N5jiWcTzJqL+7bn6VI4idYAh8XQ8k4/rZ96WcbTbstzNaietSY7Cekc32/NGAOm55uLwwT1b9zUfQau8MpXaOM1h0upxFTCcQO2TfBeVNRcHZbzomiFg6Y0SSRhckCZHk7E2yjyRBh7rDNpQX2u2h4kOmyJcLg5B7iYeUlzr1qLfOk3IvM69Ba7iMxTK3JN7ZqWvD8REzWSg3kg9VhA6OUloJ85S+jqTFWIy+U6xQMDuulKU6VOx+MWF0R6nNhL1XsUUjvbVXkMb6eCCFtvmZgWEcziDz3wCbGAxfU63LP4OgeDqV6xmd+jz3KCuR5yQH8fI0obHKQlVbR7tV6BEJA2Gr4VQxkQw80nhkj5fGjVoZxfu6jpw3REx38KFLnziO+GBX5HerFxnnKidrTGWaJO/DwZ+n20ai6A7gLb8/Og40qkzmKjv9GHsfgse5gEMRAFdwKXnDGQIYXPf4IHO7Xv8W1NFr6iV4jQywKQyPIVGoRZWc6C01mP9zoAAAALOo0JuXmtXCBdwDQroIn+GqLxinhFpTRlZPDB96KUfbH+vBZhgCz0x9rMn7g5HJYhz8ko95WYJMCf0A8C6dejI3TibXcgPvov4E2yGF++uekn26HpyVPJlP/rImqqw5k94teRMm42/ft07iJbqTPwq3CBABCfnqaxalPCx1cEjdlAbQVjmoFMExUGGEu40aQ9ry8lo6jA//m845rJSJfgnHUKAKT9v0qLDoqUUyu+qYvz2jwQ5BvOOOk7eqvg0TcTkDJht8YIUKGI5u548Keu7WmKPXkFMlnje/nm0O4YlEdOlZj3n7DbsS2qd73jHQYBxINl2M6xqu3oTrw/fZJP8N7DvzaEhGzOd4ZqqsZQ1Rt7gr+S0qdKBS0iBN+Bac/9RxE5VxJ40YKFnb37CbUYBYftTwqQSbPCot94856/OoiFOeUJup3FXwSGXS+p/wZ1+nnGQynE+cecFoSq6kQYLZ2jTyhQKl7WZJ+wnjZDp5zR0piM2V5/EUBS8LrgPHn/lRajcTvgLEvAZXmaO6+N7f9go2P0VdE+u/zkukwrA3zTG+8A3xh3AfuPRTrVb2U++7smaGctSDpaDTqmkip8wdo4RCNV0QvueZp7YdE2Uo1vwxeBWBtqNLBlrkKjj6EGdtjCMNsTigVrAIAxn+wU0bQNCWTCwNTZmlRTkS5nKHRHj4Th06xlnF95W/bTkkxXMCHedIEEuwXdMyDy/i6TiiZ8FjuS05zvgiw5Ev+OdgD+arWcro0riAKdj+PSp9L/oiJjaTBGTMJsKFNqChyjZyl1j7E50vHp91ebNTbxhWXX90DnZy7QtLpR+CBTVQF2eoH1DaIGReuX/pipHgH7XDh0NGJ8fhU+C6jzVlHolUFKOwuuY2KvTje9Lho9WevO2q6Mp0CoWxKkBkLeoH4XD7KLk0k/LZ8j5eBqA13Xoc2/fvXlwfrWnymeZKex+ksRusEqwqCpSbG7wbVUxMx+R3M4rDaEjHfMJrm2c9zyz3dMy0++fzVXAIddYo/nFt3pUANWDFj1dregEAo3HVQfHG86eHenqy3N7ZUOLHaGQMvFMc29CJufyq4kMXMtUFOsGJCvEmupZb+mmSnv50wdDEa1lOweVLRKFIIKUHEACIjo3bPw/iG731Zr4FxI6S1BOuRkSDSKvRP3swUa1m0inr4zReBOOd0vNCU55Wa98tUzr1xG9JSMwc1g2xgWyBXYeaLbkIfML1Bgkh7MQbKL0qWl6CDdh1lSOQQWlni34tyyFVz+wqYA8KP0qvq51eMWRKoJXyqTKjUPjCx619OcDr3pD2hlao49b1HpLZWp4V4WX/VvZJQ0x+Ch9CqqCuVSfAOC1PuZnAv7PG6w90uPEWeIwsNd4GL3cNTNXjEldUXXZUBdiPqZDpRfDIHAA2mGqFxqEKMtnuEeLTJUlCvvTMK2/iHmjJeADkXmD9dRPOGLEAp8WKkLdOX5gDR/jTYZwBxJbke563eL3PjJUh/9IO2JcWJMrl6qjnnm/Cm9bka6e4RZzeGoFwCWVhoEj1jmEzzylUm6kI/Kfn5JE7WOcck9dqtu9PnxdOqEdYzlA5MaBGGH591pH154XfSj5Tw0NN38xojyn8Jy3xm7T3VcFU19JJk1vPyiw3zg1+syqUZkQMPkklpDEWlzi6/LmAR0NiKTFpJ8z14IdYlFuUIKzTgUD1EmzyIIISSt/XzImkiS7IaEzGniEcFHKESLlouc1PKprHwYhDMTp1OFSmQi9qRW+twEYxEeVhVzHyA6DhAByOyGB2QjY8HAxDGokp0D421ArV/4tNggoOox7y9Q8t2KvYa8YqtL0VCG4KQ5FDXgU5oN0fVs6HUuwUBs7PPM6l/juS4LhKcjE24CGvkv4bS2wlMferoLf9oL2spLtslybxo68ObGoNEbzRH+hXQOuOAt2wyh3t5mKyx6h1BK+AHe1gvXWhP+FUPDBnPm4v4ct8rS/vfnZCT3A4IyhsJOZF3VDINsLkZsdaaKqrCkyUb2TRTOmxSFuf01qW5vIsa1K2nWkaNEuo98bJb7W7ZWbgGBpdqdNGa8qP7kBdDdQ4jAOKAtN1Vo3vaP0CxsKQQMLz5488YCNF/aQ8K//X8f6owbKPbLOQ6NKYsWOv8rkco1fjintzTYWDBoqL3Y5DYc2kg4WFwcHvQGdI6kUQ6a7K62eZ900EPCIdvGZdUeieTThVJ1Z/Uo6t3zTb/ekDKiS/ffZsbyM5a0UCTgAZ2h+pa5sBgBOhdUqy6IsUpp8hkk5PvAbgtnaE+82rvLHz3Vg5dCfUnrmJcBb43L88UdS6cBgEprZBzp6xr6JSgNjEnAAA=

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