Mycat【Mycat分片规则(按日期(天)分片、全局序列)、Mycat高可用(Mycat高可用概述)】(七)-全面详解(学习总结---从入门到深化)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: Mycat【Mycat分片规则(按日期(天)分片、全局序列)、Mycat高可用(Mycat高可用概述)】(七)-全面详解(学习总结---从入门到深化)

Mycat分片规则_按日期(天)分片



实现原理


此规则为按天分片,设定时间格式、范围。


实现过程


创建示例表

#用户信息表
create table login_info(
 id int auto_increment comment '编号',
 user_id int comment '用户编号',
 login_date date comment '登录时间',
  primary key(id)
);


修改schema.xml配置文件

<table name="login_info" dataNode="dn1,dn2" rule="sharding_by_date" ></table>


修改rule.xml配置文件

<tableRule name="sharding_by_date">
  <rule>
    <columns>login_date</columns>
    <algorithm>shardingByDate</algorithm>
  </rule>
</tableRule>


定义function

<function name="shardingByDate" class="io.mycat.route.function.PartitionByDate">
    <property name="dateFormat">yyyy-MM-dd</property>
    <property name="sBeginDate">2040-01-01</property>
    <property name="sEndDate">2040-01-04</property>
    <property name="sPartionDay">2</property>
</function>



参数:


columns:分片字段,algorithm:分片函数

dateFormat :日期格式 sBeginDate :开始日期

sEndDate:结束日期,则代表数据达到了这个日期的分片后循环从开始分片插入

sPartionDay :分区天数,即默认从开始日期算起,分隔 2 天一个分区


重启Mycat

mycat restart


插入数据

insert into login_info(id,user_id,login_date) values(1,101,'2040-01-01');
insert into login_info(id,user_id,login_date) values(2,102,'2040-01-02');
insert into login_info(id,user_id,login_date) values(3,103,'2040-01-03');
insert into login_info(id,user_id,login_date) values(4,104,'2040-01-04');
insert into login_info(id,user_id,login_date) values(5,105,'2040-01-05');
insert into login_info(id,user_id,login_date) values(6,106,'2040-01-06');


实时学习反馈


1.Mycat技术中按日期进行分片如何设置分区天数___。


A dateFormat

B sBeginDate

C sEndDate

D sPartionDay


Mycat分片规则_全局序列



在实现分库分表的情况下,数据库自增主键已无法保证全局唯一。


解决方案


本地文件


此方式Mycat将sequence配置到文件中,当使用到 sequence中的 配置后,Mycat会更下classpath中的 sequence_conf.properties 文件中sequence当前的值。


注意:


优点:本地加载,读取速度较快

缺点:抗风险能力差,Mycat 所在主机宕机后,无法读取本地文件。


本地时间戳方式


全局序列ID=64位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重 复累加) 换算成十进制为18位数的long类型,每毫秒可以并发12位 二进制的累加。


优缺点:


优点:配置简单

缺点:18位ID过长


数据库方式


利用数据库一个表来进行计数累加。但是并不是每次生成序列都读写数据库,这样效率太低。Mycat 会预加载一部分号段到 Mycat 的 内存中,这样大部分读写序列都是在内存中完成的。如果内存中的 号段用完了 Mycat 会再向数据库要一次。


原理: 在数据库中建立一张表,存放 sequence 名称(name), sequence 当前值(current_value),步长(increment int 类型每 次读取多少个 sequence,假设为 K)等信息;


数据库解决全局序列


修改Mycat配置文件server.xml

#全局序列类型:0-本地文件,1-数据库方式,2-时间戳方式。此处应该修改成1。
<property name="sequnceHandlerType">1</property>


修改Mycat配置文件schema.xml

<table name="test" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="mod-long"/>
<table name="mycat_sequence" primaryKey="name" dataNode="dn2"/>


修改Mycat 配置文件 sequence_db_conf.properties


