mycat


第一章 mycat简述

1.1 Mycat是什么?

Mycat 是数据库中间件

1.数据库中间件

中间件:是一类连接软件组和应用的计算机软件,以便于软件各部件之间的沟通。

例子:Tomcat,web中间件

数据库中间件:连接应用程序和数据库

2.为什么要用Mycat?

(1) 程序与数据库紧耦合。

(2) 高访问量高并发对数据库压力。

(3) 读写请求数据不一致。

3.数据库中间件对比

(1) Cobar属于阿里B2B事业群,始于2008年,在阿里服役3年多,接管3000+个MySQL数据库的schema, 集群日处理在线SQL请求50亿次以上。由于Cobar发起人的离职,Cobar停止维护。
(2) Mycat是开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新 的功能在其中。青出于蓝而胜于蓝。
(3) OneProxy基于MySQL官方的proxy思想利用c进行开发的,OneProxy是一款商业收费的中间件。舍 弃了一些功能,专注在性能和稳定性上。
(4) kingshard由小团队用go语言开发,还需要发展,需要不断完善。
(5) Vitess是Youtube生产在使用,架构很复杂。不支持MySQL原生协议,使用需要大量改造成本。 
(6) Atlas是360团队基于mysql proxy改写,功能还需完善,高并发下不稳定。
(7) MaxScale是mariadb(MySQL原作者维护的一个版本) 研发的中间件
(8) MySQLRoute是MySQL官方Oracle公司发布的中间件

4. Mycat官网

http://www.mycat.io/

1.2 Mycat功能

1. 读写分离

2. 数据库分片

垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)


多数据源整合

Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发 往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用 Mycat 还是 MySQL。

第二章 安装启动

2.1 安装

1、 解压即可使用

解压缩文件拷贝到linux下 /usr/local

2 、三个配置文件

(1) schema.xml:定义逻辑库,表、分片节点等内容 
(2) rule.xml:定义分片规则 
(3) server.xml:定义用户以及系统相关变量,如端口等

2.2 启动Mycat

1、修改配置文件server.xml

修改用户信息,与mysql区分,如下:

2、修改配置文件schema.xml

删除<schema>标签间的表信息,<dataNode>标签只留一个,<dataHost>标签只留一个,<writeHost> <readHost>只留一对

3、数据库访问情况

Mycat 作为数据库中间件要和数据库部署在不同机器上,所以要验证远程访问情况。



mysql -uroot -p123123 -h 192.168.140.128 -P 3306 mysql -uroot -p123123 -h 192.168.140.127 -P 3306
#如远程访问报错,请建对应用户
grant all privileges on *.* to root@'缺少的host' identified by '123123';

4、启动程序

(1)控制台启动 :去 mycat/bin 目录下执行 ./mycat console 
(2)后台启动 :去 mycat/bin 目录下 ./mycat start
为了能第一时间看到启动日志,方便定位问题,我们选择(1)控制台启动。

5、启动时可能出现报错

如果操作系统时centos 6.8,可能会出现域名解析失败的错误

解决方案:

(1) 用 vi 修改 /etc/hosts 文件

(2) 修改后重新启动网络服务器

service network restart

如果还是没有解决的话再看看是不是没有安装java的环境

2.3 登录

1、登录后台管理服务器

此登录方式用于管理维护 Mycat
mysql -umycat -p123456 -h10.140.0.143 -P9066

2.登录数据窗口

此登录方式用于通过 Mycat 查询数据,我们选择这种方式访问 Mycat
 mysql -umycat -p123456 -h10.140.0.143 -P8066

第三章 利用mycat搭建读写分离

我们通过 Mycat 和 MySQL 的主从复制配合搭建数据库的读写分离,实现 MySQL 的高可用性。 我们将搭建:一主一从、双主双从两种读写分离模式。

3.1 搭建一主一从

一个主机用于处理所有写请求,一台从机负责所有读请求,架构图如下

1、搭建MySql 数据库主从复制

(1) MySql 主从复制原理:

主服务器上面的任何修改都会保存在二进制日志Binary log里面,从服务器上面启动一个I/O thread(实际上就是一个主服务器的客户端进程),连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log里面。从服务器上面开启一个SQL thread定时检查Realy log,如果发现有更改立即把更改的内容在本机上面执行一遍。

​ 一主一从:

