高负载web框架(五)

h.部署前端haproxy而且用keepalived高可用javascript

先在node1上部署好haproxy,然后在安装好keepalived,把node1上的配置复制到node11上。css

安装haproxy,在base源下有html

# yum install -yhaproxy前端

haproxy的配置:java

       global settings: 全局配置段node

              主要用于定义haproxy进程自身的工做特性;web

       proxies: 代理配置段正则表达式

事先定义好一组后端服务器,事先定义好一组前端监听的地址,然后将他们关联起来算法

       backend: 后端服务器组vim

       frontend: 定义面向客户的监听的地址和端口,以及关联到的后端服务器组;

       listen: 组合方式直接定义frontend及相关的backend的一种机制;

       defaults: 定义默认配置;

haproxy的部分配置说明 /etc/haproxy/haproxy.cnf

使用本机的facility来记录日志,就不用发往服务器了,

#    local2.*                       /var/log/haproxy.log  把这项写到/etc/rsyslog.conf

 

    log        127.0.0.1 local2  日志发往服务器的哪里?使用facilitylocal2来记录日志,也须要在/etc/rsyslog.conf中指明记录到那个位置,没有写的话则记录到/var/log/messages文件中,在rsyslog启动时,须要监听在udp或者tcp的端口上

# Provides UDPsyslog reception

#$ModLoad imudp

#$UDPServerRun 514

 

# Provides TCPsyslog reception

#$ModLoad imtcp

#$InputTCPServerRun514     /etc/rsyslog.conf中都注释了,因此记录不了日志,要启用记录日志,这里要取消对tcpudp的注释

+++++++++

具体实现

启用/etc/haproxy/haproxy.cnf

    log        127.0.0.1 local2

/etc/rsyslog.conf中启用

# Provides UDPsyslog reception

$ModLoad imudp

$UDPServerRun 514

# Include allconfig files in /etc/rsyslog.d/

$ModLoad imtcp

$InputTCPServerRun514

再添加

local2.*                                               /var/log/haproxy.log

 

性能调整相关的参数

   -maxconn <number>:设定每一个haproxy进程所接受的最大并发链接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;

- spread-checks<0..50, in percent>:在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康情况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增长或减少必定的随机时长;

- tune.maxaccept<number>:设定haproxy进程内核调度运行时一次性能够接受的链接的个数,较大的值能够带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定为-1能够禁止此限制;通常不建议修改;

 

代理相关的配置能够以下配置段中。

        name是必须指定的

 - defaults <name>

 - frontend <name>

 - backend <name>

 - listen  <name>

全部代理的名称只能使用大写字母、小写字母、数字、-(中线)_(下划线).(点号):(冒号)。此外,ACL名称会区分字母大小写。

                     frontend <name>IP:PORT

                            use_backend

                            default_backend

 

                     backend <name>

                            balance<scheduler>   指明调度方法

                            server <name>IP:PORT [check]   check对后端服务器作健康检测

                            ...

 

                     listen <name> IP:PORT

                            balance     指明调度方法

                            server

                            server

 

                     defaults   定义默认配置

 

balance

balance<algorithm> [ <arguments> ]

balance url_param<param> [check_post [<max_wait>]]

 

