今天来使用mycat管理mysql集群, 随着数据量的提升, 我们如果把所有数据存储在一个数据库中, 对数据的各种操作就会变得非常的困难. 自然我们又想到了数据库也进行集群部署, 将一个数据库的数据分散到不同的数据库中存储, 进而提升数据操作的性能.
本文的定义是简洁快速的使用mycat, 让读者可以快速的入门mycat, 因此本文聚焦于mycat的安装, 使用, 简易配置, 常用配置文件和标签的介绍. 如果需要全面深入的了解建议去读一读官方推荐的文档.
什么是mycat?
Mycat 是基于阿里巴巴曾经开源的知名产品 - cobar 演变而来, 简单来说MyCAT就是一个数据库中间件产品支持mysql集群, 你可以像使用mysql一样使用mycat, 对于开发人员来说根本感觉不到mycat的存在.
其实可以这么简单理解: 你有多个数据库, 那么你存数据的时候存到哪个数据库呢? 所以我们需要一个存储策略, 而mycat就是做这个事情的, 简单来说: mycat就是管理数据库集群的.
mycat的分片策略
本文主要目的是为了快速搭建使用起来, 不是为了深入分析概念, 因此就简单列举介绍下, 建议读者可以到官方文档或百度了解概念. 也可以到这篇博文了解一下详细的每个参数和属性有什么作用: https://www.cnblogs.com/joylee/p/7513038.html.
好了, 不多说, 下面我们正式进入正题.
首先我们需要现有一个已经装好jdk和mysql的linux系统, 为什么需要jdk呢? 因为mycat是java代码写的, 所以需要jdk环境.
第一步: 查看是否已经安装mysql
rpm -qa | grep mysql
第二步: 卸载你查询到的mysql
#rpm -e --nodeps 要卸载的mysql
#例如:
rpm -e --nodeps mysql-libs-5.1.73-8.el6_8.x86_64
第三步: 上传mysql压缩包, 解压
第四步: 安装服务端
rpm -ivh 服务端程序 --nodeps --force
第五步: 安装客户端
rpm -ivh 客户端程序 --nodeps --force
第六步: 启动和关闭mysql
启动mysql: service mysql start
关闭mysql: service mysql stop
重启mysql: service mysql restart
第七步: 连接mysql
mysql -u root -p
这里有个需要注意: 如果你安装的是5.6版本的, 会自动生成一个随机密码
1)进入该文件查看密码
vi /root/.mysql_secret
2)使用这个密码登录mysql
mysql –u root –p
3)修改密码
SET PASSWORD = PASSWORD(‘123456’);
第八步: 设置远程登录权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
然后使用SQLyog, 或者Navicat等软件连接远程mysql.
mycat下载地址:https://github.com/MyCATApache/Mycat-download
这里要注意是linux的压缩文件.
第一步: 上传到linux系统, 解压缩.
第二步: 启动mycat
进入bin目录
启动 ./mycat start
查询状态 ./mycat status
mycat 支持的命令 { console | start | stop | restart | status | dump }
第三步: 启动之后, 我们通过mysql客户端连接mycat
用户名和密码都是test, 这是mycat默认的.
默认端口是8066
但是这里, 我在连接的时候报了2003的错误:
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.179.133’ (0)
然后去查询了下mycat的启动状态, 发现是not running, 并没有连接上.
然后我使用./mycat console 命令监测
Running Mycat-server...
wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
wrapper | JVM exited while loading the application.
jvm 1 | 错误: 代理抛出异常错误: java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: simple01: simple01: 未知的名称或服务
这个错误的原因是因为位置的host名称, 所以我们需要在hosts文件中配置当前主机IP
vim /etc/hosts
在127.0.0.1 和 ::1 中间加上你的主机IP, 保存退出后, 重新启动mycat.
再次使用客户端连接, 发现连接成功.
第四步: 分片配置
这里分为三步:
看上图, 我们配置了哪些东西呢?
server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。
在system中添加UTF-8字符集设置,否则存储中文会出现问号
utf8
修改user的设置 , 我们这里为 TESTDB设置了两个用户
test
TESTDB
123456
TESTDB
name=“root” 是用户名, 下面的password自然是密码
第五步: 测试分片
我们用mysql客户端连接mycat, 在mycat中执行下面的SQL语句, 创建一张tb_test表
我们来看一下, 是否会在其他的三个数据库中同步创建呢?
CREATE TABLE tb_test (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
我们再查看MySQL的3个库, 发现表都自动创建好了.
接下来是插入表数据, 我们来插入一些数据 (注意, 这里mycat自动将tb_test变成了大写TB_TEST)
INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'goods1');
INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'goods2');
INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'goods3');
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');
INSERT INTO TB_TEST(ID,TITLE) VALUES(10000001,'goods10000001');
查看结果, 我们发现前3条数据插入到了db1中, 第4条数据插入到了db2中, 第5条数据插入到了db3中…
很显然是因为我们采用的分片规则是每节点存储500万条数据, 所以超过了500万就存到了db2, 超过1000万就存到了db3.
第六步: 分片规则配置
我们还记得, 在配置scheme.xml文件时, 我们的分片规则是auto-sharding-long
那现在, 我们就进入rule.xml中, 来搜索下这个名字
接着, 又看到这个分片规则的算法是rang-long, 我们继续搜索
接着, 又看到这个算法是在autopartition-long.txt这个文件中, 看来我们必须到这个文件中, 才能看到庐山真面目了.
接着, 在conf目录下找到了这个文件, 进去看看
果然, 原来是在这里配置了. 这其实是最简单的一种分片规则了, 接下来我想把我的数据均匀的分配到3个分片中, 所以我要用到 “一致性哈希” 分片规则.
一致性哈希 murmur (这个我一般读作 嬷嬷, 好记, 哈哈)
我们依然是到rule.xml文件中, 搜索这个嬷嬷
这里我们把count改成3, 这个count就是要分片的数据库节点数量
然后找到表规则定义, 这个规则指定的列是id ,如果我们的表主键不是id, 而是order_id, 那么我们应该重新定义一个tableRule:
<tableRule name="sharding-by-murmur-order">
<rule>
<columns>order_idcolumns>
<algorithm>murmuralgorithm>
rule>
tableRule>
在schema.xml中配置新的逻辑表时, 指定规则为sharding-by-murmur-order
注意:修改完配置,重新启动mycat
第七步: 测试一致性哈希分片规则
创建tb_order表
插入多条数据, 测试是否平均分布在3个库表中
测试的SQL语句这里就不粘贴了, 直接看下测试结果: 发现db1的TB_ORDER表中插入了19条数据, db2的TB_ORDER中插入了22条数据, db3的TB_ORDER表中插入了28条数据.
有的读者可能纳闷了, 这是成功了还是失败了呢? 为啥不是平均的呢?
其实一致性哈希算法并不能做到完全平均, 而是数据量越大越趋近与平均. 有兴趣的读者可以专门去研究研究一致性哈希算法到底是个什么东东…
数据库读写分离对于大型系统或者访问量很高的互联网应用来说, 是必不可少的一个重要功能. 对于MySQL来说, 标准的读写分离是主从模式, 一个写节点Master后面跟着多个读节点, 读节点的数量取决于系统的压力, 通常是1-3个读节点的配置.
Mycat读写分离和自动切换机制,需要mysql的主从复制机制配合。后面我们会有专门的一片文章来研究mycat的读写分离, 本文就到这里啦~~
嗯~~文章的最后一句话属于我自己啦, 今天是国庆10月1日, 明天准备会老家看看亲人. 我们在一天天长大, 亲人在一天天变老, 不想也不能等到子欲养而亲不待的一天啊. 其实想想我们能陪伴在亲人身边的日子很少很少, 一定一定隔一段时间抽出来时间回家里看看她们, 给她们买点礼物, 听听她们的唠叨, 很幸福.