一、实验说明

此为实际生产环境实施案例,针对公司的邮件系统从Exhcange2007升级到2010,实现高可用和负载均衡,本例主要针对haproxy和LVS进行说明,Exchange只做步骤说明,具体配置不在此讨论。拓扑结构如下:

 

负载均衡应用之haproxy+LVS+keepalived For Exchange2010_第1张图片

现有生产环境是一个Exchange2007+一个Edge07,域为:abc.com

1.Edge服务器处于DMZ区域,直接与互联网通信,采用LVS的方式,Edge上不存在持续session的情况,仅仅实现邮件传递转发功能

2.内部的Exhcange服务器采用haproxy实现高可用和负载平衡,haproxy的一个优势就是可以跨网段实现负载平衡,相比于LVS较容易实现,对于分布式部署exchange的情况下很实用

IP地址规划如下:

Haproxy:         172.16.10.2         #物理管理IP

                  172.16.10.100     #对外服务IP

Exchange1:       172.16.10.101

Exhcange2:       172.16.10.102

Edge1:            10.10.10.101

Edge2:            10.10.10.102

LVS1:             10.10.10.10

LVS2:             10.10.10.11

VIP:              10.10.10.100       #LVS对外服务虚IP

二、Exchange部署步骤(只列出简单步骤)

1.安装额外Exchange2010-2和Edge2,并添加证书,同时对Exchange2010进行边缘订阅,通过内部和Edge分别测试邮件服务是否正常

2.将原来Exchange2007的数据库迁移到Exchange2010上,并添加证书,并测试邮件手法是否正常

3.删除Exchange2007上面的所有存储组,卸载Exchange 2007 及Edge07

4.在原有的服务器上面安装Exchange2010-1和Edge1

5.将Edge1和Edge2同时订阅到两台Exchange服务器上。

6.建立Exchange的DAG高可用组,实现mailbox高可用

7.建立Exchange的CAS array,域名为cas.abc.com

8.将ExchangeRPC和AddressBook改成静态端口,分别为TCP:55000和TCP:55001

9.在两台Edge上添加loopback网卡,配置loopback为VIP地址,10.10.10.100,掩码为255.255.255.0,不写网关

       更改Edge网卡的默认模式,Windows2008R2下的网卡默认为stronghost模式,需要改成weakhost模式,这样就可以不对arp请求进行响应:

netsh interface ipv4 set interface "物理网卡名称" weakhostrecive=enable
netsh interface ipv4 set interface "物理网卡名称" weakhostsend=enable
netsh interface ipv4 set interface "loopback网卡名" weakhostrecive=enable
netsh interface ipv4 set interface "loopback网卡名" weakhostsend=enable

三、部署haproxy

1.安装haproxy

yum install haproxy

2.编辑haproxy配置文件,/etc/haproxy/haproxy.cfg:

--------------------------------------------------------------------global

    log         127.0.0.1 local2	#定义日志级别和监听地址,需要在/etc/sysconfig/syslog 中定义local2

    chroot      /var/lib/haproxy	
    pidfile     /var/run/haproxy.pid	#指定haproxy进程pid文件,该值为系统默认
    maxconn     40000			#设定每个haproxy进程所接受的最大并发连接数,所有后端服务器并发连接不能超过该值
    user        haproxy			#定义运行haproxy的用户和组
    group       haproxy
    daemon				#指定haproxy在后台中运行,和 -D命令结果一样

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats	#定义socket文件位置,系统默认值,建议不修改

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http	#为所有实例提供默认模式配置,即http,后面的每个可以利可以自己在单独定义模式
    log                     global	#指定实例默认的日志文件,此例使用global短定义的log配置
    option                  httplog	#启动http的请求日志,以及会话状态和时间
    option forwardfor       except 127.0.0.0/8	#记录发起请求的客户端IP地址,默认请求的ip都是代理服务器
    option                  dontlognull	#保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包
    option                  redispatch	#当一个服务器故障,重新分派到其他服务器上
    option		    contstats	#允许连续的流量统计更新
    retries                 3		#设置一个服务器如果连不上默认的重试次数,可以在每个实例中自定义	
    timeout http-request    10s		#等待一个http请求完成的最大时间,主要保证服务器能够提供正常访问的连接会话
					#防止一个完成连接的请求后就不再进行会话,形成占用连接的情形
    timeout queue           30s		#设置当一个请求被放入队列中,等待队列的最大时间,
    timeout connect         4000	#成功请求一个服务器的最大时间,
    timeout client          30s		#客户端非活动状态的超时时长,也可以放到前端单独定义
    timeout server          1m		#服务端设置最大非活动时间,也可以放到后端单独定义
    timeout http-keep-alive 10s		#长连接的超时时间,等待一个新的http请求的最大时间