最下面添加MYCAT=dn2

GLOBAL=dn1
COMPANY=dn1
CUSTOMER=dn1
ORDERS=dn1
MYCAT=dn2


在dn2节点的orders数据库中添加 MYCAT_SEQUENCE表

DROP TABLE IF EXISTS MYCAT_SEQUENCE;
CREATE TABLE MYCAT_SEQUENCE (name VARCHAR(50) NOT NULL,current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 100, PRIMARY KEY(name)) 
ENGINE=InnoDB;


MYCAT_SEQUENCE 表插入sequence初始记录

INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('mycat', -99, 100);


注意: 代表插入了一个名为mycat的sequence,当前值为-99,步长为 100。


创建全局序列所需存储过程

#获取当前sequence的值
DELIMITER $$
CREATE FUNCTION mycat_seq_currval(seq_name
VARCHAR(50)) RETURNS VARCHAR(64)
DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(64);
SET retval="-999999999,null";
SELECT CONCAT(CAST(current_value AS
CHAR),",",CAST(increment AS CHAR)) INTO
retval FROM
MYCAT_SEQUENCE WHERE NAME = seq_name;
RETURN retval;
END $$
DELIMITER ;
#设置sequence值
DELIMITER $$
CREATE FUNCTION mycat_seq_setval(seq_name
VARCHAR(50),VALUE INTEGER) RETURNS
VARCHAR(64)
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = VALUE
WHERE NAME = seq_name;
RETURN mycat_seq_currval(seq_name);
END $$
DELIMITER ;
#获取下一个sequence值
DELIMITER $$
CREATE FUNCTION mycat_seq_nextval(seq_name
VARCHAR(50)) RETURNS VARCHAR(64)
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value +
increment WHERE NAME = seq_name;
RETURN mycat_seq_currval(seq_name);
END $$
DELIMITER ;


重启Mycat

mycat restart


向dn1,dn2添加test表

#登录 Mycat,插入数据
create table test(id int,name varchar(10));


在Mycat中向test表中添加测试数据

insert into test(id,name) values(next value for MYCATSEQ_MYCAT,(select database()));


查询数据验证

SELECT * FROM test order by id asc;


实时学习反馈


1.Mycat技术中设置全局序列需要在 server.xml 修改 sequnceHandlerType为___。


A 0

B 1

C 2

D 3


2.Mycat技术中全局序列问题中本地文件解决方案缺点___。


A 加载速度快

B 读取速度快

C 拓展性

D 抗风险能力差


Mycat高可用_Mycat高可用概述



MyCat实现读写分离架构


通过MyCat来实现MySQL的读写分离, 从而完成MySQL集群的负载 均衡 , 如下面的结构图:


问题: 但是以上架构存在问题 , 由于MyCat中间件是单节点的服务, 前端客户端所有的压力过来都直接请求这一台MyCat , 存在单点故障。所以这个时候, 我们就需要考虑MyCat的集群 ;


MyCat集群架构


通过MyCat来实现后端MySQL的负载均衡 , 通过HAProxy再实现 MyCat集群的负载均衡。


介绍: HAProxy负责将请求分发到MyCat上,起到负载均衡的作用, 同时HAProxy也能检测到MyCat是否存活,HAProxy只会将请求转发到存活的 MyCat 上。如果一台MyCat服务器宕机, HAPorxy 转发请求时不会转发到宕机的MyCat 上,所以 MyCat 依然可用。


HAProxy介绍


HAProxy是一个开源的、高性能的基于TCP(第四层)和HTTP(第七层) 应用的负载均衡软件。 使用HAProxy可以快速、可靠地实现基于 TCP与HTTP应用的负载均衡解决方案。


问题: 因为所以的客户端请求都是先到达HAProxy, 由HAProxy再将 请求再向下分发, 如果HAProxy宕机的话, 就会造成整个MyCat集群不能正常运行, 依然存在单点故障。


