数据库负载均衡
数据库负载均衡
负载均衡策略有 轮询 权重轮询 ip_hash least_conn(最小链接) url_hash等
各个负载均衡策略特点:
轮询(Round Robin)
原理:按顺序将请求依次分配给每个服务器,循环往复。
优点:简单、公平,服务器性能相近时效果较好。
缺点:忽略服务器实际负载和性能差异,可能导致部分服务器过载。
权重轮询(Weighted Round Robin)
原理:在轮询基础上,为每个服务器分配权重(如性能高的权重高),按权重比例分配请求。
优点:适应服务器性能差异,合理分配负载。
缺点:需手动配置权重,无法动态响应服务器状态变化(如突发流量)
ip_Hash
原理:根据客户端IP计算哈希值,固定将同一IP的请求定向到同一服务器。
优点:保持会话一致性(适用于无状态协议如HTTP,但需会话粘滞的场景)。
缺点:服务器增减时哈希需重新计算,可能导致会话中断;IP分布不均时负载不均衡。
最小连接(Least Connections)
原理:将请求分配给当前连接数最少的服务器。
优点:动态适应服务器负载,尤其适合长连接或处理时间差异大的场景。
缺点:需实时监控连接数,计算复杂度略高。
其他负载均衡策略
响应时间加权(Least Response Time):结合响应时间和连接数,选择最快的服务器。
随机(Random):随机选择服务器,适合简单场景。
一致性哈希(Consistent Hashing):解决哈希策略在服务器增减时的重新映射问题。
选择建议
会话保持需求:选 IP Hash 或 URL Hash。
性能差异大:选 权重轮询 或 最小连接。
动态负载敏感:选 最小连接 或 响应时间加权。
缓存优化:选 URL Hash。
以数据库主从复制 两主一从为例 步骤如下
1 在 /etc/nginx/stream.d下创建mysql-stream.conf文件,stream.d需要自己创建
vi mysql-stream.conf
文件内容如下
upstream readservers
{
#weight权重格式
#server <ip>:3306 weight=1;
#如果没有权重分配,默认轮询
server <ip>:3306;#weight=1;# 权重1(16.7%流量)
server <ip>:3306;#weight=2;# 权重2(33.3%流量)
server <ip>:3306;#weight=3;# 权重3(50%流量)
# 负载均衡算法(三选一)
#ip_hash;# 基于客户端IP哈希(会话保持)
#least_conn;# 最少连接数优先
# hash $request_uri consistent;# 基于URL哈希
}
upstream writeservers
{
# 写库集群(主库或主从)
server <ip>:3306;#weight=1;# 主库1
server <ip>:3306;#weight=1;# 主库2(双主架构时启用)
# 写库通常不需要权重除非双主架构,默认轮询即可
#least_conn;
}
2 在 /etc/nginx/stream.d下创建mysql-proxy.conf文件
# 写服务监听端口(应用连接此端口写数据)
server {
listen 33061;
proxy_pass writeservers;
proxy_connect_timeout 10s; # 连接超时时间
}
# 读服务监听端口(应用连接此端口读数据)
server {
listen 33062;
proxy_pass readservers;
proxy_connect_timeout 10s;
}
3 在nginx配置文件中 添加内容,放在顶层和http同级
vim /etc/nginx/nginx.conf
内容
stream{
include /etc/nginx/stream.d;
}
4 安装nginx-mod-stream
yum -y install nginx-mod-stream
5 重启nginx
nginx -s reload
6 登录数据库查看配置是否正常
或者编写命令直接做一百次看登陆的是那台服务器
for i in {1..100} ; do mysql -uroot -p'password' -h <ip> -P 33061 -e "select@@hostname;" 2>/dev/null ;done |sort |uniq -c

浙公网安备 33010602011771号