2013年3月10日 星期日

postfix优化

专门作为转信服务器的postfix的一些优化,参考postfix官方性能优化文档:
禁用header和body checker
禁用chroot
在hosts文件里做好域名反解
做个本地DNS cache加速域名解析
编辑master.cf,修改maxproc为2048
修改smtpd_client_connection_count_limit为1024
修改smtpd_client_connection_rate_limit为0
ulimit -n 819200

参数不是最合适的,但应该是足够大的,500用户,在dell 1950标配机上跑着没问题。
1、修改/usr/lib/courier-imap/etc/pop3d
MAXDAEMONS=512
MAXPERIP=9000
2、修改/etc/authlib/authdaemonrc
daemons=256
3、修改/etc/amavisd.conf
$max_servers = 50;
4、修改/usr/sbin/apachectl
HTTPD=’/usr/sbin/httpd.worker’
5、修改/etc/httpd/conf/httpd.conf
<IfModule worker.c>
StartServers         10
MaxClients       1500
ServerLimit         100
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>
6、修改/etc/clamd.conf
MaxThreads 50
7、修改/etc/my.cnf
max_connections=2048
8、去除rar打包exe会被ban的问题
编辑/etc/amavisd.conf,把$banned_filename_re = new_RE 这段内容相应的修改下
如果你知道该重启哪些服务,就重启这些服务,不清楚的话重启下系统就好。
9、加强发信人限制策略
编辑/etc/postfix/master.cf,把-o smtpd_client_restrictions=permit_sasl_authenticated,reject这行注释去掉。
10、仅允许同域用户给别名群发邮件。
原来的思路是用邮件列表做控制,后来发现邮件列表越搞越复杂越多事,又搜索了一把,发现用postfix的发信和收信人策略搞更方便,分享之。
A、        创建local_recipient和local_domains两个文件
[root@a postfix]# pwd
/etc/postfix
[root@a postfix]# cat local_recipient
allstaff@a.com local_only
[root@a postfix]# cat local_domains
a.com OK
127.0.0.1 OK
youip OK
B、        产生db文件,如果修改过/etc/postfix/local_recipient和/etc/postfix/local_domains文件内容,需要重新执行下面的命令才可生效。
postmap hash:/etc/postfix/local_recipient
postmap hash:/etc/postfix/local_domains
C、        在main.cf里加入两行
smtpd_restriction_classes = local_only
local_only = check_sender_access hash:/etc/postfix/local_domains, reject
D、        在main.cf里给smtpd_sender_restrictions加个规则check_recipient_access hash:/etc/postfix/local_recipient,结果如下:
smtpd_sender_restrictions =
permit_mynetworks,
reject_sender_login_mismatch,
reject_authenticated_sender_login_mismatch,
reject_unauthenticated_sender_login_mismatch,
reject_unknown_sender_domain,
check_recipient_access hash:/etc/postfix/local_recipient
F、        重启postfix。
此时非a.com用户无法给allstaff发信。
弹回信息如下:
你发送到allstaff@a.com的邮件由于以下原因被退回 :
allstaff@a.com SMTP error, RCPT TO: 554 5.7.1 <allstaff@a.com>: Recipient address rejected: Access denied
请到http://help.163.com/special/0075 ... hdrawal_letter.html 查询退信原因。
参考了http://www.extmail.org/forum/vie ... ra=& amp;page=1http://www.extmail.org/forum /vi ... peid%3D1&page=1

对postfix 的性能进行控制,是通过对postfix 一些参数的配置来调节postfix的性能,这些参数都是通过mail.cf 配置文件进行配置的.下面主要介绍下这些参数: 
  1. smtpd_delay_reject参数     作用:rcpt to指令前的过滤动作,设置为no来使过滤动作立刻生效.    
