Chinaunix首页 | 论坛 | 博客
  • 博客访问: 66516
  • 博文数量: 10
  • 博客积分: 270
  • 博客等级: 二等列兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-03 17:19
个人简介

www.21home.cn 名人图库网

文章分类

全部博文(10)

文章存档

2015年(2)

2012年(6)

2008年(2)

我的朋友

分类: LINUX

2015-07-17 23:21:24

实现原理:

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.77 mysql-5.0.77

Lighttpd-1.4.22 lighttpd-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 NULL auto_increment,

  `name` varchar(20) character set utf8 NOT NULL,

  `sex` varchar(2) character set utf8 NOT 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 for compatibility with mysql 3.x

# clients (those using the mysqlclient10 compatibility 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,REPLICATION CLIENT,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 NULL auto_increment,

  `name` varchar(20) character set utf8 NOT NULL,

  `sex` varchar(2) character set utf8 NOT 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 for compatibility with mysql 3.x

# clients (those using the mysqlclient10 compatibility 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,REPLICATION CLIENT,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, or various programs

# that require network functionality will fail.

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

存盘退出,然后chmod 600 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 -j ACCEPT

 

node1 /etc/ha.d/下的authkeys ha.cfharesources,复制到node2 目录/etc/ha.d/下。

  scp authkeys ha.cf haresources root@node2:/etc/ha.d/

在防火墙将node2端口694打开。

 

重新启动node1node2heartbeat

 

node1ifconfig看看是不是多了个eth0:0   10.0.0.30这就是自动生成的浮动IP,也就是对外的IP,访问web就是

再测试任意一台机器down掉或网络断开会不会自动切换到另外一台机器上。

 

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

 

上面heartbeat配置成功后,再按下面的步骤操作:

ha.cf里面增加

crm on

haresources资源文件转换成cib.xml文件

/usr/lib64/heartbeat/haresources2cib.py haresources

输出文件在/var/lib/heartbeat/crm/cib.xml

cib.xml<resources>…</resources>设置如下,修改了inerval timeout

<resources>

       <group id="group_1">

         <primitive class="ocf" 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>

               <nvpair id="IPaddr_192_168_18_30_attr_0" name="ip" value="192.168.18.30"/>

             </attributes>

           </instance_attributes>

         </primitive>

         <primitive class="lsb" id="lighttpd_2" provider="heartbeat" type="lighttpd">

           <operations>

             <op id="lighttpd_2_mon" interval="30s" name="monitor" timeout="15s"/>

           </operations>

         </primitive>

         <primitive class="lsb" 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模式管理命令。

查看所有资源

[root@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)

 

查看资源跑在哪个节点上

[root@node1 crm]# crm_resource -W -r lighttpd_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 key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /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:48 root@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/中增加或删除文件看否同步到另一台服务器上。

 

测试:

测试双机热备切换速度

  1. 测试down机或网络断开与Heartbeat死掉情况下

    进入node1

    Crm_mon,ifconfig

    查看状态。Mysql,lighttpd正在node1上运行

    停止heartbeat

    Service heartbeat stop

    结论:不会超过10秒完成资源切换。

    节点二查看状态

    Crm_mon

    查看集群状态

    Ifconfig

    查看IP状态

    结论:mysql,lighttpd正在node2上运行

  2. 资源停止后重启

    进入当前主节点

    Service lighttpd stop

    停止lighttpd

    Ps aux|grep lighttpd

    不会超过10秒。可以被heartbeat 启动。此时间可以根据要求设置。

  3. 坏掉一个资源看对方能启动不。

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配置、以及相关的硬件有关)。可以作一般小型站点作高可用性与主机热备使用。


管理员在2009年8月13日编辑了该文章文章。

-->
阅读(1500) | 评论(0) | 转发(0) |
0

上一篇:查看当前的连接数状况

下一篇:酒多了

给主人留下些什么吧!~~