负载均衡简介
从设备
角度实现负载均衡:
- 硬件负载均衡:
由专门的负载均衡器
服务提供商,在你的服务器和外部网络之间架设 服务商的负载均衡器
。服务商提供设备和方案帮你处理流量的均衡,不过因为比较费钱包国内没什么人用
- 软件负载均衡:
包括家喻户晓的Nginx
,LVS
,Tengine(阿里版Nginx)
。优点就是成本比较低,但需要运维去配置、维护。会踩坑,但国内都在用基本上网找就有解决方案
。
随机负载均衡
无论是Nginx
,LVS
均衡负载的核心在于网络 io 复用
,负载均衡算法
。其中均衡算法又分为随机
,轮询
,加权轮询
,哈希
,而随机负载均衡算法
就是本文的重点。
随机负载均衡:意味没有规律,随机在服务器队列
中获得一台服务器处理请求。其代码实现如下:package main
import (
"fmt"
"math/rand"
)
// 接口定义
type LoadBalance interface {
//选择一个后端Server
//参数remove是需要排除选择的后端Server
Next(remove []string) *Server
//更新可用Server列表
UpdateServers(servers []*Server)
}
// 后端Server定义
type Server struct {
//主机地址
Host string
//主机名
Name string
Id int
//主机是否在线
Online bool
}
type LoadBalanceRandom struct{
servers []*Server
}
// 实例化 随机均衡负载
func NewLoadBalanceRandom(servers []*Server) *LoadBalanceRandom{
newBalance := &LoadBalanceRandom{}
newBalance.UpdateServers(servers)
return newBalance
}
//选择一个后端Server
func (r *LoadBalanceRandom) Next() *Server {
if len(r.servers) == 0 {
return nil
}
curIndex := rand.Intn(len(r.servers))
return r.servers[curIndex]
}
func (r *LoadBalanceRandom) Get(key string) (*Server, error) {
return r.Next(), nil
}
//系统运行过程中,后端可用Server会更新
func (this *LoadBalanceRandom) UpdateServers(servers []*Server) {
newServers:=make([]*Server,0)
for _,e:=range servers {
if e.Online==true {
newServers=append(newServers,e)
}
}
this.servers=newServers
}
测试 随机负载均衡
输出func main() {
count:=make([]int,4)
servers:=make([]*Server,0)
servers=append(servers,&Server{Host:"1",Id:0,Online:true})
servers=append(servers,&Server{Host:"2",Id:1,Online:true})
servers=append(servers,&Server{Host:"3",Id:2,Online:true})
servers=append(servers,&Server{Host:"4",Id:3,Online:true})
lb:=NewLoadBalanceRandom(servers)
// 创建4个Server,随机选择100000次。查看4台机器 被选中次数
for i:=0;i<100000;i++{
c:=lb.Next()
count[c.Id]++
}
fmt.Println(count)
}
// 4 个服务器选择的次数都是相对平均
[25058 24947 25105 24890]