www.21home.cn 名人图库网
分类: LINUX
2015-07-17 23:21:24
实现原理:
1 通过linux HA软件heartbeat实现IP的自动漂移,即当一台服务器宕机后,浮动IP(整个集群的对外IP)自动漂移到另外一台服务器。再结合heartbeat crm模式监控应用服务资源,也就是说,当一台服务器的lighttpd或mysql挂掉,也会自动切换到备用服务器上。防止了单点故障造成整个网站不可用的问题。
2 数据库热备利用mysql自身的replication实现双主从结构互为备份。此方案数据量大时会降低mysql 1%左右的性能。但可用性及数据安全性将大有提高,同时服务器的切换对终端使用者是透明的,终端应用不需要进行任何修改。
3 对lighttpd web服务器的网站利用rsync软件同步网站目录文件
实验环境:
宿主主机:内存8G,cpu 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 IP:192.168.18.56 主 (双网卡)
主机名:node2 IP:192.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
完成以上配置后,将node1的mysql数据库的连接权限给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;
注:node1与node2数据库结构一定要相同,否则无法构成同步。
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
完成以上配置后,将node2的mysql数据库的连接权限给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_running,slave_sql_running都应该是yes,表示从库的I/O,Slave_SQL线程都正确开启。
到此mysql的双机互备已基本完成,在两台服务器的mysql数据库中任意添加数据看是否都可以同步到对端服务器上。
2 配置heartbeat
设置IP,主机名。
主服务器:主机名:node1
外网IP:eth0 192.168.18.56
内网IP:eth1 10.0.0.56
从服务器:主机名:node2
外网IP:eth0 192.168.18.57
内网IP:eth1 10.0.0.57
浮动IP:192.168.18.30(整个对外的IP,heartbeat启动好后会自动生成)
修改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.cf,haresources,复制到node2 目录/etc/ha.d/下。
scp authkeys ha.cf haresources root@node2:/etc/ha.d/
在防火墙将node2端口694打开。
重新启动node1,node2的heartbeat。
在node1是ifconfig看看是不是多了个eth0:0 10.0.0.30这就是自动生成的浮动IP,也就是对外的IP,访问web就是
再测试任意一台机器down掉或网络断开会不会自动切换到另外一台机器上。
Heartbeat默认模式是没法监控资源的,也就是说其中某个资源(如mysql,lighttpd)down掉,也不会发生任何动作,它只有当它变为对方机器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.xml,ha.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上运行的。
再尝试停掉lighttpd或mysql,看是否会自动切换到另一台机器上。
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/中增加或删除文件看否同步到另一台服务器上。
测试:
测试双机热备切换速度
测试down机或网络断开与Heartbeat死掉情况下
进入node1。
Crm_mon,ifconfig
查看状态。Mysql,lighttpd正在node1上运行
停止heartbeat
Service heartbeat 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 |
查看node2的backup_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配置、以及相关的硬件有关)。可以作一般小型站点作高可用性与主机热备使用。