分布式系列十四: 分库分表

分库分表是为了应对业务系统在高并发,大数据量背景下而对数据存储进行的优化.

关于分表, 本人使用过SQLSERVER数据库有分区表, 表分区比起人为按一定策略分表有一定优势, 而且生产环境中表分区也一直运行良好. sqlserver2000有分区视图的概念, 而分区视图实际就是建立在分表基础上的, 为遵循分表策略的一系列表提供了一个统一的入口.

使用表分区或分表方案各有利弊, 具体还需视情况做权衡.

为什么要分库分表

  • 提高查询性能
  • 容量提升

分库分表的方法

  • 垂直切分

    1. 垂直分库: 按照业务领域拆分, 每个库都存储了该业务领域内的数据. 这解决了表过多的问题
    2. 垂直分表: 解决了表中列过多的问题. 避免表过宽导致的查询性能问题.
  • 水平切分

    防止表的数据量过大, 拆分的表结构完全相同, 也就是将数据分布到不同的表中, 可以是同一个库, 也可以是不同库.

拆分策略

  • 垂直拆分: ER(Entity Relationship)分片, 需要注意相关的表拆分到同一个库, 防止join问题.
  • 水平拆分
    1. 一致性hash(注意节点变化导致的问题)
    2. 范围 一般按自增id
    3. 日期

拆分带来的问题

  1. 跨库join;

    解决方案: 设计前尽量考虑; 服务层调用; 使用全局表; 字段冗余;

  2. 跨表排序
  3. 唯一主键

    自增id导致的重复.
    UUID: 性能较低
    snowflake: 雪花算法
    zookeeper,redis,mongoDB
    数据库表

  4. 分布式事务

    互联网很少使用强一致性分布式事务, 但使用时就必须考虑.

分库分表的难度在于业务

如何权衡当前公司存储需要优化

  • 提前规划 (主键, join问题提前解决)
  • 单表数据超过1000w, 且还在增长

表分区的缺点

  • 分区字段不灵活, 可能导致表锁
  • 关联查询的性能可能不高
  • 自己分库分表有更大灵活性, 表分区将查询执行计划交给mysql, 对开发人员透明, 可能不好优化.

MySql 主从

可参看这篇文章

针对写少读多的情况. 可以配置多个只读从库, 使用HaProxy做负载均衡.

安装MySql

apt-get install mysql-server 安装最新版本的mysql
service mysql start 服务方式启动 或者转到目录/usr/bin使用 ./mysqld_safe &启动
service mysql stop 关闭, 或者使用mysqladmin -u root shutdown

GRANT ALL PRIVILEAGES ON *.* TO ‘root‘@‘%‘ INDENTIFIED BY ‘root‘ WITH GRANT OPTION 授权外网访问

主从配置

从节点创建用户 create user repl identified by ‘repl‘
从节点授权 grant replication slave on *.* to ‘repl‘@‘%‘ identified by ‘repl‘

mysql的数据文件和二进制文件: /var/lib/mysql/
mysql配置文件: /etc/mysql/my.cnf
mysql的日志文件: /var/log/mysql/mysql.log

配置文件中my.cnf中:

主配置:

log-bin=mysql-bin  //开启日志文件
server.id=123  //唯一id

show master status; 可以查看文件名称

从配置:

server.id=124
relay-log=slave-relay-bin  //打开中继日志
relay-log-index=slave-relay-bin.index
read-only=1 //只读

从节点指定主服务器节点:

change master to master_host=‘192.168.11.123‘,master_port=3306,master_user=‘repl‘,master_password=‘repl‘,master_log_file=‘mysql.bin.000001‘,master_log_pos=154;

master_log_file=‘mysql.bin.000001‘,master_log_pos=154;就是使用show master status;查询到的信息.

从节点启动slave: start slave;
从节点查看状态: show slave status;

主从同步原理

Slave 中有两个线程, IO和SQL, 分别用来同步日志文件和执行sql.

master -> 写binlog -> slave IO/Thread -> replylog -> SQL/Thread -> slave DB

mysqlbinlog --base64-output=decode-rows -v mysql-bin.00001 用来查看binlog日志文件内容

日志文件的存储与kafka的日志优点类似, 顺序存储, 分文件存储.

binlog文件的格式:

  • statement 基于sql语句, 如update A set name=name+‘-‘; effect row 1000
  • row 基于行模式, 存在1000条数据变更, 记录变化的值 默认为row
  • mixed 混合模式, mysql自行处理.

show binlog events in ‘mysql-bin.00001‘ 查看日志文件的事件
show variablees like ‘%log%‘ //查看日志模式 statement row mixed
set global binlog_format=‘minxed‘ //设置模式 或者在配置文件中指定binlog_format=minxed

