一、实验说明
此为实际生产环境实施案例,针对公司的邮件系统从Exhcange2007升级到2010,实现高可用和负载均衡,本例主要针对haproxy和LVS进行说明,Exchange只做步骤说明,具体配置不在此讨论。拓扑结构如下:
现有生产环境是一个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 haproxy2.编辑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 on5.测试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 LVS13.配置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 on5.测试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换成其他应用服务器也是一样的。