《原创MailServer高可用解决方案》

《MailServer高可用解决方案------适用于中小型企业》
当我们在企业中都会需要建立自己的邮件系统,建好以后,安全性成了管理员必须考虑的问题,本篇博文志在解决这个问题。
我们需要实现的效果就是服务器为一主一备,当master宕机后,slave自动接管,继续为用户提供服务。
本文以开源团队开发的EMOS微型邮件系统为例:
首先上图:
 
大概解释下:
1.用keepalived来做健康检查,再用脚本的形式来检测我们需要的服务器状态,一旦宕机,备机自动接管vip
2.用rsync来做数据同步,大概可以5分钟一次,本来想用rsync+inotify做实时同步的,但考虑到数据变动频率较大,容易丢失数据,故只采用rsync来做。

具体部署:
第一部分:高可用keepalived
1.首先安装keepalived并配置:

  
  
  
  
  1. #wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz  
  2. #tar -zxf keepalived-1.2.2.tar.gz  
  3. #cd keepalived  
  4. #./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.18-308.8.2.el5-x86_64/  
  5. #make && make install 

2.贴出配置文件并有相应注释:

  
  
  
  
  1. ! Configuration File for keepalived  
  2.  
  3. global_defs {  
  4.    notification_email {  
  5.         [email protected]                       #设置邮件报警地址,可以设置多个,每行一个  
  6.    }  
  7.    notification_email_from root@localhost   #设置邮件的发送地址  
  8.    smtp_server 127.0.0.1                    #邮件发送的服务器ip  
  9.    smtp_connect_timeout 30                  #设置连接smtp server的超时时间  
  10.    router_id Mail1                          #表示运行keepalived服务器的一个标示,发邮件时显示在邮件主题中的信息  
  11. }  
  12.  
  13. vrrp_instance VI_1 {                        #定义vrrp实例  
  14.     state MASTER                            #类型为主服务器  
  15.     interface eth0                          #指定HA检测网络的端口  
  16.     virtual_router_id 50                    #虚拟路由表示,这个表示是一个数字,同一个vrrp实例使用唯一的标示  
  17.     priority 100                            #定义优先级,数字越大,优先级越大,在同一个vrrp里,MASTER的优先级必须高于SLAVE  
  18.     advert_int 1                            #设定MASTER和SLAVE服务器之间的健康检查的时间间隔,单位是秒  
  19.     authentication {  
  20.         auth_type PASS                      #设定验证类型,主要有PASS和AH两种  
  21.         auth_pass 1111                      #设置密码,在同一个vrrp里,MASTER和SLAVE必须使用相同的密码才能正常通信  
  22.     }  
  23.     virtual_ipaddress {  
  24.         192.168.1.100                       #设置虚拟ip(VIP)  
  25.     }  
  26. }  
  27.  
  28. virtual_server 192.168.1.100 80 {           #虚拟服务器地址(VIP)、端口  
  29.     delay_loop 6                            #健康检查的间隔时间(秒),每隔 6 秒查询 realserver状态  
  30.     lb_algo rr                              #lvs 调度算法,这里使用轮询  
  31.     lb_kind DR                              #lvs 负载均衡机制,这里使用直连路由  
  32.     persistence_timeout 60                  #同一 IP 的连接 60 秒内被分配到同一台 realserver  
  33.     protocol TCP                            #用 TCP 协议检查 realserver 状态  
  34.  
  35.     real_server 192.168.1.1 80 {            #第一个web节点的地址以及端口  
  36.         weight 1                            #节点的权重  
  37.         TCP_CHECK {                         #健康检查的方式  
  38.             connect_port 80                 #检查的目标端口  
  39.             connect_timeout 3               #故障重试秒数(即连接超时)  
  40.             nb_get_retry 3                  #重试延迟(即重试次数)  
  41.             delay_before_retry 4            #重试间隔(秒)  
  42.         }  
  43.     }  
  44.     real_server 192.168.1.2 80 {            #同上!  
  45.         weight 1  
  46.         TCP_CHECK {  
  47.             connect_port 80  
  48.             connect_timeout 3  
  49.             nb_get_retry 3  
  50.             delay_before_retry 4  
  51.         }  
  52.     }  

备机上只需更改router_idstateprority参数即可,其余内容完全相同,配置完成以后重启keepalived服务。

3.编写检测脚本,用来监控postfix的进程:
vim /root/master.sh

  
  
  
  
  1. #!/bin/bash  
  2. while :  
  3. do  
  4.         mpid=`ps -C master --no-header |wc -l`  
  5.         if [ $mpid -eq 0 ]; then  
  6.         /etc/init.d/postfix restart  
  7.         sleep 5  
  8.         mpid=`ps -C master --no-header |wc -l`  
  9.         echo $mpid  
  10.                 if [ $mpid -eq 0 ]; then  
  11.                 /etc/init.d/keepalived stop  
  12.                  fi  
  13.         fi  
  14.         sleep 5  
  15. 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 即可)

  
  
  
  
  1. #vim /etc/rsyncd.conf  
  2. uid = root 
  3. gid = root 
  4. use chroot = no 
  5. max connections = 4 
  6. strict modes =yes 
  7. port = 873 
  8.  
  9. [mailbak-update-mysql-extmail]  
  10. path = /var/lib/mysql/  
  11. comment = This is a test  
  12. ignore errors  
  13. read only = no 
  14. list = no 
  15. secrets file = /etc/rsyncd.secrets  
  16. hosts allow = 192.168.1.1  
  17. [mailbak-update-home]  
  18. path = /home/  
  19. comment = This is a test  
  20. ignore errors  
  21. read only = no 
  22. list = no 
  23. secrets file = /etc/rsyncd.secrets  
  24. hosts allow = 192.168.1.1  
  25. pid file = /var/run/rsyncd.pid  
  26. lock file = /var/run/rsync.lock  
  27. log file = /var/log/rsyncd.log 

上述文件的作用是将备份服务器本地的/home/domains目录及/var/lib/mysql/extmail/目录作为同步操作的对象供邮件主服务器实时写入更新的资料。

  
  
  
  
  1. #vim rsyncd.secrets  
  2. root:123456                 #认证信息,随意即可,但两端要保持一致 

3. 在邮件备份服务器上将同步服务开启,方法是在/etc/rc.d/rc.local文件中加入一行:
/usr/bin/rsync --daemon
这样,备份服务器上的工作完成,然后我们登陆到邮件主服务器192.168.1.1上来操作:
1. 创建一个同步数据的脚本/root/rsync-to-mailbak.sh内容如下(两行):

  
  
  
  
  1. rsync -rlptgoDvHS --progress --delete --force --password-file=/etc/rsyncd.secrets /home/ [email protected]::mailbak-update-home  
  2. 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^随记” 博客,谢绝转载!

你可能感兴趣的:(keepalived,HA,mail,rsync,双机热备)