信封过滤分为四个阶段:
•连接ip(client)在.Smtp连接时,由smptd_client_restrictions参数来限制
•连接方(helo)在发送HELO/EHLO指令时,由smtpd_helo_restrictions参数来限制
•发信方(sender)在发送Mail from指令时,由smtpd_sendert_restrictions参数来限制
• 收信方(recipient)在发送Rcpt to指令时,可由smtpd_recipient_restrictions参数来限制   
默认拒绝动作不会在匹配拒绝规则后就立刻断开连接,通过把smtpd_delay_reject设置为no来立刻断开连接.从而有效的节约垃圾邮件造成的带宽和处理能力的浪费.   
2. disable_vrfy_command 参数     作用:限制外界使用VERY命令来侦测收件地址的有效性,垃圾邮件发送者常用这种技巧来收集邮件地址.  如:disable_vrfy_command =yes 
3.  进程数限制     通过default_process_limit 参数来控制postfix 系统同时可以运行的最大进程数目,缺省值是50 个.      如:default_process_limit = 100   
4.对同一目标主机的并发连接限制    当向同一目标主机发出SMTP 连接时,postfix 初始化发出两个SMTP 连接,如果投递成功则增加并发的SMTP 连接数目,遇到拥塞时又减少并发连接的数目。postfix 中通过以下的参数对同一目标主机的并发连接进行控制:
•initial_destination_concurrency:控制对同一目标主机的初始化并发连接数目。缺省值为2。
•default_destination_concurrency_limit:控制初始化连接后对同一目标主机的最大并发连接数目。缺省值为10。
•local_destination_concurrency_limit:控制对同一本地收件人的最大同时投递的邮件数目。缺省值为2,因为对本地同一收件人投递邮件时投递工作只能一个接一个的进行,所以设得在大也没用。      
5.  对同一封邮件的收件人数目限制    通过default_destination_recipient_limit 参数来控制postfix 的投递代理(如smtp 进程)可以将同    一封邮件发送给多少个收件人。也可以用smtpd_recipient_limit明确指出该投递代理的参数来覆盖该缺省值.   如:smtpd_recipient_limit = 100 
6.关于延迟邮件的再投递控制    可以通过以下的几个参数实现对延迟邮件的再投递控制:
•queue_run_delay:设置队列管理进行扫描deferred 邮件队列的频率,缺省值为1000 秒。
•maximal_queue_lifetime:设置postfix 在放弃投递而返回不可投递信息前,被延迟邮件再deferred 邮件队列中的生存时间。
•minimal_backoff_time:当一封邮件投递失败后,邮件队列将在一段时间内忽视该邮件的存在,也就是我们前面讲的时间邮票。该参数就是用来设置最小的时间邮票。缺省值为1000 秒。
•maximal_backoff_time:设置最大的时间邮票。
7. 对拒绝服务攻击的处理     postfix 对每一个SMTP 会话都设置一个错误计数器,当该客户端的请求未被接受或违反那UCE 规则时,该     计数器就增1。随着计数器的增加,postfix将采取不同的措施来防止恶意用户的拒绝服务攻击。
•smtpd_error_sleep_time:当该错误计数器的值还很小时,postfix 将暂停.
•smtpd_error_sleep_time 指定的时间,然后向客户端报告一个错误。该参数的缺省值为5 秒。
•smtpd_soft_error_limit:当错误计数器的值超过该参数指定的值时,postfix 在响应该客户端请求前将沉睡一段时间。
•smtpd_hard_error_limit:当错误计数器的值超过该参数指定的值时,postfix中断同该客户端的连接.         如:smtpd_hard_error_limit = 10

