资讯详情

总结haproxy各调度算法的实现方式及其应用场景

总结haproxy实现各调度算法及其应用场景

    • HAProxy调度算法
      • 1 静态算法
        • 1.1 socat 工具
        • 1.2 static-rr
        • 1.3 first(几乎没有)
      • 2 动态算法
        • 2.1 roundrobin
        • 2.2 leastconn
        • 2.3 random
      • 3 其他算法
        • 3.1 source
          • 3.1.1 map-base 取模法(静态算法)
          • 3.1.2 一致性hash(动态算法)
            • 3.1.2.1 hash对象
            • 3.1.2.2 一致性hash示意图
            • 3.1.2.3 一致性hash配置示例
        • 3.2 uri
          • 3.2.1 uri 取模法配置示例
          • 3.2.2 uri 一致性hash配置示例
          • 3.2.3 访问测试
        • 3.3 url_param
          • 3.3.1 url_param取模法配置示例
          • 3.3.2 url_param一致性hash配置示例
          • 3.3.3 测试访问
        • 3.4 hdr
          • 3.4.1 hdr取模法配置示例
          • 3.4.2 一致性hash配置示例
          • 3.4.3 测试访问
        • 3.5 rdp-cookie
          • 3.5.1 rdp-cookie 取模法配置示例
          • 4.3.5.2 rdp-cookie 一致性hash配置示例
      • 4 算法总结
      • 5 各算法使用场景

HAProxy调度算法

HAProxy通过固定参数 balance 指示后端服务器的调度算法listen或backend选项中。 HAProxy调度算法分为静态和动态调度算法,但有些算法可以根据参数在静态和动态算法中相互转换。 官方文档:http://cbonte.github.io/haproxy-dconv/2.1/configuration.html#4-balance

1 静态算法

静态算法:按照事先定义好的规则轮询公平调度,(只有0和1,不支持其他值)HAProxy生效。

可以借助socat实现real server启动和停止(权重设置为0关闭或1启动),需要工具才能不重启socat,这是通过socket没有修改配置文件,需重启,但由于配置文件未修改,重启(reload和restart)这些服务修改将丢失,务修改将丢失。

1.1 socat 工具

可以利用服务器的动态权重和其他状态 socat调整工具,Socat 是 Linux 一个多功能网络工具的名自Socket CAT,使用此工具进行控制socket,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等 例子:使用工具socat 调整服务器动态权重

socket在同一主机上,客户端与服务器之间主机上的桥梁,以避免通过网络连接客户端与服务器。socket文件位置的主配置文件定义为/var/lib/haproxy/haproxy.sock中,

socat通过socket控制与haproxy的通讯。

