《MailServer高可用解决方案------适用于中小型企业》
当我们在企业中都会需要建立自己的邮件系统,建好以后,安全性成了管理员必须考虑的问题,本篇博文志在解决这个问题。
我们需要实现的效果就是服务器为一主一备,当master宕机后,slave自动接管,继续为用户提供服务。
本文以开源团队开发的EMOS微型邮件系统为例:
首先上图:
大概解释下:
1.用keepalived来做健康检查,再用脚本的形式来检测我们需要的服务器状态,一旦宕机,备机自动接管vip
2.用rsync来做数据同步,大概可以5分钟一次,本来想用rsync+inotify做实时同步的,但考虑到数据变动频率较大,容易丢失数据,故只采用rsync来做。
具体部署:
第一部分:高可用keepalived
1.首先安装keepalived并配置:
- #wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
- #tar -zxf keepalived-1.2.2.tar.gz
- #cd keepalived
- #./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.18-308.8.2.el5-x86_64/
- #make && make install
2.贴出配置文件并有相应注释:
- ! Configuration File for keepalived
- global_defs {
- notification_email {
- [email protected] #设置邮件报警地址,可以设置多个,每行一个
- }
- notification_email_from root@localhost #设置邮件的发送地址
- smtp_server 127.0.0.1 #邮件发送的服务器ip
- smtp_connect_timeout 30 #设置连接smtp server的超时时间
- router_id Mail1 #表示运行keepalived服务器的一个标示,发邮件时显示在邮件主题中的信息
- }
- vrrp_instance VI_1 { #定义vrrp实例
- state MASTER #类型为主服务器
- interface eth0 #指定HA检测网络的端口
- virtual_router_id 50 #虚拟路由表示,这个表示是一个数字,同一个vrrp实例使用唯一的标示
- priority 100 #定义优先级,数字越大,优先级越大,在同一个vrrp里,MASTER的优先级必须高于SLAVE
- advert_int 1 #设定MASTER和SLAVE服务器之间的健康检查的时间间隔,单位是秒
- authentication {
- auth_type PASS #设定验证类型,主要有PASS和AH两种
- auth_pass 1111 #设置密码,在同一个vrrp里,MASTER和SLAVE必须使用相同的密码才能正常通信
- }
- virtual_ipaddress {
- 192.168.1.100 #设置虚拟ip(VIP)
- }
- }
- virtual_server 192.168.1.100 80 { #虚拟服务器地址(VIP)、端口
- delay_loop 6 #健康检查的间隔时间(秒),每隔 6 秒查询 realserver状态
- lb_algo rr #lvs 调度算法,这里使用轮询
- lb_kind DR #lvs 负载均衡机制,这里使用直连路由
- persistence_timeout 60 #同一 IP 的连接 60 秒内被分配到同一台 realserver
- protocol TCP #用 TCP 协议检查 realserver 状态
- real_server 192.168.1.1 80 { #第一个web节点的地址以及端口
- weight 1 #节点的权重
- TCP_CHECK { #健康检查的方式
- connect_port 80 #检查的目标端口
- connect_timeout 3 #故障重试秒数(即连接超时)
- nb_get_retry 3 #重试延迟(即重试次数)
- delay_before_retry 4 #重试间隔(秒)
- }
- }
- real_server 192.168.1.2 80 { #同上!
- weight 1
- TCP_CHECK {
- connect_port 80
- connect_timeout 3
- nb_get_retry 3
- delay_before_retry 4
- }
- }
- }
备机上只需更改router_id、state、prority参数即可,其余内容完全相同,配置完成以后重启keepalived服务。
3.编写检测脚本,用来监控postfix的进程:
vim /root/master.sh
- #!/bin/bash
- while :
- do
- mpid=`ps -C master --no-header |wc -l`
- if [ $mpid -eq 0 ]; then
- /etc/init.d/postfix restart
- sleep 5
- mpid=`ps -C master --no-header |wc -l`
- echo $mpid
- if [ $mpid -eq 0 ]; then
- /etc/init.d/keepalived stop
- fi
- fi
- sleep 5
- done
大概解释下:这是一个无限循环的脚本,需要在后台执行nohup sh /root/master.sh &,当postfix的master进程数为0时,重启postfix。如master进程还没有的话就关闭keepalived服务,让slave来接管浮动ip
最后重启下keepalived服务:/etc/init.d/keepalived restart
测试:
在主服务器上执行ip addr show dev eth0会显示当前主机的ip以及浮动ip
在另一台机器上ping -t 192.168.1.100,然后kill掉master进程,你会发现ping会断开,丢几个包以后会再次可以ping通。
到此高可用算是完成了,当主服务器宕机的话,备机自动接管。
第二部分:Rsync数据同步
接下来就是主备之间数据同步的问题:
我们采用的rsync的方式来做同步。
我们邮件服务器主机名为mail (192.168.1.1),备份主机名为mailbak(192.168.1.2),则需要做的工作如下:
1. 在两台服务器上分别装上rsync(yum -y install rsync),再一个就是确保提供邮件服务功能;
2. 在备机192.168.1.2上配置rsync服务(服务包系统已经自带,只需配置两个文件 rsyncd.conf 和 rsyncd.secrets 即可)
- #vim /etc/rsyncd.conf
- uid = root
- gid = root
- use chroot = no
- max connections = 4
- strict modes =yes
- port = 873
- [mailbak-update-mysql-extmail]
- path = /var/lib/mysql/
- comment = This is a test
- ignore errors
- read only = no
- list = no
- secrets file = /etc/rsyncd.secrets
- hosts allow = 192.168.1.1
- [mailbak-update-home]
- path = /home/
- comment = This is a test
- ignore errors
- read only = no
- list = no
- secrets file = /etc/rsyncd.secrets
- hosts allow = 192.168.1.1
- pid file = /var/run/rsyncd.pid
- lock file = /var/run/rsync.lock
- log file = /var/log/rsyncd.log
上述文件的作用是将备份服务器本地的/home/domains目录及/var/lib/mysql/extmail/目录作为同步操作的对象供邮件主服务器实时写入更新的资料。
- #vim rsyncd.secrets
- root:123456 #认证信息,随意即可,但两端要保持一致
3. 在邮件备份服务器上将同步服务开启,方法是在/etc/rc.d/rc.local文件中加入一行:
/usr/bin/rsync --daemon
这样,备份服务器上的工作完成,然后我们登陆到邮件主服务器192.168.1.1上来操作:
1. 创建一个同步数据的脚本/root/rsync-to-mailbak.sh内容如下(两行):
- rsync -rlptgoDvHS --progress --delete --force --password-file=/etc/rsyncd.secrets /home/ [email protected]::mailbak-update-home
- rsync -rlptgoDvHS --progress --delete --force --password-file=/etc/rsyncd.secrets /var/lib/mysql/ [email protected]::mailbak-update-mysql-extmail
2. 将这个新建的脚本权限变为可执行744或755:
chmod 744 /root/rsync-to-mailbak.sh
3. 在主服务器上创建密码文件/etc/rsyncd.secrets,使其内容和备份服务器上的密码一致。
现在可以试运行一下这个脚本看看效果了,如果是第一次,正常情况你会看到很多数据在拷贝。第二次则很少了,因为所做的是差异对比同步,相同的文件不会再次拷贝。
4. 将这个脚本放到计划任务中,设定每5分钟执行一次:
crontab -e
添加一行命令如下:
0/5 * * * * /root/rsync-to-mailbak.sh
保存,退出即可立即生效。
OK到此,整个MailServer的高可用就算完成了,再次声明,适用于中小型企业!
最后附上,中大型企业高可用的大概解决方案,后续相关博客也会出。
>在Mail的前段,放两台lvs调度器,并做HA
>中间层是节点池
>最后为共享存储
-----------------------------------------纯手动造,不为别的,只为记录--------
2012.06.15 By:Tony
本文出自 “____�N.�r^随记” 博客,谢绝转载!