深入理解nginx一致性哈希负载均衡模块[下]

上接 深入理解nginx一致性哈希负载均衡模块[上]

3. 源码分析

  nginx的一致性哈希功能是通过ngx_http_upstream_hash_module来提供的,下面来整体通过ngx_http_upstream_hash_module来学习一下一致性哈希算法的实现原理。

3.1 配置指令分析

  要启用Nginx的一致性哈希负载均衡算法,你需要使用ngx_http_upstream_hash_module模块。下面是一些配置指令的详细说明:

  1. upstream指令:
upstream指令用于定义一个负载均衡的后端服务器组。
语法: upstream group_name { ... }示例:upstream backend_servers {server backend1.example.com;server backend2.example.com;...}
  1. hash指令:
hash指令用于启用一致性哈希负载均衡算法。
语法: hash key [consistent] [method=xx]key: 指定用于计算哈希值的关键字,可以是变量或固定值。
consistent (可选): 使用一致性哈希算法。
method (可选): 指定哈希算法的方法,可选值为crc32, md5, sha1,默认为crc32。示例:upstream backend_servers {hash $request_uri consistent;server backend1.example.com;server backend2.example.com;...}

  在以上示例中开启了以reqeust_uri作为key的一致性哈希负载均衡算法。

  接下去看一下指令分析的源码,首先本模块定义了一个配置指令,如下:

static ngx_command_t  ngx_http_upstream_hash_commands[] = {{ ngx_string("hash"),NGX_HTTP_UPS_CONF|NGX_CONF_TAKE12,ngx_http_upstream_hash,NGX_HTTP_SRV_CONF_OFFSET,0,NULL },ngx_null_command
};

  在nginx解析到upstream块中的hash指令的时候就回调ngx_http_upstream_hash进行指令解析,源码如下:


static char *
ngx_http_upstream_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{ngx_http_upstream_hash_srv_conf_t  *hcf = conf;ngx_str_t                         *value;ngx_http_upstream_srv_conf_t      *uscf;ngx_http_compile_complex_value_t   ccv;value = cf->args->elts;/* 第一个参数是包含动态变量的哈希key,通过ngx_http_compile_complex_value进行解析 */ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));ccv.cf = cf;ccv.value = &value[1];ccv.complex_value = &hcf->key;if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {return NGX_CONF_ERROR;}/* 获取ngx_http_upstream_module的配置信息 */uscf = ngx_http_conf_get_module_srv_conf(cf, ngx_http_upstream_module);/* init_upstream如果已经设置,表示其他负载均衡算法已经设置过了 */if (uscf->peer.init_upstream) {ngx_conf_log_error(NGX_LOG_WARN, cf, 0,"load balancing method redefined");}/* 这里设置的flags中缺少了NGX_HTTP_UPSTREAM_BACKUP,所以如果开启hash负载均衡算法,那么nginx就不能支持主备服务器模式了*/uscf->flags = NGX_HTTP_UPSTREAM_CREATE|NGX_HTTP_UPSTREAM_WEIGHT|NGX_HTTP_UPSTREAM_MAX_CONNS|NGX_HTTP_UPSTREAM_MAX_FAILS|NGX_HTTP_UPSTREAM_FAIL_TIMEOUT|NGX_HTTP_UPSTREAM_DOWN;if (cf->args->nelts == 2) {/* 如果没有第三个参数consistent,则为普通的hash负载均衡算法 */uscf->peer.init_upstream = ngx_http_upstream_init_hash;} else if (ngx_strcmp(value[2].data, "consistent") == 0) {/* 设置一致性哈希算法配置初始化的回调函数 */uscf->peer.init_upstream = ngx_http_upstream_init_chash;} else {ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,"invalid parameter \"%V\"", &value[2]);return NGX_CONF_ERROR;}return NGX_CONF_OK;
}

   上述代码最重要的步骤就是2个,一个是设置hash key,另外一个就是设置负载均衡算法配置初始化的回调函数,虽然本模块同时实现了普通哈希和一致性哈希两种负载均衡算法,由于本文的重点是一致性哈希算法,所以普通哈希负载均衡算法略过不讲了。

3.2 负载均衡配置初始化函数的实现

