• 分库分表带来的问题及解决方案


    一.理解分库分表的意义

    1.什么情况下不分表

    阿里巴巴java开发手册嵩山版p14

     1.1、能不分就别分

     1.2、长期规划(3~5年)

    二.什么情况下分表

    2.1数据库性能瓶颈的出现:连接、速度、存储

    2.2数据库优化的层次

    1、SQL与索引(合格的sql和索引)
    2、表与存储引擎(表选择正确的存储引擎)
    3、数据库与应用架构(应用设计是否合理,是否利用了redis等缓存等)
    4、数据库与操作系统配置
    5、硬件
    6、分库分表

    三.分库分表的类型和特点

    3.1水平切分

    3.2垂直切分

     四.分库分表带来的问题

    4.1、跨库关联查询
    4.2、分布式事务
    4.3、排序、翻页、函数计算
    4.4、全局主键

    五.多数据源(动态数据源)的解决方案(datasource)

    六全局id问题

    server.xml中配置

    0、文件方式1、数据库方式2、本地时间戳3、ZK方式 4.uuid 5雪花算法

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

    使用本地方式作为数据库自增: 需设置 sequence_conf.properties配置文件

    SCHEMATABLE.HISIDS=
    SCHEMATABLE.MINID=1001
    SCHEMATABLE.MAXID=100000000 最大值
    SCHEMATABLE.CURID=1000 当前数据库的索引值
    <property name="sequnceHandlerType">1</property>

    使用的是本地数据库的方式,需要在一个分节点创建表和存储过程,其中MYCAT_SEQUENCE必须为大写

    >CREATE TABLE MYCAT_SEQUENCE (
    `name` VARCHAR(50) NOT NULL,
    current_value INT NOT NULL,
    increment INT NOT NULL DEFAULT 1,
    remark varchar(100),  -- remark 并不是必须的,在这里我是为了让每一个表都对应一个全局的自增,在Remark中配置自增项对应的表名。方便后期维护
    PRIMARY KEY(name)) ENGINE=InnoDB;
    <br>-- – 获取当前sequence的值(返回当前值,增量)
    DROP FUNCTION IF EXISTS `mycat_seq_currval`;
    DELIMITER ;;
    CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
    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值
    DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
    DELIMITER ;;
    CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = current_value + increment WHERE name = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END
    ;;
    DELIMITER ;
    -- 获取下一个sequence值
    DROP FUNCTION IF EXISTS `mycat_seq_setval`;
    DELIMITER ;;
    CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1
    DETERMINISTIC
    BEGIN
    UPDATE MYCAT_SEQUENCE
    SET current_value = value
    WHERE name = seq_name;
    RETURN mycat_seq_currval(seq_name);
    END
    ;;

    配置sequence_db_conf.properties ,加入Schemazhon中的table

    <property name="sequnceHandlerType">2</property>

    自动生成64为的时间戳,故设计主键是,要考虑其长度

    日志:

    1、wrapper.log2、mycat.log

  • 相关阅读:
    在eclipse中进行Struts2项目的配置
    通过Java反射来理解泛型的本质
    Java动态加载类在功能模块开发中的作用
    让正常网页呈现黑白色调的方法
    养生-五谷:花生
    汉语-词语:男人
    地理-地点:白浮图镇
    地理-地点:鸡黍镇
    烹饪:杂粮
    烹饪:五谷
  • 原文地址:https://www.cnblogs.com/tongcc/p/15835321.html
Copyright © 2020-2023  润新知