• MySql快速入门(四)


    在之前我们对MySql已经有了基本的了解,接下来我们就来接触MySql的分库分表,请往下阅读:

    分库分表之MyCat实现

    分库分表介绍:

    随着微服务这种架构的兴起,我们应用从一个完整的大的应用,切分为很多可以独立提供服务的小应用。每个应用都有独立的数据库。

    数据的切分分为两种:

    • 垂直切分:按照业务模块进行切分,将不同模块的表切分到不同的数据库中。
    • 水平切分将一张大表按照一定的切分规则,按照行切分到不同的表或者不同的库中。

     MyCAT介绍

    什么是MyCAT?

    官方网站http://www.mycat.org.cn/

    简单的说,MyCAT就是:

      一个彻底开源的,面向企业应用开发的“大数据库集群”

      支持事务、ACID、可以替代Mysql的加强版数据库

      一个可以视为“Mysql”集群的企业级数据库,用来替代昂贵的Oracle集群

      一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL Server

      结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

      一个新颖的数据库中间件产品

    MyCAT的目标是:低成本的将现有的单机数据库和应用平滑迁移到“云”端,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。

    MyCAT的关键特性

    支持 SQL 92标准

    支持Mysql集群,可以作为Proxy使用

    支持JDBC连接ORACLE、DB2、SQL Server,将其模拟为MySQL  Server使用

    支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性数据分片集群

    自动故障切换,高可用性

    支持读写分离,支持Mysql双主多从,以及一主多从的模式

    支持全局表,数据自动分片到多个节点,用于高效表关联查询

    支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询

    多平台支持,部署和实施简单

    MyCAT架构

    核心概念

    • Schema:由它指定逻辑数据库
    • Table:逻辑表
    • DataNode:真正存储节点
    • DataHost:真正的数据库主机

    如图所示:MyCAT使用Mysql的通讯协议模拟成了一个Mysql服务器,并建立了完整的Schema(数据库)、Table (数据表)、User(用户)的逻辑模型,并将这套逻辑模型映射到后端的存储节点DataNodeMySQL Instance)上的真实物理库中,这样一来,所有能使用Mysql的客户端以及编程语言都能将MyCAT当成是Mysql Server来使用,不必开发新的客户端协议。

    Mycat存在的问题

    • 跨库join问题

        * 通过业务分析将不同库的join查询拆分成多个select

        * 建立全局表(每个库都有一个相同的表)

        * 冗余字段(不符合数据库三范式)

        * E-R分片(将有关系的记录都存储到一个库中)

        * 最多支持跨两张表跨库的join

    • 分布式事务(弱事务)

        * 强一致性事务(同步)

        * 最终一致性事务(异步思想)

    • 分布式主键

        * redis incr命令

        * 数据库(生成主键)

        * UUID

        * snowflake算法

    Mycat解决的问题

    • 海量数据存储
    • 查询优化

    Mycat读写分离

    MyCat的读写分离是建立在MySQL主从复制基础之上实现的。

    数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。对于MySQL来说,

    标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个读节点的配置

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

    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。

      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。”

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

  • 相关阅读:
    php数组函数-array_push()
    php数组函数-array_pop()
    php数组函数-array_pad()
    php数组函数-array_merge()
    php数组函数-array_map()
    php数组函数-array_keys()
    php数组函数-array_key_exists()
    php数组函数-array_intersect()
    php数组函数-array_flip()
    php数组函数-array_filter()
  • 原文地址:https://www.cnblogs.com/Myoyc/p/12143104.html
Copyright © 2020-2023  润新知