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

news2024/9/22 23:26:08

 

目录

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 发布订阅

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/732728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux时间子系统

转自&#xff1a;深入理解Linux时间子系统(0.7)_城中之城的博客-CSDN博客 一、时间概念解析 我们住在空间里&#xff0c;活在时间中。时间对我们来说是既熟悉又陌生。熟悉是因为我们每天都在时间的驱动下忙碌着&#xff0c;陌生是因为我们从来没有停下来认真思考过时间是什么…

C++内存泄露排查的一个案例

背景: 这熟悉的线条. 请求量没啥波动, 不用怀疑, 就是内存泄露了. 方案一 Valgrind Valgrind可以用来检测是否有非法使用内存的问题, 如: 访问未初始化的内存,访问数组越界, 忘记释放动态内存的问题; 首先需要定位是哪个进程的内存泄露. 使用top命令, 然后shiftm按照内存排序…

python 常用数据结构-字典

python 常用数据结构-字典 Dict 字典字典定义字典使用&#xff1a;创建字典使用&#xff1a;访问元素字典使用&#xff1a;操作元素字典使用&#xff1a;嵌套字典字典方法字典方法 keys()字典方法 values()字典方法 items()字典方法 get()字典方法 update()字典方法 pop() 字典…

十二、Docker Compose 介绍与安装

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、docker compose介绍二、docker compose能干嘛三、docker compose安装与卸载3.1 docker-compose安装3.2 docker-compose卸载 总结 前言 在使用k8s之前&#xff0c;随…

overleaf 常用命令

ctrlb 加粗 ctrli 斜体 \emph 斜体&#xff0c;强调 行内公式 $ a b c $ 行间公式 \begin{equation} ab_cd \end{equation} 交叉引用 1.引入宏包 \usepackage[colorlinks]{hyperref} 2.\label \subsection{related wok}\label{sec:related work} this is related …

【开源分享】在线客服系统源码,支持发送文本表情,上传图片附件附详细搭建教程...

源码介绍 golang开发的单用户在线客服系统&#xff0c;功能非常的简洁实用&#xff0c;没有多余的功能。golang语言可编译为二进制程序&#xff0c;自带守护进程功能&#xff0c;相比于流传最广的PHP客服系统要稳定 环境配置 服务器&#xff1a;linux 或者 windows都可以 golan…

剑指offer36.二叉搜索树与双向链表

将二叉树转换成排序的双向循环链表&#xff0c;其中包含三个条件&#xff1a;1&#xff0c;排序&#xff1b;2&#xff0c;双向链表&#xff1b;3&#xff0c;循环链表&#xff1b; 条件1&#xff1a;将一个树排序很简单&#xff0c;采用“左-->根-->右”的中序遍历方式…

本地部署 ChatGLM2-6B

本地部署 ChatGLM2-6B 1. 什么是 ChatGLM2-6B2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 ChatGLM2-6B6. 启动 ChatGLM2-6B7. 访问 ChatGLM2-6B8. API部署9. OpenAI 格式的流式 API 部署10. 命令行部署11. ChatGLM2-6B 的推理参数含义 1. 什么是 ChatGLM2-6B Cha…

JS Node 模块化解释:AMD、UMD、CommonJS、 ESM

一、前言 传统方式下&#xff0c;JS 若想引入其它 JS 文件时&#xff0c;通常使用 <script> 语法来完成&#xff0c;然而引入的 JS 往往易于造成命名污染&#xff0c;为了解决这问题&#xff0c;模块化 开发的概念逐渐浮现。 本文将以完整的 Demo 将各大模块模块的概念…

树莓派(香橙派)交叉编译

目录 1、交叉编译是什么 2、为什么要交叉编译&#xff1f; 3、交叉编译需要用到什么工具&#xff1f; 4、&#xff08;香橙派&#xff09;交叉编译工具链的安装 5、 交叉编译服务端客户端 6、 带wiringPi库的交叉编译如何进行 1、交叉编译是什么 交叉编译是在一个平台上生…