如果一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志。此时可以稍做调整,将二进制日志只给某一从,这一从再开启二进制日志并将自己的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从,这样架构起来性能可能要好得多,而且数据之间的延时应该也稍微要好一些。工作原理图如下:

​ 一主多从:

(2) 主机配置(主机一):

修改mysql配置文件:vi /etc/my.cnf
# 加入一下配置
server-id=1 # 主服务器唯一ID 一定需要配置
log-bin=mysql-bin # 启动用二进制日志
binlog-ignore-db=mysql # 设置不要复制放入的数据库 可以设置多个
binlog-ignore-db=information_schema
binlog-do-db=需要复制的主数据库的名字
binlog_format=STATEMENT # 设置logbin格式

(3) 从机配置(从机一):

修改mysql配置文件:vim /etc/my.cnf
# 从服务器唯一ID
server-id=2
# 启用relay日志
relay-log=mysql-relay

(4) 主机、从机重启MySql服务

(5) 主机从机都关闭防火墙

(6) 在主机上建立账号并且授权slave

# 在主机mysql里执行并授权
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
# 查询master的状态
show master status;
# 并且记录下file和position的值
# 执行完此步骤后不要操作主服务器mysql,防止主服务器状态值变化

(7) 在从机上配置需要复制的主机

# 复制主机的命令
CHANGE MASTER TO MASTER_HOST='主机的IP地址',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS=具体值;
#启动从服务器复制功能 
start slave; 
#查看从服务器状态 
show slave status\G;

#下面两个参数都是Yes,则说明主从配置成功! 
# Slave_IO_Running: Yes
# Slave_SQL_Running: Yes

(8) 测试主从复制

# 主机插入创建表 插入数据

# 从机查询

(9) 如何停止服务器复制功能

stop slave;

(10) 如何重新配置主从

stop slave;
reset master;

2、修改Mycat的配置文件schema.xml

之前的配置已分配了读写主机,是否已实现读写分离?

验证读写分离
(1)在写主机插入:insert into mycat values (1,@@hostname);
主从主机数据不一致了 (2)在Mycat里查询:select * from mycat



修改<dataHost>的balance属性,通过此属性配置读写分离的类型



负载均衡类型,目前的取值有4 种:
(1)balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
(2)balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从 模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
(3)balance="2",所有读操作都随机的在 writeHost、readhost 上分发。 (4)balance="3",所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力

为了能看到读写分离的效果,把balance设置成2,会在两个主机间切换查询

<dataHost name="host1" maxCon="1000" minCon="10" balance="2"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

3、启动mycat

4、验证读写分离

#(1)在写主机数据库表mytbl中插入带系统变量数据,造成主从数据不一致 INSERT INTO mytbl VALUES(2,@@hostname);

在Mycat里查询mytbl表,可以看到查询语句在主从两个主机间切换

第四章 垂直拆分----分库

一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类, 分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:

系统被切分成了,用户,订单,支付几个模块

4.1 如何划分表

一个问题:在两台主机上的两个数据库中的表,能否关联查询?
答案:不可以关联查询。 分库的原则:有紧密关联关系的表应该在一个库里,相互没有关联关系的表可以分到不同的库里。



#客户表 rows:20万 CREATE TABLE customer(
id INT AUTO_INCREMENT, NAME VARCHAR(200), PRIMARY KEY(id)
);
#订单表 rows:600万 CREATE TABLE orders(
id INT AUTO_INCREMENT, order_type INT,
customer_id INT,
amount DECIMAL(10,2), PRIMARY KEY(id)
);
#订单详细表 rows:600万 CREATE TABLE orders_detail(
id INT AUTO_INCREMENT, detail VARCHAR(2000), order_id INT,
PRIMARY KEY(id)
);
#订单状态字典表 rows:20 CREATE TABLE dict_order_type(
id INT AUTO_INCREMENT, order_type VARCHAR(200), PRIMARY KEY(id)
);

以上四个表如何分库?客户表分在一个数据库,另外三张都需要关联查询,分在另外一个数据库。

4.2 实现分库

1、修改schema配置文件

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="customer" dataNode="dn2" ></table>
</schema>
<dataNode name="dn1" dataHost="host1" database="orders" /> <dataNode name="dn2" dataHost="host2" database="orders" /> <dataHost name="host1" 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="10.140.0.143:3306" user="root"
password="xxxx">
</writeHost> </dataHost>
<dataHost name="host2" 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="10.140.0.134:3306" user="root"
password="xxxx">
</writeHost> </dataHost>

