背景
上周研究了一下数据库中间件 MyCat ,并验证了 “MyCat 单机 + MySQL 主从复制” 的部署方案,本文接上篇,继续介绍这一方案的部署过程。
MyCat 的原理
MyCat 是一种分布式数据库中间件,跟其他分布式系统的核心思想一样,数据分散存储在不同主机上。核心概念有四个:
- 逻辑库:与 MySQL 的物理库作用一样,客户端连接 MyCat 后访问的数据库;
- 逻辑表:与 MySQL 的物理表作用一样,客户端连接 MyCat 后访问的表;
- 分片节点:DataNode,逻辑表所在的宿主,一个逻辑表可以指定 1-N 个分片节点,一个分片节点关联某个 DataHost 的某个具体的物理库;
- 节点主机:DataHost,分片节点数据所在的主机,可以配置主从分离。
MyCat 的核心原理是 “拦截器”,对 SQL 预处理和对SQL结果后处理。客户端发来一个 SQL 请求,会被 MyCat 拦截,然后做一些列的特定分析,如分片分析、路由分析、读写分离分析、缓存分析,然后将 SQL 发往后端真实的数据库;并将返回结果做适当的处理,返回给客户端。
整个过程对客户端来说是无感的,由中间件去处理读写分离,客户端代码编写时,无需定义多数据源,视为普通的 MySQL 的操作就好。
引用一个来自《分布式数据库架构及企业实践——基于Mycat中间件》的例子来说明一下各个概念的协作过程,大型电商网站中,订单表数据按所在省份进行切分,使用 MyCat 后的数据切分方案为:
该图中,orders 表被分为三个分片节点 dn1、dn2、dn3 ,它们分布在两台 MySQL 服务器上,可以按数据库服务器的资源量来设计分片方案,用 1~N 台服务器分片,分片规则选择枚举,它的定义通过 “分片字段+分片函数” 来指定,分片字段是 prov ,分片函数是枚举字符串。
最终,MyCat 部署的重点工作落在了确定分片方案、编写配置文件上面。
MyCat + MySQL 主从的四种部署方案
笔者总结了 MyCat + MySQL 主从部署的四种常见方案:
- 读写分离:不分片,dataNode 指向一个 DataNode,DataNode 指向主从集群;
- 单独分片:不用读写分离,DataHost 不指定 ReadHost;
- 分片+单MySQL主从:DataNode 指向同一个 DataHost 代表的主从集群;
- 分片+多MySQL主从:DataNode 指向不同 DataHost 代表的主从集群。
MyCat 的配置有两种方式,zookeeper 和本地 XML 。本文以本地配置为例,配置文件位于 /mycat/conf 目录,主要配置文件有:
- schema.xml:逻辑库和表以及对应的数据分片、分片主机的映射关系;
- server.xml:MyCat 登录用户认证和授权信息;
- rule.xml:逻辑表的分片规则;
根据产品需要,确定部署方案,编写 schema.xml。由于资源有限,笔者选择了第三种方案,MySQL 一主一从+分片,schema.xml 中有大量注释掉的示例配置,我们改成跟自己环境一致的配置就好了。
准备工作
第一步,准备好 部署介质和脚本;
第二步,根据 MyCat 的分片方案和服务器信息编写好 scehma.xml ;
第三步,定义 MyCat 服务访问权限文件 server.xml ,用默认配置就好;
第四步,在要部署 MyCat 的机器上,添加 MySQL 主从服务器 IP 的 host 名称,与 schema.xml 中 DataHost 引用的 host 名称一致:
vi /etc/hosts
hostM1 192.168.8.116
hostS1 192.168.8.117
部署流程
cd /home/mycat
,按如下顺序执行脚本:
- MyCat 所在的主机上,需要安装 JDK:
sh jdk_install.sh
; - 安装 MySQL 主节点:
sh master_install.sh 1
; - 为主节点创建复制帐号并授权复制权限:
sh master_grant.sh HostM1Pwd
; - 安装 MySQL 从节点:
sh slave_install.sh 302
; - 为从节点设置 Master 信息:
sh slave_grant.sh 192.168.8.116 mysql-bin.000002 1123 HostS1Pwd
; - 安装 MyCat:
sh mycat_install.sh
; - 将准备好的 MyCat 配置文件上传到 /usr/local/Mycat/conf 覆盖默认配置;
- 执行
start mycat
命令启动 MyCat。
这些操作,需要在不同的服务器上执行。
启示录
部署过程中如果有问题,可以参考此文。
部署工作应该是归属于运维职业的吧,这些年笔者也没少做,感觉用常规 20% 的技能+搜索引擎,就够应付了。
最考验人的,是耐心呐,拔出萝卜牵出泥,有一个问题,解决一个问题,幸运的是,问题到最后都被解决掉了。
最近发文都是早上 6 点开始写,快 8 点完成发布,虽然没有任何收益,但是网络笔记还是要记的呀,万一以后会用到呢?也说不定谁会因为我爱记网络笔记,被我清晰的脑回路、还算蛮流畅的文笔折服而看上我呢!
资源附录
- MyCat官网
- 简单 demo: 分片存储大表数据的一种方案
- 读写分离配置
- 同时分片和读写分离