&esmp; 在3.1节中的配置指令解析完成后,如果开启了consistent负载均衡功能,那么就会将uscf->peer.init_upstream设置为ngx_http_upstream_init_chash。当nginx完成配置解析工作以后,因为已经加载到了upstrem中的所有server,后续还需要用这些server对启用的负载均衡算法进行初始化准备工作。

  1. 第一步是加载peer链:
    if (ngx_http_upstream_init_round_robin(cf, us) != NGX_OK) {return NGX_ERROR;}

  以上这段代码是用round-robin模块的ngx_http_upstream_init_round_robin函数加载server到peer链中,具体可以参考深入理解nginx负载均衡round-robin算法。

  1. 第二步是设置负载均衡算法的上下文初始化回调函数
us->peer.init = ngx_http_upstream_init_chash_peer;
  1. 第三步是获取用ngx_http_upstream_init_round_robin加载到的peers链:
peers = us->peer.data;
  1. 第四步是分配一致性哈希算法的虚拟节点:
npoints =<

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/731260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成对抗网络 (GAN)

生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;GAN&#xff09;是由Ian Goodfellow等人在2014年提出的一种深度学习模型。GAN由两部分组成&#xff1a;一个生成器&#xff08;Generator&#xff09;和一个判别器&#xff08;Discriminator&#xff09;&…

一文学会搭建 cli 脚手架工具

文章目录 设置工具命令package.json bin 字段注释&#xff1a;#!/usr/bin/env node设置环境变量 接收命令选项参数process 实现commander 命令行交互&#xff1a;inquirer下载项目模板&#xff1a;download-git-repo执行额外命令&#xff1a;自动安装依赖child_processexeca 体…

取证工作:如何提取和破解网络浏览器用户密码

ElcomSoft 系列软件专注于破解及恢复广泛的应用环境&#xff08;Office、数据库、归档文件、iOS等&#xff09;、系统 (EFS加密等)、磁盘&#xff08;BitLocker、FileVault 2、PGP Disk、TrueCrypt 和 VeraCrypt 加密&#xff09;及网络浏览器的加密保护&#xff0c;是数据恢复…

基于卷积神经网络的野外可食用植物分类系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细探讨了一基于深度学习的可食用植物图像识别系统。采用TensorFlow和Keras框架&#xff0c;利用卷积神经网络&#xff08;CNN&#xff09;进行模型训练和预测&#xff0c;并引入迁移学习模型…

Mac测试环境搭建

1 下载pycharm 下载地址&#xff1a;PyCharm&#xff1a;JetBrains 出品的用于数据科学和 Web 开发的 Python IDE 2 安装python3.6.8 下载地址&#xff1a;Index of /ftp/python/3.6.8/ 安装后提示错误 换一种方式&#xff1a;用conda 下载地址&#xff1a;Free Download | …

python 远程执行windows上的程序

在Python中远程执行Windows上的程序&#xff0c;可以使用pywinrm库通过WinRM协议与Windows服务器进行通信。以下是一个基本示例&#xff1a; import winrm# 创建WinRM连接参数 username your_username password your_password endpoint http://remote_host:5985/wsman # 使…

代码随想录算法训练营第五十五天|583. 两个字符串的删除操作、72. 编辑距离。

583. 两个字符串的删除操作 题目链接&#xff1a;两个字符串的删除操作 题目描述&#xff1a; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 解题思路&#xff1a; 1、确定dp数组&#x…

Oracle数据库参数文件

导读 Oracle参数文件&#xff1a;数据库配置和性能调优的关键 Oracle参数文件是数据库管理中至关重要的组成部分&#xff0c;它包含了一系列数据库配置参数的设置&#xff0c;可以影响数据库的性能、安全性和可用性。参数文件允许管理员对数据库进行定制化配置&#xff0c;以满…

ipad协议847最新版

ipad协议其实就是模拟ipad端微信的人工操作&#xff0c;跟微信服务器通信。协议的关键点主要是PB协议、mmtls、07加密算法、rqt算法、aes加密、rsa加密等&#xff0c;只要把这些点拿下&#xff0c;就可以模拟官方微信的所有功能了&#xff0c;还可以模拟android、pc、mac端的登…

数字音频工作站(DAW)fl studio 21 for mac 21.2.3.3586中文版图文安装教程