1.安装相关包 [root@haproxy:/var/lib/haproxy]# yum -y install socat  [root@haproxy:/var/lib/haproxy]# echo "help" | socat stdio /var/lib/haproxy/haproxy.sock #使用管道符把help传给socat,然后标准重输入重定向sockt文件中。实际上是在这里socket文件中输入help,得到帮助,只是得到这个socket不同的帮助socket不同的帮助,不同的用法,不是所有的socket支持多种用法。 The following commands are valid at this level:   abort ssl cert <certfile>               : abort a transaction for a certificate file   add acl [@<ver>] <acl> <pattern>        : add an acl entry   add map [@<ver>] <map> <key> <val>      : add a map entry (payload supported instead of key/val)
  add ssl crt-list <list> <cert> [opts]*  : add to crt-list file <list> a line <cert> or a payload
  clear acl [@<ver>] <acl>                : clear the contents of this acl
  clear counters [all]                    : clear max statistics counters (or all counters)
  clear map [@<ver>] <map>                : clear the contents of this map
  clear table <table> [<filter>]*         : remove an entry from a table (filter: data/key)
  commit acl @<ver> <acl>                 : commit the ACL at this version
  commit map @<ver> <map>                 : commit the map at this version
  commit ssl cert <certfile>              : commit a certificate file
  del acl <acl> [<key>|#<ref>] : delete acl entries matching <key>
  del map <map> [<key>|#<ref>] : delete map entries matching <key>
  del ssl cert <certfile>                 : delete an unused certificate file
  del ssl crt-list <list> <cert[:line]>   : delete a line <cert> from crt-list file <list>
  disable agent                           : disable agent checks
  disable dynamic-cookie backend <bk>     : disable dynamic cookies on a specific backend
  disable frontend <frontend>             : temporarily disable specific frontend
  disable health                          : disable health checks
  disable server (DEPRECATED)             : disable a server for maintenance (use 'set server' instead)
  enable agent                            : enable agent checks
  enable dynamic-cookie backend <bk>      : enable dynamic cookies on a specific backend
  enable frontend <frontend>              : re-enable specific frontend
  enable health                           : enable health checks
  enable server  (DEPRECATED)             : enable a disabled server (use 'set server' instead)
  get acl <acl> <value>                   : report the patterns matching a sample for an ACL
  get map <acl> <value>                   : report the keys and values matching a sample for a map
  get var <name>                          : retrieve contents of a process-wide variable
  get weight <bk>/<srv>                   : report a server's current weight new ssl cert <certfile> : create a new certificate file to be used in a crt-list or a directory operator : lower the level of the current CLI session to operator prepare acl <acl> : prepare a new version for atomic ACL replacement prepare map <acl> : prepare a new version for atomic map replacement set dynamic-cookie-key backend <bk> <k> : change a backend secret key for dynamic cookies set map <map> [<key>|#<ref>] <value> : modify a map entry set maxconn frontend <frontend> <value> : change a frontend's maxconn setting
  set maxconn global <value>              : change the per-process maxconn setting
  set maxconn server <bk>/<srv>           : change a server's maxconn setting set profiling <what> {auto|on|off} : enable/disable resource profiling (tasks,memory) set rate-limit <setting> <value> : change a rate limiting value set server <bk>/<srv> [opts] : change a server's state, weight, address or ssl
  set severity-output [none|number|string]: set presence of severity level in feedback information
  set ssl cert <certfile> <payload>       : replace a certificate file
  set ssl ocsp-response <resp|payload>    : update a certificate's OCSP Response from a base64-encode DER set ssl tls-key [id|file] <key> : set the next TLS key for the <id> or <file> listener to <key> set table <table> key <k> [data.* <v>]* : update or create a table entry's data
  set timeout [cli] <delay>               : change a timeout setting
  set weight <bk>/<srv>  (DEPRECATED)     : change a server's weight (use 'set server' instead) show acl [@<ver>] <acl>] : report available acls or dump an acl's contents
  show activity                           : show per-thread activity stats (for support/developers)
  show backend                            : list backends in the current running config
  show cache                              : show cache status
  show cli level                          : display the level of the current CLI session
  show cli sockets                        : dump list of cli sockets
  show env [var]                          : dump environment variables known to the process
  show errors [<px>] [request|response]   : report last request and/or response errors for each proxy
  show events [<sink>] [-w] [-n]          : show event sink state
  show fd [num]                           : dump list of file descriptors in use or a specific one
  show info [desc|json|typed|float]*      : report information about the running process
  show libs                               : show loaded object files and libraries
  show map [@ver] [map]                   : report available maps or dump a map's contents show peers [dict|-] [section] : dump some information about all the peers or this peers section show pools : report information about the memory pools usage show profiling [<what>|<#lines>|byaddr]*: show profiling state (all,status,tasks,memory) show resolvers [id] : dumps counters from all resolvers section and associated name servers show schema json : report schema used for stats show servers conn [<backend>] : dump server connections status (all or for a single backend) show servers state [<backend>] : dump volatile server information (all or for a single backend) show sess [id] : report the list of current sessions or dump this exact session show ssl cert [<certfile>] : display the SSL certificates used in memory, or the details of a file show ssl crt-list [-n] [<list>] : show the list of crt-lists or the content of a crt-list file <list> show startup-logs : report logs emitted during HAProxy startup show stat [desc|json|no-maint|typed|up]*: report counters for each proxy and server show table <table> [<filter>]* : report table usage stats or dump this table's contents (filter: data/key)
  show tasks                              : show running tasks
  show threads                            : show some threads debugging information
  show tls-keys [id|*]                    : show tls keys references or dump tls ticket keys when id specified
  show trace [<module>]                   : show live tracing state
  show version                            : show version of the current process
  shutdown frontend <frontend>            : stop a specific frontend
  shutdown session [id]                   : kill a specific session
  shutdown sessions server <bk>/<srv>     : kill sessions on a server
  trace [<module>|0] [cmd [args...]]      : manage live tracing (empty to list, 0 to stop all)
  user                                    : lower the level of the current CLI session to user
  help [<command>]                        : list matching or all commands
  prompt                                  : toggle interactive mode with prompt
  quit                                    : disconnect

2.查看后端backend参数信息
[root@haproxy:/var/lib/haproxy]#
echo "show backend" | socat stdio /var/lib/haproxy/haproxy.sock
# name
stats
m44_webservers1
m44_webservers2

[root@haproxy:/var/lib/haproxy]#
echo "show info" | socat stdio /var/lib/haproxy/haproxy.sock
Name: HAProxy
Version: 2.4.17-9f97155
Release_date: 2022/05/13
Nbthread: 1
Nbproc: 2
Process_num: 1
Pid: 11324
Uptime: 0d 2h32m43s
Uptime_sec: 9163
Memmax_MB: 0
PoolAlloc_MB: 0
PoolUsed_MB: 0
PoolFailed: 0
Ulimit-n: 200030
Maxsock: 200030
Maxconn: 100000
Hard_maxconn: 100000
CurrConns: 0
CumConns: 9156
CumReq: 8
MaxSslConns: 0
CurrSslConns: 0
CumSslConns: 0
Maxpipes: 0
PipesUsed: 0
PipesFree: 0
ConnRate: 0
ConnRateLimit: 0
MaxConnRate: 0
SessRate: 0
SessRateLimit: 0
MaxSessRate: 0
SslRate: 0
SslRateLimit: 0
MaxSslRate: 0
SslFrontendKeyRate: 0
SslFrontendMaxKeyRate: 0
SslFrontendSessionReuse_pct: 0
SslBackendKeyRate: 0
SslBackendMaxKeyRate: 0
SslCacheLookups: 0
SslCacheMisses: 0
CompressBpsIn: 0
CompressBpsOut: 0
CompressBpsRateLim: 0
ZlibMemUsage: 0
MaxZlibMemUsage: 0
Tasks: 13
Run_queue: 0
Idle_pct: 100
node: haproxy.magedu.org
Stopping: 0
Jobs: 6
Unstoppable Jobs: 2
Listeners: 5
ActivePeers: 0
ConnectedPeers: 0
DroppedLogs: 0
BusyPolling: 0
FailedResolutions: 0
TotalBytesOut: 45376
TotalSplicdedBytesOut: 0
BytesOutRate: 0
DebugCommandsIssued: 0
CumRecvLogs: 0
Build info: 2.4.17-9f97155
Memmax_bytes: 0
PoolAlloc_bytes: 54560
PoolUsed_bytes: 54560
Start_time_sec: 1657332508
Tainted: 0

[root@haproxy:/var/lib/haproxy]#
echo "show servers state" | socat stdio /var/lib/haproxy/haproxy.sock
1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_port srv_check_addr srv_agent_addr srv_agent_port
4 m44_webservers1 1 rs1 10.0.0.18 2 0 1 1 9233 6 3 4 6 0 0 0 - 80 - 0 0 - - 0
4 m44_webservers1 2 rs2 10.0.0.28 2 0 1 1 9233 6 3 4 6 0 0 0 - 80 - 0 0 - - 0
4 m44_webservers1 3 local 127.0.0.1 2 0 1 1 9233 1 0 2 0 0 0 0 - 80 - 0 0 - - 0
5 m44_webservers2 1 rs2 10.0.0.28 2 0 1 1 9233 1 0 2 0 0 0 0 - 80 - 0 0 - - 0
#查询backend的后端服务器权重,未设置,默认是1
[root@haproxy:/var/lib/haproxy]#
echo "get weight m44_webservers1/rs1" | socat stdio /var/lib/haproxy/haproxy.sock
1 (initial 1)
[root@haproxy:/var/lib/haproxy]#
echo "get weight m44_webservers1/rs2" | socat stdio /var/lib/haproxy/haproxy.sock
1 (initial 1)

#修改weight,注意只针对单进程有效,因为socket发送消息,可能发到不同的进程,显示的效果就不一样,因此只适合与单进程。多进程的话除非每个进程都设置相同的值,否则每次就会返回不同的值,因此可以代用多进程配合多个socket文件,进行绑定,就能确保一一对应。
[root@haproxy:/var/lib/haproxy]#
echo "set weight m44_webservers1/rs1 3" | socat stdio /var/lib/haproxy/haproxy.sock
[root@haproxy:/var/lib/haproxy]#
echo "get weight m44_webservers1/rs1" | socat stdio /var/lib/haproxy/haproxy.sock
3 (initial 1)
[root@haproxy:/var/lib/haproxy]#
echo "get weight m44_webservers1/rs1" | socat stdio /var/lib/haproxy/haproxy.sock
0 (initial 1)

#设置开启两个socket,并进行绑定,然后就能一对一的操作了
[root@haproxy:/var/lib/haproxy]#
vim /etc/haproxy/haproxy.cfg 
global
    maxconn 100000
    chroot /apps/haproxy
    #stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
    stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1
    stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2

[root@haproxy:/var/lib/haproxy]# 通过socket修改第一个进程权重为0
echo "set weight m44_webservers1/rs1 0" | socat stdio /var/lib/haproxy/haproxy.sock1

[root@haproxy:/var/lib/haproxy]#
echo "get weight m44_webservers1/rs1" | socat stdio /var/lib/haproxy/haproxy.sock1
0 (initial 1)

[root@haproxy:/var/lib/haproxy]#
echo "get weight m44_webservers1/rs1" | socat stdio /var/lib/haproxy/haproxy.sock2
1 (initial 1)

[root@haproxy:/var/lib/haproxy]# #通过socket修改第二个进程也为0
echo "set weight m44_webservers1/rs1 0" | socat stdio /var/lib/haproxy/haproxy.sock2

[root@haproxy:/var/lib/haproxy]#
echo "get weight m44_webservers1/rs1" | socat stdio /var/lib/haproxy/haproxy.sock2
0 (initial 1)

[root@client:~]#
curl  10.0.0.100
10.0.0.28 
[root@client:~]#
curl  10.0.0.100
10.0.0.28 
#通过权重都设置为0,实现优雅的下线,这样比用交互式命令,直接使用命令,可以方便的脚本实现,这都是临时效果,服务重启这些修改都会丢失。

#将后端服务器禁用,注意只针对单进程有效,多进程需要绑定socket,分别执行
[root@haproxy:/var/lib/haproxy]#
echo " disable server m44_webservers1/rs2 0" | socat stdio /var/lib/haproxy/haproxy.sock1

[root@haproxy:/var/lib/haproxy]#
echo " disable server m44_webservers1/rs2 0" | socat stdio /var/lib/haproxy/haproxy.sock2

[root@client:~]#
curl  10.0.0.100
SorryServer
#两个后端,一个优雅下线,一个禁用,就直接进行sorryserver页面。

#启用
[root@haproxy:/var/lib/haproxy]#
echo " enable server m44_webservers1/rs2 0" | socat stdio /var/lib/haproxy/haproxy.sock2

[root@haproxy:/var/lib/haproxy]#
echo " enable server m44_webservers1/rs2 0" | socat stdio /var/lib/haproxy/haproxy.sock
1


范例: 上线和下线后端服务器脚本

[root@centos7 ~]#cat haproyx_host_up_down.sh
. /etc/init.d/functions #执行函数库,方便后面调用函数库中的action函数,显示执行结果的成功与失败。
case $1 in
up)
	echo "set weight magedu-m42-web-80/$2 1" | socat stdio /var/lib/haproxy/haproxy.sock
	[ $? -eq 0 ] && action "$2 is up"
	;;
down)
	echo "set weight magedu-m42-web-80/$2 0" | socat stdio /var/lib/haproxy/haproxy.sock
	[ $? -eq 0 ] && action "$2 is down"
	;;
