分布式数据库系统MyCat

news2024/11/17 3:25:12
  • MyCat简介
  1. MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
  2. MyCAT主要解决的是数据库的分库分表,以及对数据的读写分离。来达到提高数据存储量,以及提升数据查询效率等
  • MyCat架构
  1. 用户可以把MyCAT看作是一个数据库代理,用mysql客户端工具(如Navicat)和命令访问,其核心功能就是分库分表,即将一个大表水平分割为N个小表,实际的存储还是在后端Mysql服务器中或其它数据库中。

  1. MyCat拦截了用户发送过来的SQL语句,⾸先对SQL语句做了特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给客户。
  • MyCat安装
  1. 下载http://dl.mycat.io/
  2. 把MyCat的压缩包上传到linux服务器
  3. 解压缩 tar zxf 压缩包名称
  4. 目录结构:
  • bin:mycat命令,启动、重启、停止等
  • catlet:catlet为Mycat的一个扩展功能
  • conf:Mycat 配置信息,重点关注
  • lib:Mycat引用的jar包,Mycat是java开发的
  • logs:日志文件,包括Mycat启动的日志和运行的日志。

conf目录下service.xml,rule.xml,schema.xml三个文件

service.xml主要配置Mycat服务的参数,比如端口号,myact用户名和密码使用的逻辑数据库等

role.xml主要配置路由策略,主要有分片的片键,拆分的策略(取模还是按区间划分等)

schema.xml文件主要配置数据库的信息,例如逻辑数据库名称,物理上真实的数据源以及表和数据源之间的对应关系和路由策略等。

  1. 进入mycat/bin目录
    1. 启动命令:./mycat start
    2. 停止命令:./mycat stop
    3. 重启命令:./mycat restart
  • 分片原理
  1. 数据库分片指:通过某种特定的条件,将我们存放在一个数据库中的数据分散存放在不同的多个数据库(主机)中,这样来达到分散单台设备的负载,根据切片规则,可分为以下两种切片模式:
  • 水平分片:对数据量很大的表进行拆分,把这些表按照某种规则将数据存放到不同的数据库中。

垂直切分:根据业务的不同,将不同业务的表存储在不同的数据库中。比如将一个数据库中的A,B,C三张表垂直切分;A表存储在节点1上,B表存储在节点2上,C表存储在节点3上。

  • 分库分表
  1. 环境搭建

 mysql节点1环境;

操作系统版本 : centos7

数据库版本 : mysql-5.6
mycat版本 :1.3 release
数据库名 : db1、db3
ip:192.168.**.**

mysql节点2环境

操作系统版本 : centos7

数据库版本 : mysql-5.6
mycat版本 :1.3 release
数据库名 : db2
ip:192.168.**.**

  1.  MyCat安装到节点1上(需要安装jdk)
  2. 相关概念
  • schema:逻辑库,与MySQL中的database(数据库)对应,在逻辑库中定义所包含的Table。所以数据库中间件可以被看做是个或多个数据库集群构成的逻辑库
  • table:逻辑表,表中的数据根据不同的分片规则存储在不同的节点上。
  • dataNode:是MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上,一般来说,为了高可用性,每个DataNode都设置两个DataSource,一主一从,当主节点宕机,系统自动切换到从节点。 
  • dataHost:节点主机,定义某个物理库的访问地址,用于捆绑到dataNode上。

  1. 配置schema.xml
    1. Schema.xml用于配置逻辑库表及数据节点,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。
      • schema 标签用于定义MyCat实例中的逻辑库
      • Table 标签定义了MyCat中的逻辑表
      • dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。
      • dataHost标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句
         
    2. 注意:若是LINUX版本的MYSQL,则需要设置为Mysql大小写不敏感,否则可能会发生表找不到的问题。
      在MySQL的配置文件中my.ini [mysqld] 中增加一行
      lower_case_table_names = 1

    1. Schema.xml配置

<?xml version="1.0"?>

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