#this file replace main.cf of postfix
soft_bounce = no
(设定成yes时,原本应该退信的动作,会改成将邮件放回队列,等待下次递送;此外,原本应该响应永久错误(5xx)的状况,一律改成以暂时性错误码(4xx)响应)
queue_directory = /var/spool/postfix
(队列目录路径,queue_minfree:邮件队列中可用的空间大小。缺省为无限制。建议该值最好时message_size_limit 的数倍以便于处理大邮件。)
command_directory = /usr/sbin
(postfix的命令行管理工具(postcat、postqueue等)的存放目录)
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
(设置邮件及邮件队列的所有者为postfix)
default_privs = nobody
myhostname = mail.mail23.cn4e.com
(设置邮件服务器的主机名)
mydomain = mail23.cn4e.com
(设置邮件服务器的域名)
myorigin = $myhostname
(网域名称,要附加到只含人名部份不完整邮件地址的网域名称)
inet_interfaces = all
(设置postfix 服务监听的端口)
unknown_local_recipient_reject_code = 450
(响应码,客户端试图寄信给不存在的本地网域用户时,Postfix用于拒绝客户端的SMTP响应码)
mynetworks = 127.0.0.1/32,202.67.xxx.xxx/32
(设置可转发(Relay)哪些网络的邮件,通过本邮件系统寄出邮件的网络地址或IP地址)
alias_maps =  mysql:/etc/postfix/mysql_virtual.cf
(指定使用的别名数据库,当邮件在本地投递时,local 投递代理进程会在别名数据库(linux 下为/etc/aliases)中查询收件人的别名。该操作不会作用于邮件信头中的地址。)
alias_database = mysql:/etc/postfix/mysql_virtual.cf
(可以通过alias_database 参数控制别名数据库的路径)
home_mailbox = Maildir/
(表示要使用maildir格式的邮箱)
header_checks = regexp:/etc/postfix/header_check
(限制接收邮件的信头格式,如果符合指定的格式,则拒绝接收该邮件)
local_destination_concurrency_limit = 1
(并发进程的限制,local_destination_concurrency_limit:控制对同一本地收件人的最大同时投递的邮件数目。因为对本地同一收件人投递邮件时投递工作只能一个接一个的进行,所以设得在大也没用。)
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         xxgdb $daemon_directory/$process_name $process_id & sleep 5
(这两项默认,不要去改)
sendmail_path = /usr/sbin/sendmail
(Postfix的sendmail兼容程序的完整路径.sendmail主要是供脚本或命令行用来寄送邮件)
newaliases_path = /usr/bin/newaliases
(用于重建别名数据库的newaliaser程序的完整路径)
mailq_path = /usr/bin/mailq
setgid_group = postdrop
(Postfix用来提交邮件或管理队列的组标识符)
manpage_directory = /usr/local/man
(Postfix在线说明书的存放目录)
sample_directory = /etc/postfix
(存放Postfix配置文件样本的目录)
readme_directory = no
tls设置
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/key.pem
smtpd_tls_cert_file = /etc/postfix/cert.pem
smtpd_tls_CAfile = /etc/postfix/CAcert.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
allow_untrusted_routing = no
smtpd_sasl_auth_enable = yes
(指定是否启用SASL作为SMTP认证,默认为no)
smtpd_sasl_local_domain =
(采用Cyrun-SASL V2版进行认证,这里不作设置)
smtpd_recipient_restrictions=check_sender_access hash:/etc/postfix/local_out_senders,permit_mynetworks,mysql:/etc/postfix/mysql_smtpd_rec_limit.cf,permit_sasl_authenticated,permit_auth_destination, reject
(通过收件人地址进行过滤,通过发件人在执行RCPT TO 命令时提供的地址进行限制.
permit_auth_destination:不管客户端的主机名,只要符合以下的条件,就接受SMTP 连接请求:
* 解析后的目标地址符合$relay_domains 及其子域
* 解析后的目标地址符合$inet_interfaces、$mydestination 或$virtual_maps
reject_unauth_destination:不管客户端的主机名,只要符合以下的条件,就拒绝该客户端SMTP 连接请求:
* 解析后的目标地址符合$relay_domains 及其子域
* 解析后的目标地址符合$inet_interfaces、$mydestination 或$virtual_maps
check_recipient_access:根据解析后的目标地址、父域搜索access 数据库。如果搜索的结果为REJECT 或者 “[45]XX text” 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。
reject_unknown_recipient_domain:如果收件人的邮件地址在DNS 中没有相应的A 或 MX 记录则拒绝该客户端的连接请求)
smtpd_restriction_classes = local_only
(自定义规范等级的名称,每一组规范等级,都是由一系统UBE限制条件组成)
local_only = check_recipient_access hash:/etc/postfix/local_domains,reject
broken_sasl_auth_clients = yes
(表示是否兼容非标准的SMTP认证)
smtpd_sasl_security_options = noanonymous
(用来限制某些登录方式,参数设置为noanonymous,则表示禁止采用匿名登录方式)
virtual_gid_maps = static:12
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual.cf
(指定含有虚拟别名域定义的文件路径)
virtual_mailbox_base = /mail
(虚拟邮箱文件的相对路径起点)
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
message_size_limit = 524288000
(限制postfix 队列文件的大小。)
mailbox_size_limit = 629145600
(单封邮件的邮箱大小)
virtual_transport = maildrop
(用于投递邮件到虚拟邮箱地址的默认传输服务)
virtual_uid_maps = static:12346
bounce_size_limit = 50000
(限制某一邮件不可投递时,返回给发件人不可投递报告的大小)
smtpd_client_restrictions = mysql:/etc/postfix/mysql_smtpd_client_limit.cf,permit_sasl_authenticated
(限制可以向Postfix发起SMTP连接的客户端的主机名或IP地址,限制规则是按照查询的顺序进行的,)
smtpd_sender_restrictions = permit_mynetworks,mysql:/etc/postfix/mysql_smtpd_sender_limit.cf,reject_sender_login_mismatch,permit_sasl_authenticated,reject_unknown_sender_domain
(通过发件人地址进行限制,通过发件人在执行MAIL FROM 命令时提供的地址进行限制。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行.
reject_unknown_sender_domain:如果MAIL FROM 命令提供的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。
check_sender_access:根据MAIL FROM 命令提供的主机名、父域搜索access 数据库。如果搜索的结果为REJECT 或者 “[45]XX text” 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以通过该参数过滤来自某些不受欢迎的发件人的邮件。)
smtpd_delay_reject=no
(RCPT TO指令前的过滤动作,设置为no来使过滤动作立刻生效)
maildrop_destination_recipient_limit = 1
(Postfix默认会一次性的给多个收件人发邮件,而maildrop每次只处理一个收件人,所以只有第一个收件人能收到邮件,其他的则会被 maildrop不留痕迹的丢弃。把maildrop_destination_recipient_limit设置为1迫使Postfix每次只处理一个收件人,使maildrop能正常工作。)
disable_vrfy_command =yes
(限制外界使用VERY命令来侦测收件地址的有效性,垃圾邮件发送者常用这种技巧来收集邮件地址)
smtpd_helo_restrictions = mysql:/etc/postfix/mysql_smtpd_client_limit.cf,mysql:/etc/postfixsmtpd_recipient_limitmysql_smtpd_helo_limit.cf
(指定客户端在执行HELO命令时发送给POSTFIX的主机名,缺省地,postfix 接收客户端发送的任意形式的主机名。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。)
default_destination_recipient_limit = 10
(对同一封邮件的收件人数目限制,通过default_destination_recipient_limit 参数来控制postfix 的投递代理(如smtp 进程)可以将同一封邮件发送给多少个收件人。也可以用明确指出该投递代理的参数来覆盖该缺省值。如用smtpd_recipient_limit来指定 smtp 投递代理可以将同一封邮件发送给多少个收件人)
smtpd_helo_required = yes(参数指定客户端在SMTP会话的开始是否发送一个HELO命令)
smtpd_helo_required = yes
smtpd_sender_login_maps = mysql:/etc/postfix/mysql_sender_login_maps.cf
maximal_queue_lifetime = 6h
(设置postfix 在放弃投递而返回不可投递信息前,被延迟邮件再deferred 邮件队列中的生存时间。
minimal_backoff_time:当一封邮件投递失败后,邮件队列将在一段时间内忽视该邮件的存在,也就是时间邮票。该参数就是用来设置最小的
时间邮票。缺省值为1000 秒。
maximal_backoff_time:设置最大的时间邮票。)
queue_run_delay = 3600s
(关于延迟邮件的再投递控制,设置队列管理进行扫描deferred 邮件队列的频率)
sender_bcc_maps = mysql:/etc/postfix/mysql_sender_bcc.cf
(将发信人包含在map文件中的邮件被分到指定邮箱;)
recipient_bcc_maps = mysql:/etc/postfix/mysql_rec_bcc.cf
(将收件人包含在map文件中的邮件被分到指定邮箱。)
fallback_relay = mysql:/etc/postfix/mysql_fallbackrelay.cf
(如果找不到或无法到达正常的目的地,则将邮件转交给此参数列出的IP地址,主机或网域)
smtpd_reject_unlisted_sender = yes
(域伪装)
html_directory = no
smtpd_hard_error_limit = 10
(当错误计数器的值超过该参数指定的值时,postfix中断同该客户端的连接。)
smtpd_banner = $myhostname MAIL@35 – ESMTP Mail Service x64 Version: 3.00.00
(设置向用户显示的主机名和版本信息)
default_process_limit = 100
(进程数限制,可以通过default_process_limit 参数来控制postfix 系统同时可以运行的最大进程数目)
default_destination_concurrency_limit = 10
(控制初始化连接后对同一目标主机的最大并发连接数目。缺省值为10。
当向同一目标主机发出SMTP 连接时,postfix 初始化发出两个SMTP 连接,
如果投递成功则增加并发的SMTP 连接数目,遇到拥塞时又减少并发连接的
数目。postfix 中通过以下的参数对同一目标主机的并发连接进行控制:
* initial_destination_concurrency:控制对同一目标主机的初始化并发连接数目。缺省值为2。)
default_recipient_limit = 100
(限制queue manager为各个传输服务保留在内存里的收件人数量)
smtpd_recipient_limit = 100
(指定smtp 投递代理可以将同一封邮件发送给多少个收件人)
bounce_queue_lifetime = 3h
(退信(弹回)在队列中的保留时间。超过此时间,被认为是无法投递的)
smtpd_client_connection_count_limit=200
smtp_data_done_timeout=3600
(SMTP client送出”.”表示信息内容结束之后,最多可以等待SMTP server在多长时间内响应)
smtp_data_init_timeout=3600
smtp_data_xfer_timeout=3600
(SMTP client在传送信息的过程中,可以容忍的等待时间)
hopcount_limit = 50
(信头中Received的最大数,阻止邮件的一直循环)
bounce_template_file = /etc/postfix/bounce.cf
data_directory = /var/lib/postfix
always_add_missing_headers = yes
(Postfix总是自动为没有message-id的邮件添加message-id:)