*)
	echo "Usage: `basename $0` up|down IP"
	;;
esac

#$0为脚本的名字,$1为脚本输入的第一个字符串(up|down) $2为第二个服务器名字

自己实验:利用socat上线和下线后端服务器

为了方便管理,在backend中设置自ip为后端服务器的名字,通过ip名字进行判断主机,方便判断是那台主机。

1.修改之后的效果
[root@haproxy:/var/lib/haproxy]#
vim /etc/haproxy/conf.d/test.cfg 

frontend m44_web_80
    bind 10.0.0.100:80
    use_backend m44_webservers1

backend m44_webservers1
    server 10.0.0.18 10.0.0.18:80 check
    server 10.0.0.28 10.0.0.28:80 check
    server local 127.0.0.1:80 backup
backend m44_webservers2
    server 10.0.0.28 10.0.0.28:80
[root@haproxy:/var/lib/haproxy]#
systemctl reload  haproxy

编辑脚本:自己本机设置了两个socket因此用循环实现,

[root@haproxy:~]#
vim haproxy_host.sh
. /etc/init.d/functions
for sock in /var/lib/haproxy/haproxy.sock*;do
case $1 in
up)
        echo "set weight m44_webservers1/$2 1" | socat stdio $sock
        [ $? -eq 0 ] && action "$2 is up"
        ;;