#---------------------------------------------------------------------
# Exchange_OWA frontend which proxys to the backend
#---------------------------------------------------------------------
frontend  CAS-OWA			#定义ExchangeOWA前端实例
    bind 	172.16.10.100:443	#绑定监听地址和端口
    mode	tcp			#haproxy中https的请求都是用tcp模式,而不是http
    maxconn	20000			#访问前端haproxy服务器的最大并发连接,次数量不能超过global中定义的maxconn
    timeout client          86400000	#设定客户端超时时间,用于客户端始终可以连着OWA服务器
    default_backend             CAS	#指定默认的后端

#---------------------------------------------------------------------
# Exchange_OWA backend for web access
#---------------------------------------------------------------------
backend CAS				#定义之前OWA所指定的后端服务器
    balance     leastconn		#采用最小连接算法,一般长连接应用此种算法,邮件服务属于长连接应用
    mode	tcp			#指定模式为tcp,一定与前端模式保持一致
    option	abortonclose		#丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求			
    timeout server          86400000	#是后端服务器的连接用于不超时,这样owa页面在白天办公的时间内就不会超时关闭
    stick on src 			#先根据事先定义的调度算法进行调度,然后根据源IP地址开启粘连功能,
					#来自同一个ip的客户端始终访问同一个后端服务器,有助于保持会话持续
    stick-table type ip size 200k expire 30m	#d设置粘连表,存储类型是ip地址,大小200k,此表在30分钟后过期,stack on 和stack-type同时使用  
    server      cas01 172.16.10.101:443 check  inter 5000 rise 2 fall 5	#定义后端真实服务器,启动健康检查,设定健康检查时间间隔为5000ms
									#恢复正常需要检查2次,检查5次才确认失败
    server      cas02 172.16.10.102:443 check  inter 5000 rise 2 fall 5


#---------------------------------------------------------------------
# Exchange_135 in CAS Server For Outlook
#---------------------------------------------------------------------

frontend CAS_135			#定义outlook启动使用的135端口	
    bind	172.16.10.100:135
    mode	tcp			#指定模式为tcp
    maxconn	20000			#访问前端haproxy服务器的最大并发连接
    timeout client          1m		#客户端超时为1分钟
    default_backend             EX_135	#定义后端真实服务器

#-------------------135_Backend------------------------------------


backend EX_135
    balance     leastconn		#use lang connection method
    mode	tcp			#与前端模式保持一直
    option	abortonclose		
    option redispatch 
    timeout server          1m
    stick on src 
    stick-table type ip size 200k expire 30m	#define a stick-table,200k,store the src ip,in the 240 miniutes   
    server      cas01 172.16.10.101:135 check  inter 5000 rise 2 fall 5
    server      cas02 172.16.10.102:135 check  inter 5000 rise 2 fall 5

#---------------------------------------------------------------------
# Exchange_PRC in CAS Server For Outlook
#---------------------------------------------------------------------

frontend CAS_RPC			#定义outlook使用的ExchangePRC端口	
    bind	172.16.10.100:55000
    mode	tcp			 
    maxconn	20000			 
    timeout client          86400000
    default_backend             PRC	#use default backend

#-------------------PRC_Backend------------------------------------
backend PRC
    balance     leastconn		#use lang connection method
    mode	tcp			#mod same whith frontend
    option	abortonclose		
    option redispatch 
    timeout server          86400000
    stick match src table EX_135 	#调用之前EX_135上已经定义的地址粘连列表
    server      cas01 172.16.10.101:55000 check  inter 5000 rise 2 fall 5
    server      cas02 172.16.10.102:55000 check  inter 5000 rise 2 fall 5


#---------------------------------------------------------------------
# Exchange_addressbook in CAS Server For Outlook
#---------------------------------------------------------------------

