关于nginx平滑均匀加权轮询算法的思考

缘起:http://blog.youkuaiyun.com/gqtcgq/article/details/52076997

关于nginx算法的平滑均匀性的一点分析(只考虑两个的情况,多个的可以类比)。

假设a出现的权重为M,b出现的权重为N

1均匀性:

把算法的操作分成两个,max操作(只有选中的才执行,执行后代价是要被减去total权重(M+N))和add操作(不管怎么选中都会执行)。

对于a,假设一次循环会执行k次(我们要证明k为M)max操作,每次操作减M+N的权重,一共减去k*(M+N)的权重,而无论a还是b总共的执行add次数为M+N,a每次增加的权重的为M,a一共增加的权重也为(M+N)*M,循环结束后权重为0,所以可得k等于M,对于b同理。

2平滑性:

假设M=k*N,我们这里可以把N假设成1,对于N大于1的情况,可以简化成N为1,(比如a:6和b:2简化成a:3和b:1)

这里我们考虑第一次出现N的时间点(既第几次选择出现N),由代码可知第一次出现N的条件是不可能的(我们假设M>=N的),即使M==N,我们也假设算法会先选择M。

有代码我们可以有如下的推理:

当1=<k<3时 第1次出现N

当3=<k<5时 第2次出现N

当5=<k<7时 第3次出现N
当7=<k<9时 第4次出现N

进一步分析,我们可知,

当k为偶数时,第一次出现N的位置为k/2+1(k为2时,aba;k为4时aabaa)

当k为奇数时,第一次出现N的位置为(k+1)/2+1(k为3时aaba,k为5时aaabaa)

对于N不等于1的情况,比如a:6 b:2的情况,会出现(aabaaaba,并不是aabaabaa)


原文例子中这个对于不是两个的情况

a(4) b(2) a(4) c(1) a(4) b(2) a(4)

可以理解为先是a和b(输出aba),再(ab)和c(输出abacaba)


不是精确的证明,更不是权威的分析,只是便于理解或者加深记忆,错误之处,欢迎指正,若有精确完美的证明,恳请分享。

还有一个问题,一直耿耿于怀,nginx的负载均衡有这样的代码

ngx_accept_disabled = ngx_cycle->connection_n / 8  - ngx_cycle->free_connection_n;

说的是只有当空闲的链接数大于总链接数的1/8时才会参与获取accept锁,既才会参与去竞争锁资源,不理解的是为什么这个数是1/8,也知道这个数过大比如1/2那么可能会造成该进程偷懒的情况,既进程处理的任务很少,数据过小,比如1/16,可能会造成这一次获取的处理任务数过多,导致该进程处理不过来(因为只有1/16的空闲链接,万一来的多呢),但是为什么是1/8呢?

<think>嗯,用户想了解高并发分布式架构的实现方案和技术。首先,我需要回忆一下之前学过的相关知识,并结合提供的引用内容。高并发和分布式架构涉及很多方面,比如负载均衡、数据库分库分表、缓存、消息队列等。引用里提到过垂直分库、主主复制、限流降级这些技术,可能需要详细展开。 用户可能想知道具体的实现步骤和关键技术点。比如,如何通过负载均衡分散请求压力,或者如何利用缓存减少数据库负担。另外,分布式系统中数据一致性是一个挑战,需要提到CAP理论和最终一致性方案。还有服务治理方面,比如服务注册发现、熔断机制,这些也是关键点。 还要考虑用户的实际应用场景,他们可能面临高并发下的系统瓶颈,比如数据库查询慢、服务响应延迟等。需要结合引用中的案例,比如淘宝的垂直分库策略,或者引入HDFS、Redis等组件解决特定问题。同时,引入更多组件会增加系统复杂度,这也是需要提醒用户的权衡点。 可能需要分模块来组织回答,比如架构设计原则、核心技术、数据层处理、服务治理、容灾机制,以及引入的特定场景解决方案。每个部分都要有具体的技术例子,比如Nginx负载均衡、Redis缓存、Kafka消息队列等。最后,总结应用场景和注意事项,帮助用户全面理解。</think>### 高并发分布式架构的实现方案与技术 #### 一、架构设计原则 高并发分布式架构的核心目标是提升系统的**扩展性**、**可用性**和**容错性**。根据CAP理论,需在一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)之间权衡[^1]。典型设计原则包括: 1. **水平扩展**:通过增加服务器而非提升单机性能应对高并发。 2. **冗余设计**:数据库主主复制、异地多活等提升容灾能力。 3. **服务解耦**:将系统拆分为微服务,降低单点故障影响。 #### 二、核心技术方案 1. **负载均衡** - **流量分发**:使用Nginx、HAProxy等实现请求均匀分配,支持轮询、加权轮询、最小连接数等算法。 - **DNS负载均衡**:通过域名解析将请求分散到不同地域的服务器。 2. **数据库优化** - **垂直分库**:按业务拆分数据库(如用户库、订单库),降低单库压力[^2]。 - **水平分表**:通过分片键将大表拆分到多个物理节点(如按用户ID哈希分片)。 - **读写分离**:主库处理写操作,从库通过binlog同步数据并处理读请求。 3. **缓存技术** - **Redis**:作为分布式缓存,支持热点数据预加载,降低数据库查询压力。 - **本地缓存**:使用Caffeine或Guava Cache减少远程调用。 4. **异步处理** - **消息队列**:Kafka、RocketMQ实现削峰填谷,解耦服务间依赖。 - **任务队列**:Celery处理异步任务(如发送短信、生成报表)。 #### 三、数据层关键技术 $$ TPS = \frac{N \cdot Q}{t} $$ 其中$N$为并发用户数,$Q$为单用户请求量,$t$为响应时间。提升TPS需从分子优化(减少$Q$)或分母优化(降低$t$)着手。 | 技术 | 适用场景 | 示例组件 | |---------------|--------------------------|---------------------| | 分布式文件系统 | 海量非结构化数据存储 | HDFS、Ceph | | 列式数据库 | 实时分析场景 | ClickHouse、HBase | | 搜索引擎 | 全文检索/复杂条件查询 | Elasticsearch | #### 四、服务治理机制 1. **服务注册与发现**:Consul、Nacos实现动态服务拓扑。 2. **熔断降级**:Hystrix/Sentinel防止雪崩效应,自动隔离故障服务。 3. **限流策略**: - **令牌桶算法**:Guava RateLimiter控制QPS - **漏桶算法**:平滑突发流量 #### 五、容灾与高可用 1. **多机房部署**:通过VIP(虚拟IP)实现流量切换。 2. **数据同步**:GoldenGate实现跨数据中心数据复制。 3. **混沌工程**:通过故障注入验证系统健壮性。 #### 六、特定场景解决方案 - **秒杀系统**:库存预热+Redis原子操作+请求队列 - **全局唯一ID**:Snowflake算法(64位=时间戳+机器ID+序列号) - **分布式事务**:Seata的AT模式、TCC模式或消息事务 #### 应用场景示例 - **电商大促**:通过CDN静态资源加速+限流+异步订单处理 - **社交网络**:使用图数据库(Neo4j)处理关系链 - **物联网数据**:时序数据库(InfluxDB)存储设备上报数据 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值