Mycat数据库分片,高可用架构篇

来源:http://www.smjxgs.com 作者:王中王高手论坛 人气:67 发布时间:2019-09-06
摘要:1  海量数据的存储问题 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数

海量数据的存储问题

如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。

但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。如果使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储。

【分布式架构初探】

实战操作可参考:

1.1 什么是数据库分片

简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。

数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。

(1)一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分

图片 1

 

 

 

(2)另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

 图片 2

 

第五节-猫从哪里来,要到哪里去(Mycat的前世今生)

5.1 MyCAT猫的前世
5.2 MyCAT猫的今生
5.3 十分钟安装使用
5.4 MYCAT下实现读写分离
5.5 切!切!切!MyCAT中分表分库策略
5.6 MyCAT的五脏六腑
5.7 课后作业

一、环境

1.2 如何实现数据库分片

当数据库分片后,数据由一个数据库分散到多个数据库中。此时系统要查询时需要切换不同的数据库进行查询,那么系统如何知道要查询的数据在哪个数据库中?当添加一条记录时要向哪个数据库中插入呢?这些问题处理起来都是非常的麻烦。

这种情况下可以使用一个数据库中间件mycat来解决相关的问题。接下来了解一下什么是mycat。

5.1 MyCAT猫的前世##


最近猫为什么这么火,Apache的猫,MyCAT的猫。
差不多都长这个样

5.1-01.png

MyCAT原来本没有想着来生做猫的,因为他的前世是阿里的Cobar,
转世之后,成为了MyCAT,并且开源了,就立志做一个中国的Apache猫.

说道他的前世是阿里的Cobar, Cobar的作者离职了以后,Cobar就几乎没有进行后续开发和维护了,
后来转为开源的MyCAT,又进行了迅速的发展,现在初步统计有超过300个项目使用mycat,其中包括:
中国电信/中国联通/蒲公英传媒/天狮集团等等

5.1-02.png

为什么有这么多的知名公司使用mycat 呢, 我们看看他们的业务量,
1.安智账户系统, 数据量单表6000万条,20多张表,上亿条数据, 系统运行良好,偶尔有SQL操作迟缓的现象。
2.公安项目,20个表,30多亿条数据,选取适合的业务使用mycat

从这些项目中我们可以看出,mycat擅长对上亿条单表数据量的处理,并提供良好的实时查询服务。
而我们知道,MYSQL的库中很难处理上亿条数据的查询工作,MYCAT提高了MYSQL数据库的处理能力,
从官方的解释来看,MYCAT适合处理千亿条以下的数据,千亿条以上的数据更适合HADOOP这些系统来处理。

说了半天,什么是MYCAT呢?
MYCAT就是一个虚拟的MYSQL SERVER, 这么说可能不太理解, 但是对于应用来说,他就是一个MYSQL SERVER,
应用就像连接普通的MYSQL数据库一样的 去连接他,SQL查询、操作等等一模一样。

而MYCAT把数据库复杂的架构,以及背后复杂的分表分库的逻辑全部透明化了,MYCAT中间件连接多个MYSQL数据库,
多个数据库之间还可以做主从同步,而这一切的一切,对应用来说,只有一个数据库,那就是MYCAT。

操作系统:CentOS-6.6-x86_64-bin-DVD1.iso

Mycat介绍

5.2 MyCAT猫的今生##


MYCAT发展到现在已经不仅仅是MYSQL的代理了,它还支持SQLSERVER/ORACLE/DB2/POSTGRESQL等主流数据库。
MYCAT还可以将一个表定义为任何一种MYCAT支持的存储方式,比如MySQL的MyISAM 表、内存表、或者MongDB这种
内存数据库上。

MYCAT这么强大,那么他的原理是不是特别的复杂,非也,Mycat 的原理可以用一个动词来形容:”拦截“
它拦截应用发送过来的SQL, 并对SQL语句进行一些特定的分析:分片分析、路由分析、读写分离分析、缓存分析等,然后将
分析后的SQL分别发送到不同的真实数据库,最后对数据库返回的结果进行处理,返回给用户。

5.2-01.png

下面列举几个MYCAT 典型的应用场景:

  • 单纯的读写分离,在下面我们会有讲解如何进行Mycat下面的读写分离的配置
  • 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片
  • 多租户应用,每个应用一个库,但应用程序只连接MYCAT ,从而不改变程序本身,实现多租户
  • 报表系统,借助于MYCAT的分表能力,处理大规模报表的统计
  • 替代HBase, 分析大数据
  • 作为海量数据实时查询的一种简单有效的解决方案, 比如100亿条数据需要在3秒内实时查询出来,此时可以考虑MYCAT