MyCat的高可用集群


图解说明:


HAProxy实现了MyCat多节点的集群高可用和负载均衡,而HAProxy自身的高可用则可以通 过Keepalived来实现。因此,HAProxy主机上要同时安装 HAProxy和Keepalived, Keepalived负责为该服务器抢占vip(虚拟 ip),抢占到vip后,对该主机的访问可以通过原 来的ip访问,也可以直接通过vip访问。

HAProxy负责将对vip的请求分发到MyCat集群节点上,起到负载均衡的作用。同时HAProxy 也能检测到MyCat是否存活,HAProxy只会将请求转发到存活的MyCat 上。

如果Keepalived+HAProxy高可用集群中的一台服务器宕机,集群中另外一台服务器上的 Keepalived会立刻抢占vip 并接管服务,此时抢占了 vip 的HAProxy节点可以继续提供服务。

如果一台MyCat服务器宕机,HAPorxy 转发请求时不会转发到宕机的 MyCat 上,所以 MyCat 依然可用。  


keepalived介绍


Keepalived是一种基于VRRP协议来实现的高可用方案,可以利用其 来避免单点故障。 通常有两台甚至多台服务器运行Keepalived,一 台为主服务器(Master), 其他为备份服务器, 但是对外表现为一个虚 拟IP(VIP), 主服务器会发送特定的消息给备份服务器, 当备份服务器 接收不到这个消息时, 即认为主服务器宕机, 备份服务器就会接管虚 拟IP, 继续提供服务, 从而保证了整个集群的高可用。


实时学习反馈


1.Mycat高可用技术中HAProxy技术主要作用___。


A 负载均衡

B 虚拟IP(VIP)

C 运维监控

D 发布订阅


2. Mycat高可用技术中Keepalived技术主要作用____。


A 负载均衡

B 虚拟IP(VIP)

C 运维监控

D 发布订阅

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
6月前
|
存储 算法 关系型数据库
Mycat【Mycat分片技术(水平拆分-分表、ER表、全局表)】(五)-全面详解(学习总结---从入门到深化)
Mycat【Mycat分片技术(水平拆分-分表、ER表、全局表)】(五)-全面详解(学习总结---从入门到深化)
133 0
|
6月前
|
算法 数据库
Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)
Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)
104 0
|
6月前
|
SQL 关系型数据库 MySQL
Mycat【Mycat高级特性_搭建双主双从、Mycat分片技术_垂直拆分-分库 】(四)-全面详解(学习总结---从入门到深化)
Mycat【Mycat高级特性_搭建双主双从、Mycat分片技术_垂直拆分-分库 】(四)-全面详解(学习总结---从入门到深化)
90 0
|
存储 SQL 缓存
27MyCat - 分片规则
27MyCat - 分片规则
43 0
35MyCat - 分片规则(字符串hash解析)
35MyCat - 分片规则(字符串hash解析)
82 0
34MyCat - 分片规则(应用指定)
34MyCat - 分片规则(应用指定)
59 0
38MyCat - 分片规则(自然月分片)
38MyCat - 分片规则(自然月分片)
56 0
|
存储 关系型数据库 MySQL
MyCat - 分片 - 分片规则 - 准备工作 | 学习笔记
快速学习 MyCat - 分片 - 分片规则 - 准备工作
MyCat - 分片 - 分片规则 - 准备工作 | 学习笔记
|
存储 关系型数据库 MySQL
MyCat - 分片 - 水平拆分 - 概述及案例场景 | 学习笔记
快速学习 MyCat - 分片 - 水平拆分 - 概述及案例场景
MyCat - 分片 - 水平拆分 - 概述及案例场景 | 学习笔记
|
存储 算法 关系型数据库
MyCat-入门-分片测试-分片配置测试 | 学习笔记
快速学习 MyCat-入门-分片测试-分片配置测试
MyCat-入门-分片测试-分片配置测试 | 学习笔记