down)
        echo "set weight m44_webservers1/$2 0" | socat stdio $sock
        [ $? -eq 0 ] && action "$2 is down"
        ;;
*)
        echo "Usage: `basename $0` up|down IP"
        ;;
esac
done
[root@haproxy:~]# #检查语法
bash -n haproxy_host.sh
[root@haproxy:~]#
bash haproxy_host.sh down 10.0.0.18

10.0.0.18 is down                                    [  OK  ]

10.0.0.18 is down                                    [  OK  ]

#10.0.0.18已经下线
[root@client:~]#
curl  10.0.0.100
10.0.0.28 
[root@client:~]#
curl  10.0.0.100
10.0.0.28 
[root@client:~]#
curl  10.0.0.100
10.0.0.28  

image-20220709141342762

1.2 static-rr

static-rr:基于权重的轮询调度,(只支持0和1,不支持其它值,只能改为上线或者下线)及后端服务器慢启动,其后端主机数量没有限制,相当于LVS中的 wrr

balance只能放在backend和listen中

listen web_host
	bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
	mode http
	log global
	balance static-rr  #采用static-rr算法
	server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
	server web2 10.0.0.27:80 weight 2 check inter 3000 fall 2 rise 5

自己实验

1.设置static-rr算法
[root@haproxy:~]#
vim /etc/haproxy/conf.d/test.cfg 
frontend m44_web_80
    bind 10.0.0.100:80
    use_backend m44_webservers1

