爱情·你是我猜不到的不知所措

小说:爱情·你是我猜不到的不知所措作者:侯龙更新时间:2019-03-22字数:71726

所以兽王也没什么好隐瞒的道出一件让刘皓一开始既惊讶又不信,可是最后却恍然大悟,一切都明白过来的事情。

没错,我就是个坏男人

四个香喷喷的美女立刻拥坐在李醉身边,替他捶腿,替他揉胸,莺声燕语,让李醉如同在梦中一般,他这辈子几时有过这种享受,他忍不住摸了其中最漂亮的女人一把。
“你在水里就更好了,雷遁·伪暗。“刘皓结印射出了一道雷电让在水底的鬼鲛立刻惨叫一声,幸好他皮粗肉厚,如果是其他人中了这一招而且还是在水底中招绝对重伤。

悟空仔细回想老君那天所说,“我们在造化炉中,修为法力尽失,如同废人一般……”而老君他们经历了这个过程,反而因祸得福,将体内造化弃尽,到了此会元之中,又从造化炉中重新吸取,故而至今无碍。若是如此,这个造化炉可真是奇妙得很哪!

引言

先给大家介绍2个概念:数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。

切分模式

一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分
垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业务模块所使用的表分拆到不同的数据库中。根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也会比较简单清晰。
水平切分于垂直切分相比,相对来说稍微复杂一些。因为要将同一个表中的不同数据拆分到不同的数据库中,对于应用程序来说,拆分规则本身就较根据表名来拆分更为复杂,后期的数据维护也会更为复杂一些。

为什么用MyCat

不管怎么来说,数据切分虽然分散了单台服务器负载,但是带来了是设计和开发的复杂度。MyCat是一个开源的分布式数据库中间件,实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,在MyCat里,我们面向的是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

分库分表实践

基本环境

操作系统:CentOS / 7.1 (64bit)
JDK:1.8
MySQL:5.7
MyCat:1.6

业务目标

比如说我们现在有个实际的业务上设计需求,要将student和grade表进行垂直划分,分别存储不同的database中;还需要将student水平拆分,也要3个不同database存分别储。如下图所示,MyCat可以帮助实现这4个database的管理,而对于终端用户来说,就像只操作student和grade两张表,保证了中间件分库分页对程序员的透明性。
avatar

创建实际数据库

首先,我们肯定需要创建4个database:beijing、shanghai、guangzhou、basic,并生成对应的表。可以看出,student和grade表存在于不同的数据库,而且student表中的数据,分散存储在3个不同的数据库中:

create database beijing;
use beijing;
create table student(
    id    int primary key,
    name   varchar(8) not null,
    grade  int  not null
);

create database shanghai;
use shanghai;
create table student(
    id    int primary key,
    name   varchar(8) not null,
    grade  int  not null
);

create database guangzhou;
use guangzhou;
create table student(
    id    int primary key,
    name   varchar(8) not null,
    grade  int  not null
);

create database basic;
use basic;
create table grade(
    id    int primary key,
    name   varchar(8) not null
);

安装配置MyCat

比较简单,下载Mycat-1.6-RELEASE,直接解压缩即可。
为了方便,将/mycat/bin目录添加到环境变量:
/etc/profile文件后增加设置export PATH=/data/mycat/bin:$PATH
让profile立即生效:
# source /etc/profile

配置server

编辑mycatconfserver.xml:

<user name="test">
  <property name="password">test</property>
  <property name="schemas">TESTDB</property>
</user>

这里MyCat会帮助我们生成一个虚拟的逻辑database,我们命名为TESTDB,并设置可以访问的用户名和密码,默认访问的端口号8066,其实MyCat还会提供一个管理端口:9066,方便我们对MyCat管理和监测,这个我们以后有机会再说。

配置schema

编辑mycatconfschema.xml:

<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <!-- 取模分片 -->
        <table name="student" primaryKey="id" dataNode="dn1,dn2,dn3" rule="mod-long" />
        <table name="grade" primaryKey="id" dataNode="dn4"/>
    </schema>

    <!-- 申明节点对应的database -->
    <dataNode name="dn1" dataHost="localhost1" database="beijing" />
    <dataNode name="dn2" dataHost="localhost1" database="shanghai" />
    <dataNode name="dn3" dataHost="localhost1" database="guangzhou" />
    <dataNode name="dn4" dataHost="localhost1" database="basic" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- 可读写的数据库实例 -->
        <writeHost host="hostM1" url="localhost:3306" user="root" password="******">
        </writeHost>            
    </dataHost>

</mycat:schema>

schema是比较重要的一块配置,主要维护了虚拟库与实际库的映射关系:
可以看到,虚拟的逻辑库TESTDB中维护了2张表student和grade;
grade对应存储在实际的数据库节点dn4,也就是basic;
而student被拆分为存储在3个实际的数据库节点,分别是beijing、shanghai、guangzhou,分片的算法取模,根据取模映射到不同的节点;
最后,我们将实际的访问地址、访问权限配置完成,当然,这里还可以配置主从/读写分离配置,这块不是本文讨论的重点,我们以后单独说。

启动MyCat

这时候,我们敲入命令:# mycat start ,正常的话可以启动MyCat,输入# mycat status,可以查看是否运行正常,如果运行停止,证明启动有误,可以进入控制台启动,# mycat console,进行调试。(有可能报内存错误,一般是由于配置java虚拟机的默认大小的问题,我们可以根据命令行的提示,去wrapper.conf中修改)
avatar

MyCat插入和查询

MyCat启动后,我们就可以连接MyCat帮我们生成的逻辑库了:
# mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB
avatar
接下来,我们在逻辑库中插入一下数据验证一下:

insert into grade (id,name) values (1,"一年级");
insert into grade (id,name) values (2,"二年级");
insert into grade (id,name) values (3,"三年级");

insert into student (id,name,grade) values (1,"张三",2);
insert into student (id,name,grade) values (2,"李四",1);
insert into student (id,name,grade) values (3,"王五",3);
insert into student (id,name,grade) values (4,"甲",3);
insert into student (id,name,grade) values (5,"乙",2);
insert into student (id,name,grade) values (6,"丙",1);

我们插入了6条student记录,这时应该根据不同的取模结果,存在不同的实际数据库的student表中,所以我们切换到实际数据库:# mysql -uroot -ppassword
分别查看实际数据库:
avatar
再看此时的逻辑数据库:
avatar
逻辑数据库,查询grade和student两张表,已经数据聚合,还可以进行排序;
avatar
如果我们需要将2张表进行关联,也是可以的:
/*!mycat:catlet=io.mycat.catlets.ShareJoin */select * from student s,grade g on s.grade=g.id where g.name="一年级";
avatar

附录

附:个人研究整理和总结(查看原图或者打开原地址链接)
avatar

编辑:海陵成

发布:2019-03-22 03:07:54

当前文章:http://emigration.net.cn/rbl9jnc2rp.html

你所谓的迷茫,说到底,就是懒! 怎样安慰情绪低落的朋友 让心理学社会学教你 这年头,和尚泡妞都这么骚气 有备胎的男生心理 罗李华谈:属鼠的人2016年运程 这年头,和尚泡妞都这么骚气 双眼皮贴的危害,你知道多少? 暴力电影与“被欺负”

42346 59984 15333 59657 64154 52017 45788 26268 83570 69791 73922 92296 84612 96330 69272 66542 19708 58333 48290 70233

我要说两句: (0人参与)

发布