2 、新增两个空白的库

分库操作不是在原来的老数据库上进行操作,需要准备两台机器分别安装新的数据库

#在数据节点 dn1、dn2 上分别创建数据库 orders CREATE DATABASE orders;

3、启动mycat

cd /usr/local/mycat/bin

./mycat console

4、访问mycat进行分库

#访问 Mycat
mysql -umycat -p123456 -h 192.168.140.128 -P 8066 #切换到 TESTDB
#创建 4 张表
#查看表信息,可以看到成功分库

第五章:水平拆分---分表

相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,
每个表中 包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就
是将表中的某些行切分 到一个数据库,而另外的某些行又切分到其他的数据库中,如图:

5.1 实现分表

1、选择要拆分的表

MySQL 单表存储数据条数是有瓶颈的,单表达到 1000 万条数据就达到了瓶颈,会影响查询效率,
需要进行水平拆分(分表)进行优化。
例如:例子中的 orders、orders_detail 都已经达到 600 万行数据,需要进行分表优化。

2、分表字段

编号 分表字段 效果
1 id 主键或创建时间 查询订单注重时效,历史订单被查询的次数少,如此:分片会造成一个节点访问多,一个访问少,不平均。
2 customer_id 客户id 根据客户 id 去分,两个节点访问平均,一个客户的所 有订单都在同一个节点

3 、修改配置文件 schema.xml

#为 orders 表设置数据节点为 dn1、dn2,并指定分片规则为 mod_rule(自定义的名字) <table name="orders" dataNode="dn1,dn2" rule="mod_rule" ></table>

4、修改配置文件rule.xml

#在 rule 配置文件里新增分片规则 mod_rule,并指定规则适用字段为 customer_id, 
#还有选择分片算法 mod-long(对字段求模运算),customer_id 对两个节点求模,根据结果分片 
#配置算法 mod-long 参数 count 为 2,两个节点 <tableRule name="mod_rule"> 

... 
<algorithm>mod-long</algorithm> </rule> 
</tableRule> 
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <!-- how many data nodes --> 
<property name="count">2</property> </function>

5、在数据节点dn2上建orders表

6、重启mycat,让其配置生效

7、访问mycat实现分表

#在 mycat 里向 orders 表插入数据,INSERT 字段不能省略
INSERT INTO orders(id,order_type,customer_id,amount) VALUES (1,101,100,100100); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(2,101,100,100300); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(3,101,101,120000); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(4,101,101,103000); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(5,102,101,100400); INSERT INTO orders(id,order_type,customer_id,amount) VALUES(6,102,100,100020);
#在mycat、dn1、dn2中查看orders表数据,分表成功

5.2、 mycat的分表 “join”

Orders 订单表已经进行分表操作了,和它关联的 orders_detail 订单详情表如何进行 join 查询。

我们要对 orders_detail 也要进行分片操作。Join 的原理如下图:

1、ER表

Mycat 借鉴了 NewSQL 领域的新秀 Foundation DB 的设计思路,Foundation DB 创新性的提
出了 Table Group 的概念,其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了 JION 的效率和性能问 题,根据这一思路,提出了基于 E-R 关系的数据分片策略,子表的记录与所 关联的父表记录存放在同一个数据分表上。



#修改 schema.xml 配置文件 
<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
</table>

#在 dn2 创建 orders_detail 表 #重启 Mycat
#访问 Mycat 向 orders_detail 表插入数据
INSERT INTO orders_detail(id,detail,order_id) values(1,'detail1',1); INSERT INTO orders_detail(id,detail,order_id) VALUES(2,'detail1',2); INSERT INTO orders_detail(id,detail,order_id) VALUES(3,'detail1',3); INSERT INTO orders_detail(id,detail,order_id) VALUES(4,'detail1',4); INSERT INTO orders_detail(id,detail,order_id) VALUES(5,'detail1',5); INSERT INTO orders_detail(id,detail,order_id) VALUES(6,'detail1',6); #在mycat、dn1、dn2中运行两个表join语句
Select o.*,od.detail from orders o inner join orders_detail od on o.id=od.order_id;

2、 全局表

在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,

就成了比较 棘手的问题,考虑到字典表具有以下几个特性: 1 变动不频繁
2 数据量总体变化不大
3 数据规模不大,很少有超过数十万条记录