backend m44_webservers1
    balance static-rr
    server 10.0.0.18 10.0.0.18:80 check 
    server 10.0.0.28 10.0.0.28:80 check 
    server local 127.0.0.1:80 backup
    
backend m44_webservers2
    server 10.0.0.28 10.0.0.28:80
[root@haproxy:~]#
systemctl reload  haproxy

#测试
[root@client:~]#
curl  10.0.0.100
10.0.0.28 
[root@client:~]#
curl  10.0.0.100
10.0.0.18 

[root@haproxy:~]#
echo "set weight m44_webservers1/10.0.0.18 3" | socat stdio /var/lib/haproxy/haproxy.sock2
Backend is using a static LB algorithm and only accepts weights '0%' and '100%'.
#此算法不能够通过socat实现修改权重,只能实现0或1,即上线或者下线。
[root@haproxy:~]#
echo "set weight m44_webservers1/10.0.0.18 0" | socat stdio /var/lib/haproxy/haproxy.sock2

[root@haproxy:~]#
echo "set weight m44_webservers1/10.0.0.18 0" | socat stdio /var/lib/haproxy/haproxy.sock1

#测试
[root@client:~]#
curl  10.0.0.100
10.0.0.28 
[root@client:~]#
curl  10.0.0.100
10.0.0.28 


