设为首页 收藏本站
查看: 679|回复: 0

[经验分享] HeartBeat+lighttpd+PHP+MySQL实现双机热备自动切换

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-21 08:30:54 | 显示全部楼层 |阅读模式
实现原理:
1 通过linux HA软件heartbeat实现IP的自动漂移,即当一台服务器宕机后,浮动IP(整个集群的对外IP)自动漂移到另外一台服务器。再结合heartbeat crm模式监控应用服务资源,也就是说,当一台服务器的lighttpdmysql挂掉,也会自动切换到备用服务器上。防止了单点故障造成整个网站不可用的问题。
2 数据库热备利用mysql自身的replication实现双主从结构互为备份。此方案数据量大时会降低mysql 1%左右的性能。但可用性及数据安全性将大有提高,同时服务器的切换对终端使用者是透明的,终端应用不需要进行任何修改。
3 lighttpd web服务器的网站利用rsync软件同步网站目录文件

实验环境:
宿主主机:内存8Gcpu Genuine Intel? CPU @2.66GHz,双网卡:Intel(R) PRO/1000 EB
操作系统centos5.4_x86_64
软件:Mysql-server-5.0.77  mysql-5.0.77  lighttpd-1.4.22  Nginx-0.7.64  Webbench 1.5
      heartbeat-2.1.4-9.el5