<mycat:schema xmlns:mycat="http://org.opencloudb/">

       <!--TESTDB逻辑数据库名称-->

       <!--checkSQLschema  拦截SQL语句,

              true表示不使用schema:例如select * from goods

              false使用schema:例如select * from TESTDB.goods

       -->

       <!--

              sqlMaxLimit:限制查询语句返回最多数据的条数。

       -->

       <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">

              <!-- auto sharding by id (long) -->

              <!--TB_GOODS逻辑表名-->

              <!--dataNode数据节点-->

              <!--rule分片规则-->

              <!--数据节点及分片规则的设置;将TB_GOODS表安照auto-sharding-loing

                     规则进行分片存储;三个节点综合起来组成TB_GOODS一个完整的表

              -->

              <table name="TB_GOODS" 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.254.128: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>

  1. Server.xml用于配置服务器权限

<user name="test">

    <property name="password">test</property>

    <property name="schemas">TESTDB</property>

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

</user>

  1. 配置rule.xml

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

  1. 分片测试

由于配置的分片规则为“auto-sharding-long”,所以mycat会根据此规则自动分片。
每个datanode中保存一定数量的数据。根据id进行分片。

测试id范围为:
Datanode11~5000000
Datanode2
5000000~10000000
Datanode3
10000001~15000000

  1. 分片规则

规则

示例

描述

枚举法

通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下

<tableRule name="sharding-by-intfile">

  <rule>

    <columns>user_id</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">0</property>

  <property name="defaultNode">0</property>

</function>

columns】标识将要分片的表字段

algorithm】分片函数 mapFile 】标识配置文件名称 type】默认值为 00 表示 Integer,非零表示 String defaultNode 默认节点:小于 0 表示不设置默认节点,大于等于 0 设置默认节点。

注意:默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点
如果不配置默认节点(defaultNode 值小于 0 表示不配置默认节点),碰到不识别的枚举值就会报错。

partition-hash-int.txt 配置:

10000=0

10010=1

DEFAULT_NODE=1      //默认节点

规则

示例

描述

按日期(天)分片

此规则为按天分片。

<tableRule name="sharding-by-date">

    <rule>

        <columns>create_time</columns>

        <algorithm>sharding-by-date</algorithm>

    </rule>

</tableRule>

<function name="sharding-by-date"

class="org.opencloudb.route.function.PartitionByDate">

    <property name="dateFormat">yyyy-MM-dd</property>

    <property name="sBeginDate">2010-01-01</property>

  

    <property name="sPartionDay">10</property>

</function>

columns】标识将要分片的表字段

algorithm】分片函数

dateForma 】日期格式

sBeginDate 】开始日期

sPartionDay 】分区天数,即默认从开始日期算起,分隔 10 天一个分区。

注意
在查询时,如果需要查询时间段应该使用between...and,使用>=或者<=会查询所有分片。

需要提前将分片规划好,建好,否则有可能日期超出实际配置分片数

  • MyCat读写分离

数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。高峰时段的一些复杂SQL查询就导致数据库服务器CPU爆表,系统瘫痪,严重情况下可能导致数据库崩溃。

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

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

七、Mysql的主从复制

  • 主服务器配置

修改etc\my.conf文件:

在[mysqld]段下添加:

#启用二进制日志

log-bin=mysql-bin

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

server-id=1000

第二步:重启mysql服务

service mysqld restart

第三步:建立帐户并授权,给用户授予主从复制的权限。

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;

mysql> show BINLOG EVENTS in 'mysql-bin.*****'

  • 从服务器配置

第一步:修改my.conf文件

[mysqld]

server-id=1001

第二步:配置从服务器

mysql>change master to master_host='192.168.25.134',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文件,重新启动服务。

  • MyCat配置

Mycat  支持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.34:3306" user="root"

            password="root">

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

            password="root" />

        </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分上发。

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

  • 设置 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主从复制时延。“

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

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

相关文章

Tita的OKR:如何高效写好一个 OKR ?