鉴于此,Mycat 定义了一种特殊的表,称之为“全局表”,全局表具有以下特性: 1 全局表的插入、更新操作会实时在所有节点上执行,保持各个分片的数据一致性 2 全局表的查询操作,只从一个节点获取
3 全局表可以跟任何一个表进行 JOIN 操作

将字典表或者符合字典表特性的一些表定义为全局表,则从另外一个方面,很好的解决了数据 JOIN 的难题。通过全局表+基于 E-R 关系的分片策略,Mycat 可以满足 80%以上的企业应用开发



#修改 schema.xml 配置文件
<table name="orders" dataNode="dn1,dn2" rule="mod_rule" >
<childTable name="orders_detail" primaryKey="id" joinKey="order_id" parentKey="id" />
</table>
<table name="dict_order_type" dataNode="dn1,dn2" type="global" ></table>

#在 dn2 创建 dict_order_type 表 #重启 Mycat
#访问 Mycat 向 dict_order_type 表插入数据
INSERT INTO dict_order_type(id,order_type) VALUES(101,'type1');
INSERT INTO dict_order_type(id,order_type) VALUES(102,'type2'); #在Mycat、dn1、dn2中查询表数据

5.3 常用分片规则

1、 取模
此规则为对分片字段求摸运算。也是水平分表最常用规则。5.1 配置分表中,orders 表采用了此规

则。

2、 分片枚举
通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务

需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则。

#(1)修改schema.xml配置文件
<table name="orders_ware_info" dataNode="dn1,dn2" rule="sharding_by_intfile" ></table> #(2)修改rule.xml配置文件
<tableRule name="sharding_by_intfile"> <rule>
<columns>areacode</columns>
<algorithm>hash-int</algorithm> </rule>
</tableRule>


<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property> <property name="type">1</property>
<property name="defaultNode">0</property>
</function>
# columns:分片字段,algorithm:分片函数
# mapFile:标识配置文件名称,type:0为int型、非0为String,
#defaultNode:默认节点:小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点,
# 设置默认节点如果碰到不识别的枚举值,就让它路由到默认节点,如不设置不识别就报错
#(3)修改partition-hash-int.txt配置文件 110=0
120=1
#(4)重启 Mycat
#(5)访问Mycat创建表 #订单归属区域信息表



CREATE TABLE (
orders_ware_info
`id`
`order_id`
`address`
`areacode` PRIMARY KEY(id)
INT AUTO_INCREMENT comment '编号', INT comment '订单编号',
VARCHAR(200) comment '地址', VARCHAR(20) comment '区域编号',
);
#(6)插入数据
INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (1,1,'北京','110'); INSERT INTO orders_ware_info(id, order_id,address,areacode) VALUES (2,2,'天津','120');
#(7)查询Mycat、dn1、dn2可以看到数据分片效果

3、 范围约定 此分片适用于,提前规划好分片字段某个范围属于哪个分片。

#(1)修改schema.xml配置文件
<table name="payment_info" dataNode="dn1,dn2" rule="auto_sharding_long" ></table> #(2)修改rule.xml配置文件

<tableRule name="auto_sharding_long"> <rule>
<columns>order_id</columns>
<algorithm>rang-long</algorithm> </rule>
</tableRule>
...
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property> <property name="defaultNode">0</property>
</function>

# columns:分片字段,algorithm:分片函数
# mapFile:标识配置文件名称
#defaultNode:默认节点:小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点,
# 设置默认节点如果碰到不识别的枚举值,就让它路由到默认节点,如不设置不识别就 报错
#(3)修改autopartition-long.txt配置文件 0-102=0
103-200=1
#(4)重启 Mycat #(5)访问Mycat创建表


#支付信息表 CREATE TABLE (
payment_info
INT AUTO_INCREMENT comment '编号', INT comment '订单编号',
`id`
`order_id`
`payment_status` INT comment '支付状态', PRIMARY KEY(id)
);
#(6)插入数据
INSERT INTO payment_info (id,order_id,payment_status) VALUES (1,101,0); INSERT INTO payment_info (id,order_id,payment_status) VALUES (2,102,1); INSERT INTO payment_info (id,order_id ,payment_status) VALUES (3,103,0); INSERT INTO payment_info (id,order_id,payment_status) VALUES (4,104,1); #(7)查询Mycat、dn1、dn2可以看到数据分片效果

第六章 给予HA 机制的mycat高可用

