Haproxy coopera com Nginx para construir um experimento de implantação de cluster da web (gráfico detalhado!)
Artigo Diretório
- Um, agendador de cluster da web comum
- Dois, análise de aplicativo Haproxy
- Três, princípio do algoritmo de escalonamento Haproxy
- Quarto, Haproxy cria um cluster da Web
- Cinco, definição de log
Um, agendador de cluster da web comum
1) O agendador de cluster da Web comum atual é dividido em software e hardware. O
software geralmente usa o código aberto LVS, Haproxy, Nginx
2) LVS tem o melhor desempenho, mas é relativamente complicado de construir; o módulo upstream do Nginx suporta funções de cluster, mas a função de verificação de integridade dos nós de cluster não é forte e a alta simultaneidade não é tão boa quanto Haproxy
3) O hardware mais comumente usado é o F5, e muitas pessoas usam produtos domésticos como Barracuda e NSFOCUS
Dois, análise de aplicativo Haproxy
- O LVS tem um forte recurso anti-carregamento em aplicativos empresariais, mas há deficiências. O
LVS não oferece suporte ao processamento regular e não pode alcançar a separação dinâmica e estática.
Para sites de grande escala, a implementação e configuração do LVS são complexas e o sucesso da manutenção é relativamente alto. - Haproxy é um software que fornece alta disponibilidade, balanceamento de carga e proxy baseado em aplicativos TCP e HTTP. É
adequado para sites da Web com cargas pesadas. É
executado em hardware e suporta dezenas de milhares de solicitações de conexão simultâneas.
Três, princípio do algoritmo de escalonamento Haproxy
Haproxy suporta uma variedade de algoritmos de agendamento, os mais comumente usados são três
- O
algoritmo RR (Round Robin) RR é o algoritmo mais simples e mais comumente usado, ou seja, a programação round-robin - O
algoritmo de conexões mínimas LC (Least Connections) aloca dinamicamente as solicitações de front-end de acordo com o número de conexões de nó de back-end. - SH (Source Hashing) é
baseado no algoritmo de agendamento de acesso à origem. É usado em alguns cenários onde as sessões de sessão são gravadas no lado do servidor. O agendamento de cluster pode ser feito com base no IP de origem, Cookie, etc.
Quarto, Haproxy cria um cluster da Web
Pacote de instalação necessário para o experimento
haproxy-1.5.19.tar.gz
nginx-1.12.0.tar.gz
Configuração do ambiente
Hospedeiro | sistema operacional | endereço de IP | Software / pacote de instalação / ferramenta necessários |
---|---|---|---|
Abreviatura de Haproxy-Server HS |
CentOS7 7-2 |
192.168.2.4 | haproxy-1.5.19.tar.gz |
Abreviatura NS1 do Nginx-Server1 |
CentOS7 7-3 |
192.168.2.5 | nginx-1.12.0.tar.gz |
Abreviatura NS1 do Nginx-Server2 |
CentOS7 7-4 |
192.168.2.6 | nginx-1.12.0.tar.gz |
Cliente | Win10 | 192.168.2.10 |
Nota:
1) Por ser o mesmo segmento de rede, não há necessidade de serviços de gateway e DNS, basta comentar na configuração da placa de rede.
2) Todos os servidores precisam fechar o firewall.
3) É melhor configurar o servidor nginx primeiro e, em seguida, configurar o servidor haproxy para evitar erros. A última coisa a visitar é o endereço / test.html do servidor haproxy.
4) Quando a porta nginx está ocupada, os seguintes métodos podem ser usados para resolver o problema
lsof -i:80
kill -9 进程号
nginx或者/usr/local/nginx/sbin/nginx
netstat -natp | grep 80
1. Compilação de script e instalação do servidor Nginx (a fonte do yum vem com a implantação)
NS1 : 192.168.2.5
NS2 : 192.168.2.6
Observação: você precisa primeiro arrastar o pacote nginx-1.12.0.tar.gz para o diretório / opt
#!/bin/bash
#======配置yum源======
echo -e "\033[31m =====正在验证当前为仅主机还是NAT模式===== \033[0m"
ping -c2 -w2 www.baidu.com &> /dev/null
if [ $? -eq 0 ];then echo -e "\033[31m 检测当前为NAT模式,为您配置在线yum源 \033[0m"
mkdir -p /etc/yum.repos.d/repo.bak
mv -f /etc/yum.repos.d/* /etc/yum.repos.d/repo.bak &> /dev/null
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo &> /dev/null
yum clean all &> /dev/null
yum list &> /dev/null
echo -e "\033[31m 在线源已配置完成 \033[0m"
else
echo -e "\033[31m 检测当前为仅主机模式,为您配置本地yum源 \033[0m"
mount /dev/sr0 /mnt &> /dev/null
cd /etc/yum.repos.d/
mkdir -p /etc/yum.repos.d/repo.bak
mv -f /etc/yum.repos.d/* /etc/yum.repos.d/repo.bak &> /dev/null
echo '[local]
name=local
baseurl=file:///mnt
enabled=1
gpgcheck=0' > /etc/yum.repos.d/local.repo
yum clean all &> /dev/null
yum makecache &> /dev/null
df -h | grep "/mnt"
if [ $? -ne 0 ];then
echo -e "\033[31m 检测当前为仅主机模式,但光盘未连接! \033[0m"
else
echo -e "\033[31m 本地yum源已配置完成 \033[0m"
fi
fi
#======编译安装nginx服务======
#安装所需开发包和编译环境、编译器
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
#创建程序用户,便于准确控制访问
useradd -M -s /sbin/nologin nginx
#解压安装包
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
#指定安装路径、指定用户名、组名、启用模块以支持统计状态
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-file-aio --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module
#编译及安装
make && make install
#软链接便于系统识别nginx操作命令
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#添加nginx系统服务
echo '[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target' > /lib/systemd/system/nginx.service
#赋权及开启服务、开启开机自启
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
As operações acima são as mesmas para os dois servidores nginx, então não vou repeti-las
NS1 : 192.168.2.5
echo "this is NS1 web" > /usr/local/nginx/html/test.html
cat /usr/local/nginx/html/test.html
NS2 : 192.168.163.6
echo "this is NS2 web" > /usr/local/nginx/html/test.html
cat /usr/local/nginx/html/test.html
2. Implantar o servidor haproxy
Haproxy-Server : 192.168.2.4
1) Desligue o firewall e carregue os pacotes de software necessários para instalar o Haproxy no diretório / opt
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
cd /opt
#把haproxy-1.5.19.tar.gz安装包拖进来
2) Compilar e instalar Haproxy
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-1.5.19.tar.gz
cd haproxy-1.5.19/
make TARGET=linux2628 ARCH=x86_64 && make install
参数说明
#使用uname -r查看内核,如:2.6.18-371.el5,此时该参数用TARGET=linux26;kernel大于2.6.28的用TARGET=linux2628
TARGET=linux26 #内核版本
ARCH=x86_64 #系统位数,64位系统
3) Configuração do servidor Haproxy
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
cd /etc/haproxy/
vim haproxy.cfg
global
#4~5行–修改,配置日志记录,local0为日志设备,默认存放到系统日志
log /dev/log local0 info
log /dev/log local0 notice
#log loghost local0 info
maxconn 4096 #最大连接数,需考虑ulimit-n限制
#8行–注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
#chroot /usr/share/haproxy
uid 99 #用户UID
gid 99 #用户GID
daemon #守护进程模式
defaults
log global #定义日志为global配置中的日志定义
mode http #模式为http
option httplog #采用http日志格式记录日志
option dontlognull #不记录健康检查日志信息
retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 #最大连接数
contimeout 5000 #连接超时时间
clitimeout 50000 #客户端超时时间
srvtimeout 50000 #服务器超时时间
#删除下面所有listen项–,添加
listen webcluster 0.0.0.0:80
option httpchk GET /test.html #检查服务器的test.html文件
balance roundrobin #负载均衡调度算法使用轮询算法roundrobin
server inst1 192.168.2.5:80 check inter 2000 fall 3 #定义在线节点
server inst2 192.168.2.6:80 check inter 2000 fall 3
#--参数说明----------------
balance roundrobin #负载均衡调度算法
#轮询算法: roundrobin;最小连接数算法: leastconn;来源访问调度算法: source,类似于nginx的ip_hash
check inter 2000 #表示haproxy服务器和节点之间的一个心跳频率
fall 3 #表示连续三次检测不到心跳频率则认为该节点失效
若节点配置后带有""backup"表示该节点只是个备份节点,只有主节点失效该节点才会上。不携带"backup",表示为主节点,和其它主节点共同提供服务。
4) Adicionar serviço de sistema Haproxy
Observação: esta etapa precisa ser realizada após a configuração do servidor Nginx, caso contrário, ocorrerá falha ao iniciar
cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
cd /etc/init.d/
ll
chmod +x haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
service haproxy start
3. Teste o cluster da web
Abra http://192.168.2.4/test.html com um navegador no cliente e atualize constantemente o navegador para testar o efeito de balanceamento de carga
Cinco, definição de log
1. Edite o arquivo de configuração haproxy
Por padrão, o log do haproxy é enviado para o syslog do sistema, o que não é muito conveniente de visualizar.Para gerenciar melhor o log do haproxy, geralmente o definimos separadamente no ambiente de produção. Os logs de informações e avisos do haproxy precisam ser registrados em arquivos de log diferentes.
vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local0 notice
service haproxy restart
123456
2. Modifique a configuração do rsyslog
Necessidade de modificar a configuração do rsyslog, para facilitar o gerenciamento. Defina a configuração relacionada ao haproxy independentemente em haproxy.conf e coloque-o em /etc/rsyslog.d/. Quando o rsyslog for iniciado, ele carregará automaticamente todos os arquivos de configuração neste diretório.
vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
12345678
Nota:
Esta parte da configuração é para registrar o log de informações de haproxy em /var/log/haproxy/haproxy-info.log, e para registrar o log de avisos em /var/log/haproxy/haproxy-notice.log. "& ~" significa que quando o log é gravado no arquivo de log, rsyslog para de processar essas informações.
systemctl restart rsyslog.service
tail -f /var/log/haproxy/haproxy-info.log #查看haproxy的访问请求日志信息