两台服务器(虚拟机 内存2G
主机名:node1   IP192.168.18.56   (双网卡)
主机名:node2   IP192.168.18.57   (双网卡)
Mysql-server-5.0.77mysql-5.0.77
Lighttpd-1.4.22lighttpd-1.4.22
Nginx-0.7.64
Webbench 1.5


安装配置:
两台都安装上lighttpd,mysql,php(fastcgi),heartbeat,rsync(具体安装过程就不详细写出了)我都是通过yum安装的rpm包。
1 配置mysql主从备份
配置数据库互为同步(node1<->node2
node1中有数据库如下:
CREATE DATABASE backup_db;
USE backup_db;
CREATE TABLE `backup_table` (
  `id` int(11) NOT NULLauto_increment,
  `name` varchar(20) character setutf8 NOT NULL,
  `sex` varchar(2) character set utf8NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Mysql主配置文件/etc/my.cf设置如下:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format forcompatibility with mysql 3.x
# clients (those using the mysqlclient10compatibility package).
old_passwords=1
relay-log=mysql-relay-bin
#服务器ID号
server-id=1
log-bin
##需要备份的数据库
binlog-do-db=backup_db
replicate-same-server-id
#指定主服务器IP
master-host=10.0.0.57
#指定在主服务器上可以同步的账号
master-user=ym
#指定账号对应的密码
master-password=111111
master-port=3306
#断点重试间隔时间
master-connect-retry=60
replicate-do-db=backup_db

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
完成以上配置后,将node1mysql数据库的连接权限给node2,即为node2创建一个用户
GRANT REPLICATION SLAVE,REPLICATIONCLIENT,RELOAD,SUPER ON *.* TO 'ym'@'10.0.0.57' IDENTIFIED BY '111111';

node2中有数据库如下:
CREATE DATABASE backup_db;
USE backup_db;
CREATE TABLE `backup_table` (
  `id` int(11) NOT NULLauto_increment,
  `name` varchar(20) character setutf8 NOT NULL,
  `sex` varchar(2) character set utf8NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

注:node1node2数据库结构一定要相同,否则无法构成同步。

Node2/etc/my.cf配置如下:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format forcompatibility with mysql 3.x
# clients (those using the mysqlclient10compatibility package).
old_passwords=1
relay-log=mysql-relay-bin
#服务器ID号
server-id=2
log-bin
##需要备份的数据库
binlog-do-db=backup_db
replicate-same-server-id
#指定主服务器IP
master-host=10.0.0.56
#指定在主服务器上可以同步的账号
master-user=ym
#指定账号对应的密码
master-password=111111
master-port=3306
#断点重试间隔时间
master-connect-retry=60
replicate-do-db=backup_db

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
完成以上配置后,将node2mysql数据库的连接权限给node1,即为node1创建一个用户
GRANT REPLICATION SLAVE,REPLICATIONCLIENT,RELOAD,SUPER ON *.* TO 'ym'@'10.0.0.56' IDENTIFIED BY '111111';

重启node1,node2数据库,
mysql中可以通过以下命令来查看主从状态
show master status 查看master状态
show slave status 查看slave状态
show processlist G 查看当前进程
stop slave 暂时停止slave进程
start slave 开始slave进程

show slave status:此处slave_io_runningslave_sql_running都应该是yes,表示从库的I/OSlave_SQL线程都正确开启。
到此mysql的双机互备已基本完成,在两台服务器的mysql数据库中任意添加数据看是否都可以同步到对端服务器上。



2 配置heartbeat
设置IP,主机名。
主服务器:主机名:node1
          外网IPeth0 192.168.18.56
          内网IPeth1 10.0.0.56
从服务器:主机名:node2
          外网IPeth0 192.168.18.57
          内网IPeth1 10.0.0.57
浮动IP192.168.18.30(整个对外的IPheartbeat启动好后会自动生成)

修改node1/etc/hosts为:
# Do not remove the following line, orvarious programs
# that require network functionality willfail.
127.0.0.1               localhost.localdomain localhost
#主节点的对外用IP地址
192.168.18.56    node1.example.com     node1
192.168.18.57    node2.example.com     node2
#心跳用IP地址
10.0.0.56         node1
10.0.0.57         node2

修改node1/etc/sysconfig/network中的hostname
HOSTNAME=node1

同样node2/etc/hosts/etc/sysconfig/network也要作同样的修改
/etc/hosts配置和node1上一样,/etc/sysconfig/network中将hostname改为
HOSTNAME=node2

配置心跳的加密方式:authkeys
如果使用双机对联线(双绞线)可以如下配置
/etc/ha.d/authkeys中配置如下
auth 1
1 crc
存盘退出,然后chmod600 authkeys

配置心跳的监控:haresources
/etc/ha.d/haresources最后增加如下
node1 192.168.18.30 lighttpd mysqld
后保存退出。
mkdir –p /var/log/ha_log
chmod 777 /var/log/ha_log/

配置heartbeat的主配置文件:ha.cf
设置 /etc/ha.d/ha.cf如下:
debugfile /var/log/ha-debug
logfile /var/log/ha_log   ## ha的日志文件记录位置。如没有该目录,则需要手动添加
bcast eth1     ##使用eht1做心跳监测
keepalive 2    ##设定心跳(监测)时间时间为2
warntime 10
deadtime 30
initdead 120
udpport 694    ##使用udp端口694 进行心跳监测
auto_failback on
node node1 ##节点1,必须要与 uname -n 指令得到的结果一致。
node node2  ##节点2

heartbeat 默认使用udp 694端口进行心跳监测。 如果系统有使用iptables 做防火墙,应记住把这个端口打开。
iptables -I INPUT -p udp --dport 694 -jACCEPT

node1/etc/ha.d/下的authkeys ha.cfharesources,复制到node2 目录/etc/ha.d/下。
  scpauthkeys ha.cf haresources root@node2:/etc/ha.d/
在防火墙将node2端口694打开。

重新启动node1node2heartbeat

node1ifconfig看看是不是多了个eth0:0   10.0.0.30这就是自动生成的浮动IP,也就是对外的IP,访问web就是http://192.168.18.30
再测试任意一台机器down掉或网络断开会不会自动切换到另外一台机器上。

Heartbeat默认模式是没法监控资源的,也就是说其中某个资源(如mysql,lighttpddown掉,也不会发生任何动作,它只有当它变为对方机器dead或网络断掉才会发生动作,这显然没法达到我们的要求,为此要采用heartbeat crm(cluster resource management)模式。

上面heartbeat配置成功后,再按下面的步骤操作:
ha.cf里面增加
crm on
haresources资源文件转换成cib.xml文件
/usr/lib64/heartbeat/haresources2cib.pyharesources
输出文件在/var/lib/heartbeat/crm/cib.xml
cib.xml<resources>…</resources>设置如下,修改了inerval timeout
<resources>
       <group id="group_1">
         <primitive id="IPaddr_192_168_18_30"provider="heartbeat" type="IPaddr">
           <operations>
             <op id="IPaddr_192_168_18_30_mon" interval="5s"name="monitor" timeout="5s"/>
           </operations>
           <instance_attributes id="IPaddr_192_168_18_30_inst_attr">
             <attributes>
               <nvpairid="IPaddr_192_168_18_30_attr_0" name="ip"value="192.168.18.30"/>
             </attributes>
           </instance_attributes>
         </primitive>
         <primitive id="lighttpd_2"provider="heartbeat" type="lighttpd">
           <operations>
             <op id="lighttpd_2_mon" interval="30s"name="monitor" timeout="15s"/>
           </operations>
         </primitive>
         <primitive id="mysqld_3"provider="heartbeat" type="mysqld">
           <operations>
             <op id="mysqld_3_mon" interval="30s"name="monitor" timeout="15s"/>
           </operations>
         </primitive>
       </group>
     </resources>

修改后退出保存。将cib.xmlha.cf 复制到node2对应的目录。
重启两台机器的heartbeat
查看crm运行状态。
#crm_mon

2 Nodes configured.
1 Resources configured.
============

Node: node2(e90a9853-5c82-465e-973c-2b0b0059e13d): online
Node: node1(75df6e41-a363-42d6-af0e-2cc3d0eb91da): online

Resource Group: group_1
    IPaddr_192_168_18_30        (ocf::heartbeat:IPaddr):        Started node1
    lighttpd_2  (lsb:lighttpd):Started node1
    mysqld_3    (lsb:mysqld):   Started node1

说明lighttpd,mysqld是在node1上运行的。

再尝试停掉lighttpdmysql,看是否会自动切换到另一台机器上。
Heartbeat crm模式管理命令。
查看所有资源
[iyunv@node1 crm]# crm_resource -L
Resource Group: group_1
    IPaddr_192_168_18_30        (ocf::heartbeat:IPaddr)
    lighttpd_2  (lsb:lighttpd)
    mysqld_3    (lsb:mysqld)

查看资源跑在哪个节点上
[iyunv@node1 crm]# crm_resource -W -rlighttpd_2
resource lighttpd_2 is running on: node1
启动/停止资源
crm_resource -r lighttpd_2 -p target_role-v stop
crm_resource -r lighttpd_2 -p target_role-v start
查看资源在cib.xml中的定义
crm_resource -x –r lighttpd_2
将资源移向指定节点
crm_resource -M –r lighttpd_2 node2
允许资源回到正常的节点
crm_resource -U –r lighttpd_2
将资源从CRM中删除
crm_resource -D –r lighttpd_2 –t primitive
将资源组从CRM中删除
crm_resource -D –r group_1 –t group

3 配置rsync同步网站目录文件
配置ssh无需密码登录
node1上用ssh-keygen产生root用户的公钥和私钥
ssh-keygen
Generating public/private rsa keypair.
Enter file in which to save the key(/root/.ssh/id_rsa):
Enter passphrase (empty for nopassphrase):
Enter same passphrase again:
Your identification has been savedin /root/.ssh/id_rsa.
Your public key has been saved in/root/.ssh/id_rsa.pub.
The key fingerprint is:
49:3a:87:11:11:15:1f:3d:21:c0:cf:e2:db:3b:d4:48root@FC8Server01
注意:一路直接回车就行。
进入/root/.ssh目录,将/root/.ssh/id_rsa.pub文件拷贝为node2服务器的/root/.ssh/authorized_keys
Scp id_rsa.pub root@10.0.0.57:/root/.ssh/authorized_keys
测试 ssh 10.0.0.57,不再提示输入密码,则表示成功。
同样,在node2也做同样的ssh无密码登录配置。这样两台机器都可以相互无需密码ssh登录了。
配置rsync软件
修改/etc/rsync.conf
uid = root
gid = root
max connections = 4
pid file =/var/run/rsyncd.pid
lock file =/var/run/rsync.lock
log file =/var/log/rsyncd.log
hosts allow =10.0.0.57

[www]
path=/var/www/lighttpd/test
read only =no
ignore errors
crontab设置每隔20分钟同步一次/var/www/lighttpd/test/目录
*/20 * * * */usr/bin/rsync -avl -delete -e ssh root@10.0.0.57:/var/www/lighttpd/test//var/www/lighttpd/test/
同样,node2也做同样的rsync设置,这样两台服务器的web目录就可以每隔20分钟同步一次。
测试,在/var/www/lighttpd/test/中增加或删除文件看否同步到另一台服务器上。

测试:
测试双机热备切换速度

  • 测试down机或网络断开与Heartbeat死掉情况下
    进入node1。
    Crm_mon,ifconfig
    查看状态。Mysql,lighttpd正在node1上运行
    停止heartbeat
    Serviceheartbeat stop
    结论:不会超过10秒完成资源切换。
    节点二查看状态
    Crm_mon
    查看集群状态
    Ifconfig
    查看IP状态
    结论:mysql,lighttpd正在node2上运行
  • 资源停止后重启
    进入当前主节点
    Service lighttpd stop
    停止lighttpd
    Ps aux|grep lighttpd
    不会超过10秒。可以被heartbeat 启动。此时间可以根据要求设置。
  • 坏掉一个资源看对方能启动不。
Cd /etc/lighttpd
Mv lighttpd.conf lighttpd.conf.back
Service lighttpd stop
查看集群状态。会发现lighttpd 状态为停止,发现时间长短与cib.xml中设置的时间有关。
Crm_mon
结论:会自动切换到对方主机上。

测试mysql数据同步
开始node1,node2数据库backup_db的表backup_table都为空。
node1上的数据库backup_db的表backup_table插入几条数据,
| id | name   | sex |
+----+--------+-----+
|  1 | paishi | na  |
|  2 | test1  | nv  |
|  3 | test2  | na  |
|  4 | test3  | nv  |
|  5 | test4  | na  |


查看node2backup_db
mysql> select* from backup_table;
+----+--------+-----+
| id | name   | sex |
+----+--------+-----+
|  1 | paishi | na  |
|  2 | test1  | nv  |
|  3 | test2  | na  |
|  4 | test3  | nv  |
|  5 | test4  | na  |
+----+--------+-----+

结论:不会超过5秒完成数据同步

Rsync同步web网站目录文件测试

同步时间频率可以根据具体需要在crontab中设置
结论:数据同步正常

测试结果:
   使用Heartbeat+mysql+rsync来监控与切换数据库、web服务器资源,同步数据。最快切换时间在10秒以内(具体数值与ha.cnf配置、以及相关的硬件有关)。可以作一般小型站点作高可用性与主机热备使用。
  

  www.21home.cn名人图库

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-153976-1-1.html 上篇帖子: mysql安装遇到../depcomp: line 512: exec: g++: not found报错解决 下篇帖子: mysql中delete重复行,关于delete别名的用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表