在实际项目中,Mycat 服务也需要考虑高可用性,如果 Mycat 所在服务器出现宕机,或 Mycat 服

务故障,需要有备机提供服务,需要考虑 Mycat 集群。

6.1 高可用方案

我们可以使用 HAProxy + Keepalived 配合两台 Mycat 搭起 Mycat 集群,实现高可用性。HAProxy 实现了 MyCat 多节点的集群高可用和负载均衡,而 HAProxy 自身的高可用则可以通过Keepalived 来 实现。

编号 角色 IP地址 机器名
1 Mycat1 10.140.0.143 Web
2 Mycat2 10.140.0.144 localhost.localdomain
3 HAProxy(master) 10.140.0.143 localhost.localdomain
4 Keepalived(master) 10.140.0.143 localhost.localdomain
5 HAProxy(backup 10.140.0.67 localhost.localdomain
6 Keepalived(backup) 10.140.0.67 localhost.localdomain

6.2 安装配置haproxy

1、安装

#1准备好HAProxy安装包,传到/opt目录下 #2解压到/usr/local/src
tar -zxvf haproxy-1.5.18.tar.gz -C /usr/local/src
#3进入解压后的目录,查看内核版本,进行编译
cd /usr/local/src/haproxy-1.5.18
uname -r
make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64
# ARGET=linux310,内核版本,使用uname -r查看内核,如:3.10.0-514.el7,此时该参数就为linux310; #ARCH=x86_64,系统位数;
#PREFIX=/usr/local/haprpxy #/usr/local/haprpxy,为haprpxy安装路径。
#4编译完成后,进行安装
make install PREFIX=/usr/local/haproxy
#5安装完成后,创建目录、创建HAProxy配置文件 mkdir -p /usr/data/haproxy/
vim /usr/local/haproxy/haproxy.conf
#6向配置文件中插入以下配置信息,并保存
global
#log loghost  loca110
maxconn 4096  local notice
chroot /usr/local/haproxy local10 info
pidfile /usr/data/haproxy/haproxy.pid uid 99
gid 99 daemon #debug #quiet
defaults
log global


mode tcp
option abortonclose option redispatch retries 3
maxconn 2000
timeout connect 5000 timeout client 50000 timeout server 50000
listen proxy_status bind :48066
mode tcp
balance roundrobin
server mycat_1 10.140.0.143:8066 check inter 10s server mycat_2 10.140.0.144:8066 check inter 10s
frontend admin_stats bind :7777
mode http
stats enable
option httplog
maxconn 10
stats refresh 30s
stats uri /admin
stats auth admin:123123 stats hide-version
stats admin if TRUE

2、启动验证

#1启动HAProxy
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
#2查看HAProxy进程 ps -ef|grep haproxy
#3打开浏览器访问 http://192.168.140.125:7777/admin
#在弹出框输入用户名:admin密码:123123 #如果Mycat主备机均已启动

#4验证负载均衡,通过HAProxy访问Mycat
mysql -umycat -p123456 -h 192.168.140.126 -P 48066

6.3 配置keepalived

1、 安装 Keepalived

#1准备好Keepalived安装包,传到/opt目录下 #2解压到/usr/local/src
tar -zxvf keepalived-1.4.2.tar.gz -C /usr/local/src
#3安装依赖插件
yum install -y gcc openssl-devel popt-devel
#3进入解压后的目录,进行配置,进行编译 cd /usr/local/src/keepalived-1.4.2
./configure --prefix=/usr/local/keepalived
#4进行编译,完成后进行安装 make && make install
#5运行前配置
cp /usr/local/src/keepalived-1.4.2/keepalived/etc/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/src/keepalived-1.4.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
#6修改配置文件
vim /etc/keepalived/keepalived.conf



#修改内容如下
! Configuration File for keepalived
global_defs { notification_email {
xlcocoon@foxmail.com }
notification_email_from keepalived@showjoy.com smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0 }
vrrp_instance VI_1 { #主机配MASTER,备机配BACKUP state MASTER
#所在机器网卡
interface ens33
virtual_router_id 51 #数值越大优先级越高
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 }
virtual_ipaddress { #虚拟IP
192.168.140.200 }
}
virtual_server 192.168.140.200 48066 {
delay_loop 6
lb_algo rr
lb_kind NAT persistence_timeout 50 protocol TCP

real_server 192.168.140.125 48066 { weight 1
TCP_CHECK { connect_timeout 3
retry 3
delay_before_retry 3 }
}
real_server 192.168.140.126 48600 {
weight 1 TCP_CHECK {
connect_timeout 3 nb_get_retry 3 delay_before_retry 3
} }}