双主

都可以写数据, 可能存在数据不一致.

主从同步的问题

  • 数据同步延时, 大量数据同步, 网络问题, IO阻塞
  • 延时监控: Nagios, mk-heartbeat
    redis可以提供应用层解决方案

原文地址:https://www.cnblogs.com/walkinhalo/p/10740781.html

时间: 2024-10-29 21:08:45

分布式系列十四: 分库分表的相关文章

【干货】浅谈分布式数据库中间件之分库分表

分库分表,顾名思义就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上.那么关于分库分表,你了解多少呢?接下来,我们将从什么是数据分片及如何进行分片两方面对DDM分库分表做一个阐释.什么是数据分片 分片是解决数据库存储容量限制的直接途径.分片包括垂直分片与水平分片两种方式. 垂直分片 垂直分片又叫纵向分割,即以逻辑表为单位,把原有数据库切分成多个数据库.切分后不同的表存储在不同的数据库上. 垂直分片与业务架构设计有密切的联系.比如从业务领域对系统进行架构优化

Oracle学习(十四)分表分区

本文借鉴:Oracle亿级数据查询处理.Oracle 分区表使用和查询.垂直分区+水平分区(特此感谢!) 一.前言 大数据量的查询,不仅查询速度非常慢,而且还会导致数据库经常宕机,在尝试添加索引及查询方式修改后,还有没有更有效的解决方案呢? 分库.分表.分区这些概念咱就应该了解一下. 二.分表 假如一个大型商城有一个订购关系表,每个用户的订单都落在这个表里面,那么时间一长,要进行查询的时候,肯定慢得要死,这样的系统给客户用,那就凉凉思密达了... 拆分思想 咱可以对这个总表进行拆分,例如对年进行

数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量

当团队对系统业务和数据库进行了细致的梳理,确定了切分方案后,接下来的问题就是如何去实现切分方案了,目前在sharding方面有不少的开源框架和产 品可供参考,同时很多团队也会选择自主开发实现,而不管是选择框架还是自主开发,都会面临一个在哪一层上实现sharding逻辑的问题,本文会对这一系 列的问题逐一进行分析和考量.本文原文连接: http://blog.csdn.net/bluishglc/article/details/7766508转载请注明出处! 一.sharding逻辑的实现层面 从

数据库分库分表(sharding)系列

数据库分库分表(sharding)系列     目录; (一) 拆分实施策略和示例演示 (二) 全局主键生成策略 (三) 关于使用框架还是自主开发以及sharding实现层面的考量 (四) 多数据源的事务处理 (五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案 (一) 拆分实施策略和示例演示 第一部分:实施策略 图1.数据库分库分表(sharding)实施策略图解 1.准备阶段 对数据库进行分库分表(Sharding化)前,需要开发人员充分了解系统业务逻辑和数据库sch

数据库分库分表中间件 Sharding-JDBC 源码分析 —— 分布式主键

关注**微信公众号:[芋道源码]**有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码的疑问每条留言都将得到认真回复.甚至不知道如何读源码也可以请教噢. 新的源码解析文章实时收到通知.每周更新一篇左右. 认真的源码交流微信群. 本文主要基于 Sharding-JDBC 1.5.0 正式版 1. 概述 2.KeyGenerator 2.1 D

转数据库分库分表(sharding)系列(二) 全局主键生成策略

本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 本文原文连接: http://blog.csdn.net/bluishglc/article/details/7710738 ,转载请注明出处! 第一部分:一些常见的主键生成策略 一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键

据库分库分表(sharding)系列(一) 拆分实施策略和示例演示

本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sharding缺少基本的了解,请参考我另一篇从基础理论全面介绍sharding的文章:数据库Sharding的基本思想和切分策略 第一部分:实施策略 图1.数据库分库分表(sharding)实施策略图解(点击查看大图) 1.准备阶段 对 数据库进行分库分表(Sharding化)前,需要开发人员充分了解

数据库分库分表(sharding)系列(二) 全局主键生成策略

本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 本文原文连接: http://blog.csdn.net/bluishglc/article/details/7710738 ,转载请注明出处! 第一部分:一些常见的主键生成策略 一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键

数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案

作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一数据库按照一定的规则进行切分,把数据分散到多台物理机(我们称之为Shard)上存储,从而突破单机限制,使系统能以Scale-Out的方式应对不断上涨的海量数据,但是这种切分对上层应用来说是透明的,多个物理上分布的数据库在逻辑上依然是一个库.实现Sharding需要解决一系列关键的技术问题,这些问题主