一、安装环境说明:
操作系统:centos5.5x86
主要软件及版本:heartbeat2.0.8 drbd-8.4.0
依赖软件及版本:libnet 1.1.2.1(heartbeat所需)
数据库版本:oracle 10201 32位
安装前规划:
网卡:两台机器配双网卡,一个用于连接公用网络,一个用于做心跳测试。
主机名:分别为drbd1, drbd2,虚拟ip主机名drbd
IP:主drbd1:eth0 10.10.10.11 心跳ip eth1 135.255.10.211 连接公网。
从drbd2:eth0 10.10.10.12 心跳ip eth1 135.255.10.212 连接公网。
两台机器的eth0用交叉线相连,eth1为局域网络,共用一个网关:130.255.10.1
虚拟ip:eth1:0 135.255.10.200 虚拟ip由heartbeat自动管理,不需要预先设置。
磁盘:两台机器分别加上一个大小20G的硬盘。用来做drbd网络共享存储,并在上面安装oracle。
二、安装前配置
ip地址的配置:
eth0分别配置心跳ip,eth1分别配上上述ip地址。
两台机器上主机名及网关的配置,这里以主机器为例:
[root@drbd1 ~]# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=drbd1 #主机名 另一台机器为drbd2
GATEWAY=135.255.10.1 #网关
在两台机器上,都配置hosts文件,新增三个ip到主机名的解析
[root@drbd1 ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 drbd1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
135.255.10.211 drbd1
135.255.10.212 drbd2
135.255.10.200 drbd
主机名配置完成后,重启电脑,配置生效。
三、安装heartbeat
两台机器上做一样的安装和配置
添加用户和用户组
[root@drbd1 ~]# groupadd haclient
[root@drbd1 ~]# useradd -g haclient hacluster
首先安装libnet
[root@drbd1 ~]# cd /usr/local/src/
[root@drbd1 src]# tar zxvf libnet-1.1.2.1.tar.gz
[root@drbd1 src]# cd libnet/
[root@drbd1 libnet]# ./configure
[root@drbd1 libnet]# make
[root@drbd1 libnet]# make install
安装heartbeat
[root@drbd1 src]# tar zxvf Heartbeat-2-1-2d298bca0d0a.tar.gz
[root@drbd1 src]# cd Heartbeat-2-1-2d298bca0d0a/
[root@drbd1 Heartbeat-2-1-2d298bca0d0a]# ./ConfigureMe configure
[root@drbd1 Heartbeat-2-1-2d298bca0d0a]# make
注意,这里make到一半,可能会报一个类似hbaping HBcomm等字样的错误,解决方法:
[root@drbd1 Heartbeat-2-1-2d298bca0d0a]# cd lib/plugins/HBcomm/
[root@drbd1 HBcomm]# mv hbaping.loT hbaping.lo
回到heartbeat文件根目录下重新再执行make即可继续编译。注意这里的hbaping.loT在第一次make之前是不存在的,必须要先make编译,生成了hbaping.loT,再在报错的时候文件名修改为hbaping.lo,再重新make一次即可。最后执行make install安装
[root@drbd1 Heartbeat-2-1-2d298bca0d0a]# make install
复制三个配置文件到/etc/ha.d/目录下
[root@drbd1 Heartbeat-2-1-2d298bca0d0a]# cp doc/ha.cf doc/haresources doc/authkeys /etc/ha.d/
到此,两台机器上的heartbeat就安装完成,先不做配置,继续安装drbd
四、安装配置drbd
先将两台机器的新硬盘进行分区,使用fdisk,给第二块硬盘,即/dev/sdb分区,这里都只划一个主分区/dev/sdb1,完成后先不进行格式化,稍后会用到。
两台机器都安装配置drbd,配置完全相同:
[root@drbd1 src]# tar zxvf drbd-8.4.0.tar.gz
[root@drbd1 src]# cd drbd-8.4.0/
[root@drbd1 drbd-8.4.0]# ./configure
[root@drbd1 drbd-8.4.0]# make rpm
[root@drbd1 drbd-8.4.0]# make km-rpm
[root@drbd1 drbd-8.4.0]# cd /usr/src/redhat/RPMS/i386/
[root@drbd1 i386]# ls
drbd-8.4.0-1.i386.rpm drbd-heartbeat-8.4.0-1.i386.rpm drbd-pacemaker-8.4.0-1.i386.rpm drbd-xen-8.4.0-1.i386.rpm
drbd-bash-completion-8.4.0-1.i386.rpm drbd-km-2.6.18_194.el5-8.4.0-1.i386.rpm drbd-udev-8.4.0-1.i386.rpm
drbd-debuginfo-8.4.0-1.i386.rpm drbd-km-debuginfo-8.4.0-1.i386.rpm drbd-utils-8.4.0-1.i386.rpm
[root@drbd1 i386]# rpm -ivh drbd*
[root@drbd1 i386]# modprobe drbd #加载drbd到内核
[root@drbd1 i386]# lsmod |grep drbd #查看是否加载成功
drbd 250852 0
开始配置drbd
主配置文件为/etc/drbd.conf
[root@drbd1 ~]# cat /etc/drbd.conf
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
可以看到,主配置文件是通过包含/etc/drbd.d/global_common.conf全局通用配置文件和以.res结尾的这些/etc/drbd.d/*.res资源文件来配置drbd的。
修改global_common.conf文件如下:
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 {
degr-wfc-timeout 120;
}
options {
# cpu-mask on-no-data-accessible
}
disk {
on-io-error detach;
}
net {
protocol C;
}
syncer { rate 100M; }
}
资源文件配置如下:
[root@drbd1 ~]# cat /etc/drbd.d/r0.res
resource r0 { #资源名称为r0
on drbd1 { #drbd1上面的配置
device /dev/drbd1; #drbd1上的drbd设备
disk /dev/sdb1; #drbd1上的物理磁盘分区
address 10.10.10.11:7789; #本机ip地址,这里选择心跳ip
meta-disk internal; #表示在同一局域网内
}
on drbd2 { #drbd2机器上的配置
device /dev/drbd1;
disk /dev/sdb1;
address 10.10.10.12:7789;
meta-disk internal;
}
}
两台机器上都执行如下命令创建r0资源数据块
[root@drbd1 ~]# drbdadm create-md r0
两次输入yes,创建成功。
再在两台机器上分别启动drbd
[root@drbd1 ~]# /etc/init.d/drbd start
查看drbd运行状态:
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by root@drbd1, 2011-12-27 15:00:40
1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:20964116
发现在两台机器上,drbd都为Secondary模式,因此需要指定哪个为主,哪个为从设备
只在drbd1机器上执行如下命令:
[root@drbd1 ~]# drbdsetup /dev/drbd1 primary –force
查看drbd运行状态,发现drbd正在同步数据
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by root@drbd1, 2011-12-27 15:00:40
1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:1149952 nr:0 dw:0 dr:1158144 al:0 bm:69 lo:3 pe:1 ua:8 ap:0 ep:1 wo:b oos:19815188
[>...................] sync'ed: 5.6% (19348/20472)M
finish: 0:04:35 speed: 71,808 (71,808) K/sec
这里需要等待一点时间,让数据同步完成,然后执行如下命令来使drbd1为drbd的主设备,只在drbd1上执行:
[root@drbd1 ~]# drbdadm primary r0
再看drbd的运行状态
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by root@drbd1, 2011-12-27 15:00:40
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:20964116 nr:0 dw:0 dr:20964116 al:0 bm:1280 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
可以看到drbd1现在为primary了,drbd2上正好相反:
drbd1上查看角色
[root@drbd1 ~]# drbdadm role r0
Primary/Secondary
drbd2上查看角色
[root@drbd2 ~]# drbdadm role r0
Secondary/Primary
drbd设备,同一时间,只能在primary机器上被使用,因此这里只在drbd1上操作,对/dev/drbd1进行格式化,并挂载
[root@drbd1 ~]# mkfs -t ext3 /dev/drbd1
[root@drbd1 ~]# mkdir /oradate #在drbd2上面也要新建这个目录
[root@drbd1 ~]# mount /dev/drbd1 /oradate/
到此,drbd配置完成,下面需要在drbd设备的挂载点/oradate安装oracle
五、安装oracle10g
在两台机器上,做同样的oracle安装前的配置,下面以drbd1为例:
oracle安装详细参考官方文档,下面作简要的环境变量配置
给oracle BASE目录赋权限
[root@drbd1 ~]# chown –R oracle:oinstall /oradate
[root@drbd1 ~]# chmod –R 755 /oradate
在oracle家目录下~oracle/.bash_profile加入如下环境变量:
ORACLE_BASE=/oradate
ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
ORACLE_SID=orcl
PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/lib:/usr/lib
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH LD_LIBRARY_PATH
详细图形安装过程参考官方文档
安装完成后,对oracle监听进行配置,修改后如下
[oracle@drbd1 database]$ cd $ORACLE_HOME/network/admin
[oracle@drbd1 database]$ cat listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oradate/product/10.2.0/db_1)
(PROGRAM = extproc)
)(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /oradate/product/10.2.0/db_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = drbd)(PORT = 1521))
)
)
LISTENER的HOST部分,填上虚拟ip或者虚拟ip的主机名,这里为主机名drbd
关闭监听,关闭数据库,下面开始配置heartbeat
六、配置heartbeat
在drbd1上进行配置
[root@drbd1 ~]# cd /etc/ha.d/
1、双机互联验证文件
[root@drbd1 ha.d]# grep -v '^#' authkeys | grep -v '^$'
auth 1
1 crc
注意设置authkeys文件的权限为600
[root@drbd1 ha.d]# chmod 600 authkeys
2、主配置文件ha.cf,去掉注释和空行后,配置如下
[root@drbd1 ha.d]# grep -v '^#' ha.cf | grep -v '^$'
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
baud 19200
ucast eth0 10.10.10.12 #此处选择单播方式进行通信,ip地址为对方节点的心跳ip
auto_failback on
node drbd1
node drbd2
ping 135.255.10.1 #一个能正常ping通的ip,这里选择固定的网关
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
3、资源配置文件,只有一行
[root@drbd1 ha.d]# grep -v '^#' haresources | grep -v '^$'
drbd1 IPaddr::135.255.10.200/24/eth1 drbddisk::r0 Filesystem::/dev/drbd1::/oradate::ext3 notechange.sh
说明:drbd1为主节点的主机名,从节点也同样的配置,IPaddr为heartbeat对虚拟ip的设置,drbddisk设置drbd资源的角色,Filesystem挂载drbd磁盘,notechange.sh为共享磁盘挂载卸载,oracle启动关闭脚本,脚本存放在/etc/ha.d /resource.d下,脚本内容如下:
[root@drbd1 ha.d]# cat resource.d/notechange.sh
#!/bin/sh
#It’s used to startup/shutdown oracle database
export ORACLE_BASE=/oradate
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=orcl
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/lib:/usr/lib
MOUNTDEV=/dev/drbd1
MOUNTPOINT=/oradate
case $1 in
start)
/bin/mount $MOUNTDEV $MOUNTPOINT
su - oracle -c "dbstart"
;;
stop)
su – oracle –c "dbshut"
fuser -k -m -v $MOUNTPOINT
/bin/umount $MOUNTPOINT
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
其中,需要说明的是dbstart和dbshut两个脚本,这两个脚本为安装数据库后,自动生成的脚本,用来启动,关闭监听和数据库,其中dbstart部分地方需要做修改,才能正常启动。修改如下:
ORACLE_HOME_LISTNER=${ORACLE_HOME}
脚本通过ORACLE_HOME_LISTNER的值来定位到监听程序的可执行程序,从而启动监听,由于默认脚本设置的值和自己安装的目录路径不一样,因此需要修改成当前oracle的安装家目录。
另一个地方需要修改的是/etc/oratab文件,dbstart脚本通过读取oratab文件来决定是否启动数据库实例,启动哪个数据库实例。
修改如下:
orcl:/oradate/product/10.2.0/db_1:Y
将最后面的N改成Y,则为要启动orcl实例,路径为/oradate/product/10.2.0/db_1
如果其他还需要修改的,仔细阅读脚本,修改成当前oracle安装环境的变量即可。
在主节点上配置完heartbeat后,再把这些配置文件全部复制到从节点,因为从节点的配置文件要和主节点完全相同:
[root@drbd2 ~]# scp -r drbd1:/etc/ha.d/* /etc/ha.d/
注意ha.cf文件里面单播通讯的地方,ip地址要填对方节点的心跳ip,除了这里需要修改外,其他地方完全一样!
复制主节点/etc/oratab文件到从节点
[root@drbd2 ~]# scp drbd1:/etc/ora* /etc/
这里将主节点上安装数据库时生成的两个文件都拷贝过来,包括修改后的oratab文件。
七、启动heartbeat
查看drbd状态:
[root@drbd1 ~]# drbdadm role r0
Primary/Secondary
此时,drbd已经在正常运行,可以启动heartbeat了。
两台机器上,分别启动heartbeat
[root@drbd1 ~]# /etc/init.d/heartbeat start
稍等片刻,查看drbd是否挂载
[root@drbd1 ~]# ls /oradate/
admin flash_recovery_area lost+found oradata oraInventory product
可以看到,oradate目录下已经有了oracle的安装文件了
再来看oracle的监听是否开启,切换到oracle用户,查看监听的状态:
[root@drbd1 ~]# su - oracle
[oracle@drbd1 ~]$ lsnrctl status
监听正常,登录数据库,查看数据库的运行状态:
[oracle@drbd1 ~]$ sqlplus / as sysdba
SQL> select database_status from v$instance;
DATABASE_STATUS
-----------------
ACTIVE
SQL> !hostname
drbd1
数据库开启并且活跃,用户为sys,当前服务器主机名为drbd1,即主节点。
八、测试heartbeat切换是否正常
关闭主节点drbd1,稍后待heartbeat切换完成后,到节点2上查看drbd运行状态和数据库的运行状态
[root@drbd2 ~]# cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by root@drbd2, 2011-12-27 15:06:19
1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:20984860 dw:20985092 dr:7561 al:10 bm:1280 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:204
可以看到,节点2的drbd当前为primary状态,从节点为unknown
[root@drbd2 ~]# ls /oradate/
admin flash_recovery_area lost+found oradata oraInventory product
目录下已经有文件了
[root@drbd2 ~]# su - oracle
[oracle@drbd2 ~]$ lsnrctl status
监听正常
[oracle@drbd2 ~]$ sqlplus / as sysdba
SQL> select status from v$instance;
STATUS
------------
OPEN
SQL> !hostname
drbd2
数据库为open状态。
在win下,配置tns后,客户端连接数据库,如下:
C:\Documents and Settings\Administrator>sqlplus "system/oracle@orcl"
SQL> select status from v$instance;
STATUS
------------
OPEN
自此,整个双机热备配置完成!
整个文档根据虚拟机上实验整理完成,如有错误,遗漏,或者更好的建议,谢谢指出!!