2、启动验证

#1启动Keepalived 
service keepalived start

#2登录验证
mysql -umycat -p123456 -h 192.168.140.200 -P 48066

6.4 测试高可用

1、 测试步骤

#1关闭mycat
#2通过虚拟ip查询数据
mysql -umycat -p123456 -h 192.168.140.200 -P 48066

第七章 mycat安全设置

7.1 权限配置

1.user 标签权限控制

目前 Mycat 对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读

写权限控制。是通过 server.xml 的 user 标签进行配置。

#server.xml配置文件user部分 <user name="mycat">
<property name="password">123456</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>

配置说明

标签属性 说明
name 应用连接中间件逻辑库的用户名
password 该用户对应的密码
TESTDB 应用当前连接的逻辑库中所对应的逻辑表。schemas 中可以配置一个或多个
readOnly 应用连接中间件逻辑库所具有的权限。true 为只读,false 为读写都有,默认为 false

测试案例

#测试案例一
# 使用user用户,权限为只读(readOnly:true)
# 验证是否可以查询出数据,验证是否可以写入数据
#1、用user用户登录,运行命令如下:
mysql -uuser -puser -h 192.168.140.128 -P8066 #2、切换到TESTDB数据库,查询orders表数据,如下: use TESTDB
select * from orders;
#4、执行插入数据sql,如下:
insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000); #5、可看到运行结果,插入失败,只有只读权限

#测试案例二
# 使用mycat用户,权限为可读写(readOnly:false)
# 验证是否可以查询出数据,验证是否可以写入数据
#1、用mycat用户登录,运行命令如下:
mysql -umycat -p123456 -h 192.168.140.128 -P8066 #2、切换到TESTDB数据库,查询orders表数据,如下: use TESTDB
select * from orders;
#3、可以查询到数据
#4、执行插入数据sql,如下:
insert into orders(id,order_type,customer_id,amount) values(7,101,101,10000);
#5、可看到运行结果,插入成功

2、 privileges 标签权限控制

在 user 标签下的 privileges 标签可以对逻辑库(schema)、表(table)进行精细化的 DML 权限控
制。
privileges 标签下的 check 属性,如为 true 开启权限检查,为 false 不开启,默认为 false。
由于 Mycat 一个用户的 schemas 属性可配置多个逻辑库(schema) ,所以 privileges 的下级
节点 schema 节点同样可配置多个,对多库多表进行细粒度的 DML 权限控制。



#server.xml配置文件privileges部分 #配置orders表没有增删改查权限 <user name="mycat">
<property name="password">123456</property> <property name="schemas">TESTDB</property> <!-- 表级 DML 权限设置 -->
<privileges check="true">
<schema name="TESTDB" dml="1111" >
<table name="orders" dml="0000"></table> <!--<table name="tb02" dml="1111"></table>-->
</schema> </privileges>
</user>

配置说明

DML权限 增加 更新 查询 删除
0000 禁止 禁止 禁止 禁止
0010 禁止 禁止 可以 禁止
1110 可以 禁止 禁止 禁止
1111 可以 可以 可以 可以

测试案例

#测试案例一
# 使用mycat用户,privileges配置orders表权限为禁止增删改查(dml="0000")
# 验证是否可以查询出数据,验证是否可以写入数据
#1、重启mycat,用mycat用户登录,运行命令如下: mysql -umycat -p123456 -h 192.168.140.128 -P8066 #2、切换到TESTDB数据库,查询orders表数据,如下: use TESTDB
select * from orders; #3、禁止该用户查询数据
#4、执行插入数据sql,如下:
insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000); #5、可看到运行结果,禁止该用户插入数据




#测试案例二
# 使用mycat用户,privileges配置orders表权限为可以增删改查(dml="1111")
# 验证是否可以查询出数据,验证是否可以写入数据
#1、重启mycat,用mycat用户登录,运行命令如下: mysql -umycat -p123456 -h 192.168.140.128 -P8066 #2、切换到TESTDB数据库,查询orders表数据,如下: use TESTDB
select * from orders; #3、可以查询到数据
#4、执行插入数据sql,如下:
insert into orders(id,order_type,customer_id,amount) values(8,101,101,10000);
#5、可看到运行结果,插入成功
#4、执行插入数据sql,如下: delete from orders where id in (7,8);
#5、可看到运行结果,插入成功

