数据库分库分表、读写分离

拆分方式

  1. 垂直拆分:垂直地拆分一张表,在表的列层面切分一张表
  2. 水平拆分:水平地拆分一张表,在表的行层面拆分一张表
    1. 拆分策略:
      • 一致性hash方式(可以为主键):数据分布在分库分表中分布均匀,但是基于范围查询性能较低
      • 日期时间方式:实际也算是一种范围方式的拆分方式
      • 范围方式:数据可能在某几个分库分表中集中,性能较低,但是基于范围查询较好

拆分带来的问题

  1. 跨库join问题

    1. 设计时,放到同一库,规避该问题
    2. 服务层查询不同库,连接
    3. 全局表(公共数据)
      1. 数据变更较少,数据层面实现
      2. 公共服务
    4. 字段冗余(空间换时间(订单表,商家id,商家名称(名称变更通过定时任务或通知)))
  2. 跨分片数据排序分页

    1. 服务层合并(mycat),性能并不是很好
    2. 查询字段非分片字段,且该查询方式存在的比例很高时,可考虑将数据按两种分片方式存储两份,但需要做到数据一致性
  3. 唯一主键问题

    1. Redis
    2. UUID
    3. snowflake
    4. zookeeper
    5. 数据库全局表
  4. 分布式事务问题

    1. 2PC、3PC强一致性,牺牲性能

    2. 应用的查询补偿机制,保证最终一致性

主从同步

配置

  • master

    1. 创建一个用户’repl’,并且允许其他服务器可以通过该用户远程访问master,通过该用户去读取二进制数据,实现数据同步

      Create user repl identified by ‘repl; repl用户必须具有REPLICATION SLAVE权限,除此之外其他权限都不需要

      GRANT REPLICATION SLAVE ON . TO ‘repl’@’%’ IDENTIFIED BY ‘repl’ ;

    2. 修改master的 my.cnf配置文件,在[mysqld] 下添加如下配置

      log-bin=mysql-bin //启用二进制日志文件

      server-id=130 服务器唯一ID

    3. 重启数据库 systemctl restart mysqld

    4. 登录到数据库,通过show master status 查看master的状态信息

  • slave

    1. 修改slave的 my.cnf配置文件, 在[mysqld]下增加如下配置

      server-id=132 服务器id,唯一

      relay-log=slave-relay-bin

      relay-log-index=slave-relay-bin.index

      read_only=1

    2. 重启数据库: systemctl restart mysqld

    3. 连接到数据库客户端,通过如下命令建立同步连接

      change master to master_host=’192.168.11.140’, master_port=3306,master_user=’repl’,master_password=’repl’,master_log_file=’mysql-bin.000001’,master_log_pos=0;

      加粗部分从master的show master status可以找到对应的值,不能随便写。

    4. 执行 start slave

    5. show slave status\G;查看slave服务器状态,当如下两个线程状态为yes,表示主从复制配置成功

      Slave_IO_Running=Yes

      Slave_SQL_Running=Yes

原理

  1. master记录二进制文件至binlog中
  2. slave将master的binlog拷贝到自己的中继日志中(I/O线程)
  3. SQL线程读取中继日志,并进行数据更新

在这里插入图片描述

binlog格式

  • statement:基于sql语句模式;优点:文件较小;缺点:部分sql方法无法使用,如uuid,now()

  • row:基于行模式,记录每一条修改的值;优点:数据一致;缺点:文件过大

  • mixed:混合模式;优点:结合以上两种格式的优点,mysql自行选择;缺点:可读性较差

  • 修改方式:

    1. 修改binlog_formater,通过在mysql客户端输入如下命令可以修改

      set global binlog_format=’row/mixed/statement’;

    2. 在vim /etc/my.cnf 的[mysqld]下增加binlog_format=‘mixed’

延时问题

问题:

  1. 当master库tps比较高的时候,产生的DDL数量超过slave一个sql线程所能承受的范围,或者slave的大型query语句产生锁等待

  2. 网络传输: bin文件的传输延迟

  3. 磁盘的读写耗时:文件通知更新、磁盘读取延迟、磁盘写入延迟

解决方式:

  1. 在数据库和应用层增加缓存处理,优先从缓存中读取数据

  2. 减少slave同步延迟,可以修改slave库sync_binlog属性;

    sync_binlog=0 文件系统来调度把binlog_cache刷新到磁盘

    sync_binlog=n

  3. 增加延时监控

    Nagios做网络监控

    mk-heartbeat

Mycat应用实战

主要的配置文件为server.xml,schema.xml,rule.xml

  • server.xml:作为服务提供者的相关服务连接等配置
  • schema.xml:配置连接的分库分表的信息
  • rule.xml:分片规则的配置,也可自定义

具体参见如下文档

Mycat权威指南

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值