mycat的引入以及如何安装

1.问题一:不知道大家有没有听说过“分库分表”的概念?没听说过,好,现在听说了,听说过,那么我请问什么是分库分表?

        因为我不是在帮你总结面试题,我自然也不会拿那些冠冕堂皇的话来忽悠人。分库分表你需要分开来理解,所谓分库,就是由多个数据库来存储某个项目用到的数据。打个比方,我的乐之者cms用的mysql数据库只有一个,名字假如叫做lzzcms,做了分库之后,使用了3个数据库,名字分别叫做lzzcms_00,lzzcms_1,lzzcms_2。由一个数据库变成了3个,就叫做分库。所谓分表,就是原先使用一个表来存放的数据,现在改为多个表来存放,比如你有个日志表,长年累月的都放在一个log表里,三五年之后还行吗?不行了,你就想出了按月存放日志,那么log表也由原先的单个表变成了log_2017_01,log_2017_02......这就叫分表。

2.问题二:为什么需要分库分表?

        随着业务的快速发展,数据量的增大,在整个大数据的前提下,动辄千万级的数据,尤其在互联网公司,爬虫肆行的时代,数据量大的惊人,单库单表很难满足需求,因此出现了分库分表

3.问题三:分库分表有哪些类型?

        ①.垂直分表:指的是“大表拆成小表”,基于关系型数据库中的“列”(字段)进行拆分。比如我们都熟悉的订单基本信息表和订单明细表,他们本来把字段放在一张表里面,但是一般都选择分开来放,为什么呢,其实里面就有垂直分表的思想在里面。再比如一张存放公司信息的表,涉及到的字段有上百个也是很平常的,这时候我们就需要把收集到的公司信息放在两张表设置三张表里来存放。

        ②.垂直分库:指的是按照业务模块来划分出不同的数据库,而不是以前那样将所有的数据表都放到同一个数据库中。比如,你想象一下,淘宝有多少用户量?订单有多少?单单就这两项,如果都放在一个数据库里面,都有点吃力,更别说还有其他五花八门的信息了,这时候我们可以把用户专门用一个数据库userdb来存储,订单基本信息用一个数据库orderbaic来存储,订单详细信息用一个数据库orderdetail来存储,当然我只是拿这个来举例子,实际情况肯定要比这要复杂的多,也要考虑更多的问题。和水平分库区别开来:垂直分库各个库之间存放的表是不同的。水平分库存放的表是相同的(名字可能不同,但存放的都是一个东西,比如log表),只是内容分开了。

        ③.水平分表:也叫"横向分表",原理就是将表中不同的数据行按照一定规律分布到不同的数据库表中(这些表保存在同一个数据库中),这样一来就降低了单表数据量,查询起来速度也会明显提升,但是要注意这只能在一定程度上缓解查询性能瓶颈,因为本质上这些表还保存在同一个数据库中,所以库级别还是会有IO瓶颈。比如我上面提到的按月切分log表的方式就是水平分表。

        ④.水平分库分表:水平分库分表与上面讲到的水平分表的思想相同,唯一不同的就是将这些拆分出来的表保存在不同的数据库中。比水平分表更为常用。

4.问题四:怎么实现看似复杂的分库分表呢?

        我们是程序员,关心的是怎么编码实现。可以这样实现,比如我现在有3个库,我可以在java程序里面定义3个数据源呀,假设名字分别是conn1,conn2,conn3,还是拿按月存储log表的例子,我java程序经过一系列判断之后,得出结论现在要存放到conn3连接的mysql数据库的log_2017_12这张表里,那么我就需要把log日志通过conn3这个Connection来插入数据库了。至于经过了哪些所谓的“一系列判断”,这当然是你自己定义的了,你可以是通过id%3=2就放到conn3连接的mysql数据库里,也可以是任意的你感觉合适的规则,我们称这些自定义的规则叫做“切片规则rule”。说了这么多,意思就是你可以通过在java程序里自定义多个数据源根据自己定义的切片规则实现分库分表,但是这样真的很麻烦,所以就需要一个类似中间件的东西,帮我们做这些事情,做哪些事情?

    1.定义多个数据源

    2.定义切片规则

    3.提供一个单一的连接地址和单一的数据库名称,以便我在java程序里面就感觉是在操作一个数据库一样,比如我在java程序里面可以直接通过“jdbc:mysql://localhost:1234/TESTDB”的方式连接,连接后,不用去管它什么分库分表,切片规则,插入进去之后,如何路由到合适的数据库连接,内部都是由这个中间件帮你做的,这个中间件就相当于你和多个mysql数据库之间的桥梁,你只要配置好了多个mysql数据库和这个中间件之间的分发关系,切片规则,你就只需要关心这个中间件提供的访问连接是什么就行了,至于怎么转发到各个数据库或者是各个数据表,就是这个中间件的事情,你不用再操心劳力的关注多个数据库的问题了,这个中间件叫什么?就是我们要说的mycat

