[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

posted @ 2015-07-22 16:36  进击的小孩  阅读(477)  评论(0编辑  收藏  举报