关于mycat的连接:
Mycat官网
Mycat下载连接
Mycat官方文档,百度网盘官方文档下载连接,提取码:f9nq。
Mycat简略文档前端
能够在开始以前,阅读Mycat简略文档,对其有个大概了解。java
注:MyCAT 支持多种数据库接入,分别有:mongodb、oracle、sqlserver 、hive 、db2 、 postgresql。node
在mycat中有如下三个比较重要的专业术语,这里简单写一下:mysql
- Schema:逻辑库,与MySQL中的databases(数据库)对应,一个逻辑库中定义了所包括的table。
- table:逻辑表,就是物理数据库中存储的某一张表,与传统的数据库不一样,这里的表格要声明其所存储的逻辑数据节点datanode,再次能够指定表的分片规则。
- datanode:mycat的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,经过datasource来关联到后端某个具体数据库上。
- datasource:定义某个物理库的访问地址,用于捆绑到datanode上。
本博文实现功能以下:linux
上述环境相似于web群集,前端nginx代理(这里是mycat),后端两个MySQL服务,slave服务器用来读数据,master服务器用来写数据。nginx
系统 | IP | 主机名 | 服务 |
---|---|---|---|
Centos 7.5 | 192.168.20.2 | mysql01 | MySQL 5.7.24 |
Centos 7.5 | 192.168.20.3 | mysql02 | MySQL 5.7.24 |
Centos 7.5 | 192.168.20.4 | mycat | Mycat |
mycat的安装部署须要jdk1.7及以上版本,mysql建议是5.5及以上版本。git
自行部署两台MySQL的主从,能够参考博文:MySQL高可用方案——双主(注:只须要参考博文作出主从效果便可,并不须要双主,也不须要keepalived来作高可用)。github
[root@mycat ~]# java -version #查看jdk版本是否合适 openjdk version "1.8.0_161" OpenJDK Runtime Environment (build 1.8.0_161-b14) OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode) #若是上述指令返回错误,能够执行下面的命令安装jdk环境 [root@mycat ~]# yum -y install java
下载的mycat包,直接解压便可使用。web
#下载并解压 [root@mycat src]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz [root@mycat src]# tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/ #查看解压后的目录结构 [root@mycat src]# tree -L 1 /usr/local/mycat/ /usr/local/mycat/ ├── bin ├── catlet ├── conf ├── lib ├── logs └── version.txt
其中:sql
- bin:启动目录;
- lib:mycat自身的jar包或依赖的jar包的存放目录;
- logs:mycat日志的存放目录,日志存放在logs/log中,天天一个文件;
- 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分片规则配置文件
下面的图片描述了mycat最重要的3大配置文件:
#指定client链接mycat的用户名及密码,此处的帐号密码与MySQL数据库无关 [root@mycat mycat]# vim conf/server.xml #定位到80行左右,修改以下 <user name="mycat" defaultAccount="true"> #mycat为用户名 <property name="password">pwd@123</property> #此处为密码 <property name="schemas">teset_mycat</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>
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!--下面的schema必须和第一个文件中的schema name(逻辑库名)一致。--> <schema name="teset_mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="host1" database="test" /> <!--这里的database是指定要链接后端的哪一个数据库,这里链接的是test库--> <!--下面是指定后端真实的MySQL主机,关于下面的balance值,有三个可选值,将在下面写下来--> <dataHost name="host1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <!--指定后端哪台主机用来写数据--> <writeHost host="hostM1" url="192.168.20.2:3306" user="root" password="123.com"> <!-- can have multi read hosts --> <!--指定后端哪台主机用来读数据--> <readHost host="hostS2" url="192.168.20.3:3306" user="root" password="123.com" /> </writeHost> </dataHost> </mycat:schema>
注:上面提到的dataHost字段balance负载均衡类型,目前的取值有如下4 种:
- balance="0", 不开启读写分离机制,全部读操做都发送到当前可用的 writeHost 上(默认值)。
- balance="1",所有的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,而且 M1 与 M2 互为主备),正常状况下,M2,S1,S2 都参与 select 语句的负载均衡。
- balance="2",全部读操做都随机的在 writeHost、readhost 上分发。
- balance="3",全部读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其之后版本有,1.3 没有。
writeTyep字段有如下3中取值:
一、writeType="0", 全部写操做发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,从新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties 。
二、writeType="1",全部写操做都随机的发送到配置的 writeHost,1.5 之后废弃不推荐。switchType 属性
- -1 表示不自动切换。
- 1 默认值,自动切换。
- 2 基于 MySQL 主从同步的状态决定是否切换。
#复制一个mysql命令 [root@mycat mycat]# scp root@192.168.20.2:/usr/local/mysql/bin/mysql /usr/local/bin/ #对后端两台数据库进行登陆测试 [root@mycat mycat]# mysql -uroot -p123.com -h 192.168.20.2 [root@mycat mycat]# mysql -uroot -p123.com -h 192.168.20.3 #确保执行上述指令登陆数据库时,能够登陆成功。 #若是没有登陆成功,则要考虑数据库的root用户是否有远程登陆的权限,或者防火墙的问题。
server.xml文件内容以下:
<?xml version="1.0" encoding="UTF-8"?> <!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="processorBufferPoolType">0</property> <property name="handleDistributedTransactions">0</property> <property name="useOffHeapForMerge">1</property> <property name="memoryPageSize">1m</property> <property name="spillsFileBufferSize">1k</property> <property name="useStreamOutput">0</property> <property name="systemReserveMemorySize">384m</property> <property name="useZKSwitch">true</property> <!--以上内容中,只是删除了一些注释行的内容,主要是下面--> </system> <user name="mycat" > <property name="password">pwd@123</property> <property name="schemas">teset_mycat</property> </user> </mycat:server>
conf/schema.xml文件内容以下:
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="teset_mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="host1" database="test" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.20.2:3306" user="root" password="123.com"> <!-- can have multi read hosts --> <readHost host="hostS2" url="192.168.20.3:3306" user="root" password="123.com" /> </writeHost> </dataHost> </mycat:schema>
- ./mycat start 启动
- ./mycat stop 中止
- ./mycat console 前台运行
- ./mycat install 添加到系统自动启动(暂未实现)
- ./mycat remove 取消随系统自动启动(暂未实现)
- ./mycat restart 重启服务
- ./mycat pause 暂停
- ./mycat status 查看启动状态
#建立命令软链接 [root@mycat mycat]# ln -sf /usr/local/mycat/bin/mycat /usr/local/bin/ #启动mycat [root@mycat mycat]# mycat start #更建议使用mycat console前台启动,若是有错误,就会直接输出到屏幕,方便排错 #待调试正常后,再使用mycat start后台启动便可。 Starting Mycat-server... [root@mycat conf]# ss -lnp | grep 8066 #若是端口没有在监听,则表示启动失败,自行查看日志排查吧。 tcp LISTEN 0 100 :::8066 :::* users:(("java",pid=62070,fd=78)) #使用server.xml文件中定义的用户名及密码进行登陆查看 [root@mycat conf]# mysql -umycat -ppwd@123 -h 192.168.20.4 -P 8066 mysql> show databases; #下面的teset_mycat库对应的就是后端的test库 +-------------+ | DATABASE | +-------------+ | teset_mycat | +-------------+ 1 row in set (0.00 sec) mysql> use teset_mycat #库中全部的表数据和后端数据库是对应的 mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | t1 | +----------------+ 1 row in set (0.00 sec) mysql> select * from t1; +------+------+ | id | name | +------+------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | +------+------+
至此,已经成功接入了mycat来链接后端数据库,可是mycat的主要功能尚未展现,我将继续更新后面的内容。其实更推荐去阅读Mycat官方文档。官方文档也比较通俗易懂。