现在MYCAT社区活跃,MYCAT 周边的系统也慢慢衍生出来,慢慢的形成了MYCAT生态圈了,像MYCAT-WEB 监控,MYCAT-HA
高可用方案等等,所以MYCAT还是很值得我们学习和研究的。

JDK版本:jdk1.7.0_45

2.1 什么是Mycat?

 

Mycat 背后是阿里曾经开源的知名产品——Cobar。Cobar 的核心功能和优势是 MySQL 数据库分片,此产品曾经广为流传,据说最早的发起者对 Mysql 很精通,后来从阿里跳槽了,阿里随后开源的 Cobar,并维持到 2013 年年初,然后,就没有然后了。

Cobar 的思路和实现路径的确不错。基于 Java 开发的,实现了 MySQL 公开的二进制传输协议,巧妙地将自己伪装成一个 MySQL Server,目前市面上绝大多数 MySQL 客户端工具和应用都能兼容。比自己实现一个新的数据库协议要明智的多,因为生态环境在哪里摆着。

 

Mycat 是基于 cobar 演变而来,对 cobar 的代码进行了彻底的重构,使用 NIO 重构了网络模块,并且优化了 Buffer 内核,增强了聚合,Join 等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。

简单的说,MyCAT就是:

·一个新颖的数据库中间件产品支持mysql集群,或者mariadb cluster,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。

 图片 3

5.3 十分钟安装使用##


MYCAT虽然强大,但是他的安装却十分简单, 下面我们进入我们十分钟安装教程:

MyCat版本:Mycat-server-1.4-release-20151019230038-linux.tar.gz

2.2 Mycat支持的数据库

 图片 4

 

1.下载MYCAT安装包###

在GitHub 的 MyCATApache项目下,我们找到
https://github.com/MyCATApache/Mycat-download/tree/master/1.5-RELEASE
选取 Mycat-server-1.5.1-RELEASE-20160929233042-linux.tar.gz
linux 版本进行 下载

目前1.6版本部分功能还在开发中,1.5版本比较稳定,建议下载1.5用于生产环境使用

MyCat节点IP:192.168.1.203      主机名:edu-mycat-01  主机配置:4核CPU、4G内存

2.3 Mycat的分片策略

 图片 5

 

 

 

2. 解压运行MYCAT安装包###

下载文件是一个tar的linux压缩包,用解压命令
tar -zxvf Mycat-server-1.5.1-RELEASE-20160929233042-linux.tar.gz

5.3-01.png

启动命令
./mycat start|restart|stop|console 常用几项内容

5.3-02.png

日志文件
logs/wrapper.log mycat服务器日志
logs/mycat.log 数据库操作日志,分析数据库操作路由使用。

启动MyCat最主要的几个配置文件:
conf/server.xml 服务器用户、虚拟Sechma、端口等配置信息。
conf/sechma.xml 物理数据库映射。

使用MyCAT来说的话,最主要的就是修改这两个文件,接下来我们实现MYCAT下的读写分离。

MySQL版本:mysql-5.6.26.tar.gz

2.4 概念说明

5.4 MYCAT下实现读写分离##


首先参考上一节MYSQL配置主从复制,配置好主从数据库之间的数据复制功能。

主节点IP:192.168.1.205     主机名:edu-mysql-01   主机配置:4核CPU、4G内存

2.4.1 逻辑库(schema) :

前面一节讲了数据库中间件,通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。

1.登录主服务器的mysql,查询master的状态###

mysql> show master status;
------------------ ---------- -------------- ------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
------------------ ---------- -------------- ------------------
| mysql-bin.000010 | 106 | db1,db2,db3 | mysql |
------------------ ---------- -------------- ------------------
Master 重启后会修改mysql-bin(序号加1)

从节点IP:192.168.1.206     主机名:edu-mysql-02   主机配置:4核CPU、4G内存

2.4.2 逻辑表(table):

既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。

分片表:是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。 总而言之就是需要进行分片的表。

非分片表:一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。

2.查看Slave机有没有配置成功:###

mysql> show slave statusG
以下两个参数必须为YES:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

 

2.4.3 分片节点(dataNode)

数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)。

3.MyCAT的配置###

不使用Mycat托管的 MySQL主从服务器

schema.xml
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM" url="172.19.4.239:3306" user="root" password="123456"></writeHost>
</dataHost>

支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />

<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM" url="172.19.4.239:3306" user="root" password="123456">
<readHost host="hostS" url="172.19.4.240:3306" user="root" password="123456" />
</writeHost>
</dataHost>

设置 balance="1"与writeType="0"
Balance参数设置:

  1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。
  2. balance=“1”,所有读操作都随机的发送到readHost。
  3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发

WriteType参数设置:

  1. writeType=“0”, 所有写操作都发送到可用的writeHost上。
  2. writeType=“1”,所有写操作都随机的发送到readHost。
  3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。

这样配置了以后,就已经实现了读写分离的功能, 还可以对数据库进行负载均衡
启动mycat , 用应用或者Navicat等工具 连接mycat ,端口是 8066
insert , select 进行测试。

二、依赖课程

2.4.4 节点主机(dataHost)

数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。

5.5 切!切!切!MyCAT中分表分库策略##


上面只是实现了如何进行读写分离,基于数据库的主从同步复制的原理, 我们在之前的课程里已经知道,
主从同步复制的数据是 ,保证从数据库和主库的数据一模一样,也就是说数据是多复制了一份出来,

而MYCAT 只所以能支持上百亿的数据量,在于他的另一个功能:分表分库策略
分表分库简单来说,就是MYCAT 下面连接的数据库节点,打比方说有dn1,dn2,dn3, 他们每个库中的数据
是各不相同的。
把MYCAT当做一个虚拟数据库来看,travelrecord 是MYCAT下面建的一张表, 应用调用MYCAT
库可以调用到整张表的数据, 但是如果查询某一个节点dn1 , 则只能查询到一部分数据(通常是1/3)的数据
dn1, dn2 , dn3 各自存储了一部分的数据, 但是可以通过MYCAT 来查询到整张表的数据,
这样增强了每个数据库的数据存储处理能力, 这就是MYCAT的高明之处,也就是为什么他能够处理上百亿条数据的奥妙。

这里列出一个简单的分表分库的配置:
schema.xml
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
在schema中 我们需要配置mycat 中的虚拟表table ,以及他的rule ,分表规则
auto-sharding-long 的意思是 事先已经定义好每个dn的 范围,根据范围划分,这个规则在rule.xml中进行配置.

datanode 的配置:
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost2" database="db2" />
<dataNode name="dn3" dataHost="localhost3" database="db3" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <!-- can have multi write hosts -->
    <writeHost host="hostM1" url="172.19.4.3:3306" user="root" password="123456"></writeHost>
</dataHost>

<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <!-- can have multi write hosts -->
    <writeHost host="hostM2" url="172.19.4.201:3306" user="root" password="123456"></writeHost>
</dataHost>

<dataHost name="localhost3" maxCon="1000" minCon="10" balance="0"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <!-- can have multi write hosts -->
    <writeHost host="hostM2" url="172.19.4.86:3306" user="root" password="123456"></writeHost>
</dataHost>

这样数据就是自动切分到这3个不同的datanode中了, select 取出来也是完整的数据。

分表分库还有一点窍门就是,你的数据是纵向来切,还是横向来切,
上面讲的那个是 横向来切:就是把一张表的数据 切到不同的 数据库中。

纵向切更简单,就是以表来分库, 不同的表 放到不同的库中, 表中的数据在某个库中是完整的。

《高可用架构篇--第13节--MySQL源码编译安装(CentOS-6.6 MySQL-5.6)》

2.4.5 分片规则(rule)

前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。

5.6 MyCAT的五脏六腑##


学会了MYCAT来做读写分离和分表分库的使用以后,我们应该更深入MYCAT的五脏六腑,了解MYCAT的运行机制,这样对线上的应用处理一些
应急事故,以及解决一些问题提供思路,非常的有帮助,有能力的童鞋还可以参与到MYCAT的后续开发中来。

5.6-01.png

MYCAT 的后端通信采用了NIO非阻塞 和AIO 异步通信方式, 使得通信效率更高
SQL解析这一块用到了阿里的Druid进行解析
协议这一块,对于MYSQL数据库采用原生的二进制协议,还支持驱动方式的连接
并且MYCAT还增加order by , group by ,limit 等聚合功能的支持

有兴趣的童鞋可以对 MYCAT线程池、网络通信、路由分发、事务管理、缓存等模块做输入的学习和分析。

《高可用架构篇--第14节--MySQL主从复制的配置(CentOS-6.6 MySQL-5.6)》

Mycat的下载及安装

