范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Go实现Nginx加权轮询算法

  一,Nginx 负载均衡的轮询 (round-robin)
  在说加权轮询之前我们先来简单的说一下轮询
  转自:https://segmentfault.com/a/1190000039799210
  整理:地鼠文档:www.topgoer.cn1. nginx 中的配置upstream cluster {     server 192.168.0.14;     server 192.168.0.15; }  location / {    proxy_set_header X-Real-IP $remote_addr;               //返回真实IP    proxy_pass http://cluster;                           //代理指向cluster   }2. 简单介绍
  轮询 作为负载均衡中较为基础的算法,他的实现不需要配置额外的参数。简单理解:配置文件中一共配置了 N 台服务器,轮询 算法会遍历服务的节点列表,并按照节点顺序每轮选择一台服务器处理请求,当所有节点遍历一遍后,重新开始 3. 特点
  轮询 算法中我们不难看出,每台服务器处理请求的数量基本持平,按照请求时间逐一分配,因此只能适用于集群服务器性能相近的情况,平均分配让每台服务器承载量基本持平。但是如果集群服务器性能参差不齐,这样的算法会导致资源分配不合理,造成部分请求阻塞,部分服务器资源浪费。为了解决上述问题,我们将 轮询 算法升级了,引入了 加权轮询 算法,让集群中性能差异较大的服务器也能合理分配资源。达到资源尽量最大化合理利用 4. 实现 (这里使用golang模拟实现)type RoundRobinBalance struct {     curIndex int     rss []string }  /**  * @Author: yang  * @Description:添加服务  * @Date: 2021/4/7 15:36  */ func (r *RoundRobinBalance) Add (params ...string) error{     if len(params) == 0 {         return errors.New("params len 1 at least")     }     addr := params[0]     r.rss = append(r.rss, addr)      return nil }  /**  * @Author: yang  * @Description:轮询获取服务  * @Date: 2021/4/7 15:36  */ func (r *RoundRobinBalance) Next () string {     if len(r.rss) == 0 {         return ""     }     lens := len(r.rss)     if r.curIndex >= lens {         r.curIndex = 0     }     curAdd := r.rss[r.curIndex ]     r.curIndex = (r.curIndex + 1) % lens     return curAdd }5. 测试
  简单调用下方法看看结果 /**  * @Author: yang  * @Description:测试  * @Date: 2021/4/7 15:36  */ func main(){     rb := new(RoundRobinBalance)     rb.Add("127.0.0.1:80")     rb.Add("127.0.0.1:81")     rb.Add("127.0.0.1:82")     rb.Add("127.0.0.1:83")      fmt.Println(rb.Next())     fmt.Println(rb.Next())     fmt.Println(rb.Next())     fmt.Println(rb.Next())     fmt.Println(rb.Next())     fmt.Println(rb.Next()) }  go run main.go   127.0.0.1:80 127.0.0.1:81 127.0.0.1:82 127.0.0.1:83 127.0.0.1:80 127.0.0.1:81二,Nginx 负载均衡的加权轮询 (weighted-round-robin)
  进入主题 1. nginx 配置http {       upstream cluster {           server 192.168.1.2 weight=5;           server 192.168.1.3 weight=3;           server 192.168.1.4 weight=1;       }    location / {        proxy_set_header X-Real-IP $remote_addr;               //返回真实IP        proxy_pass http://cluster;                           //代理指向cluster     }2. 加权算法简介-特点
  不同的服务器的配置,部署的应用数量,网络状况等都会导致服务器处理能力会不一样,所以简单的 轮询 算法将不再适用,而引入 了加权轮询 算法:根据服务器不同的处理能力,给每个服务器分配不同的权值,根据不同的权值将不同的服务器分配到对应的服务器上;
  请求数量较大时,每个服务处理请求的数量之比会趋向于权重之比。 3. 算法说明
  在 Nginx加权轮询算法 中,每个节点都有3个权重的变量 Weight : 配置的权重,根据配置文件初始化每个服务器节点的权重 currentWeight : 节点的当前权重,初始化时是配置的权重,随后会一直变更 effectiveWeight : 有效的权重,初始值为 weight ,通讯过程中发现节点异常,则 -1 ,之后再次选择本节点,调用成功一次则 +1 ,直到恢复到 weight。这个参数可以用于做降权。或者说是你的设置的权限修正…
  Nginx加权轮询算法 的逻辑实现 轮询所有节点,计算当前状态下所有的节点的 effectiveWeight 之和 作为 totalWeight; 更新每个节点的 currentWeight , currentWeight = currentWeight + effectiveWeight; 选出所有节点 currentWeight 中最大的一个节点作为选中节点; 选择中的节点再次更新 currentWeight, currentWeight = currentWeight - totalWeight; 4. 简单举例
  注意:实现中不考虑健康检查,即所有的节点都是100%可用的,所以 effectiveWeight 等于 weight
  假设:现在有3个节点 {A, B, C} 分别权重为:{4, 2, 1};请求7次
  第N次请求
  请求前 currentWeight
  选中的节点
  请求后 currentWeight
  1
  [serverA=4, serverB=2, serverC=1]   serverA   [serverA=1, serverB=4, serverC=2]   2
  [serverA=1, serverB=4, serverC=2]   serverB   [serverA=5, serverB=-1, serverC=3]   3
  [serverA=5, serverB=-1, serverC=3]   serverA   [serverA=2, serverB=1, serverC=4]   4
  [serverA=2, serverB=1, serverC=4]   serverA   [serverA=-1, serverB=3, serverC=5]   5
  [serverA=-1, serverB=3, serverC=5]   serverC   [serverA=3, serverB=5, serverC=-1]   6
  [serverA=3, serverB=5, serverC=-1]   serverA   [serverA=0, serverB=7, serverC=0]   7
  [serverA=0, serverB=7, serverC=0]   serverB   [serverA=4, serverB=2, serverC=1]   totaoWeight = 4 + 2 + 1 = 7   第一次请求: serverA = 4 + 4 = 8 , serverB = 2 + 2 = 4, serverC = 1 + 1 = 2; 最大的是 serverA ; 所以选择 serverA ;然后serverA = 8 - 7 = 1;最后得出:serverA=1, serverB=4, serverC=2   第二次请求: serverA = 1 + 4 = 5; serverB = 4 + 2 = 6 ; serverC = 2 + 1 = 3;最大的是 serverB ; 所以选择 serverB ; 然后 serverB = 6 - 7 = -1 ;最后得出: serverA=5, serverB=-1, serverC=3   以此类推… 5. 代码实现   以golang实现下上面的逻辑: type WeightRoundRobinBalance struct { curIndex int rss []*WeightNode } type WeightNode struct { weight int // 配置的权重,即在配置文件或初始化时约定好的每个节点的权重 currentWeight int //节点当前权重,会一直变化 effectiveWeight int //有效权重,初始值为weight, 通讯过程中发现节点异常,则-1 ,之后再次选取本节点,调用成功一次则+1,直达恢复到weight 。 用于健康检查,处理异常节点,降低其权重。 addr string // 服务器addr } /** * @Author: yang * @Description:添加服务 * @Date: 2021/4/7 15:36 */ func (r *WeightRoundRobinBalance) Add (params ...string) error{ if len(params) != 2{ return errors.New("params len need 2") } // @Todo 获取值 addr := params[0] parInt, err := strconv.ParseInt(params[1], 10, 64) if err != nil { return err } node := &WeightNode{ weight: int(parInt), effectiveWeight: int(parInt), // 初始化時有效权重 = 配置权重值 currentWeight: int(parInt), // 初始化時当前权重 = 配置权重值 addr: addr, } r.rss = append(r.rss, node) return nil } /** * @Author: yang * @Description:轮询获取服务 * @Date: 2021/4/7 15:36 */ func (r *WeightRoundRobinBalance) Next () string { // @Todo 没有服务 if len(r.rss) == 0 { return "" } totalWeight := 0 var maxWeightNode *WeightNode for key , node := range r.rss { // @Todo 计算当前状态下所有节点的effectiveWeight之和totalWeight totalWeight += node.effectiveWeight // @Todo 计算currentWeight node.currentWeight += node.effectiveWeight // @Todo 寻找权重最大的 if maxWeightNode == nil || maxWeightNode.currentWeight < node.currentWeight { maxWeightNode = node r.curIndex = key } } // @Todo 更新选中节点的currentWeight maxWeightNode.currentWeight -= totalWeight // @Todo 返回addr return maxWeightNode.addr } 6. 测试验证/** * @Author: yang * @Description:测试 * @Date: 2021/4/7 15:36 */ func main(){ rb := new(WeightRoundRobinBalance) rb.Add("127.0.0.1:80", "4") rb.Add("127.0.0.1:81", "2") rb.Add("127.0.0.1:82", "1") fmt.Println(rb.Next()) fmt.Println(rb.Next()) fmt.Println(rb.Next()) fmt.Println(rb.Next()) fmt.Println(rb.Next()) fmt.Println(rb.Next()) fmt.Println(rb.Next()) }   执行下看下结果 run main.go 127.0.0.1:80 127.0.0.1:81 127.0.0.1:80 127.0.0.1:80 127.0.0.1:82 127.0.0.1:80 127.0.0.1:81

临桂地区人居标杆,解密耀辉美好家园七大核心优势耀辉美好家园位于机场路与西城北路交汇处,新西城街口的黄金地段位置。项目占地面积为106805平方米,建设面积约36万平方米,目前规划有商业酒店写字楼商业内街游泳池运动场幼儿园地下停贯彻党代会精神服务高质量发展中原银行奋勇争先书写更加出彩新篇章文王昺南李昂催人奋进的省第十一次党代会刚刚胜利闭幕,向全省各条战线作出了在确保高质量建设现代化河南确保高水平实现现代化河南上迈出坚实步伐,奋力谱写新时代中原更加出彩的绚丽篇章的伟大亲吻一下手机就解锁?错了,华为唇动解锁技术不是这样的目前我们主流的解锁方式,不外乎输入密码面孔识别指纹识别,虹膜识别血液识别也有,但是成本太昂贵了,难以推广。然而最近,华为技术有限公司公开设备解锁方法和装置专利,公开号为CN1130理科男交答卷了,这就是我最满意的车先简单做个自我介绍,本人90后,理科男枚,已婚,家有爱妻与公主,总来说个幸福家三口。之前有辆轿车,二手,开两年,直在琢磨着换车事,本人虽说枚理科男,但并不老土,这次我也赶个潮流,入windows10如何安装3dmax教程方法大全有一位深度技术的老用户本来电脑使用的win764位旗舰版,看到深度win10系统已经更新了这么久,就想要升级windows10来测试使用一下。但是小伙伴却不知道在win10系统要如压制雷王,海盗船H100iRGBPROXT一体水冷在风冷水冷两大散热体系中,一体式水冷散热以其安装方便兼容性强散热效率高等特点受到了不少玩家的喜爱。如今伴随着冷头RGB化的趋势以及各大厂商执行漏液包赔,一体式水冷散热成为众多玩家装2020年该用WiFi6了!领势MX4200的WiFi6体验写在前面2020年如果要在数码圈评选一个热词的话,我想非WiFi6莫属了。在今年年初的小米10发布会上,雷军专门用五分钟左右的时间来讲解这个技术,这是将其作为一个相当大的卖点在宣传老镜头拍北京日本Canon851。9旁轴镜头索尼微单拍慕田峪秋色最近北京的天气不错,所以出门溜达的次数多了些,毕竟秋天可以说是北京最美的季节了。当然每次溜达的时候都已经习惯了带上我的老索尼微单和不同的镜头,进行实拍。此次实拍的地点是位于北京怀柔HUAWEIMatePad11与iPadPro2018对比推荐AppleiPadPro2018iPadPro(2018款)在外观设计上与之前的iPad有很大的差异,其取消了苹果经典的圆形Home键,第一部采用四面等边的全面屏设计。解锁方式采用U盘终结者阿斯加特AP2红矮星移动固态硬盘体验今年9月初,USBPromoterGroup正式发布了USB4标准,其主要具有三个特性,第一是USB4规范将引入双链路通道第二是传输带宽达到雷电3的40Gbps标准第三是接口类型为国产宝马X6来了,新领克05上市,全系搭载2。0T爱信8AT动力组合对于领克品牌,很多人并不陌生,作为国内市场上近几年新崛起的一个国产豪华品牌,自推出市场后,便取得了不俗的市场关注度和出色的市场表现。根据最新的销量数据显示领克汽车2021年18月份
今日头条天天给大家发钱,那今日头条的钱从哪里来的啊?今日头条是国内为数不多的百亿级媒体资讯平台,有着强大的资金,数据,流量支持,为了更好的增强用户体验以及回馈新老用户,特推出了今日头条极速版,今日头条极速版包罗万象,让人们在娱乐的同高通和中兴通讯实现5G毫米波里程碑e公司讯,高通技术公司和中兴通讯(000063)8月27日宣布,为配合和支持IMT2020(5G)推进组制定的支持200MHz载波带宽的5G毫米波测试和部署需求,双方成功展示了中国赛鸽H9里程版电动车评测搭载23Ah黑金电池,续航超过150公里对于用户来说,在选择电动车时,最关心的莫过于车辆的续航,而对此,不少电动车企业都在加大这一车型的研发与打造力度。而就在最近,行业又新推出了一款长续航电动车,其就是赛鸽H9里程版电动经常用office,是不是不适合买macbook?如果经常使用Office,不推荐用苹果电脑!如果经常使用Office,不推荐用苹果电脑!虽然说Office也有Mac版本,但和Win系统下的Office功能上还是相差得太远了。普通欧宝发布微型Rockse电动汽车一次充电行驶75公里欧洲汽车制造商欧宝发布了一款新的全电动汽车,名为Rockse,该车针对生活在城市地区的人们,他们需要一款非常小的紧凑的不产生任何排放的汽车。这款车尤其被定位为城市年轻司机,因为有了从马斯克造机器人想到的,育儿关注这一点很重要导语引导孩子不仅要敢想,还要勇于去试错。企业家工程师埃隆马斯克总是在用自己的奇思妙想去影响这个世界,继造车造火箭之后,马斯克宣布明年推出特斯拉机器人,被外界称为一款能跑腿做家务的人甲醇制氢,多此一举锂电池新能源汽车已在路上一骑绝尘,氢燃料电池汽车还在努力向正式商用进发。氢能的前景几何?氢燃料电池汽车何时可以量产上路?氢燃料供应链何时成熟?想必大家对此多少有些好奇。工信部对氢气昌米科技有限公司成立,小米造车又有大动作?日前,北京昌米科技有限公司正式成立,经营范围包括出版物批发第三类医疗器械经营药品零售销售(含网上销售)汽车零配件自行车摩托车(不含三轮摩托车)等。通过股权信息显示,北京昌米科技有限融资丨米文动力与科亿科技达成战略合作,嵌入式AI助力工业智能化升级创业邦获悉,近日,北京米文动力科技有限公司(以下简称米文动力)和安徽省科亿信息科技有限公司(以下简称科亿科技)于合肥签署战略合作协议。面对中国智造未来发展趋势,双方联手围绕工业质检市场监管总局发布公告规范新能源汽车检测收费来源央视网近期,市场监管总局组织对北京市上海市重庆市等11个城市机动车检测收费情况进行了抽查,发现部分城市在纯电动汽车检测收费中不列明具体服务项目和收费标准,将不应收取的尾气检测费百度工作人员偷偷用公司的服务器挖比特币百度服务器就是强大比特币被称之为数字黄金,因为其价值很高,2017年的时候曾经创下了历史记录,19853美元一枚。但是基于数字货币的特性,获取比特币的途径只有2种方式,一种是直接去交易所购买,再一种