两台MySQL之间互为彼此的从库,同时又是主库 。这种方案,既做到了访问量的压力分流,同时也解决了“单点故障”问题 。任何一台故障,都还有另外一套可供使用的服务 。
不过,这种方案,只能用在两台机器的场景 。如果业务拓展还是很快的话,可以选择将业务分离,建立多个主主互备 。
三、 MySQL数据库机器之间的数据同步
每当我们解决一个问题,新的问题必然诞生在旧的解决方案上 。当我们有多台MySQL,在业务高峰期 , 很可能出现两个库之间的数据有延迟的场景 。并且,网络和机器负载等,也会影响数据同步的延迟 。我们曾经遇到过 , 在日访问量接近1亿的特殊场景下 , 出现,从库数据需要很多天才能同步追上主库的数据 。这种场景下,从库基本失去效用了 。
于是,解决同步问题,就是我们下一步需要关注的点 。
1. MySQL自带多线程同步
MySQL5.6开始支持主库和从库数据同步,走多线程 。但是,限制也是比较明显的,只能以库为单位 。MySQL数据同步是通过binlog日志,主库写入到binlog日志的操作 , 是具有顺序的,尤其当SQL操作中含有对于表结构的修改等操作 , 对于后续的SQL语句操作是有影响的 。因此 , 从库同步数据,必须走单进程 。
2. 自己实现解析binlog , 多线程写入 。
以数据库的表为单位,解析binlog多张表同时做数据同步 。这样做的话 , 的确能够加快数据同步的效率,但是,如果表和表之间存在结构关系或者数据依赖的话,则同样存在写入顺序的问题 。这种方式,可用于一些比较稳定并且相对独立的数据表 。
国内一线互联网公司,大部分都是通过这种方式,来加快数据同步效率 。还有更为激进的做法,是直接解析binlog,忽略以表为单位 , 直接写入 。但是这种做法,实现复杂,使用范围就更受到限制,只能用于一些场景特殊的数据库中(没有表结构变更,表和表之间没有数据依赖等特殊表) 。
四、 在Web服务器和数据库之间建立缓存
实际上,解决大访问量的问题,不能仅仅着眼于数据库层面 。根据“二八定律”,80%的请求只关注在20%的热点数据上 。因此,我们应该建立Web服务器和数据库之间的缓存机制 。这种机制,可以用磁盘作为缓存,也可以用内存缓存的方式 。通过它们,将大部分的热点数据查询,阻挡在数据库之前 。
1. 页面静态化
用户访问网站的某个页面,页面上的大部分内容在很长一段时间内,可能都是没有变化的 。例如一篇新闻报道,一旦发布几乎是不会修改内容的 。这样的话,通过CGI生成的静态html页面缓存到Web服务器的磁盘本地 。除了第一次,是通过动态CGI查询数据库获取之外,之后都直接将本地磁盘文件返回给用户 。
在Web系统规模比较小的时候 , 这种做法看似完美 。但是,一旦Web系统规模变大,例如当我有100台的Web服务器的时候 。那样这些磁盘文件,将会有100份,这个是资源浪费 , 也不好维护 。这个时候有人会想 , 可以集中一台服务器存起来,呵呵,不如看看下面一种缓存方式吧 , 它就是这样做的 。
2. 单台内存缓存
通过页面静态化的例子中,我们可以知道将“缓存”搭建在Web机器本机是不好维护的 , 会带来更多问题(实际上 , 通过PHP的apc拓展,可通过Key/value操作Web服务器的本机内存) 。因此,我们选择搭建的内存缓存服务,也必须是一个独立的服务 。
内存缓存的选择,主要有redis/memcache 。从性能上说,两者差别不大,从功能丰富程度上说 , Redis更胜一筹 。
推荐阅读
- 手机模拟游戏推荐,模拟手机游戏排行榜推荐
- gis是电负性气体吗,gis是电负性气体吗知乎
- 开发ios游戏视频教程,iphone游戏开发
- 虚拟主机申请服务,虚拟主机服务商介绍
- 怎么修改mysql端口号 怎么更改mysql的端口号
- 360路由器充电口怎么拆,360路由器怎么安装和设置
- 多进程mysql数据库死锁,mysql多进程多线程
- 云电脑怎么显示隐藏文件,云电脑怎么隐藏虚拟键盘
- mysql怎么驱动 mysql驱动放在哪里