Mycat 官网
官方说明
我下的是 Mycat-server-1.6
Linux
版本
我的安装目录 /data/mycat
#下载
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
#解压
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
8066
:开发端口,正常开发,操作数据库使用
9066
:管理端口,一般就热刷新配置时使用
进入 Mycat 的 bin
目录下
./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动(暂未实现)
./mycat remove 取消随系统自动启动(暂未实现)
./mycat restart 重启服务
./mycat pause 暂停
./mycat status 查看启动状态
配置看着比较多,但是上面部分都是配置里自带的,只在下面 user 标签
做了修改
PS:
逻辑库可以理解为一个虚拟库,用户只需连接这个逻辑库做操作就行了,剩下至于究竟 SQL 在哪台上执行之类的,由 Mycat 自己去选择
xmlns:mycat
的值在 1.5
版本中是 http://org.opencloudb/
/font>
xmlns:mycat
的值在 1.6
版本中是 http://io.mycat/
/font>
后面文件一样,不多赘述
...
配置逻辑库账号123456
配置逻辑库密码mysql1
配置对应逻辑库,多个都用这套账号密码的 ,
隔开
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0property>
<property name="useGlobleTableCheck">0property>
<property name="sequnceHandlerType">2property>
<property name="processorBufferPoolType">0property>
<property name="handleDistributedTransactions">0property>
<property name="useOffHeapForMerge">1property>
<property name="memoryPageSize">1mproperty>
<property name="spillsFileBufferSize">1kproperty>
<property name="useStreamOutput">0property>
<property name="systemReserveMemorySize">384mproperty>
<property name="useZKSwitch">trueproperty>
system>
<user name="root">
<property name="password">123456property>
<property name="schemas">mysql1property>
user>
mycat:server>
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mysql1" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
schema>
<dataNode name="dn1" dataHost="mysql1-host" database="test" />
<dataHost name="mysql1-host" maxCon="1000" minCon="10" balance="1" writeType="0" switchType="2" dbType="mysql" dbDriver="native" slaveThreshold=“100”>
<heartbeat>show slave statusheartbeat>
<writeHost host="master-node1" url="118.25.215.105:7000" user="root" password="123456">
<readHost host="slave-node1" url="118.25.215.105:7001" user="root" password="123456" />
writeHost>
<writeHost host="master-node2" url="118.25.215.105:7001" user="root" password="123456"/>
dataHost>
mycat:schema>
PS:配置说明在官方的书上都有,这里对用到的做了整理,也可以自己到官网下载 PDF
逻辑库设置,可以理解成 Mycat 创建的虚拟数据库,用来给用户与实际数据库之间搭建的桥梁
name
:定义逻辑库的名称
checkSQLschema
:设为 true
时会省略数据库前缀,据说有 Bug,一般默认 false
就好了
PS:说下我这里为什么设置为 true,因为设置成 false 的情况下,由于数据库前缀没去除,导致直接用 Navicate 等工具连接 Mycat 逻辑库后直接双击表都打不开,报库名没有。因为虚拟库的库名再实际库里是不存在的,所以写 SQL 不带库名就不存在问题,怎么选择可以自己权衡
sqlMaxLimit
:当查询语句没有 limit
时就会自动帮你加上,不写就不会有这个效果,查询语句中本身有 limit
情况下以查询语句的为准
dataNode
:对应的分片节点
对应的分片节点,由于暂时没用到分片,不多介绍,配置一个就好了
name
:节点名称
dataHost
:分片所属的物理数据库,我的理解是对应的物理数据库的逻辑关系
database
:数据库名,你具体这个节点要操作哪个数据库
物理数据库的逻辑关系,什么读写分离,多主负载均衡,自动切换的逻辑都是这里面配,建议对着配置看
dataHost
name
:实例名称,自取
maxCon
:每个读写实例连接池的最大连接数量
minCon
:每个读写实例连接池的最小连接数量,初始化连接池大小
balance
:负载均衡类型
writeType
:同样是负载均衡类型,功能上略有不同
switchType
:主从切换配置
slaveThreshold
:需要这个配合 switchType
才能实现主备切换
dbType
:指定后端连接的数据库类型,目前支持 mysql,mongodb,oracle,spark 等
dbDriver
:指定连接后端数据库使用的 Driver
指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,因为这个值执行的
是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。
从 1.6 版本开始支持 postgresql 的 native 原始协议。
如果使用 JDBC 的话需要将符合 JDBC 4 标准的驱动 JAR 包放到 MYCAT\lib 目录下,并检查驱动 JAR 包中
包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:
com.mysql.jdbc.Driver。
heartbeat:心跳 SQL,注意 switchType
属性所需要使用对应的 SQL
writeHost:配置写实例,具体数据库配置
host
:可以理解成名称,自起,日志里面根据这个 host 就知道执行的哪个数据库
url
:数据库地址
user
:用户名
password
:密码
readHost:配置写实例,具体数据库配置,配置参照 writeHost
看到 finish 10 success 10 这种的就说明这个实例连接成功了,每个实例都要看下,防止有失败的
连接 Mycat 管理端口 9066
服务器上修改完配置保存
#会加载schema.xml配置的调整。
reload @@config;
#刷新全部配置
reload @@config_all;
PS:这个刷新对日志这个刷新好像不太好使,不知道是不是 Bug
连接 Mycat 开发端口 8066
读写分离,balance=“1”
,因此 master1
用于写,master2
,slave
用于读
修改 conf
下 log4j2.xml
文件日志等级为 debug
查看日志
tail -100f mycat.log
建表
CREATE TABLE `people` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NULL COMMENT '名字',
`age` int(11) NULL COMMENT '年龄',
PRIMARY KEY (`id`)
);
通过 7000
端口看出,创建语句在 master 主库上执行的,并且 fromSlaveDB=false
也可以看出走的不是从库
新增 1 条数据
INSERT INTO people (name, age) VALUES ('小明', 12)
查询列表
SELECT * FROM people
从这回的 7001
端口以及 fromSlaveDB=true
上可以看出走的从库
再次新增一条数据
INSERT INTO people (name, age) VALUES ('小红', 20)
查询数据
SELECT * FROM people WHERE age < 20
dnindex.properties
:通过查看 conf
目录下的这个文件,可以知道mycat正在使用的 writeHost
,0表示schema.xml
中 dataHost
标签下的第一个 writeHost
模拟主的宕机
停止 master 容器
可以看到失败一定次数后,开始尝试切换数据源
来看下 dnindex.properties
执行一个写操作
INSERT INTO people (name, age) VALUES ('A', 25)
由于内存不足,导致内存分配失败
修改 conf
下的 wrapper.conf
文件
这两个值原大小为 4G
和 1G
,我这个服务器一共就 2G
所以内存不足了,可通过 top
查看服务器内存使用情况
日志报 Unknown charsetIndex:255 错误
PS:忘截图了
由于 Mycat
字符集的配置文件匹配不到导致的错误
conf
下的 index_to_charset.properties
文件里新增 255=utf8mb4
网上很多报的是 Unknown charsetIndex:224
同理新增 224=utf8mb4