2013年2月16日 星期六

heartbeat 2.x简单配置

   高可用集群是指一组通过硬件和软件连接起来的独立计算机,它们在用户面前表现为一个单一系统,在这样的一组计算机系统内部的一个或者多个节点停止工作,服务会从故障节点切换到正常工作的节点上运行,不会引起服务中断。从这个定义可以看出,集群必须检测节点和服务何时失效,何时恢复为可用。这个任务通常由一组被称为“心跳”的代码完成。在Linux-HA里这个功能由一个叫做heartbeat的程序完成。
    Heartbeat是Linux-HA工程的一个组件,自1999年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,在行业内得到了广泛的应用。
    下面以2.1.3版本为例讲解其框架和基础概念。
一、基本框架
Heartbeat分1.x和2.x两个大版本,v2版本是可以兼容之前v1的配置文件的,但从功能的角度来看,v2要强不少:

引用

a)2.x支持CRM管理,资源文件由原来的haresources变为cib.xml;
b)支持ocf、lsb、stonith等格式的resource agent;
c)可以对多资源组进行独立监控,不再需要依赖mon或ldirectord等第三方脚本;
d)支持多节点;
e)提供GUI图形配置和管理工具。

Heartbeat 2.x基于集群资源管理器(Cluster Resource Manager-CRM)CRM模式:可以支持最多16个节点,这些模式使用基于XML的集群信息(Cluster Information Base-CIM)配置。CIB文件(/var/lib/heartbeat/crm/cib.xml)会在各个节点间自动复制,可以实现下面的对象和动作:

引用

a)集群节点配置和监控;
b)集群资源,包括属性、优先级、组和依赖性的定制;
c)日志、监控、仲裁和fence标准管理;
d)当服务失败或其中设定的标准满足时,需要执行的动作。

二、基础概念
Heartbeat包括以下几个组件:

引用

heartbeat – 节点间通信校验模块
CRM - 集群资源管理模块
CCM - 维护集群成员的一致性
LRM - 本地资源管理模块
StonithDaemon - 提供节点重启服务
logd - 非阻塞的日志记录
apphbd - 提供应用程序级的看门狗计时器
Recovery Manager - 应用故障恢复
底层结构–包括插件接口、进程间通信等
CTS – 集群测试系统,集群压力测试

三、可靠消息通信
以下内容转自:互动百科
Heartbeat通过插件技术实现了集群间的串口、多播、广播和组播通信,在配置的时候可以根据通信媒介选择采用的通信协议,heartbeat启动的时候检查这些媒介是否存在,如果存在则加载相应的通信模块。这样开发人员可以很方便地添加新的通信模块。
对于高可用集群系统,如果集群间的通信不可靠,那么很明显集群本身也不可靠。Heartbeat采用UDP协议和串口进行通信,它们本身是不可靠的,可靠性必须由上层应用来提供。那么怎样保证消息传递的可靠性呢?
Heartbeat 通过冗余通信通道和消息重传机制来保证通信的可靠性。Heartbeat检测主通信链路工作状态的同时也检测备用通信链路状态,并把这一状态报告给系统管理员,这样可以大大减少因为多重失效引起的集群故障不能恢复。例如,某个工作人员不小心拨下了一个备份通信链路,一两个月以后主通信链路也失效了,系统就不能再进行通信了。通过报告备份通信链路的工作状态和主通信链路的状态,可心完全避免这种情况。因为这样在主通信链路失效以前,就可以检测到备份工作链路失效,从而在主通信链路失效前修复备份通信链路。
Heartbeat通过实现不同的通信子系统,从而避免了某一通信子系统失效而引起的通信失效。最典型的就是采用以太网和串口相结合的通信方式。这被认为是当前的最好实践,有几个理由可以使我们选择采用串口通信:

