上节 我们主要讲解了HAProxy的基本知识,以及事关HAProxy的重要资源。我们知道HAProxy是众多负载均衡器中非常重要的一个,而本系列文章就是围绕其使用、管理以及原理来展开。在深度学习之前,我们先安装HAProxy,运行起来,直观感受下它的魅力。

源代码下载

使用上文提供的下载链接,下载到本地服务器上:

1
$ wget http://www.haproxy.org/download/2.8/src/haproxy-2.8.3.tar.gz

编译

HAProxy的编译相当简单,不用configure、不用cmake,系统给我们提供了Makefile文件,按照指引设置make参数即可编译成功。

我们先忽略掉所有编译选项,按照下面的方法编译一个版本出来测试。至于具体选项的特定含义,以及其他高级选项,后续再慢慢道来。

阅读全文 »

HAProxy是一款开源的、高性能的、基于TCP(四层)和HTTP(七层)应用的负载均衡软件,借助HAProxy可以免费、快速、可靠地部署基于TCP和HTTP应用的负载均衡解决方案。


HAProxy作为一款专业的负载均衡软件,其主要特性如下:

  • 高可靠性和高稳定性。HAProxy同时数以万计的并发连接,对内存和CPU资源消耗较低,其性能可与硬件级F5相媲美。
  • 支持轮循、加权轮循、源地址保持、RI、rdp-cookie等多种负载均衡算法。
  • 支持url检测后端服务健康度。
  • 支持原生SSL。
  • 支持ACL。
  • 支持session保持。
  • 支持连接拒绝、全透明代理。
  • 拥有一个功能强大的服务器状态监控页面,通过此页面可以实时了解系统的运行状况。
  • 自身有完美的热备方案(与Keepalived配合部署)。

工欲善其事必先利其器,本文记录HAProxy的重要资源,通过学习这些资料深度掌握HAProxy的部署、管理和原理等方面的知识。

阅读全文 »

Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。

参考图书

书名 ISBN 作者 出版社 出版日期 备注
深入理解Nginx:模块开发与架构解析(第2版) 9787111526254 陶辉 机械工业出版社 2022年07月 P
Nginx经典实例 9787519877613 [美]德里克 中国电力出版社 2023年05月

参考网站

域名系统,Domain Name System(DNS),是将域名和IP地址相互映射的一个分布式数据库。DNS使用UDP端口53,对每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

本文记录DNS相关图书、资料和开源系统列表,以供后续的逐步深入分析。

阅读全文 »

0x01 大规模系统架构

书名ISBN作者出版社出版日期备注
亿级流量系统架构设计与实战 9787121476983 李琛 电子工业出版社 2024年05月
架构师修炼之道 9787568052702 Michael Keeling 华中科技大学出版社 2019年08月
高并发系统实战派 9787121442049 谢恩德 电子工业出版社 2022年09月
架构演变实战:从单体到微服务再到中台 9787121436123 潘志伟 电子工业出版社 2022年06月
深入理解RPC框架原理与实现 9787121420948 华钟明 电子工业出版社 2021年10月
阅读全文 »

负载均衡(Load Balance)就是将操作合理有效分解到多个操作单元执行,从而扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡有硬件负载和软件负载之分。

在大多数互联网公司中,普遍使用软件形态的负载均衡器,并且基于所处理的协议区分为两种不同的系统:

  • 四层负载均衡,也被称为网络负载均衡。仅用于对TCP、UDP流量进行处理。四层负载均衡在转发中主要基于IP地址、端口等信息。
    四层负载均衡的开源软件包括LVS、DPVS、Katran等,分别代表了三种方案:Linux内核,DPDK,eBPF。
  • 七层负载均衡,也被称为应用负载均衡。支持HTTP、HTTPS、SSL、TLS等协议的处理。
    七层负载均衡在转发中可以利用应用层的信息,如HTTP的请求头部,而这些信息对四层负载均衡来说是不可见的。
    七层负载均衡的开源软件包括Nginx、HAProxy、BFE、Traefik、Envoy等。
阅读全文 »

上文我们使用apt安装了Thrift开放框架,apt仓库中的Thrift是0.16.0版本,并不是官方最新版本。如果为了使用新的特性,我们需要自行编译最新版本。本文介绍采用从源代码编译的方式,来安装Thrift-0.19.0版本。

阅读全文 »

Thrift在Ubuntu/Debian系统上的安装一般有两种方式:

  • 一是APT仓库安装,简单方便,但这种方式安装的软件并非官方最新版本,版本更新有一定延迟;
  • 二是从源代码编译安装,可以编译使用最新特性版本,但过程略显复杂,需要有一定的技术功底;

读者自行选择某种方法,本文介绍apt安装方法。

安装

参考安装指南:
https://thrift.apache.org/docs/install/debian.html
https://d3s.mff.cuni.cz/files/teaching/nswi080/labs/Files/prepare-2thrift-en.html

阅读全文 »

Thrift is a software framework for scalable cross-language services development. It combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml.

