zoukankan      html  css  js  c++  java
  • [ZZ]MySQL分表分块到主从

    1. 记得大学的时候搭建一个网站,数据库,开发环境,web服务一股脑全部在一台机器上,用几个数M的大图片做webpage的背景,觉得很cool。没有访问就没有数据库优化问题。

    2. 以MySQL为例,当一个table中有数百万条记录的时候,查询自然就会越来越慢。这时通常做的就是分库分表。
    分库:垂直拆分
    简单的说就是将1个DB中不同的table人为的分离到不同的DB。
    比如:DB中存有用户信息和群信息2个table,用户又属于一个群。把原来的1个DB分成2个。一个存用户DB,一个群DB,这就是分库。
    优势:对于不同的库可以有不同的操作逻辑,自然分散数据库压力。
    问题:不能跨库查询,不能保证数据的一致性和完整性。例如,插入用户信息的同时应该把用户加入群中。分库后设计2个DB的操作。不能用transaction来完成。

    分表:水平拆分
    我们有一个user的table,因为它过大。我们按照userID这个字段的最后一位来拆分。将user拆分为user_0, user_1...user_9。这样也可以分散压力。不过程序上的复杂度也会提高。
    拆分的Rule是非常重要,要考虑到各个表的平衡和可扩展性。
    CREATE TABLE user (id INT, name DECIMAL(7,2), date DATE) ENGINE=INNODB
    PARTITION BY HASH(MONTH(date)) PARTITIONS 12;
    上面就是一个按照月份拆分的例子。

    Memcached(缓存技术)+ 分库分表 是初期用来缓解数据库压力的办法。

    3. 主从设置,MySQL Replication为例。
    一主多从:
    一般来说是由一台主库和多台从库组成,从库可以作备份和容灾,当主库出现故障时,从库就手动变成主库。
    (1)对Master(主库)的操作都记录在log中。
    (2)Slave(从库)将主库的log events拷贝到自己的relay log中。
    (3)Slave重做log中的事件,反映在从库中。
    一般写操作master,读从slave中取得。多个slave可以分流查询的压力。一般主从的设置都是配合Proxy或Amoeba来操作,下面将介绍。

    具体设置参考:


    主从+MySQL Proxy(MySQL Amoeba)
    在主从设置的基础上,还可以通过使用Proxy或Amoeba来将读写分离,从而减轻数据库压力。



    以Mysql Proxy为例。Proxy相当于一个处于Client和Server之间的连接器。由Lua脚本写成。使用其可以将读写分离。对于写的操作,我们让master来处理,写之后Slave自动同步master的更改。而对于读,我们用slave来处理。

    多主多从:
    多主多从的设置,是一个loop环形,每个DB既是前一个DB的Slave又是后一个的Master。
    注意的地方就是在对各个DB做插入操作时,要设置好auto_increment_increment和auto_increment_offset.为了防止最后merge时出现的主键冲突错误。
    优势: 一个Master挂掉,也还可以继续DB操作。每个DB都可以进行读写,分散压力。
    多主多从的设计,写操作不在只能在一个master上进心,而是可以在任何DB上进行。读的操作压力也可以更好的分散到各个DB中。

    原地址:

    http://blog.sina.com.cn/s/blog_7e89c3f501012vpr.html

  • 相关阅读:
    VBOX虚拟化工具做VPA学习都很方便硬件信息完全实现真实模拟
    Dynamics CRM2016 使用web api来创建注释时的注意事项
    Dynamics CRM build numbers
    域控制器的角色转移
    辅域控制器的安装方法
    利用QrCode.Net生成二维码 asp.net mvc c#
    给现有的word和pdf加水印
    利用LogParser将IIS日志插入到数据库
    短文本情感分析
    Dynamics CRM Ribbon WorkBench 当ValueRule的值为空时的设置
  • 原文地址:https://www.cnblogs.com/njujerry/p/4667873.html
Copyright © 2011-2022 走看看