引用

(1)IP通信子系统的失效不太可能影响到串口子系统。
(2)串口不需要复杂的外部设备和电源。
(3)串口设备简单,在实践中非常可靠。
(4)串口可以非常容易地专用于集群通信。
(5)串口的直连线因为偶然性掉线事件很少。

不管是采用串口还是以太网IP协议进行通信,heartbeat都实现了一套消息重传协议,保证消息包的可靠传递。实现消息包重传有两种协议,一种是发送者发起,另一种是接收者发起。
对于发送者发起协议,一般情况下接收者会发送一个消息包的确认。发送者维护一个计时器,并在计时器到时的时候重传那些还没有收到确认的消息包。这种方法容易引起发送者溢出,因为每一台机器的每一个消息包都需要确认,使得要发送的消息包成倍增长。这种现像被称为发送者(或者ACK)内爆(implosion)。
对于接收者发起协议,采用这种协议通信双方的接收者通过序列号负责进行错误检测。当检测到消息包丢失时,接收者请求发送者重传消息包。采用这种方法,如果消息包没有被送达任何一个接收者,那么发送者容易因NACK溢出,因为每个接收者都会向发送者发送一个重传请求,这会引起发送者的负载过高。这种现像被称为NACK内爆(implosion)。
Heartbeat实现的是接收者发起协议的一个变种,它采用计时器来限制过多的重传,在计时器时间内限制接收者请求重传消息包的次数,这样发送者重传消息包的次数也被相应的限制了,从而严格的限制了NACK内爆

------------------------------------------------------------

     昨天介绍了heartbeat 2.x的基础概念,其中提到v2版本是可以兼容v1的配置文件,而v2提供了更加强大的集群控制功能。使用v1还是v2的配置文件,是以ha.cf主配置文件决定的。实际使用中,虽然v2功能强大,但配置比较麻烦,GUI图形工具更是复杂难用,似乎要完全弄懂并不容易。不过,要实现基础的配置却是比较简单的,官方也提供了大量的说明文档,建议大家对比来看。
一、安装
heartbeat 官方网站:http://linux-ha.org/
测试环境为:

引用

node1: hatest3 192.168.228.233
node2: hatest4 192.168.228.234
FIP: 192.168.228.235

操作系统以红旗DC Server 5.0 SP2为例,其自带的heartbeat是1.x版本的,必须先卸载:

# rpm -e heartbeat heartbeat-ldirectord heartbeat-pils heartbeat-stonith

而2.x版本依赖多个perl包,我是使用centos 4.7的yum源来安装的。在红旗上配置好yum工具后,使用yum安装即可:

引用

# yum install heartbeat*
heartbeat-2.1.3-3.el4.centos.i386.rpm
heartbeat-devel-2.1.3-3.el4.centos.i386.rpm
heartbeat-gui-2.1.3-3.el4.centos.i386.rpm
heartbeat-ldirectord-2.1.3-3.el4.centos.i386.rpm
heartbeat-pils-2.1.3-3.el4.centos.i386.rpm
heartbeat-stonith-2.1.3-3.el4.centos.i386.rpm
perl-Authen-Radius-0.13-1.el4.centos.noarch.rpm
perl-Data-HexDump-0.02-1.el4.centos.noarch.rpm
perl-Mail-POP3Client-2.17-1.c4.noarch.rpm
perl-MailTools-1.77-1.el4.centos.noarch.rpm
perl-Net-IMAP-Simple-1.17-1.el4.centos.noarch.rpm
perl-Net-IMAP-Simple-SSL-1.3-1.c4.noarch.rpm

※ 注意,不知道为什么,我在第一次安装完毕后,配置启动CRM总是失败,后来查看日志才发现原来缺少了/var/run/heartbeat下的多个文件和目录,而这些目录是用于存放运行CRM时的临时执行命令的。所以,请务必确认一下该目录下的内容和用户、组等权限。

引用

# ll /var/run/heartbeat
总用量 12
drwxr-xr-x  2 hacluster haclient 4096  4月  8 12:32 ccm
drwxr-x---  2 hacluster haclient 4096  4月  8 12:33 crm
srwxrwxrwx  1 root      root        0  4月  8 12:32 register
drwxr-xr-t  4 root      root     4096  4月  8 12:33 rsctmp
srwxrwxrwx  1 root      root        0  4月  8 12:32 stonithd
srwxrwxrwx  1 root      root        0  4月  8 12:32 stonithd_callback

※ 另外,heartbeat的运行还需要依赖hacluster用户和haclient组,而红旗在之前安装1.x版本时已经创建了这些用户,这里不需重新创建。如果您对这些用户的uid和gid进行了改动,则务必把对应的目录修改为正确的宿主。
二、1.x和2.x配置文件对比
在下面三个文件上体现了v2版本对比v1的区别:

引用

/etc/ha.d/authkeys 该文件在两个版本作用是完全相同的,都必须设置,并且保证每个节点(node)内容一样;
/etc/ha.d/ha.cf 这个是主要配置文件,由其决定v1或v2 style格式
/etc/ha.d/haresources 这是v1的资源配置文件
/var/lib/heartbeat/crm/cib.xml 这是v2的资源配置文件,两者根据ha.cf的设定只能选其一