OKR 是一个简单而强大的目标设定系统&#xff0c;世界各地的企业都依靠它来提高&#xff08;除其他外&#xff09;对战略、调整和参与的关注度。该系统由目标&#xff08;你想实现的目标&#xff09;和关键结果&#xff08;衡量目标实现情况的量化陈述&#xff09;组成。 目标…

参数页面设计

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 参数页面设计 {public partial class Form1 : Form{List<PMs> PMs new List<PMs>();public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){for (int …

element-ui table使用type=‘selection‘复选框全禁用-全选禁用_elementui table禁用全选

问题点&#xff1a;当条件数据全被禁用时&#xff0c;全选按钮不是禁用的状态。 复选框全被禁用时&#xff0c;全选按钮将被隐藏 问题总结&#xff1a; 当条件数据全被禁用时&#xff0c;全选按钮也变成禁用的状态&#xff0c;而不是隐藏。有会做的小伙伴希望跟帖。谢谢&#x…

PasteSpiderFile文件同步管理端使用说明(V24.6.21.1)

PasteSpider作为一款适合开发人员的部署管理工具&#xff0c;特意针对开发人员的日常情况做了一个PasteSpiderFile客户端&#xff0c;用于windows上的开发人员迅速的更新发布自己的最新代码到服务器上&#xff01; 虽然PasteSpider也支持svn/git的源码拉取&#xff0c;自动编译…

0802功放2

功放要记一般的式子&#xff0c;而非最大的式子&#xff0c;因为总不能总开到最大音量上工作&#xff0c;而是在比较合适的音量上工作 运放的最大电压也是比电源低1~2V 饱和三极管的功率&#xff0c;电流越大&#xff0c;饱和压降越大&#xff1f;&#xff1f;&#xff1f;不…

SpringBoot优点达项目实战:项目初始化(一)

SpringBoot优点达项目实战&#xff1a;项目初始化&#xff08;一&#xff09; 文章目录 SpringBoot优点达项目实战&#xff1a;项目初始化&#xff08;一&#xff09;1、项目介绍2、项目搭建3、依赖导入4、数据准备 1、项目介绍 技术框架 SpringbootmybatisPlusvueknife 2、项目…

机器学习之逻辑回归丨KNN测试

选择题 【 正确答案: A D】 A. B. C. D. 【 正确答案: B】 A. B. C. D. 【 正确答案: C, D】 A. B. C. D. 假设我们三个类别中心&#xff0c;若某测试样本为&#xff0c;它的 c ( i ) c^{(i)} c(i)是多少&#xff1f; 【 正确答案: B】 A.1 B.2 C.3 D.不确定 假设你…

跨境电商货源渠道哪里找?盘点11个拿货产业带

一、跨境货源渠道哪里找&#xff1f; 说到找货源&#xff0c;应该很多卖家都上过阿里巴巴1688“淘货”&#xff0c;阿里巴巴1688作为一个全球采购批发平台&#xff0c;在2017年上线了个跨境专供板块&#xff0c;专为跨境卖家供货&#xff0c;跨境专供板块的供货商需要经过严格…

将 MinIO 与 Keycloak OIDC 集成

Keycloak是一种单点登录解决方案。使用Keycloak&#xff0c;用户使用Keycloak而不是MinIO进行身份验证。如果没有Keycloak&#xff0c;您将不得不为每个用户创建一个单独的身份 - 从长远来看&#xff0c;这将很麻烦。您需要一个集中身份解决方案来管理 MinIO 的身份验证和授权。…

vue3 vxe-grid列中绑定vxe-switch实现数据更新

1、先上一张图&#xff1a; <template #valueSlot"{ row }"><vxe-switch :value"getV(row.svalue)" change"changeSwitch(row)" /></template>function getV(value){return value 1;};function changeSwitch(row) {console.l…

数据分析必备:一步步教你如何用matplotlib做数据可视化(11)

1、Matplotlib 三维绘图 尽管Matplotlib最初设计时只考虑了二维绘图&#xff0c;但是在后来的版本中&#xff0c;Matplotlib的二维显示器上构建了一些三维绘图实用程序&#xff0c;以提供一组三维数据可视化工具。通过导入Matplotlib包中包含的mplot3d工具包&#xff0c;可以启…

推荐免费好用的日历和浏览器,你一定要下载使用

猫眼浏览器 猫眼浏览器是一款基于Chromium内核的增强版网页浏览器&#xff0c;融合了Chrome的核心功能与Safari的优美外观。它以简约和安全为目标&#xff0c;提供了快速、流畅的网页加载和浏览体验。 猫眼浏览器内置了隐私保护和广告屏蔽功能&#xff0c;能够有效防止用户数据…

Linux tcpdump抓包必备知识

author: 放牛娃学编程 moto: 分享与热爱&#xff0c;不是大爱我不说 放牛娃每日一语: 除了你自己&#xff0c;没有人可以说你不行 别急着划开&#xff0c;这篇笔记一定能够给你带来收获 因为这里你能学到AI永远也给不了你的知识 Linux tcpdump抓包必备知识 文章目录 Linux tcp…

Vue3 头像是圆形,hover上去时头像出现黑色半透明样式,且中间显示修改两字的实现

实现效果 原头像 hover效果 实现方式 博主在实际开发过程中使用mouseover和mouseout会出现无法点击或hover频繁闪动的问题&#xff0c;故这里采用的是css中的hover&#xff0c;利用hover也能轻松实现上述效果&#xff0c;且完全不会影响点击事件的使用。 <template> &…

Mysql: 数据模型

一.关系型数据库 概念:建立在关系型基础上,由多张相互连接的二维表组成的数据库。 1.关系型数据库: 2.特点&#xff1a; 1.使用表存储数据,格式统一,便于维护。 2.使用SQL语言操作,标准统一,使用方便。 3.数据模型 通过客户端连接DBMS可以创建多个数据库,在数据库中…

TOPGP-TIPTOP调用外部Webservice

功能要求&#xff1a;ERP作业调用外部系统的webserice更新数据。 演示环境&#xff1a;ERP作业cooi002&#xff08;员工档案&#xff09;录入后更新到外部系统员工档案表。 1、外部系统的WebSerice使用.net搭建 2、在Service.cs中写一个调用方法erp_other erp_other中两个参数…

Windows 中 Chrome / Edge / Firefox 浏览器书签文件默认存储路径

1. Chrome 浏览器 按组合键 Win R&#xff0c;打开运行对话框&#xff0c;输入 %USERPROFILE%\AppData\Local\Google\Chrome\User Data\Default或在Chrome 浏览器地址栏输入 chrome://version查看【个人资料路径】 2. Edge 浏览器 按组合键 Win R&#xff0c;打开运行对…

dockerfile文件的中的命令

# 基础镜像 FROM registry.cn-beijing.aliyuncs.com/205erp/myopenjdk:8.6 # 设置工作目录 WORKDIR /opt # 拷贝jar包到工作目录 COPY target/*.jar app.jar RUN ls # 设置暴漏的端口 EXPOSE 8080 # 启动jar包 CMD/ENTRYPOINT java ${JAVA_TOOL_OPTIONS} -jar app.jarCMD与ENT…

【uniapp】uniapp开发微信小程序入门教程

HBuilderx中uniapp开发微信小程序入门教程 一、 环境搭建 1. HBuilderx下载安装 HBuilderx下载安装地址 2. 微信开发者工具下载安装 微信开发者工地址具下载安装 二、创建uniapp项目 选择&#xff1a;文件>新建>项目>uni-app 输入项目名称>选择默认模板>…

揭秘App推广黑科技:xinstall如何助力企业实现数据驱动增长!

一、引言 在互联网时代&#xff0c;App的推广和运营面临着前所未有的挑战。随着流量红利的衰退&#xff0c;如何高效、精准地触达目标用户&#xff0c;成为众多企业亟待解决的问题。今天&#xff0c;我们将为大家介绍一款能够破解App推广难题的神器——xinstall&#xff0c;它以…