负载均衡的基本思路:在一个服务器集群中尽可能地平均负载量,通常的做法时在服务器前端设置一格负载均衡器(一般是专门的硬件设备)负载均衡器将请求的连接路由到最空闲的可用服务器。一个典型的大型网站负载均衡设置,一个负载均衡器用于HTTP流量,另一个用于MySQL访问。负载均衡有五个常见目的:
- 可扩展性
- 高效性
- 可用性
- 透明性
- 一致性
直接连接
有人认为负载均衡就是配置在应用和MySQL服务器之间的东西,但这并不是唯一的负载均衡方法。也可以在保持应用和MySQL连接的情况下使用负载均衡。事实上,集中化的负载均衡系统只有在存在一个对等置换的服务器池时才能很好的工作。除了一些特定逻辑,应用为负载均衡做决策是非常高效的。
1. 复制上的读/写分离
MySQL复制产生了多个数据副本,你可以选择在备库还是主库上执行查询,由于备库复制是异步的,因此主要的难点就是如何处理备库上的脏数据。应该将备库用作只读的,而主库可以同时处理读和写查询。
比较常见的读/写分离方法如下:
- 基于查询分离
将所有不能容忍脏数据的读和写查询分配到主动或主库服务器上,其他的查询分配到备库或被动服务器上。该策略很容易实现,但事实上无法有效地使用备库,因为只有很少的查询能容忍脏数据。
- 基于脏数据分离
这是对基于查询分离方法的小改进,让应用检查复制延迟,以确定备库数据是否太旧。许多报表类应用都使用这个策略。
- 基于会话分离
- 基于版本分离
- 基于全局版本/会话分离
2. 修改应用的配置
分发负载的方法是重新配置应用。需要修改一些代码,包括配置文件修改,通过文件副本或代码控制更新命令“发布”到其他服务器上。
3. 修改DNS名
这是一个比较粗糙的负载均衡技术,但对于简单的应用,为不同的目的创建DNS还是很实用的。最简单的方法是只读服务器拥有一个DNS名,而给负责写操作的服务器起另外一个DNS名。
4. 转移IP地址
一些负载均衡解决方案依赖于在服务器间转移虚拟地址,通过ARP(地址解析协议)命令强制使IP地址的更改快速而且原子性地通知到网络上。
引入中间件
上面讨论的方案都是假定跟MySQL服务器直接相连的,但许多负载均衡解决方案都会引入一个中间,作为网络通信的代理。他一边接受所有的通信请求,另一边将这些请求派发到指定的服务器上,然后把执行结果发送回请求的机器上。
1. 负载均衡器
MySQL连接都只是正常的TCP/IP连接,所以可以在MySQL上使用多用途负载均衡器,但由于缺少MySQL专有的特性,因此会多一些限制。
- 除非负载均衡器知道MySQL的真实负载,否则在分发请求时可能无法做到很好的负载均衡。
- 许多负载均衡器知道如何检查一个HTTP请求并把会话“固定”到一个服务器上以保护在Web服务器上的会话状态。负载均衡器可能并不知道如何把所有从单个HTTP会话发送的连接请求“固定”到一个MySQL服务器上。
- 连接池和长连接可能会阻碍负载均衡器分发请求。
- 多用途负载均衡器只会针对HTTP服务器做健康和负载检查。一个简单的负载均衡器最少能够核实服务器在一个TCP端口上接受的连接数。
2. 负载均衡算法
- 随机
- 轮询
- 最少连接数
- 最快响应
- 哈希
- 权重
一主多备间的负载均衡
一主多备的架构不太有很好的可扩展性,但可以通过一些办法结合负载均衡来获得很好的效果。
- 功能分区
- 过滤和数据分区
- 将部分写操作转移到备库
- 保证备库跟上主库
- 同步写操作