正如前面所说的,v2版本使用CRM管理工具,而cib.xml文件可有几种方式来编写:

引用

a)人工编写XML文件;
b)使用admintools工具,其已经包含在heartbeat包中;
c)使用GUI图形工具配置,也包含在heartbeat-gui包里面;
d)使用python脚本转换1.x style的格式配置文件。

这四种方法实质都是相同的,并且以python脚本转换最为简单容易(GUI工具相当难用,今后有时间再详细说明)。为此,我们可以先配置好1.x style的格式。
三、配置1.x style格式
1、准备
为方便配置文件之间的同步,我建议先给主节点做好到下面各个节点的ssh密钥认证,单向即可。
这部分的配置,请参考:http://www.linuxfly.org/post/29/
2、设定authkeys文件
该文件是集群中各节点相互认证的配置文件,允许使用crc(明文)、md5、sha1等不同的验证方式,可以使用heartbeat自带的示例来修改:

# cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/
# cd /etc/ha.d
# chmod 600 authkeys

修改后的内容如下:

引用

# cat authkeys
auth 2
1 crc
2 sha1 HI!
3 md5 Hello!

auth命令定义了使用那种验证方式,需保证每个节点使用相同的验证方式和验证字符串。authkeys的权限也必须是600的。
3、设定ha.cf文件
这是关键的配置文件,同样的,可以先从示例中拷贝过来:

# cp /usr/share/doc/heartbeat-2.1.3/ha.cf /etc/ha.d

1.x的基本配置信息如下:

引用

# more /etc/ha.d/ha.cf
#发送keepalive包的间隔时间
keepalive 2
#定义节点的失效时间
deadtime 30
#定义heartbeat服务启动后,等待外围其他设备(如网卡启动等)的等待时间
initdead 30
#使用udp端口694 进行心跳监测
udpport 694
#定义心跳
bcast   eth0 eth1               # Linux
#定义是否使用auto_failback功能
auto_failback off
#定义集群的节点
node    hatest3
node    hatest4
#使用heartbeat提供的日志服务,若use_logd设置为yes后,下面的三个选项会失效
use_logd yes
#logfile /var/log/ha_log/ha-log.log
#logfacility local7
#debugfile /var/log/ha_log/ha-debug.log
#设定一个监控网关,用于判断心跳是否正常
ping 192.168.228.153
deadping 5
#指定和heartbeat一起启动、关闭的进程
respawn hacluster /usr/local/lib64/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

该配置文件是比较简单和清晰的,在不适用crm yes的情况下,即为1.x style格式。
4、设定haresources文件
这个是1.x使用的集群资源文件,每行一个组,第一列定义的是优先级服务器,也就是默认资源运行在该服务器上:

引用

hatest3 192.168.228.235 httpd
#hatest3 IPaddr::192.168.228.235 httpd

当ha发现优先节点当掉了,则另一个节点会自动接管192.168.228.235(浮动IP)和服务。第二行的作用是相同的,第一行是简略了IPaddr的写法。如果集群需要实现Active-Active(互备)状态,则可以再写一行,但托管的应用不能冲突。
5、设定hosts文件
这不是一个必须的配置,但为了方便同步各节点的配置,建议设定:

引用

# cat /etc/hosts
hatest3 192.168.228.233
hatest4 192.168.228.234

6、拷贝配置文件到集群各节点上
可以利用v2版本提供的同步配置工具来同步上述的配置文件,但默认只提供同步ha.cf和authkeys,haresources文件还是需要自行拷贝的(v2不使用该文件):

引用

# /usr/lib/heartbeat/ha_propagate
# /usr/lib/heartbeat/ha_propagate
Propagating HA configuration files to node hatest4.
ha.cf                                         100%   11KB  10.7KB/s   00:00
authkeys                                      100%  682     0.7KB/s   00:00
Setting HA startup configuration on node hatest4.
# scp /etc/ha.d/haresources hatest4:/etc/ha.d
haresources                                   100% 5960     5.8KB/s   00:00

7、测试
在节点上都启动heartbeat服务:

# service heartbeat start

同时监控/var/log/ha-log日志文件,可以发现:

引用

info: Enabling logging daemon
info: logfile and debug file are those specified in logd config file (default /etc/logd.cf)
info: Version 2 support: false
info: **************************
info: Configuration validated. Starting heartbeat 2.1.3
info: heartbeat: version 2.1.3
info: Heartbeat generation: 1239094081

可见,这是没有使用v2 style配置格式的。接着,您可以进行简单的切换测试(例如断开hatest3的网络,关闭hatest3等),看看httpd服务是否可以正常切换到hatest4上。
至此,1.x style的heartbeat已经搭建完成。接下来即可借助1.x style的资源配置文件,转换为2.x style的格式,以构建2.x的HA集群应用。因文章篇幅太长,请转到下一篇日志中继续。

--------------------------------------------------------------------

    继续昨天的内容。接下来要做的,就是借助1.x style的集群资源配置文件转换为2.x style的格式,并适当的配置ha.cf文件。与1.x style不同的是,v2.x style会使用CRM来进行整个集群的管理。集群开始时,通过在各节点间选举产生一个节点成为DC(Designated Coordinator),配置应在该DC上进行,并由其分发到下面的各个节点上。另外,使用中发现存在缺少ccm和crm临时目录的问题,暂时从官方的文档中暂时没有找到明确的解析和说明,我是作为一个Bug来理解的。
