heartbeat+drbd+mysql的高可用性
- 格式:doc
- 大小:10.46 MB
- 文档页数:42
/thread-3689681-1-1.html我们下面来实现一个架构,heartbeat+drbd+nfs实现mysql和网站数据的同步,keepalived 实现nginx的高可用,而用nginx和dns轮询实现负载均衡。
架构说明目录规划/usr/local/src/lnmp:用来存放源码工具等等/data:用来存放所有数据和NFS以及DRBD的挂载/data/shell:用来存放所有管理脚本/data/mysql:用来挂载DRBD的mysql资源,以供mysql存放数据库/data/wwwnfs:用来挂载DRBD生成的www资源,以供两个节点挂载到各个节点的/data/www 目录,以供论坛等程序数据使用/data/www:用来挂载NFS资源,用来存放论坛(网站)等程序数据拓扑工作原理内网:1,DRBD网络存储创建出两个资源,一个mysql给mysql数据库同步用,一个www给web(论坛)数据NFS共享挂载用,虚拟出两个虚拟IP,一个是 192.168.1.100,用来连接数据库,一个是192.168.1.200,用来给节点挂载NFS注意:NFS底下挂载了三次:DRBD挂载一次,文件系统挂载一次,客户端挂载一次2,Heartbeat来实现DRBD的HA,同时虚拟出两个内网IP,并管理NFS,MySQL的启动和关闭外网:1,两个节点都用Nginx做均衡器,通过内网调度负载两个节点,实现内部均衡2,DNS配置双IP对应一个域名的方式来实现DNS轮询,实现外网均衡3,Keepalived使用双主(master)配置虚拟出两个虚拟IP:节点一 12.12.12.100和节点二12.12.12.200,同时共外网访问,两个节点互为主从关系,当某个节点挂掉的时候,另外一个节点将同时是两个资源的master,同时拥有两个虚拟IP,实现资源转移。
我们知道DNS的缺点就是生效慢,分配资源不合理,理论上有可能把所有的请求都发送给同一节点,导致均衡不合理导致所有资源不可用,这里我们由于有了NGINX内部负载,就不怕DNS轮询不均衡了,因为NGINX内部有严谨的调度方式,不管那台请求有多少,在内部都能实现理想的调度,这样就能把 DNS负载均衡和NGINX完美结合,是硬件资源得到合理的利用,然后利用keepalive保证了每个节点的可靠性,几乎完美!拓扑图如下:架构实现LNMP架构配置配置LNMp架构需要注意两点:注意一:这里MYSQL都不要初始化,不要启动!后面有专门的配置的注意二:nginx所有端口都改成 8080,因为一会还要安装nginx来做均衡器并对外提供服务,所以不要用默认的80注意三、nginx和php-fpm运行的用户都是www。
MySQL⾼可⽤⽅案-PXC环境部署记录之前梳理了,对于mysql⾼可⽤⽅案,经常⽤到的的主要有下⾯三种:⼀、基于主从复制的⾼可⽤⽅案:双节点主从 + keepalived⼀般来说,中⼩型规模的时候,采⽤这种架构是最省事的。
两个节点可以采⽤简单的⼀主⼀从模式,或者双主模式,并且放置于同⼀个VLAN中,在master节点发⽣故障后,利⽤keepalived/heartbeat的⾼可⽤机制实现快速切换到slave节点。
在这个⽅案⾥,有⼏个需要注意的地⽅:采⽤keepalived作为⾼可⽤⽅案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下(⽐如脑裂)相互抢占导致往两个节点写⼊相同数据⽽引发冲突;1)把两个节点的auto_increment_increment(⾃增步长)和auto_increment_offset(⾃增起始值)设成不同值。
其⽬的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应⽤,从⽽会导致slave新写⼊数据的⾃增值和原先master上冲突了,因此⼀开始就使其错开;当然了,如果有合适的容错机制能解决主从⾃增ID冲突的话,也可以不这么做;2)slave节点服务器配置不要太差,否则更容易导致复制延迟。
作为热备节点的slave服务器,硬件配置不能低于master节点;3)如果对延迟问题很敏感的话,可考虑使⽤MariaDB分⽀版本,或者直接上线MySQL 5.7最新版本,利⽤多线程复制的⽅式可以很⼤程度降低复制延迟;4)对复制延迟特别敏感的另⼀个备选⽅案,是采⽤semi sync replication(就是所谓的半同步复制)或者后⾯会提到的PXC⽅案,基本上⽆延迟,不过事务并发性能会有不⼩程度的损失,需要综合评估再决定;5)keepalived的检测机制需要适当完善,不能仅仅只是检查mysqld进程是否存活,或者MySQL服务端⼝是否可通,还应该进⼀步做数据写⼊或者运算的探测,判断响应时间,如果超过设定的阈值,就可以启动切换机制;6)keepalived最终确定进⾏切换时,还需要判断slave的延迟程度。
Drbd+mysql+keepalived实现高可用测试一、drbd安装和配置DRBD版本:drbd-8.4.3Primary:192.168.1.2 (dbm1)Secondary:192.168.1.7 (dbm2)虚拟IP: 192.168.1.202(Primary)为仅主服务器端配置(Secondary)为仅从服务器端配置(Primary,Secondary)为主服务器端从服务器端共同配置1.准备环境:(Primary,Secondary)1)设置hosts文件# vi /etc/hosts192.168.1.2 dbm1 dbm1192.168.1.7 dbm2 dbm22)在控制台左侧―硬盘‖,新建两块容量为10G的硬盘vdc,分别分配给两台主机。
分区为vdc1,大小为10G,并在本地系统创建/data目录,不做挂载操作。
# fdisk /dev/vdc出现command (m for help) :输入n,回车//增加一个分区输入p,回车;输入1,回车;输入1,回车;输入20805,回车;//将整个硬盘作为1个分区输入w,回车//保存分区退出#fdisk –l查看硬盘分区是否成功# mkdir /data //创建/data目录3)更改主机名:(Primary)# vi /etc/sysconfig/networkHOSTNAME=dbm1(Secondary)# vi /etc/sysconfig/networkHOSTNAME=dbm22.DRBD的安装配置:1)安装依赖包:(Primary,Secondary)# yum install gcc gcc-c++ make glibc flex kernel-devel kernel-headers注意:安装kernel-devel一定要和你uname -r 看到的内核版本一致。
若不一致,则输入以下指令:#yum update kernel#reboot重启之后继续安装2)安装DRBD:(Primary,Secondary)# wget /drbd/8.4/drbd-8.4.3.tar.gz# tar zxvf drbd-8.4.3.tar.gz# cd drbd-8.4.3# ./configure --prefix=/usr/local/drbd --with-km# make KDIR=/usr/src/kernels/2.6.32-279.el6.x86_64///红色处需要根据自己具体情况修改,可通过以下指令查看#cd /usr/src/kernels#ls //查看具体路径# make install# mkdir -p /usr/local/drbd/var/run/drbd# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d# chkconfig --add drbd# chkconfig drbd on加载DRBD模块:# modprobe drbd查看DRBD模块是否加载到内核:# lsmod |grep drbddrbd 292307 0 //出现类似内容则安装成功3)配置(Primary,Secondary)#vi /usr/local/drbd/etc/drbd.d/drbd,res //新建drbd.res资源文件加入以下内容:注意IP修改为自己的IP4)创建DRBD设备并激活r0资源(Primary,Secondary) #mknod /dev/drbd0 b 147 0#drbdadm create-md r0若drbdadm出现以下错误提示:则输入以下指令:#dd if=/dev/zero of=/dev/vdc1 bs=1M count=128等待片刻,显示success表示drbd块创建成功Writing meta data...initializing activity logNOT initializing bitmapNew drbd meta data block successfully created.(… …)* If you wish to opt out entirely, simply enter 'no'.* To continue, just press [RETURN]Success再次输入该命令:#drbdadm create-md r0 //成功激活r0Writing meta data...initializing activity logNOT initializing bitmapNew drbd meta data block successfully created.5)创建启动(Primary,Secondary)#cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/drbd#Chconfig —add drbd#Chconfig drbd on6)启动DRBD (Primary,Secondary)#service drbd start7) 文件系统在primary上#mkfs –t ext3 /dev/drbd0然后primary把它安装(仅primary安装)Mount /dev/drbd0 /data注意,如果主\从同时安装该设备,则不能自动同步,若只有一个服务器安装,则可以自动同步. Drbdsetup /dev/drbd0 primary –force 把某服务器设置为master二、mysql安装及配置安装MySQL。
MySQL数据库服务器双机热备的实现方法两则2011-08-31 12:56:43分类:Mysql/postgreSQL在实际的应用中,数据库是非常重要和关键的一个环节。
在保障数据库安全的同时,提高应用性和缩短出故障后的恢复时间,也同等重要。
特别是在一些持续性和实时性要求高的应用中,故障一小时,可能会让你损失几千到几万甚至更高。
本方案致力于数据库实时备份,并且在故障发生后以最短的时间恢复和修复。
在mysql数据库的备份应用中,主从复制结构是应用的比较广泛,数据同步和实时性都很高,基本上能满足大部分的需求。
本方案基于主从复制结构的基础上,当主库出现故障时,从库能自动接管主库的功能,向外提供服务,且将自身设置为主库,将这个故障时间和影响缩短至最小,5秒内可切换完成。
待原主库修复后,会自动进入从库的备份角色,如此循环。
在本方案的实现中,有两种方法且均基于mysql的主从结构中:1、高可用(High Availability)HA集群,用heartbeat实现及增加了故障后的恢复功能。
2 、同样是高可用,只是是自己编写脚本程序来监控,切换,恢复。
在方法1中,使用稳定的heartbeat开源软件实现,但此方法,需要多一个IP对外访问,同时在监控上,是监控机器的状态而不是mysql,有些情况下,机器是好的但mysql服务挂了,这种情况下就不准确了。
不过可以修改监控方式或增加对mysql服务的监控。
方法2中,可以不用增加一个对外IP,同时在监控上,可以直接监控mysql 的服务,至于稳定性,有待测试。
此方法中还有一个问题,就是提供给客户端的数据库连接IP,因为切换后,IP也就变了。
如果说更改程序,那不现实。
所以,这里可以用域名,不过仍然需要修改域名的IP指向或是修改客户机的 hosts 文件。
本文使用的是修改DNS的方法,因为DNS是自己配置的,可以灵活操作。
本文分两部分进行说明第一部分用 heartbeat 实现的高可用1环境条件两个虚拟机(IP:192.168.1.91/92/93),CentOS5.4,mysql-5.1.37,heartbeat-2.1.3-32 安装前的准备Heartbeat 的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。
Heartbeat⾼可⽤解决⽅案Heartbeat⾼可⽤1. Heartbeat作⽤:通过heartbeat,可以将资源(ip以及程序服务等资源)从⼀台已经故障的计算机快速转移到另⼀台正常运转的机器上继续提供服务,⼀般称之为⾼可⽤服务。
heartbeat和keepalived有很多相同之处,但是也有区别。
1. ⼯作原理:通过修改heartbeat的配置⽂件,可以指定⼀台heartbeat服务器作为主服务器,另⼀台⾃动成为热备服务器。
在热备服务器上⾯配置heartbeat守护程序来监听来⾃主服务器的⼼跳信息。
如果在规定时间内,⽆法监听到⼼跳信息,那么就启动故障转移,取得主服务器上的相关资源的所有权,接替主服务器继续不间断的提供服务,从⽽达到资源以及服务⾼可⽤的⽬的。
heartbeat还⽀持主主模式,及两台服务器互为主备。
⼀般故障切换时间在5~20s之间。
另外:和keepalived的服务⼀样,heartbeat⾼可⽤是服务器级别的,不是服务级别的。
1. 服务器宕机2. heartbeat软件故障3. ⼼跳连接线故障)服务故障不会导致切换,可以通过服务宕机把heartbeat服务停掉。
1. ⼼跳连接:⾄少需要两台主机才可以实现⾼可⽤服务。
两台heartbeat服务之间通信:穿⾏电缆,所谓的串⼝(⾸先,缺点是距离不能太远)⼀根以太⽹电缆两⽹卡直连(常⽤⽅式)以太⽹电缆,通过交换机等⽹络设备连接。
(交换机可能出现问题等)1. Heartbeat裂脑(splitbrain)两台服务器在⼀定时间内,⽆法相互检测到对⽅⼼跳⽽各⾃启动故障转移功能,取得资源和服务的所有权,会导致同⼀个IP在两端同时启动服务,存在两个相同的VIP,造成冲突的严重问题。
1. 裂脑的原因:⼼跳链路故障,导致⽆法正常通信开启了防⽕墙阻挡了⼼跳信息传输⼼跳⽹卡地址等配置不正确⼼跳⽅式,⼼跳⼴播冲突,软件bug1. 防⽌裂脑⽅案:同时使⽤串⾏电缆和以太⽹电缆连接,同时使⽤两条⼼跳线检测到裂脑时,强制关闭⼀个节点。
构建Heartbeat+DRBD+NFS高可用文件共享存储DRBD的介绍:Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。
数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)工具:drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令,drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用drbdmeta:管理META数据结构,平时很少直接用。
在DRBD中,资源是特指某复制的存储设备的所有方面。
包括资源名称、DRBD设备(/dev/drbdm,这里m是设备最小号,最大号可到147)、磁盘配置(使本地数据可以为DRBD所用)、网络配置(与对方通信)每个资源有个角色,是Primary或Secondary,下面简称“主”和“备” 主角色的DRBD设备可以不受限制的读和写,比如创建和映射文件系统、对于块设备的raw或直接IO访问。
备角色的DRBD设备接受来自对方的所有修改,但是不能被应用程序读写,甚至只读也不行。
角色可以改变。
DRBD功能单主模式:典型的高可靠性集群方案。
复主模式:需要采用共享cluster文件系统,如GFS和OCFS2。
用于需要从2个节点并发访问数据的场合,需要特别配置。
复制模式:3种模式:协议A:异步复制协议。
本地写成功后立即返回,数据放在发送buffer 中,可能丢失。
协议B:内存同步(半同步)复制协议。
本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失。
协议C:同步复制协议。
本地和对方写成功确认后返回。
如果双机掉电或磁盘同时损坏,则数据可能丢失。
一般用协议C。
选择协议将影响流量,从而影响网络时延。
有效的同步:按线性而不是当初写的顺序同步块。
同步损坏时间内的不一致数据。
这段时间一直在研究mysql的集群方案,前几天发了一个关于mysql+heartbeat+存储的方案,今天把mysql+drbd+heartbeat的方案也放出来吧,这个方案,我个人觉得有瑕疵,就是主机挂了通过heartbeat往备机上面切换这个没有问题,但是如果有failback的话,那么主机回切将会有一系列的问题,主要应该就是脑裂吧,遇到问题的欢迎和我讨论。
1.环境说明:2.test1:192.168.122.10 as5u33.test2:192.168.122.11 as5u34.V I P:192.168.122.125.6.7.第一部分:mysql的安装(主备机一样)8.# tar -zxvf mysql-5.0.67.tar.gz9.# cd mysql-5.0.6710.# groupaddmysql11.# useradd -g mysql -s /sbin/nologin -M mysql12.# ./configure --prefix=/usr/local/mysql --with-charset=gbk--localstatedir=/var/data --with-extra-charset=all--enable-thread-safe-client13.# make && make install14.15.# cp support-files/f /etc/f16.# cp support-files/mysql.server /etc/rc.d/init.d/mysqld17.# chmod 755 /etc/rc.d/init.d/mysqld18.加入服务队列:19.# chkconfig --add mysqld20.21.# chown -R mysql.mysql /usr/local/mysql/22.# /usr/local/mysql/bin/mysql_install_db --user=mysql(这一步可以先不用执行,放到drbd那一块执行)23.# chown -R mysql.mysql /usr/local/mysql/var24.25.# /usr/local/mysql/bin/mysqld_safe --user=mysql&26.27.*************************************************************************28.配置库文件搜索路径(有时间自己做吧)29.# echo "/usr/local/mysql/lib/mysql" >> /etc/ld.so.conf30.# ldconfig31.添加/usr/local/mysql/bin到环境变量PATH中32.#echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile33.#source /etc/profile34.**************************************************************************35.36.######################################################################37.38.第二部分:DRBD的安装和设置(首先hosts做好主备解析,关闭iptables相关选项)39./drbd/40.(1)安装DRBD(主从服务器安装相同)41.# tar -zxvf drbd-8.3.0.tar.gz42.# cd drbd-8.3.043.# make KDRI=/usr/src/redhat/44.# make install45.检查是否生成了相应的文件:/etc/drbd.conf ; /etc/init.d/drbd ; 以及./drbd/drbd.ko46.加载安装drbd模块47.# modprobedrbd48.通过lsmod检查是否已经成功49.#lsmod |grepdrbd50.如果有,则表示成功了51.(2)更改drbd配置文件(主从服务器相同)52.准备drbd要使用的分区,该分区最好是干净的分区,我在虚拟机中重新划分了一个分区/dev/sdb1作为drbd使用。
一、安装heartbeat 和drbd主机名修改之后最好重启一下查看主机server1 和server2 的IP:配置两台主机的hosts 文件:yum 这个命令要root 用户才有权限配置drbd一般只需要添加红色字体部分global {usage-count yes;}common {handlers {pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";}startup {}options {}disk {}net {protocol C;}}resource r0 {on server1 {device /dev/drbd1;disk /dev/sda2;address 192.168.1.123:7789; # 主机server1 的ip meta-disk internal;}on server2 {device /dev/drbd1;disk /dev/sda2;address 192.168.1.129:7789; # 主机server2 的ip meta-disk internal;}}Drbd 管理:两台主机启动drbd两台主机查看drbd 状态:设置server1 为主节点,并格式化和挂载目录配置heartbeatha.cf 主配置文件haresource 资源管理文件authkeys 心跳加密文件配置主机其中一张网卡的静态IP:配置ha.cfdebugfile /var/log/ha-debug //调试日志位置logfacility local0keepalive 2 //2秒检测一次心跳连接deadtime 30 //多长时间检测不到主服务器心跳为有问题,不要设置太低warntime 10 //警告时间(最好在2-10秒)initdead 120 //初始化启动时,120秒内无链接为正常udpport 694 //使用udp 694做为bcast/ucast通讯端口ucast eth3 10.0.0.201 //单播方式连接,eth1是本身对应的心跳网卡主从都写对方的心跳ipauto_failback on //开启自动切换,主服恢复后,自动切换回来node s erver1 //申明主服,注意是uname -n的完全限定域名node s erver2 //申明备服,注意是uname -n的完全限定域名ping 192.168.1.254 // ping 的是网关crm respawnapiauth mgmtd uid=haclusterrespawn root /usr/lib64/heartbeat/mgmtd -v配置authkeysauth 11 crcchmod 600 authkeys命令设置authkeys 权限(authkeys 的权限一定要设置,不然日志报错)配置haresources注:该文件内IPaddr,Filesystem等脚本存放路径在/etc/ha.d/resource.d/下,也可在该目录下存放服务动脚本(例如:mysqld),将相同脚本名称添到/etc/ha.d/haresources内容中,从而跟随heartbeat启而启动该脚本。
IPaddr::192.168.1.100/24/eth2:用IPaddr脚本配置浮动VIPdrbddisk::r0:用drbddisk脚本实现DRBD主从节点资源组的挂载和卸载Filesystem::/dev/drbd0::/data::ext4:用Filesystem脚本实现磁盘挂载和卸载二、安装MYSQL以下方法是解决上上面报错问题的方法:登录mysql注意:@ 左边是用户名,右边是域名、IP或%,表示可以访问mysql 的域名和IP,% 表示外部任何地址都能访问。
修改mysql 的默认引擎为InnoDB停止mysql,命令service mysqld stop编辑f配置好heartbeat之后,因为主heartbeat启动的时候会挂载drdb文件系统以及启动mysql,切换的时候会将主上的mysql停止并卸载文件系统,从上会挂载文件系统,并启动mysql。
因此需要做如下操作(两台服务器):到这里heartbeat+drbd+mysql高可用环境就搭建结束了。
接下来进行测试。
高可用测试:启动 server1 主机上的 mysql查看data 目录发现只有存放数据的mysqldata 目录启动drbd (两台服务器):查看drbd 的状态:设置server1 为主机,并挂载启动heartbeat(两台服务器):查看非心跳网卡的IP:可以看见虚拟ip 192.168.1.100已经存在了。
说明成功了。
我们看看heartbeat的日志就能发现。
先看看两台服务器的状态:可以看见挂载在server1服务器。
测试方法:1.停掉master上的mysqld,看看是否切换(因为heartheat不检查服务的可用性,因此需要通过而外的脚本来实现)。
2.停掉master的heartheat看看是否能正常切换。
3.停掉master的网络或者直接将master系统shutdown,看看能否正常切换。
4.启动master的heartbeat看看是否能正常切换回来。
5.重新启动master看看能否切换过程是否OK。
注意:这里说的切换是不是已经将mysql停掉、是否卸载了文件系统等等。
我就停止server1上的heartbeat来测试是否会自动切换,这里除了第一条无法实现,其他的都可以切换:可以看见已经切换了,我们看 server2的情况:查看server2 的ip 和浮动IP:查看日志,查看发生的情况:对于mysqld服务挂掉的情况无法实现自动切换,所以需要一个脚本来帮助我们完成,我这里有个简单的脚本,能实现当mysqld服务不可用时进行自动切换,当进行切换时发送邮件等。
该脚本放在主服务器执行,也就是运行mysqld服务的服务器上执行。
脚本存在灵活性所以不建议使用脚本(可以直接跳过这一段,阅读下面的 HA 图形界面的安装和配置部分):Mysqlmon.sh 的内容如下:#!/bin/bashtrap 'echo PROGRAM INTERRUPTED; exit 1' INTusername=rootpassword=123456n=0log='/var/log/mysqlmon.log'while truedoif /usr/local/mysql/bin/mysql -u${username} -p${password} -e "usetest" >&/dev/null;thenecho"`date +"%Y-%m-%d %H:%M:%S"` mysqld is alive!" >> ${log}n=0elseecho"`date +"%Y-%m-%d %H:%M:%S"` mysqld cannot be connected!" >> ${log}n=$[n + 1]if [ $n -eq 3 ];then/etc/init.d/heartbeat stopecho"`date +"%Y-%m-%d %H:%M:%S"` mysqld switched to backup!" >> ${log}echo"`date +"%Y-%m-%d %H:%M:%S"` mysqld switched to backup"| mutt -s "mysqld switched to backup" saltstack@breakfifisleep10done说明:mysql 编译安装的路径和yum 命令安装mysql的路径是不一样的,所以/usr/local/mysql/bin/mysql 根据安装方式的不一样具体修改Mutt 是发送邮件命令,通过 rpm -qa | grep -e mutt 查看 mutt 是否安装,如果没有安装,那么需要安装通过nohup mysqlmon.sh & 挂在后台执行,但是报错如下:分析和解决办法:因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符。
从你的脚本及报告的错误看来, 很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC格式的(1). vi filename然后用命令:set ff?可以看到dos或unix的字样. 如果的确是dos格式的, 那么你可以用set ff=unix把它强制为unix格式的, 然后存盘退出. 再运行一遍看.ok了。
希望遇到类似问题的同学能够如此解决。
解决方法:打开mysqlmon.sh打开之后按一下键盘上Esc 键,随后输入:set ff? 回车将文件格式转换为unix 之后需要修改mysqlmon.sh 文件的权限重新将 mysqlmon.sh 挂在后台执行,执行的时候 mysqlmon.sh 最好是绝对路径:另外一个脚本:#!/bin/shcat << EOF+-----------------------------------------------------------------------------+| === Welcome to LinuxTone=== | |---------------------[url][/url]-------------------------|+-------------------------------By:hamgua--------------------------------+EOFMYPORT=`netstat -na|grep "tcp"|grep "3306"|awk -F[:" "]+ '{print $5}'`HAPORT=`netstat -na|grep "udp"|grep "694"|awk -F[:" "]+ '{print $5}'`PING=`ping -c 5 |awk -F, '/packets/{print $3}'|cut -c 2-|awk '{print $1}'` DB1IP=`ifconfig eth0|awk '/inet/{print $2}'|cut -c 6-`#DB2IP is your next mysqlserver and haserver IP,According to it own IP to filllog='/var/log/mysqlmon.log'while [ "$PING" != "100\%" ]doif [ "$MYPORT" == "3306"];thenif [ "$HAPORT" == "694" ];thenecho "$DB1IP mysql and ha is running......"elseecho "$DB1IP mysql is running,but ha is down,start ha now"/etc/init.d/heartbeat startif [ "$HAPORT" == "694"];thenecho "$DB1IP ha start successful,mysql and ha all running......"elseecho "$DB1IP ha is down,let (DB2IP) to take over mysql,please start ha now!" > ${log}fifielseif [ "$HAPORT" == "694" ];thenecho "$DB1IP mysql is down,but ha is runing,now shutdown ha,let (DB2IP) to take over mysql,then restart mysql....." > ${log}/etc/init.d/heartbeat stop/etc/init.d/mysqld startif [ "$MYPORT" == "3306"];then/etc/init.d/heartbeat startecho "$DB1IP$mysql restart successful,now mysql and ha all running......"fielseecho "$DB1IPmysql and ha all down,first restart msyql,when mysql is run,restart ha"/etc/init.d/mysqld startif [ "$MYPORT" == "3306"];then/etc/init.d/heartbeat startif [ "$HAPORT" == "694" ];thenecho "$DB1IPmysql and ha all running......"elseecho "$DB1IPmysql is running,ha is down,please restart ha" > ${log}fielseecho "$DB1IPmysql and ha all down,let (DB2IP) to take over mysql,please restart mysql" > ${log}fififisleep 10done要在/etc/sysconfig/iptables 文件中添加如下内容:-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT -A INPUT -p udp -m --udp --dport 694 -d 10.0.0.201 -j ACCEPT在server1 上将mysqlmon.sh 挂在后台执行:三、安装、配置HA-GUI :网上下载pacemaker-mgmt-master.zip ,下载路径如下:https:///ClusterLabs/pacemaker-mgmt如下图所示:下载下来的zip 包不要放置在挂载的网络磁盘上,要将它放置在主机本身的磁盘上,我是将磁盘拷贝在home/用户名目录/Downloads 目录下使用unzip 命令解压zip 包:然后通过cd 命令打开解压的文件编译安装:第一步:./ConfigureMe configure有可能会报错,错误如下:那么需要安装一下依赖包:yum install perl-TimeDate OpenIPMI-libs lm_sensors libxslt libibverbs librdmacm pkg config libtool intltool gettext-devel glib2-devel python-devel libxml2-devel pam-de vel ncurses-devel pygtk2 libtool-ltdl libqb clusterlib libtool-ltdl-devel swig gnutls-devel -y第二部编译:Make第三步安装:Make install打开 ha 的图形界面用命令 ha_gui & 打开图形界面如果IP(主机名)、用户名、密码都是正确的,但是不可以连接,那么可能是主机上的pacemaker 或者corosync 没有启动(因为我这里将pacemaker 作为corosync 的插件使用,所以只需要启动corosync 即可),启动corosync:登录后的默认界面:关闭STONITH 支持默认的情况下pacemaker中启用了stonith,但是我们实际部署集群时可能一般都不会用到stonith资源。