5.7 课后作业##


  1. 用MYCAT 实现上一节中的 读写分离案例
  2. 用MYCAT 实现一个分表分库的应用

更多课程关注公众号【小张网校】
公众号里有微信群加入交流,有大牛亲自指导实战!

barcode.jpg

注意:上一节课中讲到的MySQL主从复制配置,在用MyCat做主从读写分离或其结合实际项目场景应用中,主从复制配置还需要按实际需求情况进行调整。

3.1 安装环境

1、jdk:要求jdk必须是1.7及以上版本

2、Mysql:推荐mysql是5.5以上版本

3、Mycat:

Mycat的官方网站:

http://www.mycat.org.cn/

下载地址:

https://github.com/MyCATApache/Mycat-download

 

(调整后的主从数据库my.cnf配置文件,随视频教程压缩包提供)

3.2 安装步骤

Mycat有windows、linux多种版本。本教程为linux安装步骤,windows基本相同。

第一步:下载Mycat-server-xxxx-linux.tar.gz

第二步:将压缩包解压缩。建议将mycat放到/usr/local/mycat目录下。

第三步:进入mycat目录,启动mycat

./mycat start

停止:

./mycat stop

mycat 支持的命令{ console | start | stop | restart | status | dump }

Mycat的默认端口号为:8066

 

Mycat的分片

三、MyCat介绍  ( MyCat官网: )

4.1 需求

把商品表分片存储到三个数据节点上。

 

MyCat的读写分离是基于后端MySQL集群的主从同步来实现的,而MyCat提供语句的分发功能。MyCat1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠。

4.2 安装环境分析

两台mysql数据库服务器:

Host1:192.168.25.134

Host2:192.168.25.166

 

host1环境

操作系统版本 : centos6.4

数据库版本 : mysql-5.6

mycat版本 :1.4 release

数据库名 : db1、db3

 

 

mysql节点2环境

操作系统版本 : centos6.4

数据库版本 : mysql-5.6

mycat版本 :1.4 release

数据库名 : db2

 

MyCat安装到节点1上(需要安装jdk)

 

                                              
图片 6  

4.3 配置schema.xml

四、MyCat的安装

4.3.1 Schema.xml介绍

Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。

 

schema 标签用于定义MyCat实例中的逻辑库

Table 标签定义了MyCat中的逻辑表

dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。

dataHost标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。

 

注意:若是LINUX版本的MYSQL,则需要设置为Mysql大小写不敏感,否则可能会发生表找不到的问题。

在MySQL的配置文件中/etc/my.cnf [mysqld] 中增加一行

  lower_case_table_names=1

 

1、设置MyCat的主机名和IP与主机名的映射

4.3.2 Schema.xml配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

        <schema name="e3mall" checkSQLschema="false" sqlMaxLimit="100">
                <!-- auto sharding by id (long) -->
                <table name="tb_item" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataNode name="dn3" dataHost="localhost1" database="db3" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                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.25.134:3306" user="root"
                        password="root">
                        <!-- can have multi read hosts -->

                </writeHost>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
                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.25.166:3306" user="root"
                        password="root">
                        <!-- can have multi read hosts -->

                </writeHost>
        </dataHost>
</mycat:schema>

 

4.4 配置server.xml 

 

# vi /etc/sysconfig/network

4.4.1 Server.xml介绍

server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。

 

NETWORKING=yes

4.4.2 Server.xml配置

<user name="test">
    <property name="password">test</property>
    <property name="schemas">e3mall</property>
    <property name="readOnly">false</property>
</user>

 

4.5 配置rule.xml 

rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标签。在具体使用过程中可以按照需求添加tableRule

和function。

此配置文件可以不用修改,使用默认即可。

HOSTNAME=edu-mycat-01

4.6 测试分片

# vi /etc/hosts

4.6.1 创建表

配置完毕后,重新启动mycat。使用mysql客户端连接mycat,创建表。