四、配置2.x style格式
从上面的测试可见,heartbeat 2.1.3确实是支持v1的配置格式的。如果要使用CRM管理,接下来要做的,就是激活v2的支持,并转换集群资源配置文件。
1、修改ha.cf配置文件
首先停止各节点的heartbeat服务:

# service heartbeat stop

然后修改/etc/ha.d/ha.cf文件为:

引用

# more /etc/ha.d/ha.cf
keepalive 2
deadtime 30
initdead 30
udpport 694
bcast   eth0 eth1               # Linux
auto_failback off
node    hatest3
node    hatest4
ping 192.168.228.153
use_logd yes
#下面的配置是关键,也就是激活crm管理,允许使用v2 style格式
#注意,还可以使用crm yes的写法,但这样写的话,如果后面的cib.xml配置有问题
#会导致heartbeat直接重启该服务器,所以,测试时建议使用respawn的写法
crm respawn
#下面是对传输的数据进行压缩,是可选项
compression     bz2
compression_threshold 2

※ 注意,v2 style不支持ipfail功能,而应使用pingd代替
请见:http://www.linux-ha.org/ipfail
2、关于Designated Coorinator
v2.x style使用CRM来进行整个集群的管理。即使没有生成下面的cib.xml文件,只要正确配置authorkeys和ha.cf,即可运行集群。
集群开始时,通过在各节点间选举产生一个节点成为DC(Designated Coordinator),日志会显示:

引用

info: update_dc: Set DC to hatest3 (2.0)

今后,配置应在该DC上进行,并由其分发到下面的各个节点上。
※ 注意,我从官方的资料中并没有找到明确指出,如何再多个节点之间选举DC的方法和策略,似乎是与节点的主机名有关。
介绍请见:这里
暂时,建议首次配置heartbeat的朋友,可以在没有cib.xml文件的情况下,启动所有节点上的heartbeat服务,通过查看日志以判断DC为那台节点机器。
这里,以hatest3为DC进行举例说明。所以,以下的工作都在hatest3节点上进行。
3、转换v1.x为v2.x格式文件
heartbeat提供了一个使用python写的转换工具,可直接转换v1 style的配置文件为v2 style:

# /usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources

※ 如果您之前已经启动过使用v2 style的heartbeat,需要先删除原来的文件:

# rm -f /var/lib/heartbeat/crm/*

继续前,可以先校验一下资源文件的格式是否正确:

# crm_verify -x /var/lib/heartbeat/crm/cib.xml

◎ 因/etc/ha.d/haresources文件对于v2 style来说是多余的,所以官方文档中,是创建了一个haresources.tmp的文件,然后直接转换:

# /usr/lib/heartbeat/haresources2cib.py /root/haresources.tmp

4、拷贝配置文件到各节点上
同步各节点的配置文件

引用

# /usr/lib/heartbeat/ha_propagate
Propagating HA configuration files to node hatest4.
ha.cf                                                                                      100%   11KB  10.7KB/s   00:00
authkeys                                                                                   100%  682     0.7KB/s   00:00
Setting HA startup configuration on node hatest4.
# scp /var/lib/heartbeat/crm/cib.xml hatest4:/var/lib/heartbeat/crm/
cib.xml                                                                                    100% 3117     3.0KB/s   00:00

5、重建crm临时目录
※ 这一步非常重要,如果不进行这步操作的话,后面启动hearbeat服务会失败的。
在安装的时候,我们提到,heartbeat v2的允许需要依赖/var/run/heartbeat中的若干文件。但不知道是Bug,还是其他原因,我发现机器重启后,/var/run/heartbeat目录会被清空:

引用

# ll /var/run/heartbeat/
总用量 0

但这目录下的ccm和crm对于heartbeat v2的运行是不可缺少的,对比一下heartbeat包中的内容:

引用

# rpm -ql heartbeat|grep run
/var/run
/var/run/heartbeat
/var/run/heartbeat/ccm
/var/run/heartbeat/crm

如果这时候直接启动heartbeat服务,日志中就会报错:

引用

info: startCib: CIB Initialization completed successfully
info: cib_register_ha: Signing in with Heartbeat
info: cib_register_ha: FSA Hostname: hatest3
ERROR: socket_wait_conn_new: trying to create in /var/run/heartbeat/crm/cib_callback bind:: No such file or directory
ERROR: Can't create wait channel of type uds: Resource temporarily unavailable

通过查看/etc/init.d/heartbeat文件,可以发现其中有:

