双机问题一则
双机的连接方式就不详说了,就是心跳线连接,A和B机都是两个网卡bge0和bge1。两个网卡配置的相同地址。A和B跑不同的应用,互为主备。
问题:A机或者B机莫名其妙无法远程连入,查看双机状况,发现A机或B机下线。
解决:从A机背板或者远程管理端口连入,机器运行正常,查看/var/adm/messages有些异常,但是感觉没问题,只是一台机器两个网卡间切换而已。
需求:服务器归一个部门管理,但是由于数据的敏感性,所以root帐号不能交给这个部门。所以出现了这样一个需求。关机、重启等特殊命令给一个用户来执行。但是考虑到服务器上脚本的安全性,这个用户又不能去查看这些脚本。
首先,我想到的是Solaris的RABC来实现。通过SMC建立相应的角色,用户,并授权。可能由于我操作的问题,始终都没弄对。
然后一翻google。将能搜索到的办法都基本尝试了一下,居然没有一个可行,继续怀疑自己的问题。其实网上的办法是另外一种,就是通过shell来做文章,登陆后立刻执行一个shell关机,比如(如下办法我没成功):
| 要关机,必须有关机权限。什么人有关机权限?root。但不能把root口令告诉普通用户,怎么办?创建一个特殊的超级用户,他的登录shell是一个定制的文件:一条关机命令。具体做法如下:
# vi /etc/passwd shutdown:x:0:1:shutdown user:/:/bin/shutdown 添加一个用户 # vi /etc/shadow shutdown:::::::: # vi /bin/shutdown /usr/sbin/shutdown -y -g0 -i5 把别的用户logout,试着用shutdown用户登录。输入完用户名和口令后,系统就开始关机。 |
最后大鱼儿和一个同事建议我使用sudo。尝试下总归是好的,去sunfreeware.com下载相关的包,上传到服务器。
|
# gunzip libgcc-3.4.6-sol10-sparc-local.gz |
一切准备就绪。然后用shdUser登陆。
|
$ vi .profile |
更多sudo信息可以参考Sudo Main Page。
Oracle本身的备份策略很多,这里只说说简单的exp命令备份在双机互为主备的方案中shell怎么做。
由于互为主备,平时AB机各自运行自己的实例,当然发生故障后有双机软件去实现自动切换。这样就导致了存储上挂接的同一个lum并不会同时出现两台主机上。那么传统的exp备份脚本就无法正常运行。比如常用的exp的shell脚本如下:
| ORACLE_BASE=/export/home/oracle export ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORACLE_HOME ORACLE_SID=test export ORACLE_SID LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/openwin/lib export LD_LIBRARY_PATH NLS_LANG="simplified chinese"_china.zhs16gbk export NLS_LANG ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data export ORA_NLS33 PATH=$PATH:/opt/SUNWspro/bin:/usr/sbin:/opt/bin:$ORACLE_HOME/bin:/usr/ccs/bin export PATH DATE=`date +%Y%m%d` cd /databak gzip test${DATE}.dmp |
如果套用到互为备份的双机中,就有问题,这个shell到底放在A机还是B机呢?还是两台都放?
如果放在其中一台服务器上,假设放在A机上。A机出问题(网络故障或者系统故障),数据库B机自动接管了(这时存储上的lum都会挂接到B机)。A机脚本就无法工作。
如果A、B机都放,依然是问题。存储上的lum是无法同时挂接到两台服务器的。
因此,那就应该考虑,从判断监听是否启动或者判断数据库是否启动入手,通过shell生成一个flag文件,然后去判断这个flag文件大小。修改后的shell如下:
| ORACLE_BASE=/export/home/oracle export ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORACLE_HOME ORACLE_SID=test export ORACLE_SID LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/usr/openwin/lib export LD_LIBRARY_PATH NLS_LANG="simplified chinese"_china.zhs16gbk export NLS_LANG ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data export ORA_NLS33 PATH=$PATH:/opt/SUNWspro/bin:/usr/sbin:/opt/bin:$ORACLE_HOME/bin:/usr/ccs/bin export PATH DATE=`date +%Y%m%d` |
最后,在AB机都放上这个脚本。在crontab中写好执行时间,也不会因为其中一台服务器down掉导致备份无法正常执行。
1、solaris10 + oracle10.2.0.4 rac
2、连接时出现ORA-12545:增加两个节点的LOCAL_LISTENER设置。用sys帐号登录后分别在两个节点执行:
ALTER SYSTEM SET LOCAL_LISTENER = ‘(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.7)(PORT = 1521))’ SID = ‘testdb1′;
ALTER SYSTEM SET LOCAL_LISTENER = ‘(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.8)(PORT = 1521))’ SID = ‘testdb2′;
3、客户端tnsname.ora
testDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.7)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.8)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = swpudb)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)
4、导入两个应用的数据做测试后,
5、问题:就是在node1使用ssh连接时,键入命令有时停顿很严重,但是服务器负载很低。而且应用程序连接是也非常缓慢,这种情况一天内不间断发生。尝试修改应用连接的VIP地址,将两个node的VIP互换,发现应用程序可正常连接,响应速度正常。说明node1有问题,但是至今无法确认到底是什么问题。无比头疼。
6、在node1中查看alter日志:
-bash-3.00$ tail -200 /export/home/oracle/admin/swpudb/bdump/alert_testdb1.log | grep ORA
Starting ORACLE instance (normal)
Starting up ORACLE RDBMS Version: 10.2.0.4.0.
WARNING: inbound connection timed out (ORA-3136)
WARNING: inbound connection timed out (ORA-3136)
在node2中查看alter日志:
-bash-3.00$ tail -200 /export/home/oracle/admin/swpudb/bdump/alert_testdb2.log | grep ORA
Starting ORACLE instance (normal)
Starting up ORACLE RDBMS Version: 10.2.0.4.0.
google出的一个文档:http://www.dbasky.net/archives/2009/05/oracle10gora-3136.html,按照文档所说在两个节点上都增加响应配置。
$ lsnrctl
LSNRCTL> show inbound_connect_timeout
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hpcmdb2.transgd)(PORT=1521)))
LISTENER parameter "inbound_connect_timeout" set to 60
The command completed successfully
LSNRCTL> set inbound_connect_timeout 0
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hpcmdb2.transgd)(PORT=1521)))
LISTENER parameter "inbound_connect_timeout" set to 0
The command completed successfully
LSNRCTL> show inbound_connect_timeout
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hpcmdb2.transgd)(PORT=1521)))
LISTENER parameter "inbound_connect_timeout" set to 0
The command completed successfully
LSNRCTL> exit
7、节点1依然不正常……
清明期间看到大鱼儿写的Nginx并发逼近1万大关,想想学校的教务系统的web端,应该也可以用到Nginx。因为之前用Apache加载resin来做的负载均衡,但是偶尔会出现登录后500的错误,百思不得其解,但是只要刷新一下就好了。所以后来放弃了用Apache加载resin做负载均衡。所以看了大鱼儿的blog就跃跃欲试。
1、服务器是sun4v系列的,查看了官方的说明可以支持,直接下载了稳定版。
2、由于自己只是做一个负载均衡,不需要其他一些模块,所以连PCRE我也放弃了。
3、需要gcc或者其他来编译,操作系统没装,我就去down了个gcc回来。
准备工作就绪,把包传到服务器上去。开工。
| # gunzip gcc-3.4.6-sol10-sparc-local.gz # pkgadd -d ./gcc-3.4.6-sol10-sparc-local # gunzip libiconv-1.11-sol10-sparc-local.gz # pkgadd -d ./libiconv-1.11-sol10-sparc-local # PATH=$PATH:/opt/gnome/bin:/usr/local/bin:/opt/netscape:/usr/ccs/bin # exprot PATH # gzip -d nginx-0.6.36.tar.gz # tar xvf nginx-0.6.36.tar # ./configure –without-http_rewrite_module –user=webadmin –group=webadmin –with-http_stub_status_module checking for OS + SunOS 5.10 sun4v checking for C compiler … found + using GNU C compiler + gcc version: 3.4.6 checking for gcc -pipe switch … found checking for gcc variadic macros … found checking for C99 variadic macros … found checking for unistd.h … found checking for inttypes.h … found checking for limits.h … found checking for sys/filio.h … found checking for crypt.h … found checking for SunOS specific features checking for sendfilev() … found checking for event ports … found checking for poll() … found checking for /dev/poll … found checking for kqueue … not found checking for crypt() … found checking for zlib library … found checking for int size … 4 bytes checking for long size … 4 bytes checking for long long size … 8 bytes checking for void * size … 4 bytes checking for uint64_t … found checking for sig_atomic_t … found checking for sig_atomic_t size … 4 bytes checking for socklen_t … found checking for in_addr_t … found checking for in_port_t … found checking for rlim_t … found checking for uintptr_t … uintptr_t found checking for system endianess … big endianess checking for size_t size … 4 bytes checking for off_t size … 8 bytes checking for time_t size … 4 bytes checking for setproctitle() … not found checking for pread() … found checking for pwrite() … found checking for strerror_r() … found checking for gnu style strerror_r() … found but is not working checking for localtime_r() … found checking for posix_memalign() … not found checking for memalign() … found checking for sched_yield() … found checking for mmap(MAP_ANON|MAP_SHARED) … found checking for mmap("/dev/zero", MAP_SHARED) … found checking for System V shared memory … found checking for struct msghdr.msg_control … not found checking for ioctl(FIONBIO) … found checking for struct tm.tm_gmtoff … not found Configuration summary nginx path prefix: "/usr/local/nginx" make -f objs/Makefile gcc -c -mcpu=v9 -O -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Wno-unused-function -Wunused-variable -Wunused-value -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ ………省略………. # makeinstall |
要让人笑掉大牙的地方就在make那里,我几乎耗费了整整一天的时间来找原因。我make的时候看到有error字样就以为是错误,屏幕显示问题成了-W在上一行的最后部分,error在第二行开头。我就以为是错误,然后到邮件列表啊什么的里面去海找。
这是最近两天我一直考虑的一个问题。简单描述下:SPARC版的Solaris和Oracle。
首先,就问题来说,即便是我更改了Oracle参数,不允许dba组的用户直接使用connect as sysdba登录。但是root仍然可以将参数更改回去。所以传统一直认为是没有办法可以解决。我想到了另一个办法可以用人工干预的方式起一个监控作用。其实很简单。写一个shell监控参数文件的状况,写到crontab中,时刻执行。当然root可以更改crontab,或者伪造shell脚本生成的log。所以这也不是解决之道。
其实这个和Solaris本身设计有很大的关系,因为系统本身的root权限是至高无上的,所以导致Oracle本身最开始设计时无法阻止。一直到10g第二版才有相关的组件Oracle DataBase Vault可以侧面解决。使用 Oracle Database Vault 限制特权用户访问专用应用程序数据:http://www.oracle.com/
Sql-Sever用户可能会笑,说Oracle连这个都做不到。但是Sql-Server也必须要通过域控制才能完满做到嘛。
最后,我很纳闷儿,因为我问了好多朋友,或者朋友的朋友,都说无法解决这个问题。甚至银行系统用的Oracle数据库居然也没有考虑这个问题(只限国内),我无语!我们的钱就靠root帐号持有者的责任感?难怪我们的手机随时都有莫名电话、短信骚扰,银行如此,通信等行业我不敢想了。上面说的产品限制了DBA的权限,使DBA只需要维护Oracle本身,而不是干预应用。
两台v880服务器,原来都安装的Solaris8和Oracle8。后来其中一台升级到Solaris9、Oracle9。另外一台本想保持旧貌,可惜老天不长眼,再一次停电前正常关机之后,再也启动不起来。简单说就是无法引导,然后和Sun的工程师一起找原因,未果(其中遇到各种各样的稀奇古怪的问题,使用了能想到的各种各样的办法都不行,最主要就是超级块有问题,而且无法修复)。最后只能放弃。
由于该系统中数据没有做备份,又想保证数据。工程师提出类似Windows覆盖安装的概念,简单说来,就是装入Solaris8的光盘,从光盘启动安装系统,在进入安装后不久有个选择:Upgrade还是Install,选择Upgrade。我详细的询问了工程师,他说基本上只要不是损坏或者和源盘文件不同的,就会跳过,不会影响到整个系统,以及系统中的应用。这对我来说是一个全新的概念,从来没有想到Solaris也可以这么做。在整个Upgrade的过程中,所有的设置都和原设置相同,完成Upgrade之后系统可以引导了,不过问题又来了。提示输入用户名之后回车,继续让输入用户名,就没有提示输入密码,提示pam_authtok_get.so这个文件有问题(更多请参考PAM(Pluggable Authentication Modules ))。本来可以继续深入挖掘,但是由于时间关系,不得不停止继续修复的方案,而采用忍受丢失部分数据的方案,重装!
在确定硬件没有故障的前提下,工程师又让我吃惊了,他说可以克隆。因为两台880的配置一模一样,一般这样的克隆只是针对备份数据而言,但是为了节约重装系统和数据库,以及打补丁的时间克隆是最快的。本想自己又开始漫长的装系统的过程,结果听他这么说,我愿意看看怎么做。两台880我分别用A和B表示,B表示有问题的,A表示正常的。
这里比如注意。如果服务器不是光纤磁盘,以上操作足够。如果是光线磁盘,必须在插入两个克隆的磁盘后,先要按照下面的操作。
下午,准备将一台SUN FIRE 880的服务器从Solaris8迁移到Solaris10。但是遇到了一个问题,让我百思不得其解。
1、先将准备好的光盘(ISO从Sun的官方网站获得CD版的)。使用boot cdrom,提示无法打开设备;
2、使用Sun服务器自带的Solaris9(光盘当然是从其他服务器上借来用的)可以正常从boot cdrom开始;
3、以为是光盘刻录速度导致读取问题,重刻CD,4x、8x和16x都刻过,再试,还是不行;
4、以为是下载文件问题。重新下载第一张CD,采用4x刻录,再试,还是不行。
5、从Sun官方网站下载DVD版,采用8x刻录,还是不行;
6、从另外一台迁移完成的SUNFIRE880的管理员手中获得他刻录时用的ISO,发现两个问题:第一,今天我们从官方网站下载的DVD大小是2.72G,他刻录时使用的这个ISO同样是Sun官方网站下的,大小是2.84G。莫非增加了新补丁在最新的这个ISO里面,大小还会变少?不管那么多,重新采用6x刻录,还是不行。
这就不是我常识范围内的问题了(所下载的文件MD5检查没问题)。我能想到的都已经全部重新做了,还有什么问题呢?一、硬件问题,那为什么Solaris9就没有问题呢?二、刻录格式问题,一个ISO文件无法选择刻录时的格式吧?我用的Nero,确实没这个选项,这个我仔细看过。而且关键是即便是进入原有的系统,刻录的光盘都无法读出内容,当然没有尝试除了那张Solaris9以外的光盘。难不成Sun在ISO里面做了什么手脚?不可能,另外一个880都已经完成了迁移,同样是下载的,同样是Nero刻录的。至今无解!郁闷!
现在怀疑是iso刻录的时候需要选引导,但是我这里的Nero刻录iso根本没得选。
20080720更新:
1、这台v880,已经基本全天候24小时运行了5年多,没有更换过任何部件,没有出现过任何硬件问题;
2、Sun工程师说可能是OBP问题,升级OBP有个小插曲。升级时发现版本是4.22,原版本是4.7。我当时以为Sun那边自己规范的问题,后来才知道只是简单的22>7而已,OBP升级会在下面一篇中说。
3、用truss来分析整个光盘读取进程,还是没有结果。最后只能说返厂分析,可惜服务早就过保,作罢。
4、这个光驱经过快一天的来回折腾,终于宣告——这是我的问题,您别折腾我了。罢工!归结起来就是这么古老的机器,没出问题就好,出了问题,那就是一个接一个。不过话说回来,一台机器常年运作,除停电意外,能这样不错了。
我现在的应用都是建立在一个SUNFIRE880的服务器上,也就是说该服务器既是数据库服务器,又是应用服务器。
由于所有的应用都在Resin下跑,造成负载过大,在暂时不将数据库和应用分开的前提下,额外做作了一个Resin。问题就出来了——这台服务器只要重启一下(当然,基本都是由于停电关机,来电启动之后),就会导致另外一个resin下的应用无法正常获得数据。最后才发现是由于在服务器启动的过程中resin启动的要比数据库快,只需要按照如下操作就能恢复:
1、stop掉两个resin;
2、将数据库shutdown掉,然后重新startup;
3、重新启动resin。
我想多个resin情况也应该差不多。补充下,我使用的resin是2.1.14。
793fb2fd