1.3 first(几乎不用)

first:根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数,新请求才会分配给下一台服务,因此会忽略服务器的权重设置,此方式使用较少不支持用socat进行动态修改权重,可以设置0和1,

listen web_host
	bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
	mode http
	log global
	balance first
	server web1 10.0.0.17:80 maxconn 2 weight 1 check inter 3000 fall 2 rise 5
	server web2 10.0.0.27:80 weight 1 check inter 3000 fall 2 rise 5

测试访问效果

#同时运行下面命令,观察结果
# while true;do curl http://10.0.0.7/index.html ; sleep 0.1;done

自己实验:

[root@haproxy:~]#
vim /etc/haproxy/conf.d/test.cfg 
frontend m44_web_80
    bind 10.0.0.100:80
    use_backend m44_webservers1

backend m44_webservers1
    balance first
    server 10.0.0.18 10.0.0.18:80 check maxconn 10 #连接数超过10个才访问第二个。
    server 10.0.0.28 10.0.0.28:80 check
    server local 127.0.0.1:80 backup

backend m44_webservers2
    server 10.0.0.28 10.0.0.28:80
[root@haproxy:~]#
systemctl reload  haproxy

#测试
[root@client:~]#
curl  10.0.0.100
10.0.0.18 
[root@client:~]#
curl  10.0.0.100
10.0.0.18 
#注意,权重能修改,但是不起作用。

#并发测试
[root@client:~]#
yum -y install httpd-tools
[root@client:~]#
while :;do ab -c20 -n100 -k  http://10.0.0.100/;sleep 0.1;done
#-c并发20个,-n总共100个包,-k长连接的形式,循环的形式执行

#与此同时其他主机,进行测试,会出现28的主机,但是大多数还是18的机器。
[root@haproxy:~]#
curl 10.0.0.100
10.0.0.18 
[root@haproxy:~]#
curl 10.0.0.100
10.0.0.18 
[root@haproxy:~]#
curl 10.0.0.100
10.0.0.28 
[root@haproxy:~]#
curl 10.0.0.100
10.0.0.18 

2 动态算法

动态算法:基于后端服务器状态进行调度适当调整,新请求将优先调度至当前负载较低的服务器,

2.1 roundrobin

roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不同于lvs中的rr轮训模式,HAProxy中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中最多支持个real server,支持对real server权重动态调整, ,静态算法后端real server个数不限。

listen web_host
	bind 10.0.0.7:80,:8801-8810,10.0.0.7:9001-9010
	mode http
	log global
	balance roundrobin
	server web1 10.0.0.17:80 weight 1 check inter 3000 fall 2 rise 5
	server web2 10.0.0.27:80 weight 2 check inter 3000 fall 2 rise 5

支持动态调整权重:

# echo "get weight web_host/web1" | socat stdio /var/lib/haproxy/haproxy.sock
1 (initial 1)

# echo "set weight web_host/web1 3" | socat stdio /var/lib/haproxy/haproxy.sock

# echo "get weight web_host/web1" | socat stdio /var/lib/haproxy/haproxy.sock
3 (initial 1)

自己实验

#为了操作方便,仍然采用单进程,需要进行调整socket个数,以及对应的进程个数和CPU绑定。
[root@haproxy:~]#
vim /etc/haproxy/haproxy.cfg 
global
    maxconn 100000
    chroot /apps/haproxy
    stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
   # stats socket /var/lib/haproxy/haproxy.sock1 mode 600 level admin process 1
    #stats socket /var/lib/haproxy/haproxy.sock2 mode 600 level admin process 2
    #uid 99
    #gid 99
    user haproxy
    group haproxy
    daemon
    nbproc 1  #设置进程数为一个,与上面的socket数一致。

    #nbthread 4
    #cpu-map 1 0
    #cpu-map 2 1 #关闭绑定,因为只有一个进程,一个CPU,不用绑定
........
[root@haproxy:/var/lib/haproxy]#
rm<

标签: m44电容柜用m44r电阻器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台