传统关系型数据库的分布式开发通常需要自己做,不仅耗时耗力而且效果不是很理想,当想快速搭建时,最初想到的是看有没有第三方,网上牛人还是很多的,做得比较好的其中之一Mycat,它是开源的分布式数据库系统,解决数据库的负载均衡,主备复制,读写分离,简单来说就是你只管直接与mycat通讯,至于分离什么的交给它里面自己做,其它啥都不用操心。
至于什么是MyCat有什么优势,可以看看官网介绍Mycat 数据库分库分表中间件。
上图是MyCat架构图。
MyCat可以与HAProxy使用实现高可用数据库集群,更深入的内容自己去查,本章只详讲从0开始使用MyCat 基础篇,至少能先跑起来。
一、下载
本次运行环境为windows,Linux下更好吧,然后数据库用mysql,需要java环境,下载jdk8
jdk安装配置
1. 首先去oracle官网下载并安装jdk8,添加环境变量,JAVA_HOME设置为D:\Java\jdk1.8
2. CLASSPATH设置为.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
3. path系统变量追加%JAVA_HOME%\bin;
安装Mysql,需要注意的是数据库,表,字段的编码都采用utf8吧,否则插入的中文显示为乱码,具体解决方法网上查一查,去试一试。
下载MyCat,http://dl.mycat.io/ 选择最新的版本下载。(下图可以看到还有其它前面需要的资源都可以从这里下载)
二、配置
下载解压后就要先配置MyCat了,(这里不是exe文件,没有安装,配置好后直接运行startup_nowrap.bat)
打开mycat\conf里面的startup_nowrap.bat 为了降低资源占用,mycat的jvm设置在startup_nowrap.bat 可以清楚看到如下配置:
“%JAVA_CMD%” -server -Xms1G -Xmx2G -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=1G -DMYCAT_HOME=%MYCAT_HOME% -cp “..\conf;..\lib*” io.mycat.MycatStartup
这里将-Xms1G改成-Xms512M,-Xmx2G改成-Xmx1024M,保存后重新启动即可。
添加Windows环境变量,MYCAT_HOME设置为安装目录D:\MycatServer1.5
修改wrapper.conf文件里的改成wrapper.java.command=D:\jdk1.8\bin\java.exe
三、连接MySQL
Mycat绑定MySQL 启动的配置
conf 配置文件存放配置文件:
--server.xml:是Mycat服务器参数调整和用户授权的配置文件。--schema.xml:是逻辑库定义和表以及分片定义的配置文件。--rule.xml: 是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT。--log4j.xml: 日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug debug级别下,会输出更多的信息,方便排查问题。--autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相关的id分片规则配置文件--lib MyCAT自身的jar包或依赖的jar包的存放目录。--logs MyCAT日志的存放目录。日志存放在logs/log中,每天一个文件
具体什么意思后面慢慢看。
先解决主配置,server.xml配置文件配置访问用户及权限, 修改高亮处信息,其中mycat、user为访问mycat的用户,TESTDB为mycat虚拟的数据库,供上层应用访问。
123456TESTDB-->
-->123456TESTDBtrue
mycat的数据库配置是在schema.xml中配置,这部分不太好理解,精简了一下,主要分schema、dataNode、dataHost三个主要配置。
节点定义了mycat的虚拟数据库为TESTDB,下面借用园友的说明:
dataNode的意义很简单,这个逻辑表的数据存储在后端的哪几个数据库里面rule代表的是这个逻辑表students的具体切分策略,目前MyCAT只支持按照某一个特殊列,遵循一些特殊的规则来切分,如取模,枚举等,具体的留给之后细说-->
这意味着,childtable的joinkey会按照父表的parentKey的策略一起切分,当父表与子表进行连接,
且连接条件是childtable.joinKey=parenttable.parentKey时,不会进行跨库的连接.-->
这里的测试过程比较麻烦,所以直接贴结论:
1.balance=0时,读操作都在localhost上(localhost失败时,后端直接失败)
2.balance=1时,读操作会随机分散在localhost1和两个readhost上面(localhost失败时,写操作会在localhost1,如果localhost1再失败,则无法进行写操作)
3.balance=2时,写操作会在localhost上,读操作会随机分散在localhost1,localhost1和两个readhost上面(同上)
4.writeType=0时,写操作会在localhost上,如果localhost失败,会自动切换到localhost1,localhost恢复以后并不会切换回localhost进行写操作
5.writeType=1时,写操作会随机分布在localhost和localhost1上,单点失败并不会影响集群的写操作,但是后端的从库会无法从挂掉的主库获取更新,会在读数据的时候出现数据不一致
举例:localhost失败了,写操作会在localhost1上面进行,localhost1的主从正常运行,但是localhost的从库无法从localhost获取更新,localhost的从库于其他库出现数据不一致-->select user()-->
以上配置注意高亮部分,配置的是每个dn对应哪个实体服务器里面哪个实体库(此处只有本机,所以都绑定到本机localhost,再添加3个不同的数据库TESTDB1\TESTDB2\TESTDB3,手动都添加要测试的表,若有多余的服务器可以将ip替换掉测试),详细的内容参考文中的注释。
经过实验 goods表:在mycat的TESTDB的虚拟表goods中添加一行记录会在 TESTDB1和TESTDB2中的表goods同步添加一行记录。
hotnews表:在mycat的TESTDB的虚拟表hotnews中添加的一行记录会随机插入 TESTDB1、TESTDB2、TESTDB3的其中一个库中的hotnews表。
其它表的测试你们自己试试。
这就是分片,靠的是分片规则,下面就来看rule。
(每个数据库中相同的表要手工提前生成表结构,否则会提示找不到此表,操作mycat时它并不能自动同步实体数据库生成,可能有方法,现在还没深入了解)
rule.xml配置文件,可以先不管。
- 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.-->idfunc1user_idfunc1sharding_idhash-intidrang-longidmod-longidmurmurcreate_datepartbymonthcalldatelatestMonthidrang-modidjump-consistent-hash02160weightMapFile 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替-->/etc/mycat/bucketMapPath-->
用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西-->partition-hash-int.txtautopartition-long.txt3812824yyyy-MM-dd2015-01-01partition-range-mod.txt3
四、运行
用管理员权限运行startup_nowrap.bat启动MyCat。
若出现上面的问题,检查java的环境是否正确和mycat的环境配置。
启动成功后会出现:
#如果启动失败,请修改D:\mycat\bin\startup_nowrap.bat文件中的以下参数。默认占用内存为2G
D:\dev-bin\mycat\bin>"C:\Program Files (x86)\Java\jdk1.7.0_13/bin/java" -server-Xms512m -Xmx512m -XX:MaxPermSize=64M-XX:+AggressiveOpts -XX:MaxDirectMemorySize=768m-DMYCAT_HOME=D:\
p "..\conf;..\lib\*" io.mycat.MycatStartup
然后dos中会不停的出现心跳检测,有错误信息可去mycat\logs中查看日志。
注意:如日志中出现192.168.xxx not connected 等信息,请允许对应的mysql远程访问,且先提前独自检查mysql都能正确访问。
使用navicat连接mycat,操作方式和连接物理mysql库一致,用户mycat,密码123456,端口8066
连接成功后,将看到TESTDB数据库和hotnews等数据表
在hotnews表中添加一些数据,保存
执行select * from hotnews 查看操作,然后去TESTDB1、TESTDB2、TESTDB3中查询hotnews表
MyCat中TESTDB是中间件逻辑数据库,MySQL中的testdb、testdb2、testdb3是真实的数据库。
在mycat中添加数据时若提示testdb2.hotnews不存在,则要手动在testdb2中添加相同表结构。
添加完后,可以看到hotnews记录在三个testdb、testdb2、testdb3中是均衡随机插入的。
而goods在testdb、testdb2中是一样的。
至此可以配置出MyCat了,敬请期待下篇 net下如何使用。