Thrift是一个可扩展、跨语言的服务开发框架。它使用代码生成引擎,形成了一个可以高效和无缝连接Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml等语言的开发栈。

Thrift使用IDL描述语言来定义软件服务,并经过它的编译器将IDL服务翻译成骨架文件以及通信协议代码。它通常被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。

阅读全文 »

系统编程

系统编程是指编写系统软件,其代码在底层运行,直接跟内核和核心系统库对话。

书名ISBN作者出版社出版日期备注
Linux/UNIX系统编程手册 上下册 9787115328670 [德]Michael Kerrisk 人民邮电出版社 2022年04月 P
Linux系统编程 第2版 9787115346353 [美]Robert Love 人民邮电出版社 2022年03月 P
Linux系统编程 9787111716617 [瑞]Jack-Benny Persson 机械工业出版社 2023年01月
Linux内核编程指南 第三版 9787302092940 [美]拜克/鲍姆 清华大学出版社 2004年11月 P
Linux内核编程 9787115251947 [美]罗德里格斯 人民邮电出版社 2011年05月 P
Linux环境编程:从应用到内核 9787111536109 高峰 机械工业出版社 2016年06月 P

Google Test,简称gtest,是Google出品的C++单元测试框架。基于该框架,我们可以编写和运行单元测试、集成测试和功能测试。我这一系列的博文,重点讲解gtest的使用方法和实现原理。

阅读全文 »

参考图书

书名ISBN作者出版社出版日期备注
防火墙和VPN技术与实践 9787115594723 李学昭 人民邮电出版社 2022-11-01
交换机.路由器.防火墙(第3版) 9787121252044 刘晓辉 电子工业出版社 2015-01-01 P,W
华为防火墙技术漫谈 9787115390769 徐慧洋/白杰/卢宏旺 人民邮电出版社 2021-01-01 P,W
Linux防火墙 第4版 9787115436337 [美]史蒂夫.苏哈林 人民邮电出版社 2016-11-01 P,W
Designing and Implementing Linux Firewalls

with Qos Using Netfilter, Iproute2, Nat and L7-Filter

9781904811657 Lucian Gheorghe Packt Publishing 2006-10-31 P
阅读全文 »

创建Windows可执行程序之后,在有些使用场景下不需做成安装包,而是期待直接双击即可运行。我们可以将exe、dll等资源打包成压缩包,用户解压之后再运行exe文件;或者使用WinRAR软件将所有资源打包成自解压可执行程序。本文主要介绍后者。

阅读全文 »

printf是一套家族函数,是C语言标准库函数,定义于头文件stdio.h,其定义如下所示:

1
2
3
4
5
6
7
#include <stdio.h>

int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int dprintf(int fd, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);

printf的format参数是格式控制字符串,它包含两种字段:一是普通字符串,打印时原样输出;二是控制字段,打印时使用可变变量…指定的参数数据,来替换对应的控制字段。两种字段相结合,形成结果字符串,然后printf将结果字符串打印到标准输出。

阅读全文 »

(extern 变量) (extern 函数) 解析

这种情况下的extern说明变量或者函数声明在其他的源文件里,而不用include头文件的方式来引用该函数,在链接时,链接器在各个模块中搜索这个变量或者函数来进行最终链接。

(extern “C”) 解析

使用这种extern的情况多发生在使用C++调用由C写成的函数库时,此时编译过程中常发生编译器找不到C函数的问题,从而导致链接失败。为了解决这种情况,才引用了extern “C”这种用法。

那为什么又会出现这种链接失败的情况呢?简单来是由于g++和gcc生成函数名称方式的不同造成的。C++语言在编译的时候为了解决函数的多态问题,不会直接使用程序中书写的函数名称,而会使用一种特别的方法经过中间变换过程生成一个全局唯一函数名。C库函数是没有经过函数名称变换得来的,当C++使用经过变换的函数名称去调没有变换过的函数时,肯定会出现链接失败的情况。

这种特殊的转换方法叫做“名称的特殊处理(Name Mangling)”,比如C++将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,这是一个用C写成的库文件,请用C的方式来链接它们。

阅读全文 »

0x01 时间函数之间的关系

1
2
3
4
5
6
7
8
9
10
11
12
struct tm
{
int tm_sec; // 代表目前秒数,正常范围0-59,但允许至61秒;
int tm_min; // 代表目前分数,范围为0-59。
int tm_hour; // 从午夜算起的小时数,范围为0-23。
int tm_mday; // 目前月份的日数,范围为1-31。
int tm_mon; // 代表目前月份,从一月算起,范围为0-11。
int tm_year; // 从1900年算起至今的年数。比如(时间戳1970-01-02 10:23:09,该值为70)。
int tm_wday; // 一星期中的日数,从星期日算起,范围为0-6。
int tm_yday; // 从1月1日算起至今的天数,范围为:0-365。
int tm_isdst; // 日光节约时间的旗标。
};
阅读全文 »