首页 » MySQL » mysql架构总结

mysql架构总结

 

数据存储

1、nosql:redis,memcached,mongodb
leveldb:持久化存储,本地,不能通过网络访问,150G的数据是可以的,大于这个数可能会有些问题,随机写40万/秒,随机读6万/秒,所以写操作更好,更适合多写的场景
SSDB:在leveldb基础上,增加了网络支持,目标是替代redis,支持主从,主主复制,连接性能没有redis好,但存储量很大。
时间序列数据库:数据格式里包含timestamp,

二、mysql
做完主从的第一步是从库设置 read-only

 

主从延迟缓解方法:
1)、从库SSD硬盘
2)、尽量避免主库大量的写入,异步写
3)、主库和从库直接使用专用网络,高速互联
4)、对于数据一致性要求严格的,不要查从库
5)、减少从库压力,例如使用多个从库

主从有时也需要延迟,主从延迟设置:
stop slave;
CHANGE MASTER TO MASTER_DELAY = 600;#600秒
start slave;

经验:
1. 生产应用的mysql用户,不允许delete权限,授权insert update select就可以了,delete可以用update 更改状态。
2.有条件的情况下可以做一个延迟一小时的从库。(有时候测试对数据对比可以用到,误删除的时候可以用到)

3.所有DML操作必须备份
写一个脚本,dml_backuo.sh table_name 传一个表名就备份哪个表。

4.有些公司数据库操作必须有两个脚本:
修改脚本
数据回滚脚本

三、mysql复制方案及应用场景(手动切换)
可参考文章:http://mp.weixin.qq.com/s/B30SScTCUQ85vfDSfCsNBw
1、一主一从,高可用
架构说明:最传统的一主一从,如果主库发生故障,手动将从库提升为主库,从库仅用于故障恢复或者说备份。

2、一主一从,读写分离
架构说明:还是一主一从,在客户端实现读写分离,不过需要注意主从延时的情况。
小技巧:在写比较度的表上可以在Master不建立索引,而在Slave端来建立索引。因为不建立索引,insert会比较快,slave建立索引,读会比较快,主从是不会冲突的,除非主库也建立了同样的索引。

3、一主多从,读写分离
架构说明:和一主一从类似,在读请求比较多的情况下,可以增加MySQL从节点。
小技巧:可以在客户端实现多个从节点的轮询和权重的设置。

4、一主多从,负载均衡

架构说明:在对读需求场景比较多的情况下,为了不频繁的对客户端进行配置变更,可以在从库前端放置负载均衡。不过在slave比较多的时候。主从复制也会给MySQLMaster带来一些性能上和带宽上的压力。
小技巧:给Slave分配不同的角色。例如之前公众号文章说的延迟从库、灾备从库、数据仓库等

5、主主复制,双写(用的不多)
架构说明:主主复制其实就是MySQL的双向复制,两台机器互为主从,双主可以同时写,不过要处理好自增ID重复问题,例如设置使用奇偶插入 。

6、主主复制,单写
架构说明:还是主主复制,不过这次单写,也就是双主当主从。既可以保证写的高可用,又可以保证读的高可用。
小技巧:这个是两台机器的最佳方案哦。

7、双主双从
架构说明:在主主复制,单写的时候。如果一个主宕机,那么就读写另外一个主。可读的节点就剩下了一个。对于读需求比较多的业务可能会有问题,那么双主双从就可以解决这个问题。
小技巧:复杂的架构带的肯定是运维的难题哦。

以上故障都是手动切换

四、主从自动切换方案
1、mysql mmm
实践说明:最好不要用,有时候很正常,会去切,导致主从不同步,所以经常要手动去同步。

2、mysql mha
比mmm更稳定一些,保证数据一致性上会更好 。

五、mysql DAL中间件
可参考:https://www.unixhot.com/article/75
1、mysql-proxy
2、atlas(360开源的,在mysql-proxy上的二次开发)
3、cobar(阿里开源的数据库中间件)
4、mycat (阿里基于cobar的二次开发)

六、mysql集群
1、MySQL Cluster(强烈不推荐)
2、 Percona XtraDB Cluster方案(推荐)

七、监控mysql
可以用天兔,还可以用percona的工具
网址:

percona-toolkit工具,可以监控系统一些东西, 主要是监控mysql一些状态,慢查询之类的
常用命令:
pt-mysql-summary查询状态
pt-query-digest慢日志分析
pt-slave-find主从状态
pt-slave-delay从延迟状况
pt-online-schema-change在线进行dml操作,防止死锁:
1)、创建一个和你执行alter表相同的表结构 tmp
2)、执行tmp表结构修改,从原表copy数据到修改后的表
3)、在原表上创建触发器,将copy过程中产生的数据,更新到新表。
4)、copy完成。rename(把原表改成其他的,把tmp表改成原表)

xtraBackup备份工具(基于innodb),innobackupex可以备份myisam引擎表。
生产中做mysql主从,可以利用这个代替mysqldump这一步。

实践经验:当一个表的数据很大如,10w条以下,要做表结构修改的时候,需要注意,先要测试,不然业务会全部挂掉,为什么呢?
因为当表非常大的时候,做alter table的时候,可能需要很长时间,alter table的时候会锁表,导致select,或其他的操作这个表都在等待,当访问量大的时候,等待的就多了,会导致数据库连接数满,连接数满了,访问其他的表也访问不了,所以全部挂掉了。

原文链接:mysql架构总结,转载请注明来源!

1