StartHA() {
  EchoNoNl "Starting High-Availability services: "
......
  if
    [ ! -d $RUNDIR/heartbeat ]
  then
    mkdir -p $RUNDIR/heartbeat/ccm
    mkdir -p $RUNDIR/heartbeat/crm
    chown -R hacluster:haclient $RUNDIR/heartbeat
    chmod -R 750 $RUNDIR/heartbeat
  fi
......

所以,解决办法是,修改该文件为:

引用

StartHA() {
  EchoNoNl "Starting High-Availability services: "
......
  if
[ ! -d $RUNDIR/heartbeat/ccm -o ! -d $RUNDIR/heartbeat/crm ]
  then
    mkdir -p $RUNDIR/heartbeat/ccm
    mkdir -p $RUNDIR/heartbeat/crm
    chown -R hacluster:haclient $RUNDIR/heartbeat
    chmod -R 750 $RUNDIR/heartbeat
  fi
......

参考办法:
Heartbeat fails to start after Dapper upgrade
6、测试
最后,在各节点上启动heartbeat服务进行测试:

# service heartbeat start

日志会显示:

引用

info: Enabling logging daemon
info: logfile and debug file are those specified in logd config file (default /etc/logd.cf)
info: Version 2 support: respawn
WARN: File /etc/ha.d/haresources exists.
WARN: This file is not used because crm is enabled
info: **************************
info: Configuration validated. Starting heartbeat 2.1.3
info: heartbeat: version 2.1.3
info: Heartbeat generation: 1239088581

可见,已经使用v2 style配置了。接下来,您可以查看hatest3上的服务是否正常,或进行故障切换测试。
7、GUI工具
v2 style的集群正常启动后,会打开5560端口,允许hb_gui访问。

引用

# netstat -ln|grep 5560
tcp        0      0 0.0.0.0:5560                0.0.0.0:*                   LISTEN
# ps -ef|grep mgmt|grep -v 'grep'
root      3770  3752  2 10:50 ?        00:00:02 /usr/lib/heartbeat/mgmtd -v

使用hb_gui访问CRM管理界面前,还需要给hacluster用户创建一下密码:

# passwd hacluster

接着,就可以进入Xwin界面,运行:

# hb_gui

看到的登陆界面如下:
点击在新窗口中浏览此图片
登陆后可以看到当前的集群情况:
点击在新窗口中浏览此图片
该界面不单可以进行监控,还可以进行配置和管理的操作:
点击在新窗口中浏览此图片
不过,这工具可真的并不是那么好用,待以后有机会再做说明吧。
※ heartbeat还提供了一个CRM管理程序crm_resource,在 这里 说明。
最后确认整个HA集群都可以正常运行、监控、切换后,可以把/etc/ha.d/ha.cf中的crm respawn改为crm yes,并设置为自启动:

# chkconfig --level 35 heartbeat on

五、故障分析
在整个配置和调试过程中,遇到的问题可真是不少,甚至大部分问题在官方的资料中都没有提及,这是开源软件一个典型的问题。软件并不是研发出来就可以了,维护和文档是非常重要的。
1、激活5560端口错误
启动heartbeat时,报错:

引用

ERROR: Duplicate apiauth directive for API client mgmtd: [mgmtd uid=root]
some entries in ha.cf no longer needed

在旧版本heartbeat上,激活5560端口,提供GUI访问支持,需要修改/etc/ha.d/ha.cf文件,在其中增加:

引用

apiauth mgmtd uid=root
respawn root /usr/lib/heartbeat/mgmtd -v

但新版本heartbeat已经不需要再进行该设置了,只需要打开crm yes或crm respawn即可,而重复的定义会导致启动失败的。
官方提供了说明:http://www.linux-ha.org/UpdateExperience
2、缺少临时目录

引用

ERROR: socket_wait_conn_new: trying to create in /var/run/heartbeat/crm/cib_callback bind:: No such file or directory
ERROR: Can't create wait channel of type uds: Resource temporarily unavailable

这问题在前面已经提过了,是因为缺少/var/run/heartbeat下的ccm和crm目录,修改/etc/init.d/heartbeat脚本,或重建这些目录都可以解决。
3、临时目录权限不对

引用

ERROR: socket_wait_conn_new: unlink failure(/var/run/heartbeat/ccm/ccm): Permission denied
ERROR: socket_wait_conn_new: trying to create in /var/run/heartbeat/ccm/ccm bind:: Permission

这问题与上面的问题类似,是因为临时目录创建时给予的权限不对导致的,修改为正确的权限即可。
4、UUID不正确
参与集群的每台服务器都会有一个唯一的UUID值,但可能由于一些特殊原因,例如目录复制、机器拷贝、文件丢失等,导致UUID丢失或重复,会导致集群不能正常启动。
这时,可删除下面的文件,重启heartbeat时会自动重建新的UUID:

# cd /var/lib/heartbeat/
# rm delhostcache hb_generation hb_uuid hostcache
# service heartbeat start

5、宿主和权限问题
红旗上默认安装的heartbeat v1会创建UID为90的hacluster用户和haclient组,若您重新安装hearbeat v2时对这部分进行了修改,请需要确认相关的文件是否正确。同样的,权限也一样,有部分执行文件是设置了setuid等特殊权限的。
下面的命令能协助您找出机器中属于hacluster用户的文件:

# find / -u hacluster -print

2013年1月13日 星期日

服务器信息脚本

echo "#开机时间"
w | grep up | awk -F"up" '{print "up"$2}' | awk -F"," '{print $1}'
echo ""
echo "#硬件BOIS信息,必须root执行"
dmidecode | grep -E 'Release Date|UUID|Product Name|Vendor|Serial Number: '| sed -n '1,5p'
echo ""
echo "#cpu情况"
grep "model name" /proc/cpuinfo  | awk '{++SUM[$4$5" "$7$8$9]}END{for(a in SUM)print a,"(*"SUM[a]")"}'
echo ""
echo "#磁盘情况"
fdisk -l | grep Disk | awk -F"," '{print $1}'
echo ""
echo "#内存、swap情况"
free -g | grep -E 'Mem|Swap' | awk '{print $1,$2+1"GB"}'
echo ""
echo "系统内核情况"
uname -a | awk '{print $3"("$(NF-1)")"}'
echo ""
echo "MAC地址"
ifconfig | grep HWaddr
echo ""
echo "登陆情况"
last |grep -E '0[0-6]:[0-5][0-9] - [0-9][0-9]:[0-5][0-9]'
echo "磁盘情况"
df -h | awk '{print $1,$2}'