澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

MyCat在MySQL主从复制基础上达成读写分离,Mycat数

海量数据的存储问题

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

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

【分布式架构初探】

实战操作可参考:

Mycat 实现 MySQL 读写分离

环境:CentOS 6.8

实验拓扑:

        mycat
        /    
  master -- slave (主从复制)

mycat: 192.168.0.121
master: 192.168.0.120
slave: 192.168.0.122

Mycat 提供了编译好的安装包,下载地址:http://dl.mycat.io
Mycat 官方首页:http://mycat.org.cn

Index of /

../
1.6-RELEASE/                                       28-Oct-2016 12:56                   -
1.6.5-DEV/                                         15-Jan-2017 07:10                   -
2.0-dev/                                           02-Jan-2017 07:24                   -
mycat-web-1.0/                                     02-Jan-2017 07:40                   -
yum/                                               18-May-2016 02:51                   -
Mycat-server-1.4-beta-20150604171601-linux.tar.gz  27-Jun-2015 10:09             7663894
apache-maven-3.3.3-bin.tar.gz                      27-Jun-2015 10:09             8042383
apache-tomcat-7.0.62.tar.gz                        27-Jun-2015 10:09             8824528
jdk-7u79-linux-x64.tar.gz                          27-Jun-2015 10:09           153512879
jdk-8u20-linux-x64.tar.gz                          27-Jun-2015 10:09           160872342
phpMyAdmin-4.4.9-all-languages.tar.gz              27-Jun-2015 10:09             9352049
probe-2.3.3.zip                                    27-Jun-2015 10:09             7957290
toolset.sh                                         26-Oct-2015 05:03               16015
zookeeper-3.4.6.tar.gz

wget 一下 Mycat-server 1.6 和 jdk-7u79 两个包:

wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
wget http://dl.mycat.io/jdk-7u79-linux-x64.tar.gz

[root@vm2 ~]# ll -h Mycat* jdk*
-rw-r--r-- 1 root root 147M Jun 27  2015 jdk-7u79-linux-x64.tar.gz
-rw-r--r-- 1 root root 7.4M Jun 27  2015 Mycat-server-1.4-beta-20150604171601-linux.tar.gz

Mycat-server 包解压后可直接使用。

tar -xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

其目录结构是这样的:

[root@vm2 local]# tree -L 1 mycat
mycat
|-- bin
|-- catlet
|-- conf
|-- lib
|-- logs
`-- version.txt

5 directories, 1 file

bin 目录中是可执行文件以及脚本,我们可以使用其中的 mycat 脚本控制mycat的启动和关闭。

conf 目录中是配置文件,这里配置读写分离主要使用 schema.xml 和 server.xml。其他配置分片的配置请参考官方文档。

logs 目录存放日志文件,遇到mycat出错了,就在这里查看问题的原因。

安装 jdk:

mkdir /usr/java
tar -xf jdk-7u79-linux-x64.tar.gz -C /usr/java 

[root@vm2 logs]# cat /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.7.0_79
export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile.d/java.sh

[root@vm2 logs]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

完成。

这里只讲解一下读写分离用到的配置文件:server.xml, schema.xml。

前提:已经有一个配置好的 mysql 一主一从架构。

一个主从集群在Mycat里面由一个 dataNode 定义,dataNode 定义了一个数据库实例及其中的一个具体的库。Mycat 的一个数据库实例可以实际上是一个主从复制架构:一主多从,一主一从,多主多从等等,具体在 dataHost 中定义。

这里建立一个非拆分库(将mycat逻辑库绑定到一个具体的 dataNode 上)testdb,绑定到 dn1 这个 dataNode 上。

1. 学习计划

1、订单系统实现

2、订单生成

3、Mycat数据库分片

 

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 课后作业

一、环境

schema.xml:

<schema name="testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

</schema>

现在所有的表会走默认的节点 dn1。逻辑库 testdb,对应了数据节点 dn1。dn1 对应着真实的数据库实例上的一个真实的库。

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

定义数据节点,dn1,这个节点对应一个数据库实例中的一个真实的库,库名为 db1。

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

例子中所表述的意思为:使用名字为 vm3306 数据库实例上的 db1 物理数据库,这就组成一个数据分片,最 后,我们使用名字 dn1 标识这个分片。

该属性用于定义该分片属性哪个具体数据库实例上的具体库,因为这里使用两个纬度来定义分片,就是:实 例 具体的库。因为每个库上建立的表和表结构是一样的。所以这样做就可以轻松的对表进行水平拆分。

dataHost: 包含一个 writeHost 和 一个 readHost,它们之前已经配置好主从复制了。

balance="3":表示写请求只发给节点,读请求只发给读节点。

<dataHost name="vm3306" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">

    <heartbeat>select user()</heartbeat>

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

    <writeHost host="hostM1" url="192.168.0.120:3306" user="tuser" password="guli123">
        <!-- can have multi read hosts -->
        <readHost host="hostS1" url="192.168.0.122:3306" user="tuser" password="guli123"/>
    </writeHost>

    <!-- <writeHost host="hostM2" url="localhost:3316" user="tuser" password="guli123"/> --> 
</dataHost>

user 及 password属性是后端主从mysql的账户密码信息。

dataHost属性说明:

  1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .

  2. balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

2. 订单系统

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

server.xml 配置:

    <user name="test">
            <property name="password">test</property>
            <property name="schemas">testdb</property>
    </user>

    <user name="user">
            <property name="password">user</property>
            <property name="schemas">testdb</property>
            <property name="readOnly">true</property>
    </user>

我们在主从 mysql 中创建测试用户 tuser,赋予增删改查,创建库和表的权限。

master:

mysql> GRANT CREATE,DELETE,INSERT,SELECT,UPDATE ON db1.* TO 'tuser'@'192.168.0.%' IDENTIFIED BY 'guli123';

启动 mycat:

cd /usr/local/mycat/bin
./mycat start

启动 mycat 遇到第一个日志报错,在 logs/wrapper.log 看到如下错误:

ERROR  | wrapper  | 2017/01/23 11:59:42 | JVM exited while loading the application.
INFO   | jvm 1    | 2017/01/23 11:59:42 | Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000007a6aa0000, 1431699456, 0) failed; error='Cannot allocate memory' (errno=12)
INFO   | jvm 1    | 2017/01/23 11:59:42 | #
INFO   | jvm 1    | 2017/01/23 11:59:42 | # There is insufficient memory for the Java Runtime Environment to continue.
INFO   | jvm 1    | 2017/01/23 11:59:42 | # Native memory allocation (malloc) failed to allocate 1431699456 bytes for committing reserved memory.

提示说没有足够的内存来启动 Java 运行时环境,因为我用的虚拟机,给了 512M 内存,所以内存不够,重新分配了1.5G,就不会报这个错了。

启动 mycat 遇到第二个日志报错,在 logs/wrapper.log 看到如下错误:

[root@vm2 logs]# tail -f wrapper.log:

ERROR  | wrapper  | 2017/01/23 17:19:28 | JVM exited while loading the application.
INFO   | jvm 5    | 2017/01/23 17:19:28 | 错误: 代理抛出异常错误: java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: vm2: vm2: 未知的名称或服务

错误提示,可能没有配置好本地主机名的名称解析。

添加本地主机名解析:

[root@vm2 bin]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.0.121 vm2

再次尝试启动:

# ./mycat start

查看日志 wrapper.log:

INFO   | jvm 1    | 2017/01/23 17:24:40 | log4j 2017-01-23 17:24:40 [./conf/log4j.xml] load completed.
INFO   | jvm 1    | 2017/01/23 17:24:41 | MyCAT Server startup successfully. see logs in logs/mycat.log

显示启动成功,这次OK了。

2.1. 功能分析

1、在购物车页面点击“去结算”按钮,跳转到订单确认页面

a) 必须要求用户登录

b) 使用拦截器实现。

c) 如果用户未登录跳转到登录页面。

d) 如果用户已经登录,放行。展示确认页面。

e) 判断cookie中是否有购物车数据

f) 如果有同步到服务端。

2、订单确认页面中选择收货地址,选择支付方式,确认商品列表。

a) 根据用户id查询收货地址列表

b) 展示支付方式列表。

c) 从购物车中取商品列表,从服务端取购物车列表。

3、订单确认页面点击“提交”,生成订单。

4、展示订单生成完成,或者跳转到支付页面。

 

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

Mycat 管理命令与监控

2.2. 工程搭建

E3-order

  |--E3-order-interface(jar)

  |--E3-order-service(war)

E3-order-web(war)

 

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

1. 管理命令

mysql -h127.0.0.1 -utest -ptest -P9066

MyCAT 自身有类似其他数据库的管理监控方式,可以通过 Mysql 命令行,登录管理端口(9066)执行相应 的 SQL 进行管理,也可以通过 jdbc 的方式进行远程连接管理,本小节主要讲解命令行的管理操作。

登录:目前 mycat 有两个端口,8066 数据端口,9066 管理端口,命令行的登陆是通过 9066 管理端口来操 作,登录方式类似于 mysql 的服务端登陆。

mysql -h127.0.0.1 -utest -ptest -P9066 [-dmycat]
-h 后面是主机,即当前 mycat 按照的主机地址,本地可用 127.0.0.1 远程需要远程 ip -u Mycat server.xml 中配置的逻辑库用户
-p Mycat server.xml 中配置的逻辑库密码
-P 后面是端口 默认 9066,注意 P 是大写
-d Mycat server.xml 中配置的逻辑库 

数据端口与管理端口的配置端口修改:数据端口默认 8066,管理端口默认 9066 ,如果需要修改需要配置 server.xml

管理端口用于执行管理命令:

mysql -h127.0.0.1 -utest -ptest -P9066 

命令端口用户执行增删改查等 SQL 语句:

mysql -h127.0.0.1 -utest -ptest -P8066 

下面先看看管理端口支持的命令。

从 9066 管理端口登陆后,执行 show @@help 可以查看到所有命令:

mysql> show @@help;
 ------------------------------------------ -------------------------------------------- 
| STATEMENT                                | DESCRIPTION                                |
 ------------------------------------------ -------------------------------------------- 
| show @@time.current                      | Report current timestamp                   |
| show @@time.startup                      | Report startup timestamp                   |
| show @@version                           | Report Mycat Server version                |
| show @@server                            | Report server status                       |
| show @@threadpool                        | Report threadPool status                   |
| show @@database                          | Report databases                           |
| show @@datanode                          | Report dataNodes                           |
| show @@datanode where schema = ?         | Report dataNodes                           |
| show @@datasource                        | Report dataSources                         |
| show @@datasource where dataNode = ?     | Report dataSources                         |
| show @@datasource.synstatus              | Report datasource data synchronous         |
| show @@datasource.syndetail where name=? | Report datasource data synchronous detail  |
| show @@datasource.cluster                | Report datasource galary cluster variables |
| show @@processor                         | Report processor status                    |
| show @@command                           | Report commands status                     |
| show @@connection                        | Report connection status                   |
| show @@cache                             | Report system cache usage                  |
| show @@backend                           | Report backend connection status           |
| show @@session                           | Report front session details               |
| show @@connection.sql                    | Report connection sql                      |
| show @@sql.execute                       | Report execute status                      |
| show @@sql.detail where id = ?           | Report execute detail status               |
| show @@sql                               | Report SQL list                            |
| show @@sql.high                          | Report Hight Frequency SQL                 |
| show @@sql.slow                          | Report slow SQL                            |
| show @@sql.resultset                     | Report BIG RESULTSET SQL                   |
| show @@sql.sum                           | Report  User RW Stat                       |
| show @@sql.sum.user                      | Report  User RW Stat                       |
| show @@sql.sum.table                     | Report  Table RW Stat                      |
| show @@parser                            | Report parser status                       |
| show @@router                            | Report router status                       |
| show @@heartbeat                         | Report heartbeat status                    |
| show @@heartbeat.detail where name=?     | Report heartbeat current detail            |
| show @@slow where schema = ?             | Report schema slow sql                     |
| show @@slow where datanode = ?           | Report datanode slow sql                   |
| show @@sysparam                          | Report system param                        |
| show @@syslog limit=?                    | Report system mycat.log                    |
| show @@white                             | show mycat white host                      |
| show @@white.set=?,?                     | set mycat white host,[ip,user]             |
| show @@directmemory=1 or 2               | show mycat direct memory usage             |
| switch @@datasource name:index           | Switch dataSource                          |
| kill @@connection id1,id2,...            | Kill the specified connections             |
| stop @@heartbeat name:time               | Pause dataNode heartbeat                   |
| reload @@config                          | Reload basic config from file              |
| reload @@config_all                      | Reload all config from file                |
| reload @@route                           | Reload route config from file              |
| reload @@user                            | Reload user config from file               |
| reload @@sqlslow=                        | Set Slow SQL Time(ms)                      |
| reload @@user_stat                       | Reset show @@sql  @@sql.sum @@sql.slow     |
| rollback @@config                        | Rollback all config from memory            |
| rollback @@route                         | Rollback route config from memory          |
| rollback @@user                          | Rollback user config from memory           |
| reload @@sqlstat=open                    | Open real-time sql stat analyzer           |
| reload @@sqlstat=close                   | Close real-time sql stat analyzer          |
| offline                                  | Change MyCat status to OFF                 |
| online                                   | Change MyCat status to ON                  |
| clear @@slow where schema = ?            | Clear slow sql by schema                   |
| clear @@slow where datanode = ?          | Clear slow sql by datanode                 |
 ------------------------------------------ -------------------------------------------- 
58 rows in set (0.00 sec)

查看 mycat 版本:

mysql> show @@version;
 ----------------------------------------- 
| VERSION                                 |
 ----------------------------------------- 
| 5.6.29-mycat-1.6-RELEASE-20161028204710 |
 ----------------------------------------- 
1 row in set (0.00 sec)

查看当前的库:

mysql> show @@database;
 ---------- 
| DATABASE |
 ---------- 
| testdb   |
 ---------- 
1 row in set (0.00 sec)

查看 MyCAT 的数据节点的列表,对应 schema.xml 配置文件的 dataNode 节点:

mysql> show @@datanode;
 ------ ------------ ------- ------- -------- ------ ------ --------- ------------ ---------- --------- --------------- 
| NAME | DATHOST    | INDEX | TYPE  | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
 ------ ------------ ------- ------- -------- ------ ------ --------- ------------ ---------- --------- --------------- 
| dn1  | vm3306/db1 |     0 | mysql |      0 |    8 | 1000 |     244 |          0 |        0 |       0 |            -1 |
 ------ ------------ ------- ------- -------- ------ ------ --------- ------------ ---------- --------- --------------- 
1 row in set (0.00 sec)

其中,“NAME”表示 dataNode 的名称;“dataHost”表示对应 dataHost 属性的值,即数据主机; “ACTIVE”表示活跃连接数;“IDLE”表示闲置连接数;“SIZE”对应总连接数量。

这里有 8 个空闲连接,那我们去主从节点用 netstat -ntp 命令看看建立的连接情况:

master:

[root@vm1 ~]# netstat -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 192.168.0.120:22            192.168.0.104:60060         ESTABLISHED 1492/sshd
tcp        0      0 ::ffff:192.168.0.120:3306   ::ffff:192.168.0.121:58636  ESTABLISHED 1414/mysqld
tcp        0      0 ::ffff:192.168.0.120:3306   ::ffff:192.168.0.121:58640  ESTABLISHED 1414/mysqld
tcp        0      0 ::ffff:192.168.0.120:3306   ::ffff:192.168.0.121:58582  ESTABLISHED 1414/mysqld
tcp        0      0 ::ffff:192.168.0.120:3306   ::ffff:192.168.0.121:58644  ESTABLISHED 1414/mysqld
tcp        0      0 ::ffff:192.168.0.120:3306   ::ffff:192.168.0.121:58646  ESTABLISHED 1414/mysqld
tcp        0      0 ::ffff:192.168.0.120:3306   ::ffff:192.168.0.121:58641  ESTABLISHED 1414/mysqld
tcp        0      0 ::ffff:192.168.0.120:3306   ::ffff:192.168.0.121:58635  ESTABLISHED 1414/mysqld
tcp        0      0 ::ffff:192.168.0.120:3306   ::ffff:192.168.0.121:58632  ESTABLISHED 1414/mysqld
tcp        0      0 ::ffff:192.168.0.120:3306   ::ffff:192.168.0.122:48205  ESTABLISHED 1414/mysqld

slave:

[root@vm3 ~]# netstat -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 192.168.0.122:48205         192.168.0.120:3306          ESTABLISHED 1607/mysqld
tcp        0      0 192.168.0.122:22            192.168.0.104:60102         ESTABLISHED 1196/sshd
tcp        0      0 ::ffff:192.168.0.122:3306   ::ffff:192.168.0.121:45593  ESTABLISHED 1607/mysqld
tcp        0      0 ::ffff:192.168.0.122:3306   ::ffff:192.168.0.121:45591  ESTABLISHED 1607/mysqld
tcp        0      0 ::ffff:192.168.0.122:3306   ::ffff:192.168.0.121:45583  ESTABLISHED 1607/mysqld
tcp        0      0 ::ffff:192.168.0.122:3306   ::ffff:192.168.0.121:45589  ESTABLISHED 1607/mysqld
tcp        0      0 ::ffff:192.168.0.122:3306   ::ffff:192.168.0.121:45579  ESTABLISHED 1607/mysqld
tcp        0      0 ::ffff:192.168.0.122:3306   ::ffff:192.168.0.121:45580  ESTABLISHED 1607/mysqld
tcp        0      0 ::ffff:192.168.0.122:3306   ::ffff:192.168.0.121:45588  ESTABLISHED 1607/mysqld
tcp        0      0 ::ffff:192.168.0.122:3306   ::ffff:192.168.0.121:45577  ESTABLISHED 1607/mysqld

可看到有很多从 mycat 服务器发起数据库连接(主有9个连接,从有8个连接)。

查看心跳报告:

mysql> show @@heartbeat;
 -------- ------- --------------- ------ --------- ------- -------- --------- -------------- --------------------- ------- 
| NAME   | TYPE  | HOST          | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME    | STOP  |
 -------- ------- --------------- ------ --------- ------- -------- --------- -------------- --------------------- ------- 
| hostM1 | mysql | 192.168.0.120 | 3306 |       1 |     0 | idle   |       0 | 1,1,1        | 2017-01-24 06:44:38 | false |
| hostS1 | mysql | 192.168.0.122 | 3306 |       1 |     0 | idle   |       0 | 1,1,1        | 2017-01-24 06:44:38 | false |
 -------- ------- --------------- ------ --------- ------- -------- --------- -------------- --------------------- ------- 
2 rows in set (0.00 sec)

该命令用于报告心跳状态

RS_CODE 状态:
    OK_STATUS = 1;正常状态
    ERROR_STATUS = -1; 连接出错
    TIMEOUT_STATUS = -2; 连接超时
    INIT_STATUS = 0; 初始化状态

若节点故障,会连续默认 5 个周期检测,心跳连续失败,就会变成-1,节点故障确认,然后可能发生切换

查看 Mycat 的前端连接状态,即应用与 mycat 的连接:

mysql> show @@connectionG
*************************** 1. row ***************************
    PROCESSOR: Processor0
           ID: 1
         HOST: 127.0.0.1
         PORT: 9066
   LOCAL_PORT: 50317
       SCHEMA: NULL
      CHARSET: latin1:8
       NET_IN: 257
      NET_OUT: 6343
ALIVE_TIME(S): 1264
  RECV_BUFFER: 4096
   SEND_QUEUE: 0
      txlevel:
   autocommit:
1 row in set (0.00 sec)

从上面获取到的连接 ID 属性,可以手动杀掉某个连接。

kill @@connection id,id,id

显示后端连接状态:

mysql> show @@backendG
...
...
...
*************************** 16. row ***************************
 processor: Processor0
        id: 4
   mysqlId: 8
      host: 192.168.0.122
      port: 3306
    l_port: 45583
    net_in: 7018
   net_out: 1646
      life: 6287
    closed: false
  borrowed: false
SEND_QUEUE: 0
    schema: db1
   charset: utf8:33
   txlevel: 3
autocommit: true
16 rows in set (0.00 sec)

一共有16个后端连接,这里截取最后一个。

显示数据源:

mysql> show @@datasource;
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
| DATANODE | NAME   | TYPE  | HOST          | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
| dn1      | hostM1 | mysql | 192.168.0.120 | 3306 | W    |      0 |    8 | 1000 |     231 |         0 |          2 |
| dn1      | hostS1 | mysql | 192.168.0.122 | 3306 | R    |      0 |    8 | 1000 |     211 |         8 |          0 |
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
2 rows in set (0.00 sec)

可以看到主从信息。

2.3. 展示订单确认页面

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. 执行SQL语句

mysql -h127.0.0.1 -utest -ptest -P8066

创建 tb1 表:

mysql> show databases;
 ---------- 
| DATABASE |
 ---------- 
| testdb   |
 ---------- 
1 row in set (0.00 sec)

mysql> use testdb;create table tb1 (id INT, name VARCHAR(20));
Database changed
Query OK, 0 rows affected (0.25 sec)

mysql> show tables;
 --------------- 
| Tables_in_db1 |
 --------------- 
| tb1           |
 --------------- 
1 row in set (0.01 sec)

插入两条数据:

mysql> insert into tb1 values (1, 'guli'), (2, 'xie');
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0

查看一下插入结果:

mysql> select * from tb1;
 ------ ------ 
| id   | name |
 ------ ------ 
|    1 | guli |
|    2 | xie  |
 ------ ------ 
2 rows in set (0.00 sec)

没问题。

再分别到主从节点看数据插入没有:

master:

mysql> use db1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
 --------------- 
| Tables_in_db1 |
 --------------- 
| tb1           |
 --------------- 
1 row in set (0.00 sec)

mysql> select * from tb1;
 ------ ------ 
| id   | name |
 ------ ------ 
|    1 | guli |
|    2 | xie  |
 ------ ------ 
2 rows in set (0.00 sec)

slave:

mysql> use db1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
 --------------- 
| Tables_in_db1 |
 --------------- 
| tb1           |
 --------------- 
1 row in set (0.00 sec)

mysql> select * from tb1;
 ------ ------ 
| id   | name |
 ------ ------ 
|    1 | guli |
|    2 | xie  |
 ------ ------ 
2 rows in set (0.00 sec)

好,可以看到 OK 了。

查看刚才执行过的 sql 语句:

mysql> show @@sql;
 ------ ------ --------------- -------------- ------------------- 
| ID   | USER | START_TIME    | EXECUTE_TIME | SQL               |
 ------ ------ --------------- -------------- ------------------- 
|    1 | test | 1485212346188 |            1 | select * from tb1 |
|    2 | test | 1485212040101 |            1 | select * from tb1 |
|    3 | test | 1485211834831 |            1 | select * from tb1 |
|    4 | test | 1485211803688 |            1 | select * from tb1 |
|    5 | test | 1485209518691 |            2 | select * from tb1 |
 ------ ------ --------------- -------------- ------------------- 
5 rows in set (0.00 sec)

遇到的问题:

似乎无法统计 insert 语句,不知为什么。

查看统计数据:

mysql> show @@sql.sum;
 ------ ------ ------ ------ ------ ------ -------- --------- -------------- -------------- --------------- 
| ID   | USER | R    | W    | R%   | MAX  | NET_IN | NET_OUT | TIME_COUNT   | TTL_COUNT    | LAST_TIME     |
 ------ ------ ------ ------ ------ ------ -------- --------- -------------- -------------- --------------- 
|    1 | test |    5 |    0 | 1.00 | 1    |     85 |     709 | [5, 0, 0, 0] | [5, 0, 0, 0] | 1485212346189 |
 ------ ------ ------ ------ ------ ------ -------- --------- -------------- -------------- --------------- 
1 row in set (0.00 sec)

端口号: 该命令工作在 9066 端口,用来记录用户通过本地 8066 端口向 Mycat-Server 发送的 SQL 请求执行
信息。信息包括有 ID 值,执行 SQL 语句的用户名称,执行的 SQL 语句,命令执行的起始时间,命令执行消耗时间

查看慢查询语句:

设置慢查询阈值为0:reload @@sqlslow=0;

mysql> reload @@sqlslow=0;
Query OK, 1 row affected (0.00 sec)
Reset show  @@sql.slow time success

在8066端口执行查询:select * from tb1;

mysql> select * from tb1;
 ------ ------- 
| id   | name  |
 ------ ------- 
|    1 | guli  |
|    2 | xie   |
|    3 | xu    |
|    4 | he    |
|    5 | huang |
|    6 | ma    |
|    7 | liu   |
|    8 | zeng  |
 ------ ------- 
8 rows in set (0.00 sec)

在 9066 端口执行 show @@sql.slow 查看抓取的慢查询SQL语句:

mysql> show @@sql.slow;
 ------ ------------ --------------- -------------- ------------------- 
| USER | DATASOURCE | START_TIME    | EXECUTE_TIME | SQL               |
 ------ ------------ --------------- -------------- ------------------- 
| test | NULL       | 1485213017329 |            1 | select * from tb1 |
 ------ ------------ --------------- -------------- ------------------- 
1 row in set (0.00 sec)

2.3.1. 功能分析

1、根据id查询用户的收货地址列表(使用静态数据)

2、从购物车中取商品列表,展示到页面。调用购物车服务查询。

 

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

3,如果要验证一下读写分离已经成功了,应该怎么验证呢?

使用mysql客户端连接9066管理端口,执行 show @@datasource 可以观察到 READ_LOAD,WRITE_LOAD 两个统计参数的变化:

这里显示 hostM1 为写节点,hostS1 为读节点:

hostM1 的 WRITE_LOAD = 2
hostS1 的 READ_LOAD = 12

mysql> show @@datasource;
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
| DATANODE | NAME   | TYPE  | HOST          | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
| dn1      | hostM1 | mysql | 192.168.0.120 | 3306 | W    |      0 |    8 | 1000 |     287 |         0 |          2 |
| dn1      | hostS1 | mysql | 192.168.0.122 | 3306 | R    |      0 |    8 | 1000 |     271 |        12 |          0 |
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
2 rows in set (0.00 sec)

使用mysql客户端连接8066管理端口,执行查询,插入语句,同时使用mysql客户端连接 9066 端口观察一下读写统计参数的变化:

8066:执行查询 select * from tb1;

mysql> select * from tb1;
 ------ ------ 
| id   | name |
 ------ ------ 
|    1 | guli |
|    2 | xie  |
|    3 | xu   |
|    4 | he   |
 ------ ------ 
4 rows in set (0.00 sec)

9066:

mysql> show @@datasource;
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
| DATANODE | NAME   | TYPE  | HOST          | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
| dn1      | hostM1 | mysql | 192.168.0.120 | 3306 | W    |      0 |    8 | 1000 |     308 |         0 |          2 |
| dn1      | hostS1 | mysql | 192.168.0.122 | 3306 | R    |      0 |    8 | 1000 |     293 |        13 |          0 |
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
2 rows in set (0.00 sec)

读节点的读计数加1,

hostM1 的 WRITE_LOAD = 2
hostS1 的 READ_LOAD = 13

8066:执行插入操作 insert into tb1 values (5,'huang');

mysql> insert into tb1 values (5,'huang');
Query OK, 1 row affected (0.02 sec)

9066:

mysql> show @@datasource;
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
| DATANODE | NAME   | TYPE  | HOST          | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
| dn1      | hostM1 | mysql | 192.168.0.120 | 3306 | W    |      0 |    8 | 1000 |     332 |         0 |          4 |
| dn1      | hostS1 | mysql | 192.168.0.122 | 3306 | R    |      0 |    8 | 1000 |     315 |        13 |          0 |
 ---------- -------- ------- --------------- ------ ------ -------- ------ ------ --------- ----------- ------------ 
2 rows in set (0.00 sec)

写节点的读计数加2

hostM1 的 WRITE_LOAD = 2
hostS1 的 READ_LOAD = 13

由此可见读写分离是成功的。可以看到数据也成功写入数据库:

mysql> select * from tb1;
 ------ ------- 
| id   | name  |
 ------ ------- 
|    1 | guli  |
|    2 | xie   |
|    3 | xu    |
|    4 | he    |
|    5 | huang |
 ------ ------- 
5 rows in set (0.00 sec)

到此基本演示了 mycat 的主从读写分离功能,配置的前提是已经有一个配置好的 mysql 主从复制架构,mycat 工作于 mysql 主从架构的前端,负责 SQL 语句的分发。

mycat 另一个主要功能是数据分片,这里没有演示。暂时就写到这里。

2.3.2. Dao层

直接从redis中取购车商品列表。

 

2.4 概念说明

5.4 MYCAT下实现读写分离##


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

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

2.3.3. Service层

收货地址静态数据,没有server。

调用购物车的service查询购物车商品列表。

 

MyCat在MySQL主从复制基础上达成读写分离,Mycat数据库分片。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.3.4. Controller

引用购物车服务

 澳门新浦京娱乐场网站 6

澳门新浦京娱乐场网站 7

 

 

 

请求的url:/order/order-cart

参数:没有参数

返回值:逻辑视图

 

Controller

@Controller
public class OrderCartController {

    @Autowired
    private CartService cartService;

    @RequestMapping("/order/order-cart")
    public String showOrderCart(HttpServletRequest request) {
        //取用户信息
        TbUser user = (TbUser) request.getAttribute("user");
        //取购物车商品列表
        List<TbItem> cartList = cartService.getCartList(user.getId());
        //把商品列表传递给jsp
        request.setAttribute("cartList", cartList);
        //返回逻辑视图
        return "order-cart";
    }
}

 

2.4. 登录拦截器 

2.4.2 逻辑表(table):

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

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

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

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

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

 

2.4.1. 功能分析

1、从cookie中取token

2、如果没有取到,没有登录,跳转到sso系统的登录页面。拦截

3、如果取到token。判断登录是否过期,需要调用sso系统的服务,根据token取用户信息

4、如果没有取到用户信息,登录已经过期,重新登录。跳转到登录页面。拦截

5、如果取到用户信息,用户已经是登录状态,把用户信息保存到request中。放行

6、判断cookie中是否有购物车信息,如果有合并购物车

 

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.2. 拦截器实现

 

/**
 * 用户登录判断拦截器
 * <p>Title: LoginInterceptor</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.cn</p> 
 * @version 1.0
 */
public class LoginInterceptor implements HandlerInterceptor {

    @Value("${COOKIE_TOKEN_KEY}")
    private String COOKIE_TOKEN_KEY;
    @Value("${COOKIE_CART_KEY}")
    private String COOKIE_CART_KEY;
    @Value("${SSO_URL}")
    private String SSO_URL;
    @Autowired
    private UserService userService;
    @Autowired
    private CartService cartService;

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1、从cookie中取token
        String token = CookieUtils.getCookieValue(request, COOKIE_TOKEN_KEY);
        // 2、如果没有取到,没有登录,跳转到sso系统的登录页面。拦截
        if (StringUtils.isBlank(token)) {
            //跳转到登录页面
            response.sendRedirect(SSO_URL   "/page/login?redirect="   request.getRequestURL());
            return false;
        }
        // 3、如果取到token。判断登录是否过期,需要调用sso系统的服务,根据token取用户信息
        E3Result e3Result = userService.getUserByToken(token);
        // 4、如果没有取到用户信息,登录已经过期,重新登录。跳转到登录页面。拦截
        if (e3Result.getStatus() != 200) {
            response.sendRedirect(SSO_URL   "/page/login?redirect="   request.getRequestURL());
            return false;
        }
        // 5、如果取到用户信息,用户已经是登录状态,把用户信息保存到request中。放行
        TbUser user = (TbUser) e3Result.getData();
        request.setAttribute("user", user);
        // 6、判断cookie中是否有购物车信息,如果有合并购物车
        String json = CookieUtils.getCookieValue(request, COOKIE_CART_KEY, true);
        if (StringUtils.isNotBlank(json)) {
            cartService.mergeCart(user.getId(), JsonUtils.jsonToList(json, TbItem.class));
            //删除cookie中的购物车数据
            CookieUtils.setCookie(request, response, COOKIE_CART_KEY, "");
        }
        //放行
        return true;
    }

}

 

2.4.3. Springmvc配置 

<!-- 拦截器配置 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.e3mall.order.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

  

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.4. 实现sso系统的回调

 澳门新浦京娱乐场网站 8

 

2.4.5 分片规则(rule)

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

5.6 MyCAT的五脏六腑##MyCat在MySQL主从复制基础上达成读写分离,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)》

2.5. 提交订单

Mycat的下载及安装

5.7 课后作业##


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

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

barcode.jpg

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

2.5.1. 功能分析

1、在订单确认页面点击“提交订单”按钮生成订单。

2、请求的url:/order/create

3、参数:提交的是表单的数据。保存的数据:订单、订单明细、配送地址。

a) 向tb_order中插入记录。

  1. 订单号需要手动生成。

要求订单号不能重复。

订单号可读性号。

可以使用redis的incr命令生成订单号。订单号需要一个初始值。

  1. Payment:表单数据
  2. payment_type:表单数据
  3. user_id:用户信息
  4. buyer_nick:用户名
  5. 其他字段null

b) 向tb_order_item订单明细表插入数据。

  1. Id:使用incr生成
  2. order_id:生成的订单号
  3. 其他的都是表单中的数据。

c) tb_order_shipping,订单配送信息

  1. order_id:生成的订单号
  2. 其他字段都是表单中的数据。

d) 使用pojo接收表单的数据。

可以扩展TbOrder,在子类中添加两个属性一个是商品明细列表,一个是配送信息。

把pojo放到e3-order-interface工程中。

public class OrderInfo extends TbOrder implements Serializable{
    private List<TbOrderItem> orderItems;
    private TbOrderShipping orderShipping;
    public List<TbOrderItem> getOrderItems() {
        return orderItems;
    }
    public void setOrderItems(List<TbOrderItem> orderItems) {
        this.orderItems = orderItems;
    }
    public TbOrderShipping getOrderShipping() {
        return orderShipping;
    }
    public void setOrderShipping(TbOrderShipping orderShipping) {
        this.orderShipping = orderShipping;
    }

}

 

业务逻辑: 

1、接收表单的数据

2、生成订单id

3、向订单表插入数据。

4、向订单明细表插入数据

5、向订单物流表插入数据。

6、返回e3Result。

 

返回值:e3Result

 

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配置文件,随视频教程压缩包提供)

2.5.2. Dao层

可以使用逆向工程。

 

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

 

2.5.3. Service层

参数:OrderInfo

返回值:e3Result

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private TbOrderMapper orderMapper;
    @Autowired
    private TbOrderItemMapper orderItemMapper;
    @Autowired
    private TbOrderShippingMapper orderShippingMapper;
    @Autowired
    private JedisClient jedisClient;

    @Value("${ORDER_GEN_KEY}")
    private String ORDER_GEN_KEY;
    @Value("${ORDER_ID_BEGIN}")
    private String ORDER_ID_BEGIN;
    @Value("${ORDER_ITEM_ID_GEN_KEY}")
    private String ORDER_ITEM_ID_GEN_KEY;

    @Override
    public e3Result createOrder(OrderInfo orderInfo) {
        // 1、接收表单的数据
        // 2、生成订单id
        if (!jedisClient.exists(ORDER_GEN_KEY)) {
            //设置初始值
            jedisClient.set(ORDER_GEN_KEY, ORDER_ID_BEGIN);
        }
        String orderId = jedisClient.incr(ORDER_GEN_KEY).toString();
        orderInfo.setOrderId(orderId);
        orderInfo.setPostFee("0");
        //1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭
        orderInfo.setStatus(1);
        Date date = new Date();
        orderInfo.setCreateTime(date);
        orderInfo.setUpdateTime(date);
        // 3、向订单表插入数据。
        orderMapper.insert(orderInfo);
        // 4、向订单明细表插入数据
        List<TbOrderItem> orderItems = orderInfo.getOrderItems();
        for (TbOrderItem tbOrderItem : orderItems) {
            //生成明细id
            Long orderItemId = jedisClient.incr(ORDER_ITEM_ID_GEN_KEY);
            tbOrderItem.setId(orderItemId.toString());
            tbOrderItem.setOrderId(orderId);
            //插入数据
            orderItemMapper.insert(tbOrderItem);
        }
        // 5、向订单物流表插入数据。
        TbOrderShipping orderShipping = orderInfo.getOrderShipping();
        orderShipping.setOrderId(orderId);
        orderShipping.setCreated(date);
        orderShipping.setUpdated(date);
        orderShippingMapper.insert(orderShipping);
        // 6、返回e3Result。
        return e3Result.ok(orderId);
    }

}

 

  

Mycat的分片

三、MyCat介绍  ( MyCat官网: )

2.5.4. Controller

请求的url:/order/create

参数:使用OrderInfo接收

返回值:逻辑视图。

业务逻辑:

1、接收表单提交的数据OrderInfo。

2、补全用户信息。

3、调用Service创建订单。

4、返回逻辑视图展示成功页面

a) 需要Service返回订单号

b) 当前日期加三天。

 

在拦截器中添加用户处理逻辑:

 澳门新浦京娱乐场网站 9

@RequestMapping(value="/order/create", method=RequestMethod.POST)
    public String createOrder(OrderInfo orderInfo, HttpServletRequest request) {
        // 1、接收表单提交的数据OrderInfo。
        // 2、补全用户信息。
        TbUser user = (TbUser) request.getAttribute("user");
        orderInfo.setUserId(user.getId());
        orderInfo.setBuyerNick(user.getUsername());
        // 3、调用Service创建订单。
        e3Result result = orderService.createOrder(orderInfo);
        //取订单号
        String orderId = result.getData().toString();
        // a)需要Service返回订单号
        request.setAttribute("orderId", orderId);
        request.setAttribute("payment", orderInfo.getPayment());
        // b)当前日期加三天。
        DateTime dateTime = new DateTime();
        dateTime = dateTime.plusDays(3);
        request.setAttribute("date", dateTime.toString("yyyy-MM-dd"));
        // 4、返回逻辑视图展示成功页面
        return "success";
    }

 

3. Mycat数据库分片

 

4.1 需求

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

 

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

海量数据的存储问题

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

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

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)

 

                                              
澳门新浦京娱乐场网站 10  

1.1 什么是数据库分片

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

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

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

澳门新浦京娱乐场网站 11

 

 

 

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

 澳门新浦京娱乐场网站 12

 

4.3 配置schema.xml

四、MyCat的安装

1.2 如何实现数据库分片

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

这种情况下可以使用一个数据库中间件mycat来解决相关的问题。接下来了解一下什么是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与主机名的映射

Mycat介绍

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

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的存在。

 澳门新浦京娱乐场网站 13

4.4.1 Server.xml介绍

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

 

NETWORKING=yes

2.2 Mycat支持的数据库

 澳门新浦京娱乐场网站 14

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

2.3 Mycat的分片策略

 澳门新浦京娱乐场网站 15

 

 

 

4.6 测试分片

# vi /etc/hosts

2.4 概念说明

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 插入数据 

 

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

 澳门新浦京娱乐场网站 16

 

 

127.0.0.1 edu-mycat-01

2.4.1 逻辑库(schema) :

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

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

2.4.2 逻辑表(table):

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

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

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

Mycat读写分离

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

 澳门新浦京娱乐场网站 17

 

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

 澳门新浦京娱乐场网站 18

 

192.168.1.205 edu-mysql-01

2.4.3 分片节点(dataNode)

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

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

2.4.4 节点主机(dataHost)

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

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

 

 

 

 

2.4.5 分片规则(rule)

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

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文件,重新启动服务。

 

 澳门新浦京娱乐场网站 19

 

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

 

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

Mycat的下载及安装

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

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

 

附: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

(澳门新浦京娱乐场网站 20)此附件可保存

 澳门新浦京娱乐场网站 21

 

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

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

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

Mycat的分片

export JRE_HOME=$JAVA_HOME/jre

4.1 需求

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

 

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

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)

 

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

4.3 配置schema.xml

# source /etc/profile

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

 

# java -version

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 

 

 

4.4.1 Server.xml介绍

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

 

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

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。

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

# useradd mycat

4.6 测试分片

# passwd mycat

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 插入数据 

 

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

 澳门新浦京娱乐场网站 22

 

 

 

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

此时需要添加节点了。

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

澳门新浦京娱乐场网站 23  

$ su root

Password:

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

# cd /usr/local/mycat/

# ll

澳门新浦京娱乐场网站 24  

 

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

澳门新浦京娱乐场网站 25  

 

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

澳门新浦京娱乐场网站 26  

澳门新浦京娱乐场网站 27  

 

(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

澳门新浦京娱乐场网站 28  

澳门新浦京娱乐场网站 29  

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

增加:

[client]

default-character-set=utf8

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

澳门新浦京娱乐场网站 30  

 

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

澳门新浦京娱乐场网站 31  

澳门新浦京娱乐场网站 32  

 

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;

澳门新浦京娱乐场网站 33  

mysql> use rc_schema2;

澳门新浦京娱乐场网站 34  

mysql> show tables;

澳门新浦京娱乐场网站 35  

mysql> select * from edu_user;

澳门新浦京娱乐场网站 36  

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

澳门新浦京娱乐场网站 37  

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

 

(2) 写测试

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

澳门新浦京娱乐场网站 38  

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

澳门新浦京娱乐场网站 39  

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

澳门新浦京娱乐场网站 40
  
澳门新浦京娱乐场网站 41  

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

 

接下来计划课程:

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

MyCat的高可用集群 HAProxy Keepalived MyCat;

 

本文由澳门新浦京娱乐场网站发布于数据库,转载请注明出处:MyCat在MySQL主从复制基础上达成读写分离,Mycat数