随着音乐制作行业的不断发展&#xff0c;越来越多的音乐人和制作人开始使用数字音频工作站&#xff08;DAW&#xff09;来创作和制作音乐。其中FL Studio 21是一个备受欢迎的选择&#xff0c;因为它提供了强大的音乐制作工具和易于使用的界面。 然而&#xff0c;一直以来&…

Elasticsearch的倒排索引简介

倒排索引介绍 Elasticsearch的倒排索引&#xff08;Inverted Index&#xff09;是其能够快速执行全文搜索查询的关键技术。为了理解倒排索引的工作原理&#xff0c;我们可以将其与传统的正向索引进行比较。 正向索引&#xff08;Forward Index&#xff09; 在正向索引中&…

2024 RubyMine 激活,分享几个RubyMine 激活的方案

文章目录 RubyMine 公司简介我这边使用RubyMine 的理由RubyMine 2023.3 最新变化AI Assistant 正式版对 AI 生成名称建议的支持改进了 Ruby 上下文单元测试生成 RailsRails 应用程序和引擎的自定义路径Rails 路径的自动导入对存储在默认位置之外的模型、控制器和邮件器的代码洞…

云计算中仲裁节点和仲裁可用区介绍

在云计算中&#xff0c;仲裁是指当多个节点或实例之间发生争议或冲突时&#xff0c;由一个独立的第三方机构或节点来解决争议或冲突的过程。仲裁通常用于解决云计算中的资源分配、数据一致性、服务质量等问题。 仲裁的作用主要有以下几点&#xff1a; 1. 保证资源分配的公平性…

Python数据分析实验一:Python数据采集与存储

目录 一、实验目的与要求二、实验过程三、主要程序清单和运行结果1、爬取 “中国南海网” 站点上的相关信息2、爬取天气网站上的北京的历史天气信息 四、程序运行结果五、实验体会 一、实验目的与要求 1、目的&#xff1a; 理解抓取网页数据的一般处理过程&#xff1b;熟悉应用…

基于Redis自增实现全局ID生成器(详解)

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P48 - P49 目录 全局ID生成器介绍 基于Redis自增实现全局ID 实现代码 全局ID生成器介绍 背景介绍 当用户在抢购商品时&#xff0c;就会生成订单并保存到数据库的某一张表中&#…

打破边界:深入探索STUN在实现无缝NAT穿越和WebRTC通信中的核心作用

引言 STUN是一个网络协议&#xff0c;设计用于帮助在网络地址转换&#xff08;NAT&#xff09;后面的设备发现其公网地址和端口号。通过允许这些设备发现自己从外部看到的地址&#xff0c;STUN使得它们能够在NAT或防火墙背后建立端到端的通信&#xff0c;这对于VoIP、视频会议…

python界面开发 - Checkbutton:复选框

文章目录 1. python图形界面开发1.1. Python图形界面开发——Tkinter1.2. Python图形界面开发——PyQt1.3. Python图形界面开发——wxPython1.4. Python图形界面开发—— PyGTK&#xff1a;基于GTK1.5. Python图形界面开发—— Kivy1.6. Python图形界面开发——可视化工具1.7. …

day12_SpringCloud(Gateway,Nacos配置中心,Sentinel组件)

文章目录 1 Gateway组件1.1 Gateway简介1.2 Gateway入门1.3 网关路由流程图1.4 路由工厂1.5 过滤器1.5.1 过滤器简介1.5.2 内置过滤器1.5.3 路由过滤器1.5.4 默认过滤器1.5.5 全局过滤器1.5.6 过滤器执行顺序 2 Nacos配置中心2.1 统一配置管理2.2 Nacos入门2.2.1 Nacos中添加配…

多线程多进程

秋招面试的java八股文知识点补充以及iot 这里有一点阅读补充 线程和进程区别 什么是进程? 进程 (Process) 是计算机中的一个独立执行单元&#xff0c;是操作系统资源分配的基本单位每个进程有各自独立的内存空间和资源&#xff0c;它们之间相互独立&#xff0c;相互之间不能…

中国电子学会(CEIT)2020年09月真题C语言软件编程等级考试三级(含详细解析答案)

中国电子学会&#xff08;CEIT&#xff09;考评中心历届真题&#xff08;含解析答案&#xff09; C语言软件编程等级考试三级 2020年09月 编程题五道 总分:100分一、因子问题&#xff08;20分&#xff09; 任给两个正整数N、M&#xff0c;求一个最小的正整数a&#xff…