-- ----------------------------
-- Table structure for tb_item
-- ----------------------------
DROP TABLE IF EXISTS `tb_item`;
CREATE TABLE `tb_item` (
  `id` bigint(20) NOT NULL COMMENT '商品id,同时也是商品编号',
  `title` varchar(100) NOT NULL COMMENT '商品标题',
  `sell_point` varchar(500) DEFAULT NULL COMMENT '商品卖点',
  `price` bigint(20) NOT NULL COMMENT '商品价格,单位为:分',
  `num` int(10) NOT NULL COMMENT '库存数量',
  `barcode` varchar(30) DEFAULT NULL COMMENT '商品条形码',
  `image` varchar(500) DEFAULT NULL COMMENT '商品图片',
  `cid` bigint(10) NOT NULL COMMENT '所属类目,叶子类目',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商品状态,1-正常,2-下架,3-删除',
  `created` datetime NOT NULL COMMENT '创建时间',
  `updated` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `cid` (`cid`),
  KEY `status` (`status`),
  KEY `updated` (`updated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

 

4.6.2 插入数据 

 

将此文件中的数据插入到数据库:

 图片 7

 

 

127.0.0.1 edu-mycat-01

4.6.3 分片测试

由于配置的分片规则为“auto-sharding-long”,所以mycat会根据此规则自动分片。

每个datanode中保存一定数量的数据。根据id进行分片

经测试id范围为:

Datanode1:1~5000000

Datanode2:5000000~10000000

Datanode3:10000001~15000000

 

当15000000以上的id插入时报错:

[Err] 1064 - can't find any valid datanode :TB_ITEM -> ID -> 15000001

此时需要添加节点了。

 

192.168.1.203 edu-mycat-01

Mycat读写分离

数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个读节点的配置

 图片 8

 

Mycat读写分离和自动切换机制,需要mysql的主从复制机制配合。

 图片 9

 

192.168.1.205 edu-mysql-01

5.1 Mysql的主从复制

 

主从配置需要注意的地方

1、主DB server和从DB server数据库的版本一致

2、主DB server和从DB server数据库数据名称一致

3、主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一

 

192.168.1.206 edu-mysql-02

5.2 Mysql主服务器配置

第一步:修改my.cnf文件:

在[mysqld]段下添加:

binlog-do-db=db1

binlog-ignore-db=mysql

#启用二进制日志

log-bin=mysql-bin

#服务器唯一ID,一般取IP最后一段

server-id=134

第二步:重启mysql服务

service mysqld restart

第三步:建立帐户并授权slave

mysql>GRANT FILE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456';

mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%' identified by '123456';

#一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

 

刷新权限

mysql> FLUSH PRIVILEGES;

  

查看mysql现在有哪些用户

mysql>select user,host from mysql.user;

 

第四步:查询master的状态

mysql> show master status;

------------------ ---------- -------------- ------------------ -------------------

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

------------------ ---------- -------------- ------------------ -------------------

| mysql-bin.000001 |      120 | db1          | mysql            |                   |

------------------ ---------- -------------- ------------------ -------------------

1 row in set

 

 

 

 

5.3 Mysql从服务器配置

第一步:修改my.cnf文件

[mysqld]

server-id=166

 

第二步:配置从服务器

mysql>change master to master_host='192.168.25.128',master_port=3306,master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=120

 

注意语句中间不要断开,master_port为mysql服务器端口号(无引号),master_user为执行同步操作的数据库账户,“120”无单引号(此处的120就是show master status 中看到的position的值,这里的mysql-bin.000001就是file对应的值)。

 

第二步:启动从服务器复制功能

Mysql>start slave;

 

第三步:检查从服务器复制功能状态:

mysql> show slave status

 

……………………(省略部分)

Slave_IO_Running: Yes //此状态必须YES

Slave_SQL_Running: Yes //此状态必须YES

……………………(省略部分)

 

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

 

错误处理:

如果出现此错误:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

因为是mysql是克隆的系统所以mysql的uuid是一样的,所以需要修改。

解决方法:

删除/var/lib/mysql/auto.cnf文件,重新启动服务。

 

 图片 10

 

以上操作过程,从服务器配置完成。

 

2、因为MyCat是用Java开发的,因此MyCat运行需要安装JDK(准确来说是JRE就够了),并且需要JDK1.7或以上版本

5.4 Mycat配置

Mycat 1.4 支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:

 

<dataNode name="dn1" dataHost="localhost1" database="db1" />

<dataNode name="dn2" dataHost="localhost1" database="db2" />

<dataNode name="dn3" dataHost="localhost1" database="db3" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"

writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">

<heartbeat>show slave status</heartbeat>

<writeHost host="hostM" url="192.168.25.134:3306" user="root"

    password="root">

    <readHost host="hostS" url="192.168.25.166:3306" user="root"

    password="root" />

  </writeHost>

</dataHost>

 

 

 

(1) 设置 balance="1"与writeType="0"

Balance参数设置:

  1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。

2. balance=“1”,所有读操作都随机的发送到readHost。

  1. balance=“2”,所有读操作都随机的在writeHost、readhost上分发

WriteType参数设置:

  1. writeType=“0”, 所有写操作都发送到可用的writeHost上。

  2. writeType=“1”,所有写操作都随机的发送到readHost。

  3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。

 “readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。”

(2) 设置 switchType="2" 与slaveThreshold="100"

switchType 目前有三种选择:

-1:表示不自动切换

1 :默认值,自动切换

2 :基于MySQL主从同步的状态决定是否切换

“Mycat心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制。Mycat心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延。“

 

 

# vi /etc/profile

附:Centos6.5下安装mysql

第一步:查看mysql是否安装。

rpm -qa|grep mysql

第二步:如果mysql的版本不是想要的版本。需要把mysql卸载。

yum remove mysql mysql-server mysql-libs mysql-common

rm -rf /var/lib/mysql

rm /etc/my.cnf

第三步:安装mysql。需要使用yum命令安装。在安装mysql之前需要安装mysql的下载源。需要从oracle的官方网站下载。

1)下载mysql的源包。

我们是centos6.4对应的rpm包为:mysql-community-release-el6-5.noarch.rpm

2)安装mysql下载源:

yum localinstall mysql-community-release-el6-5.noarch.rpm

(图片 11)此附件可保存

 图片 12

 

3)在线安装mysql:

yum install mysql-community-server

第四步:启动mysql

service mysqld start

第五步:需要给root用户设置密码。

/usr/bin/mysqladmin -u root password 'new-password'  // 为root账号设置密码

第六步:远程连接授权。

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

注意:'myuser'、'mypassword' 需要替换成实际的用户名和密码。

 

## java env

export JAVA_HOME=/usr/local/java/jdk1.7.0_72

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

# source /etc/profile

# java -version

 

3、创建mycat用户并设置密码

# useradd mycat

# passwd mycat

 

4、上传安装包 Mycat-server-1.4-release-20151019230038-linux.tar.gz 到 MyCat服务器中的/home/mycat目录,并解压并移动到 /usr/local/mycat目录

$ tar -zxvf Mycat-server-1.4-release-20151019230038-linux.tar.gz

图片 13  

$ su root

Password:

# mv /home/mycat/mycat  /usr/local/

# cd /usr/local/mycat/

# ll

图片 14  

 

5、设置MyCat的环境变量

# vi /etc/profile

## mycat env

export MYCAT_HOME=/usr/local/mycat

export PATH=$PATH:$MYCAT_HOME/bin

# source /etc/profile

 

五、配置MyCat

1、在配置MyCat前,请确认MySQL的主从复制安装配置已完成并正常运行。MySQL主从数据的同步在MySQL中配置,MyCat不负责数据同步的问题。

补充:

(1) MySQL主从复制配置中,如果涉及到函数或存储过程的同步复制,需要在/etc/my.cnf中的[mysqld]段中增加配置log_bin_trust_function_creators=true 或在客户端中设置 set global log_bin_trust_function_creators = 1;

(2) 如果要做读写分离下的主从切换,那么从节点也有可能会变为写节点,因此从节点就不能设置为只读 read_only=1 。

(3) Linux版本的MySQL,需要设置为MySQL大小写不敏感,否则可能会发生找不到表的问题。可在/etc/my.cnf的[mysqld]段中增加lower_case_table_names=1 。

 

2、配置MyCat的schema.xml

schema.xml是MyCat最重要的配置文件之一,用于设置MyCat的逻辑库、表、数据节点、dataHost等内容,

[mycat@edu-mycat-01 conf]$ cd /usr/local/mycat/conf/

[mycat@edu-mycat-01 conf]$ vi schema.xml

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat=";

      <!-- 定义MyCat的逻辑库,逻辑库的概念与MySQL中的 database 概念相同 -->

      <!-- schema name="rc_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="rc_dn1"></schema -->

<!--schema name="pay_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="pay_dn1"></schema-->

      <schema name="rc_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="rc_dn2"></schema>

      <schema name="pay_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="pay_dn2"></schema>

<!-- 其中checkSQLschema表明是否检查并过滤SQL中包含schema的情况,如逻辑库为 TESTDB,则可能写为select * from TESTDB.edu_user,此时会自动过滤TESTDB,SQL变为select * from edu_user,若不会出现上述写法,则可以关闭属性为false -->

<!--sqlMaxLimit默认返回的最大记录数限制,MyCat1.4版本里面,用户的Limit参数会覆盖掉MyCat的sqlMaxLimit默认设置-->

 

      <!-- 定义MyCat的数据节点 -->

      <!-- dataNode name="rc_dn1" dataHost="dtHost1" database="roncoo" / -->

<!-- dataNode name="pay_dn1" dataHost="dtHost1" database="edu_simple_pay" / -->

      <dataNode name="rc_dn2" dataHost="dtHost2" database="roncoo" />

      <dataNode name="pay_dn2" dataHost="dtHost2" database="edu_simple_pay" />

<!-- dataNode 中的 name 数据表示节点名称, dataHost表示数据主机名称, database表示该节点要路由的数据库的名称 -->

 

      <!-- dataHost配置的是实际的后端数据库集群(当然,也可以是非集群) -->

      <!-- 注意:schema中的每一个dataHost中的host属性值必须唯一,否则会出现主从在所有dataHost中全部切换的现象 -->

      <!-- 定义数据主机dtHost1,只连接到MySQL读写分离集群中的Master节点,不使用MyCat托管MySQL主从切换 -->

      <!--

      <dataHost name="dtHost1" maxCon="500" minCon="20" balance="0"

           writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">

           <heartbeat>select user()</heartbeat>

           <writeHost host="hostM1" url="192.168.1.205:3306" user="root" password="www.roncoo.com" />

      </dataHost>

      -->

      <!-- 使用MyCat托管MySQL主从切换 -->

      <!-- 定义数据主机dtHost2,连接到MySQL读写分离集群,并配置了读写分离和主从切换 -->

      <dataHost name="dtHost2" maxCon="500" minCon="20" balance="1"

           writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">

           <!-- 通过show slave status检测主从状态,当主宕机以后,发生切换,从变为主,原来的主变为从,这时候show slave

                 status就会发生错误,因为原来的主没有开启slave,不建议直接使用switch操作,而是在DB中做主从对调。 -->

           <heartbeat>show slave status</heartbeat>

           <!-- can have multi write hosts -->

           <writeHost host="hostM2" url="192.168.1.205:3306" user="root" password="www.roncoo.com" />

           <writeHost host="hostS2" url="192.168.1.206:3306" user="root" password="www.roncoo.com" />

      </dataHost>

      <!-- 参数balance决定了哪些MySQL服务器参与到读SQL的负载均衡中 -->

<!-- balance="0",为不开启读写分离,所有读操作都发送到当前可用的writeHost上-->

      <!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->

      <!-- balance="2",所有读操作都随机的在writeHost、readHost上分发-->

      <!-- MyCat1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在MyCat里配置为两个writeHost并设置balance="1" -->

      <!-- writeType="0",所有写操作都发送到可用的writeHost上 -->

      <!-- writeType="1",仅仅对于galera for mysql集群这种多主多节点都能写入的集群起效,此时Mycat会随机选择一个writeHost并写入数据,对于非galera for mysql集群,请不要配置writeType=1,会导致数据库不一致的严重问题 -->

</mycat:schema>

MyCat1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:

MyCat心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性:switchType="2" 与 slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,MyCat心跳机制通过检测 show slave status 中的

"Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延,当Seconds_Behind_Master 大于slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则表示主从同步,可以安全切换,否则不会切换。

 

3、配置 server.xml

server.xml 主要用于设置系统变量、管理用户、设置用户权限等。

[wusc@edu-mycat-01 conf]$ vi server.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mycat:server SYSTEM "server.dtd">

<mycat:server xmlns:mycat=";

      <system>

      <property name="defaultSqlParser">druidparser</property>

<property name="charset">utf8mb4</property>

      <!-- <property name="useCompression">1</property>-->

      <!--1为开启mysql压缩协议-->

      <!-- <property name="processorBufferChunk">40960</property> -->

      <!--

      <property name="processors">1</property>

      <property name="processorExecutor">32</property>

       -->

           <!--默认是65535 64K 用于sql解析时最大文本长度 -->

           <!--<property name="maxStringLiteralLength">65535</property>-->

           <!--<property name="sequnceHandlerType">0</property>-->

           <!--<property name="backSocketNoDelay">1</property>-->

           <!--<property name="frontSocketNoDelay">1</property>-->

           <!--<property name="processorExecutor">16</property>-->

           <!-- <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序

                  <property name="mutiNodePatchSize">100</property> 亿级数量排序批量

                 <property name="processors">32</property> <property name="processorExecutor">32</property>

                 <property name="serverPort">8066</property> <property name="managerPort">9066</property>

                 <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>

                 <property name="frontWriteQueueSize">4096</property>

<property name="processors">32</property>

           -->

      </system>

      <!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为MySQL主从复制配置中的Master节点,没实现读写分离,读写都在该Master节点中进行  -->

      <!--

      <user name="user1">

           <property name="password">roncoo.1</property>

           <property name="schemas">rc_schema1,pay_schema1</property>

      </user>

      -->

      <!-- 用户2,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群,并通过MyCat实现了读写分离 -->

      <user name="user2">

           <property name="password">roncoo.2</property>

           <property name="schemas">rc_schema2,pay_schema2</property>

      </user>

      <!-- 用户3,只读权限-->

      <user name="user3">

           <property name="password">roncoo.3</property>

           <property name="schemas">rc_schema2,pay_schema2</property>

           <property name="readOnly">true</property>

      </user>

</mycat:server>

 

4、防火墙中打开8066和9066端口

MyCat的默认数据端口为8066,mycat通过这个端口接收数据库客户端的访问请求。

管理端口为9066,用来接收mycat监控命令、查询mycat运行状况、重新加载配置文件等。

[root@edu-mycat-01 mycat]# vi /etc/sysconfig/iptables

增加:

## MyCat

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 9066 -j ACCEPT

重启防火墙:

[root@edu-mycat-01 mycat]# service iptables restart

 

5、修改log日志级别为debug,以便通过日志确认基于MyCat的MySQL数据库集群读写分离的数据操作状态(可以在正式上生产前改成info级别)

[mycat@edu-mycat-01 conf]$ vi /usr/local/mycat/conf/log4j.xml

图片 15  

 

6、启动MyCat

[mycat@edu-mycat-01 bin]$ cd /usr/local/mycat/bin/

(1)     控制台启动,这种启动方式在控制台关闭后,MyCat服务也将关闭,适合调试使用:

[mycat@edu-mycat-01 bin]$ ./mycat console

(2) 可以采用以下后台启动的方式:

[mycat@edu-mycat-01 bin]$ ./mycat start

Starting Mycat-server...

(对应的,重启: mycat restart , 关闭: mycat stop )

 

7、MyCat连接测试

(1)     如果本地Windows安装有MySQL,可以使用已有的mysql客户端远程操作MyCat

图片 16  

图片 17  

 

(2)     如果为了方便,需要在MyCat主机上对MyCat进行操作(把MyCat当是本地MySQL来操作),可以在MyCat节点主机上安装MySQL客户端:

[mycat@edu-mycat-01 bin]$ su root

[root@edu-mycat-01 bin]# yum install mysql

 

使用安装好的mysql客户端登录MyCat

[mycat@edu-mycat-01 bin]$ mysql -uuser2 -proncoo.2 -h192.168.1.203 -P8066

图片 18  

图片 19  

[root@edu-mycat-01 mycat]# vi /etc/my.cnf

增加:

[client]

default-character-set=utf8

保存后再查询,乱码问题解决,如下:

图片 20  

 

(3)     使用第三方MySQL管理客户端连接MyCat测试(navicat支持,MySQL-Front兼容性不太好),以navicat为例:

图片 21  

图片 22  

 

8、读写分离测试

(1) 监听MyCat日志

[mycat@edu-mycat-01 ~]$ cd /usr/local/mycat/logs/

[mycat@edu-mycat-01 logs]$ tail -f mycat.log

 

(2)     读测试

$ mysql -uuser2 -proncoo.2 -h192.168.1.203 -P8066

mysql> show databases;

图片 23  

mysql> use rc_schema2;

图片 24  

mysql> show tables;

图片 25  

mysql> select * from edu_user;

图片 26  

执行上面的查询语句,此时对应的MyCat日志信息如下:

图片 27  

多次执行 select * from edu_user 语句,MyCat打印出来的日志信息显示读操作请求都是路由到Slave节点(192.168.1.206)。

 

(2) 写测试

mysql> insert into edu_user (userName, pwd) values('吴水成', 'roncoo.com');

图片 28  

执行上面的新增插入语句后,此时对应的MyCat日志信息如下:

图片 29  

多次执行以上插入语句,发现新增数据都是从 Master节点(192.168.1.205)插进入的,并且Slave节点通过Binlog同步了Master节点中的数据。

图片 30
  
图片 31  

综上,基于MyCat的读写分离集群配置成功。 

 

接下来计划课程:

MyCat读写分离集群的主从容错(切换)、恢复;

MyCat的高可用集群 HAProxy Keepalived MyCat;

 

本文由4887王中王鉄算盘奖结果发布于王中王高手论坛,转载请注明出处:Mycat数据库分片,高可用架构篇

关键词:

最火资讯