5.mycat简介

        如上,我已经尽量用自己的话很啰嗦的去说明了一下mycat是一个什么样的角色,再从另外一个角度来啰嗦一下,mycat就相当于是一个代理,代理了我们java程序跟多个mysql数据库之间的交互,使我们的java程序专注于逻辑的书写,分库分表的内部适配(确定出一条数据该存到哪个库的哪个表)转发就由mycat来实现。

帮你解疑释惑:

        1.mycat通过定义多个数据源,定义切片规则的方式主要实现的就是水平分库分表,然后可以提供给程序一个固定的url地址。

        2.mycat不是一个jar包,它是一个安装包,拿一个版本来说“Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz”就是mycat,我们需要在linux上安装并配置它,而学习mycat,也就是学习它的配置。

        3.mycat支持读写分离

        4.mycat目的在于替代昂贵的商业中间件,mycat不仅支持mysql,大部分主流数据库都支持,比如db2,oracle,sql server等。

        5.mycat源于阿里的Cobar,Cobar在开源了一段时间后,不了了之,mycat就出现并代替了cobar。

--------------------------------------------------------------mycat的安装-----------------------------------------------------------------------

环境:

    192.168.23.69本地windows机器,安装着mysql

    192.168.23.113centos7的虚拟机ip,用来安装mycat

mycat的版本:Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

1.把下载下来的Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz安装包上传到linux上去:

[root@localhost ~/installs]#ls
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

2.指定安装目录安装到/usr/local下:

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

3.配置一下mycat的环境变量,vi ~/.bashrc:

export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin

4.使更改生效:

source ~/.bashrc

5.为了心里有谱,查看一下安装目录的目录结构:

image.png

可以看到,通过第二步的解压,在/usr/local目录下自动生成了一个mycat文件夹,这也是为什么环境变量那么配置的原因。cd mycat看一下里面的目录结构:

[root@localhost /usr/local/mycat]#tree -d
.
├── bin
├── catlet
├── conf
│   ├── zkconf
│   └── zkdownload
├── lib
└── logs
    └── 2017-12

8 directories

6.其实就这样我们就已经把mycat安装成功了,但是为了能验证安装成功的效果,我还需要做一个最简单的配置,修改配置文件/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="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<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">
     <heartbeat>select user()</heartbeat>
     <writeHost host="hostM1" url="192.168.23.69:3306" user="root"     password="root"></writeHost>
</dataHost>
</mycat:schema>

具体详细的解释我以后会说,这里只解释几个不对不说的地方:

image.png

如上图,dataNode标签里面的database是你在writeHost标签里面指定的机器192.168.23.69上的数据库名字,dbType="mysql"说明我要连接的数据库的类型是mysql类型,因为mycat还支持除mysql之外的其他数据库,你不指定它不知道要连接的将是什么数据库。writeHost标签里面的host属性是你随便指定的一个名字,url指定要连接的物理数据库所在url,user和password是登录物理数据库(这里是192.168.23.69:3306上的test)的用户名和密码。就这样配置之后,mycat就代理了这个真实的物理数据库(192.168.23.69:3306上的test),我们对真实的物理数据库可以进行的一切操作都可以借助mycat来完成了。

7.启动mycat

    mycat start

8.查看是否启动成功 ps -ef |grep mycat,发现已经成功:

image.png

9.万事俱备矣。通过客户端连接已经启动的mycat,这里的客户端可以是命令行、navicat、或者java程序等:

    ①。通过客户端连接,使用mysql -uroot -p123456  -h192.168.23.113  -P8066  -DTESTDB:

 

命令解释一下:mysql -uroot -p123456  -h192.168.23.113  -P8066  -DTESTDB,这里的-uroot -p123456是指定的登录mycat的逻辑数据库TESTDB的密码,你就把它当做mysql的数据库一样啊,登录mysql的数据库需要用户名和密码,登录mycat的数据库自然也需要用户名和密码。

至于为什么是root和123456,这是在配置文件里面的默认值,我们以后就会说到的。-h指定mycat所在机器的地址,-P指定mycat的端口,注意-P是大写。-D即database,指定要连接的mycat的数据库的名字,看看我们前边配置的schema.xml,发现已经指定了 schema标签的 name为"TESTDB",这里的TESTDB就是和schema.xml里面的TESTDB对应的。

    ②。通过命令行都可以连接成功,使用Navicat更容易了吧:

    

    连接属性就这些,点击连接就可以了:

    

跟连接普通的mysql数据库,完全一模一样吧,还迷茫啥,去秀秀你的crud虎逼操作吧。

    ③。通过java程序连接,连接信息都有了,java程序怎么连接还需要说吗?从上面可以总结出mycat的下面这些信息:

    url:jdbc:mysql://192.168.23.113:8066/TESTDB

    username:root

    password:123456

    有了这些信息,java程序连接就那么简单了。

10.如果你连接不上,请检查下面的问题:

        ①。把mycat所在服务器上的防火墙放行8066端口或者关闭防火墙测试。

        ②。确保mycat所连接的物理数据库使用的用户可以远程登录,因为我在这里是使用mycat连接的远程数据库。配置允许root远程登录的方法:

mysql -u root –p
mysql>use mysql;
mysql>update user set host = '%' where user = 'root';
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值