叠加态和超级定位:量子世界的奇特现象

亲爱的读者&#xff0c; 欢迎回到我们的量子力学系列文章。在前几篇文章中&#xff0c;我们介绍了量子力学的起源、基本概念以及波函数作为描述量子世界的数学工具。今天&#xff0c;我们将深入探索量子力学中的奇特现象&#xff0c;包括叠加态和超级定位。 在量子力学中&…

sklearn高级功能

包括构造数据集、正则化、交叉验证 1.构造数据集 from sklearn import datasets import matplotlib.pyplot as plt #构造数据 #用函数来建立 100 个 sample&#xff0c;有一个 feature&#xff0c;和一个 target&#xff0c;这样比较方便可视化。 X, y datasets.make_regres…

Python开发项目基于大数据的反电信诈骗管理系统设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

行为型模式-策略模式(一)

今天就说一说设计模式中的策略模式&#xff0c;从名字来讲&#xff0c;意思就是&#xff0c;对应不同的情况&#xff0c;就有一种解决问题的办法&#xff0c;不同的情况&#xff0c;就有不同的应对方法&#xff0c;这就是策略模式&#xff0c;非常的智能化。 也可以参考菜鸟 …

leetcode 876.链表的中间结点(快慢指针问题)

⭐️ 往期相关文章 &#x1f4ab; 链接1&#xff1a;leetcode 206.反转链表 &#x1f4ab; 链接2&#xff1a;leetcode 203.移除链表元素 &#x1f4ab; 链接3&#xff1a;数据结构-手撕单链表代码详解 ⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;链表的中间结点 …

手把手教大家实现 npm 包,并发布 npm 仓库,搭建文档(一)

我就知道你会点进来看看&#xff0c;吹牛逼的&#xff0c;哈哈&#xff0c;不过呢&#xff0c;我正在朝着这个方向前进&#xff0c;希望大家给我鼓励鼓励&#xff0c;希望点击进来小伙伴点点赞&#xff0c;点点关注。 说实话&#xff0c;写这个项目的目的&#xff0c;从我自己…

ModaHub魔搭社区:阿里云CTO周靖人:魔搭社区将成为中国最大的“大模型自由市场”

7月7日消息&#xff0c;阿里云CTO周靖人在上海世界人工智能大会上宣布了阿里云的发展计划。 他表示&#xff0c;阿里云将致力于推动中国大模型生态的繁荣&#xff0c;并为大模型创业公司提供全方位的支持。阿里云魔搭社区已经聚集了180万AI开发者和900多个优质AI模型&#xff0…

springboot---定时任务实现

定时任务 1. scheduled注解实现1.1. 用法1.2. 参数详解1.2.1. cron1.2.2. zone1.2.3. fixedDelay1.2.4. fixedDelayString1.2.5. fixedRate1.2.6. fixedRateString1.2.7. initialDelay1.2.8. initialDelayString 1.3. 示例 1. scheduled注解实现 1.1. 用法 任意类中创建一个方…

ASL-QPSO|改进量子粒子群自适应算法及其实现(Matlab)

作者在前面的文章中介绍了量子粒子群算法&#xff0c;量子粒子群算法不但继承粒子群算法的优点&#xff0c;还有它自身计算模型更加简洁&#xff0c;控制参数更少等更加突出的优势&#xff0c;但依然存在着一定的局限性。 例如也会存在着早熟收敛的问题&#xff0c;随着迭代次数…

金属工件表面粗糙度测量方法概述

引言: 在加工零件等的表面上,存在着不同高低、深度和间隙凹凸等的复杂形状。其中,深度且间隔较小的表面坑洼不平被称为表面粗糙度。 产品外包装、汽车仪表盘或是触摸屏等加工零件表面的“闪闪发亮”“粗糙无光泽”等外观区别,就源自这个表面粗糙度的差异。 此外,拿在手里…