定义负载均衡算法,可用于“defaults”、“listen”和“backend”。<algorithm>用于在负载均衡场景中挑选一个server,其仅应用于持久信息不可用的条件下或须要将一个链接从新派发至另外一个服务器时。支持的算法有:

  roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重能够在运行时进行调整,不过,在设计上,每一个后端服务器仅能最多接受4128个链接;

  static-rr:基于权重进行轮叫,与roundrobin相似,可是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器链接数上没有限制;

  leastconn:新的链接请求被派发至具备最少链接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAPSQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,能够在运行时调整其权重;

  source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不一样的服务器;经常使用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可使用hash-type修改此特性;

  uri:对URI的左半部分(“问题”标记以前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可使得对同一个URI的请求老是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法经常使用于代理缓存或反病毒代理以提升缓存的命中率;须要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可使用hash-type修改此特性;

  url_param:经过<argument>URL指定的参数在每一个HTTP GET请求中将会被检索;若是找到了指定的参数且其经过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法能够经过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;若是某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可使用hash-type修改此特性;

  hdr(<name>):对于每一个HTTP请求,经过<name>指定的HTTP首部将会被检索;若是相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索相似Host类的首部时仅计算域名部分(好比经过www.magedu.com来讲,仅计算magedu字符串的hash)以下降hash算法的运算量;此算法默认为静态的,不过其也可使用hash-type修改此特性;

 

ACL

haproxyACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来作出转发决策,这大大加强了其配置弹性。其配置法则一般分为两步,首先去定义ACL,即定义一个测试条件,然后在条件获得知足时执行某特定的动做,如阻止请求或转发至某特定的后端。定义ACL的语法格式以下。

 

  acl<aclname> <criterion> [flags] [operator] <value> ...

 

 <aclname>ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(链接线)_(下划线).(点号):(冒号)haproxy中,acl能够重名,这能够把多个测试条件定义为一个共同的acl

 <criterion>:测试标准,即对什么信息发起测试;测试方式能够由[flags]指定的标志进行调整;而有些测试标准也能够须要为其在<value>以前指定一个操做符[operator]

 [flags]:目前haproxyacl支持的标志位有3个:

   -i:不区分<value>中模式字符的大小写;

   -f:从指定的文件中加载模式;

   --:标志符的强制结束标记,在模式中的字符串像标记符时使用;

 <value>acl测试条件支持的值有如下四类:

    整数或整数范围:如1024:65535表示从102465535;仅支持使用正整数(若是出现相似小数的标识,其为一般为版本测试),且支持使用的操做符有5个,分别为eqgegtlelt

    字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;若是在模式首部出现了-i,能够在其以前使用“--”【是两个-】标志位;

    正则表达式:其机制类同字符串匹配;

   IP地址及网络地址

 

同一个acl中能够指定多个测试条件,这些测试条件须要由逻辑操做符指定其关系。条件间的组合测试关系有三种:“与”(默认即为与操做)、“或”(使用“||”操做符)以及“非”(使用“!”操做符)

 

经常使用的测试标准(criteria)

be_sess_rate(backend) <integer>

 

用于测试指定的backend上会话建立的速率(即每秒建立的会话数)是否知足指定的条件;经常使用于在指定backend上的会话速率太高时将用户请求转发至另外的backend,或用于阻止***行为。例如:

   backend dynamic

       mode http

       acl being_scanned be_sess_rate gt 50 若是每秒钟会话建立数大于50个,则认为是遭到***了

       redirect location /error_pages/denied.html if being_scanned  若是说遭到***,则将请求内容重定向到/error_pages/denied.html

 

fe_sess_rate(frontend) <integer>

 

用于测试指定的frontend(或当前frontend)上的会话建立速率是否知足指定的条件;经常使用于为frontend指定一个合理的会话建立速率的上限以防止服务被滥用。例以下面的例子限定入站邮件速率不能大于50/秒,全部在此指定范围以外的请求都将被延时50毫秒。

   frontend mail

       bind :25

       mode tcp

       maxconn 500

       acl too_fast fe_sess_rate ge 50

       tcp-request inspect-delay 50ms   将速率大于50的都延迟50ms

       tcp-request content accept if ! too_fast 若是请求速率没有超过50,则accept

       tcp-request content accept if WAIT_END  等待结束了,也能够接收进来  

访问速率值设置须要注意,不要把正常的都阻止了

 

 

hdr(header) <string>

 

用于测试请求报文中的全部首部或指定首部是否知足指定的条件;指定首部时,其名称不区分大小写,且在括号“()”中不能有任何多余的空白字符。测试服务器端的响应报文时可使用shdr()。例以下面的例子用于测试首部Connection的值是否为close

   hdr(Connection) -i close

 

method <string>

 

测试HTTP请求报文中使用的方法。

 

path_beg <string>

 

用于测试请求的URL是否以<string>指定的模式开头。下面的例子用于测试URL是否以/static/p_w_picpaths/javascript/stylesheets头。

   acl url_static       path_beg       -i /static /p_w_picpaths /javascript/stylesheets

 

 path_end <string>

 

用于测试请求的URL是否以<string>指定的模式结尾。例如,下面的例子用户测试URL是否以jpggifpngcssjs结尾。

    aclurl_static       path_end       -i .jpg .gif .png .css .js

    acl中使用同一个名字是能够的

 

hdr_beg <string>

 

用于测试请求报文的指定首部的开头部分是否符合<string>指定的模式。例如,下面的例子用记测试请求是否为提供静态内容的主机imgvideodownloadftp

   acl host_static hdr_beg(host) -i img. video. download. ftp.

 

hdr_end <string>

 

用于测试请求报文的指定首部的结尾部分是否符合<string>指定的模式。例如,下面的例子用记测试请求是否为

 

hdr_reg (header) <regex>  对指定请求的值作正则表达式匹配

path_reg <regex>  对请求路径作做则表达式匹配的

 

这里要实现动静分离,经过haproxyACL功能来实现,动态内容分发到node4node5,静态内容分发到varnish上。

配置内容:

frontend main

   maxconn 6000

   bind :80

   acl url_static path_beg -i /p_w_picpaths /video /music  若是这里加了/,则全部请求都被定位到此处

   acl url_static path_end -i .jpg .html .css .png .gif .txt

   use_backend static if url_static

   default_backend webapp

 

backend static

   balance uri

server static1 192.168.21.178check port 80

server static2 192.168.21.167check port 80

   server h1 127.0.0.1 backup port 8080

 

backend webapp

   balance source

server s1 192.168.21.166check port 80 maxconn 4000 weight 2

   server s2 192.168.21.150 check port 80 maxconn 4000 weight 2

   server h1 127.0.0.1:8080 backup

   stats enable               显示状态页的

   stats hide-version

   stats uri /hap?stats

   stats scope .

   stats realm HAproxy\ Statistic

   stats auth look:look

stats admin ifTRUE

 

keepalived的实现

keepalived:主要实如今两个或多个节点之间实现VRRP协议的,也即运行keepalivedkeepalived能够实现VRRP功能

vrrp就是将两个或两个以上的物理路由设备定义成一个虚拟的路由器,此时称为路由组,这一组路由设备共同联合起来构建成虚拟路由,在虚拟路由上配置一个vip和与vip共同对应vmac,这一组的路由器上,每个路由器都有对应的优先级,每一节点刚开始都是初始化的,然后通告本身的优先级,最后经过优先级来肯定优先级最高的做为主节点,其余的节点都为备节点,只有当主节点宕机时,其余节点就会把主节点上vip等资源抢到自身主机,由此在末端主机上只需配置一个网关,指向虚拟ip,这时就实现了路由协议的高可用效果,vrrp 虚拟冗余路由协议

 

两个虚拟主机各自都安装keepalived服务进程,keepalived进程可以经过互相通讯,经过vrrp协议的工做机制,通告优先级、选举主节点配置ip地址

 

keepalivedcentos 6.4以后收录REHL系了

#yum install –y keepalived

# rpm -qlkeepalived | less

/etc/keepalived

/etc/keepalived/keepalived.conf   配置文件

/etc/rc.d/init.d/keepalived  服务脚本,keepalived在通讯时,须要进行认证的,最好换一个多播地址,默认vrid51,若是不换多播地址,则通常是vrid都是惟一的

/etc/sysconfig/keepalived

/usr/bin/genhash

/usr/libexec/keepalived

/usr/sbin/keepalived

keepalived.conf配置文件中 !是注释

# vim/etc/keepalived/keepalived.conf

! ConfigurationFile for keepalived

 

global_defs {

   notification_email {万一服务器挂了时,用邮件通知给谁

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1邮件服务器,若是有邮件服务器则使用邮件服务器的地址

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

 

vrrp_instance VI_1{

    state MASTER

    interface eth0

    virtual_router_id 21

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass keepalived

    }

    virtual_ipaddress {

        192.168.21.152

}

    notify_master "/etc/rc.d/init.d/haproxystart"

    notify_backup "/etc/rc.d/init.d/haproxystop"

    notify_fault "/etc/rc.d/init.d/haproxystop"

}

备节点须要修改的地方

state BACKUP   修改

priority 98   修改

相关文章
相关标签/搜索