frontend CAS_addressbook		#定义outlook使用的通讯簿端口	
    bind	172.16.10.100:55001
    mode	tcp			
    maxconn	20000			#frontend max connection
    timeout client          86400000
    default_backend         Addressbook	#use default backend

#-------------------addressbook_Backend------------------------------------

backend Addressbook
    balance     leastconn		#use lang connection method
    mode	tcp			#mod same whith frontend
    option	abortonclose		
    option redispatch 
    timeout server          86400000
    stick match src table EX_135 	#调用之前EX_135上已经定义的地址粘连列表
    server      cas01 172.16.10.101:55001 check inter 5000 rise 2 fall 5
    server      cas02 172.16.10.102:55001 check	inter 5000 rise 2 fall 5

#----------------------------------------------------------------------------
#	HAproxy admin console
#----------------------------------------------------------------------------
listen	STAT				#定义listen项,主要用于haproxy的web页面状态监控和管理
   bind		:8090			#定义监听端口
   stats	enable			#开启统计状态
   stats auth	admin:admin	 	#设置web页面认证用户为admin,密码为:admin
   stats	hide-version		#在web页面隐藏haproxy当前版本信息
   stats uri	/haadmin?stats		#定义状态页面的uri
   stats admin 	if TRUE			#开启认证功能,如果认证成功则登录

3.设置haproxy的对外服务地址:

 ifconfig eth0:0 172.16.10.100 netmask 255.255.255.0

  将上面命令放到/etc/rc.local中,使下期启动时自动调用

4.重启Haproxy服务

 service haproxy restart
 chkconfig haproxy on

5.测试Haproxy

netstat -antl 		查看是否有443 和55001等监听

输入网址http://172.16.10.2/haadmin?stats查看状态页面

四、部署keepalived

1.安装LVS+Keepalived(由于我在安装系统的时候勾选了高可用组件,所以默认已经安装了lvs和keepalived)

    在LVS1和LVS2上可以通过yum进行安装

2.在两个LVS节点的hosts文件中相互添加记录:

 LVS1:
 10.10.10.11
 LVS2:
 10.10.10.10 LVS1

3.配置SSH互信:LVS1: ssh-keygen -t rsa

cd ~/.ssh/
ssh-copy-id -i id_rsa.pub  root@LVS2LVS2:ssh-keygen -t rsa 
cd ~/.ssh/
ssh-copy-id -i id_rsa.pub  root@LVS1测试SSHssh LVS2 "hostname"

4.配置keepalived /etc/keepalived/keepalived.conf

 LVS1上修改如下配置:

vrrp_instance VI_1 {
    state MASTER		#设置当前服务器为Master
    interface eth0
    virtual_router_id 51	#设置Master的ID,一定要大于
    priority 100
    advert_int 1
        auth_pass 1111
    }
        10.10.10.100	#设置提供服务的VIP


}

#------------------------------------------------
# Exchange Edge Server Load Balance
#------------------------------------------------
virtual_server 10.10.10.100 25 {
    delay_loop 6
    lb_algo wlc			#定义调度算法为加权最小链接
    lb_kind DR			#定义DR模式
    nat_mask 255.255.255.0	#指定VIP的子网掩码
    persistence_timeout 50	#配置持久性链接为50
    protocal TCP
    
    real_server 10.10.10.10 25 {	#定义realserver
	weight 1			#权重为1
	SMTP_CHECK {			#启用针对smtp的健康检查
		connect_timeout 3	#超时时间为3s,大于3s即为down
        }
     }
    real_server 10.10.10.10 25 {	#定义第二个realserver
	weight 1
	SMTP_CHECK {
		connect_timeout 3
   	}
      }
  }
}

LVS2上只要将配置文件的 state 改成BACKUP,route_id改成50,只要比LVS1的小即可,其他不变

重启keepalived

 service keepalived restart
 chkconfig keepalived on

5.测试keepalived

ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.10.10.100:smtp rr persistent 50
  -> 10.10.10.11:smtp            Route   1      0          0         
  -> 10.10.10.10:smtp            Route   1      0          0

五、总结

相对来说比较简单,因此步骤没有特别详细,除了exchange外,其他一步一步来的话应该不会有问题,如果做实验的话,把exchange换成其他应用服务器也是一样的。