7.2 sql 拦截

firewall 标签用来定义防火墙;firewall 下 whitehost 标签用来定义 IP 白名单 ,blacklist 用来定义 SQL 黑名单。

1、 白名单
可以通过设置白名单,实现某主机某用户可以访问 Mycat,而其他主机用户禁止访问。

#设置白名单
#server.xml配置文件firewall标签 #配置只有192.168.140.128主机可以通过mycat用户访问 <firewall>
<whitehost>
<host host="192.168.140.128" user="mycat"/>
</whitehost> </firewall>

#重启Mycat后,192.168.140.128主机使用mycat用户访问 mysql -umycat -p123456 -h 192.168.140.128 -P 8066 #可以正常访问,

2、黑名单

可以通过设置黑名单,实现 Mycat 对具体 SQL 操作的拦截,如增删改查等操作的拦截

#设置黑名单 #server.xml配置文件firewall标签 #配置禁止mycat用户进行删除操作 <firewall>
<whitehost>
<host host="192.168.140.128" user="mycat"/>
</whitehost>
<blacklist check="true">
<property name="deleteAllow">false</property> </blacklist>
<firewall>

#重启Mycat后,192.168.140.128主机使用mycat用户访问 mysql -umycat -p123456 -h 192.168.140.128 -P 8066 #可以正常访问



#切换TESTDB数据库后,执行删除数据语句 delete from orders where id=7; #运行后发现已禁止删除数据,

可以设置的黑名单 SQL 拦截功能列表

配置项 缺省值 描述
selelctAllow true 是否允许执行 SELECT 语句
deleteAllow true 是否允许执行 DELETE 语句
updateAllow true 是否允许执行 UPDATE 语句
insertAllow true 是否允许执行 INSERT 语句
createTableAllow true 是否允许创建表
setAllow true 是否允许使用 SET 语法
alterTableAllow true 是否允许执行 Alter Table 语句
dropTableAllow true 是否允许修改表
commitAllow true 是否允许执行 commit 操作
rollbackAllow true 是否允许执行 roll back 操作

第八章 mycat监控

8.1 mica-web 简介

Mycat-web 是 Mycat 可视化运维的管理和监控平台,弥补了 Mycat 在监控上的空白。帮 Mycat 分 担统计任务和配置管理任务。Mycat-web 引入了 ZooKeeper 作为配置中心,可以管理多个节点。 Mycat-web 主要管理和监控 Mycat 的流量、连接、活动线程和内存等,具备 IP 白名单、邮件告警等模 块,还可以统计 SQL 并分析慢 SQL 和高频 SQL 等。为优化 SQL 提供依据。

8.2 mycat-web 配置

  1. ZooKeeper安装

安装步骤

#1下载安装包http://zookeeper.apache.org/
#2 安装包拷贝到Linux系统/opt目录下,并解压 tar -zxvf zookeeper-3.4.11.tar.gz
#3 进入ZooKeeper解压后的配置目录(conf),复制配置文件并改名 cp zoo_sample.cfg zoo.cfg
#4 进入ZooKeeper的命令目录(bin),运行启动命令
./zkServer.sh start
#5 ZooKeeper服务端口为2181,查看服务已经启动 netstat -ant | grep 2181
  1. Mycat-web 安装

安装步骤如下:

#1下载安装包http://www.mycat.io/
#2 安装包拷贝到Linux系统/opt目录下,并解压
tar -zxvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz
#3 拷贝mycat-web文件夹到/usr/local目录下 cp -r mycat-web /usr/local
#4 进入mycat-web的目录下运行启动命令 cd /usr/local/mycat-web/
./start.sh &
#5 Mycat-web服务端口为8082,查看服务已经启动 netstat -ant | grep 8082
#6 通过地址访问服务 http://192.168.140.127:8082/mycat/

3.mycat-web 配置

​ 安装步骤如下:

1 先在注册中心配置ZooKeeper地址,配置后刷新页面

2 新增Mycat监控实例

8.3 mycat 性能监控指标

在 Mycat-web 上可以进行 Mycat 性能监控,例如:内存分享、流量分析、连接分析、活动线程分

析等等。


原文链接:https://www.cnblogs.com/ZKPython/p/12627290.html