(一)实现数据库的读写分离
1 业务需求
在服务中,只配置主库.如果遇到了高并发的现象,则主库有宕机的风险,用户大量的请求中,查询的数量是最多的.如何进行优化呢??
2 解决方案: 使用代理服务器(Amoeba)
Amoeba是一个以Mysql为底层的数据存储,并对应用提供Mysql协议接口的proxy.它集中地响应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡,读写分离,高可用性等需求.与MySql官方的MySql Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件),用SQLJEP语法书写规则,比基于lua的脚本的Mysql Proxy简单.
3 双机热备
Master:A主要的作用向从库B同步数据
从库B:向A主库同步数据
3.1调用流程
正常情况下,主库负责写库操作,从库主要负责读库操作
当主库宕机时,通过某些技术手段可以实现数据库的主从切换.这时从库即充当主库又充当从库.
运维人员将主库修复完成后启动.因为之前已经配置了双击热备的形式.这时因为从库已经运行了一段时间,其中的数据一定比主库的多,这时从库将数据同步给主库,最终实现了数据的一致.
(二)Mycat的引入(遇到数据库瓶颈,无法继续优化sql,使用Mycat)
1 Mycat是数据库的分库分表中间件,国内最活跃的,性能最好的开源软件数据库中间件!
2 Mycat的特性
♦ 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理
♦ 基于心跳的自动故障切换,支持读写分离,支持Mysql主从,以及galera cluster集群
♦ 支持分布式事务
3 数据库的优化
♦优化SQL语句---原则
a:能用单表不用关联查询.正常的数据库设计需要满足三范式要求.
b:使用关联时尽可能提早确定数据.否则会进行大量的笛卡尔积操作.直接影响程序执行性能.
c:尽可能根据主键查询
♦创建索引
对于经常查询的数据,为其创建索引文件
a: 普通索引 INDEX (id)
b: 唯一索引 UNIQUE INDEX unique_id(id ASC)
c: 全文索引 FULLTEXT INDEX fulltext_name(name)
d: 单列索引 INDEX single_name(name(20)) //索引长度为20
e: 多列索引 INDEX multi(id,name(20))
f: 空间索引 SPATIAL INDEX sp(space)
♦ 添加缓存
为经常查询的数据,将数据添加到缓存中,提高查询效率
♦ 定期转储数据
采用历史表策略 将旧的数据保存到历史表中.当前表中只维护现在使用的数据
♦ 分库分表
因为数据库瓶颈问题,无法以现在的优化策略,优化数据库,这时需要将数据库进行分库分表操作.也就是将一个数据库动态的拆分为多个数据库.
4 数据库的垂直拆和水平拆
根据不同的数据库,将有关联关系的数据表拆分到一个数据库中,将没有关联关系的数据表拆分到不同的数据库中.(根据业务拆分)
将数据库中的表数据拆分到多个数据库中得表中
Mycat 逻辑库,进行管理