waslinux安装部署
⑴ linux was怎么安装httpserver
安装JDK,IBMJava118-SDK-1.1.8-4.0.i386.rpm
假设将rpm下载到/root/rpms,从命令行输入:
rpm -ivh/root/rpms/IBMJava118-SDK-1.1.8-4.0.i386.rpm
在正确使用JDK之前必须设置好shell环境。检查有关shell的文档来了解如何设置环境。我使用bash,因此在/root/.bash_profile文件中添加了以下几行:
以下是引用片段:
JAVA_HOME=/usr/jdk118
PATH=$PATH:/usr/jdk118/bin
CLASSPATH=$CLASSPATH:/usr/jdk118/lib/classes.zip
export PATH JAVA_HOME CLASSPATH
为了确保更改在当前的命令行中生效,输入: . ~/.bash_profile
安装Web服务器(HTTP Server)
Web服务器必须在安 WebSphere Application Server之前安装。
下载安装包:ihs.6010.linux.ia32.tar
1、tar -xvf ihs.6010.linux.ia32.tar---生成一个目录IHS;
2、cd IHS--看到一个目录install;
3、 ./install--执行命令即开始安装 ,安装到了/opt/IBMIHS/目录下;
4、启动服务器:/opt/IBMHTTPServer/bin/apachectl start
如果看到一个错误 HTTP Server无法启动, 尝试更新 /opt/IBMHTTPServer/conf/httpd.conf 文件。因为我运行的是单机,所以将以下这行:ServerType inetd,更新为ServerType standalone。
netscape浏览器下载
下载地址:http://browser.netscape.com/release
下载包netscape-i686-pc-linux-gnu-sea.tar.gz
gzip -d netscape-i686-pc-linux-gnu-sea.tar.gz
tar -xvf netscape-i686-pc-linux-gnu-sea.tar.gz --解压生成一个目录netscape-installer
开始安装,进入netscape-installer,看到netscape-installer,执行命令:./netscape-installer 即可;
启动Netscape浏览器,并指向http://localhost/index.html,检查设置和运行是否一切正常。若正常应该看到类似图1的画面:IBM HTTP Server的欢迎页面。
安装和配置 WebSphere Application Server和安装其他软件一样:
1、gzip -d was.cd.6100.trail.base.linux.ia32.tar.gz --解压gzip
2、tar -xvf was.cd.6100.trail.base.linux.ia32.tar --解压 生成一个WAS的目录,进去之后看到一个绿色的目录install就对了,执行该目录就是安装;
3、cd WAS --进入加压后的目录
4、./install --执行安装。默认安装目录:/opt/IBM/WebSphere/AppServer
5、启动server:进入 /opt/IBM/WebSphere/AppServer/bin ,执行命令:./startServer.sh server1;
6、停止服务:进入/opt/IBM/WebSphere/AppServer/bin,,执行命令:./stopServer.sh server1;
7、启动HTTP Server
8、部署WEB Application
进入WebShere的控制台
cd /opt/IBM/WebSphere/AppServer
⑵ 如何在后台部署深度学习模型
搭建深度学习后台服务器
我们的Keras深度学习REST API将能够批量处理图像,扩展到多台机器(包括多台web服务器和Redis实例),并在负载均衡器之后进行循环调度。
为此,我们将使用:
KerasRedis(内存数据结构存储)
Flask (python的微web框架)
消息队列和消息代理编程范例
- redis-server
- python run_keras_server.py
- curl -X POST -F [email protected] 'http://localhost:5000/predict'
- {"predictions": [{"label": "beagle","probability": 0.9461546540260315},{"label": "bluetick","probability": 0.031958919018507004},{"label": "redbone","probability": 0.006617196369916201},{"label": "Walker_hound","probability": 0.0033879687543958426},{"label": "Greater_Swiss_Mountain_dog","probability": 0.0025766862090677023}],"success": true}
- # import the necessary packagesimport requests# initialize the Keras REST API endpoint URL along with the input# image pathKERAS_REST_API_URL = "http://localhost:5000/predict"IMAGE_PATH = "jemma.png"
- # load the input image and construct the payload for the requestimage = open(IMAGE_PATH, "rb").read()payload = {"image": image}# submit the requestr = requests.post(KERAS_REST_API_URL, files=payload).json()# ensure the request was sucessfulif r["success"]: # loop over the predictions and display them for (i, result) in enumerate(r["predictions"]): print("{}. {}: {:.4f}".format(i + 1, result["label"], result["probability"]))# otherwise, the request failedelse: print("Request failed")
- python simple_request.py
本篇文章的整体思路如下:
我们将首先简要讨论Redis数据存储,以及如何使用它促进消息队列和消息代理。然后,我们将通过安装所需的Python包来配置Python开发环境,以构建我们的Keras深度学习REST API。一旦配置了开发环境,就可以使用Flask web框架实现实际的Keras深度学习REST API。在实现之后,我们将启动Redis和Flask服务器,然后使用cURL和Python向我们的深度学习API端点提交推理请求。最后,我们将以对构建自己的深度学习REST API时应该牢记的注意事项的简短讨论结束。
第一部分:简要介绍Redis如何作为REST API消息代理/消息队列
测试和原文的命令一致。
第三部分:配置Python开发环境以构建Keras REST API
文章中说需要创建新的虚拟环境来防止影响系统级别的python项目(但是我没有创建),但是还是需要安装rest api所需要依赖的包。以下为所需要的包。
第四部分:实现可扩展的Keras REST API
首先是Keras Redis Flask REST API数据流程图
让我们开始构建我们的服务器脚本。为了方便起见,我在一个文件中实现了服务器,但是它可以按照您认为合适的方式模块化。为了获得最好的结果和避免复制/粘贴错误,我建议您使用本文的“下载”部分来获取相关的脚本和图像。
为了简单起见,我们将在ImageNet数据集上使用ResNet预训练。我将指出在哪里可以用你自己的模型交换ResNet。flask模块包含flask库(用于构建web API)。redis模块将使我们能够与redis数据存储接口。从这里开始,让我们初始化将在run_keras_server.py中使用的常量.
我们将向服务器传递float32图像,尺寸为224 x 224,包含3个通道。我们的服务器可以处理一个BATCH_SIZE = 32。如果您的生产系统上有GPU(s),那么您需要调优BATCH_SIZE以获得最佳性能。我发现将SERVER_SLEEP和CLIENT_SLEEP设置为0.25秒(服务器和客户端在再次轮询Redis之前分别暂停的时间)在大多数系统上都可以很好地工作。如果您正在构建一个生产系统,那么一定要调整这些常量。
让我们启动我们的Flask app和Redis服务器:
在这里你可以看到启动Flask是多么容易。在运行这个服务器脚本之前,我假设Redis服务器正在运行(之前的redis-server)。我们的Python脚本连接到本地主机6379端口(Redis的默认主机和端口值)上的Redis存储。不要忘记将全局Keras模型初始化为None。接下来我们来处理图像的序列化:
Redis将充当服务器上的临时数据存储。图像将通过诸如cURL、Python脚本甚至是移动应用程序等各种方法进入服务器,而且,图像只能每隔一段时间(几个小时或几天)或者以很高的速率(每秒几次)进入服务器。我们需要把图像放在某个地方,因为它们在被处理前排队。我们的Redis存储将作为临时存储。
为了将图像存储在Redis中,需要对它们进行序列化。由于图像只是数字数组,我们可以使用base64编码来序列化图像。使用base64编码还有一个额外的好处,即允许我们使用JSON存储图像的附加属性。
base64_encode_image函数处理序列化。类似地,在通过模型传递图像之前,我们需要反序列化图像。这由base64_decode_image函数处理。
预处理图片
我已经定义了一个prepare_image函数,它使用Keras中的ResNet50实现对输入图像进行预处理,以便进行分类。在使用您自己的模型时,我建议修改此函数,以执行所需的预处理、缩放或规范化。
从那里我们将定义我们的分类方法
classify_process函数将在它自己的线程中启动,我们将在下面的__main__中看到这一点。该函数将从Redis服务器轮询图像批次,对图像进行分类,并将结果返回给客户端。
在model = ResNet50(weights="imagenet")这一行中,我将这个操作与终端打印消息连接起来——根据Keras模型的大小,加载是即时的,或者需要几秒钟。
加载模型只在启动这个线程时发生一次——如果每次我们想要处理一个映像时都必须加载模型,那么速度会非常慢,而且由于内存耗尽可能导致服务器崩溃。
加载模型后,这个线程将不断轮询新的图像,然后将它们分类(注意这部分代码应该时尚一部分的继续)
在这里,我们首先使用Redis数据库的lrange函数从队列(第79行)中获取最多的BATCH_SIZE图像。
从那里我们初始化imageIDs和批处理(第80和81行),并开始在第84行开始循环队列。
在循环中,我们首先解码对象并将其反序列化为一个NumPy数组image(第86-88行)。
接下来,在第90-96行中,我们将向批处理添加图像(或者如果批处理当前为None,我们将该批处理设置为当前图像)。
我们还将图像的id附加到imageIDs(第99行)。
让我们完成循环和函数
在这个代码块中,我们检查批处理中是否有图像(第102行)。如果我们有一批图像,我们通过模型(第105行)对整个批进行预测。从那里,我们循环一个图像和相应的预测结果(110-122行)。这些行向输出列表追加标签和概率,然后使用imageID将输出存储在Redis数据库中(第116-122行)。
我们使用第125行上的ltrim从队列中删除了刚刚分类的图像集。最后,我们将睡眠设置为SERVER_SLEEP时间并等待下一批图像进行分类。下面我们来处理/predict我们的REST API端点
稍后您将看到,当我们发布到REST API时,我们将使用/predict端点。当然,我们的服务器可能有多个端点。我们使用@app。路由修饰符以第130行所示的格式在函数上方定义端点,以便Flask知道调用什么函数。我们可以很容易地得到另一个使用AlexNet而不是ResNet的端点,我们可以用类似的方式定义具有关联函数的端点。你懂的,但就我们今天的目的而言,我们只有一个端点叫做/predict。
我们在第131行定义的predict方法将处理对服务器的POST请求。这个函数的目标是构建JSON数据,并将其发送回客户机。如果POST数据包含图像(第137和138行),我们将图像转换为PIL/Pillow格式,并对其进行预处理(第141-143行)。
在开发这个脚本时,我花了大量时间调试我的序列化和反序列化函数,结果发现我需要第147行将数组转换为C-contiguous排序(您可以在这里了解更多)。老实说,这是一个相当大的麻烦事,但我希望它能帮助你站起来,快速跑。
如果您想知道在第99行中提到的id,那么实际上是使用uuid(通用唯一标识符)在第151行生成的。我们使用UUID来防止hash/key冲突。
接下来,我们将图像的id和base64编码附加到d字典中。使用rpush(第153行)将这个JSON数据推送到Redis db非常简单。
让我们轮询服务器以返回预测
我们将持续循环,直到模型服务器返回输出预测。我们开始一个无限循环,试图得到157-159条预测线。从这里,如果输出包含预测,我们将对结果进行反序列化,并将结果添加到将返回给客户机的数据中。我们还从db中删除了结果(因为我们已经从数据库中提取了结果,不再需要将它们存储在数据库中),并跳出了循环(第163-172行)。
否则,我们没有任何预测,我们需要睡觉,继续投票(第176行)。如果我们到达第179行,我们已经成功地得到了我们的预测。在本例中,我们向客户机数据添加True的成功值(第179行)。注意:对于这个示例脚本,我没有在上面的循环中添加超时逻辑,这在理想情况下会为数据添加一个False的成功值。我将由您来处理和实现。最后我们称烧瓶。jsonify对数据,并将其返回给客户端(第182行)。这就完成了我们的预测函数。
为了演示我们的Keras REST API,我们需要一个__main__函数来实际启动服务器
第186-196行定义了__main__函数,它将启动classify_process线程(第190-192行)并运行Flask应用程序(第196行)。
第五部分:启动可伸缩的Keras REST API
要测试我们的Keras深度学习REST API,请确保使用本文的“下载”部分下载源代码示例图像。从这里,让我们启动Redis服务器,如果它还没有运行:
然后,在另一个终端中,让我们启动REST API Flask服务器:
另外,我建议在向服务器提交请求之前,等待您的模型完全加载到内存中。现在我们可以继续使用cURL和Python测试服务器。
第七部分:使用cURL访问Keras REST API
使用cURL来测试我们的Keras REST API服务器。这是我的家庭小猎犬Jemma。根据我们的ResNet模型,她被归类为一只拥有94.6%自信的小猎犬。
你会在你的终端收到JSON格式的预测:
第六部分:使用Python向Keras REST API提交请求
如您所见,使用cURL验证非常简单。现在,让我们构建一个Python脚本,该脚本将发布图像并以编程方式解析返回的JSON。
让我们回顾一下simple_request.py
我们在这个脚本中使用Python请求来处理向服务器提交数据。我们的服务器运行在本地主机上,可以通过端口5000访问端点/predict,这是KERAS_REST_API_URL变量(第6行)指定的。
我们还定义了IMAGE_PATH(第7行)。png与我们的脚本在同一个目录中。如果您想测试其他图像,请确保指定到您的输入图像的完整路径。
让我们加载图像并发送到服务器:
我们在第10行以二进制模式读取图像并将其放入有效负载字典。负载通过请求发送到服务器。在第14行发布。如果我们得到一个成功消息,我们可以循环预测并将它们打印到终端。我使这个脚本很简单,但是如果你想变得更有趣,你也可以使用OpenCV在图像上绘制最高的预测文本。
第七部分:运行简单的请求脚本
编写脚本很容易。打开终端并执行以下命令(当然,前提是我们的Flask服务器和Redis服务器都在运行)。
使用Python以编程方式使用我们的Keras深度学习REST API的结果
第八部分:扩展深度学习REST API时的注意事项
如果您预期在深度学习REST API上有较长一段时间的高负载,那么您可能需要考虑一种负载平衡算法,例如循环调度,以帮助在多个GPU机器和Redis服务器之间平均分配请求。
记住,Redis是内存中的数据存储,所以我们只能在队列中存储可用内存中的尽可能多的图像。
使用float32数据类型的单个224 x 224 x 3图像将消耗602112字节的内存。
⑶ 虚拟机Linux上部署DB2pureScale过程
在Linux 操作系统 中,可在虚拟机上搭建DB2 pureScale,那么搭建的步骤是怎么样的呢?DB2 pureScale又有什么用呢?下面随我一起来了解下Linux系统如何在虚拟机上部署DB2 pureScale。
在虚拟机Linux上部署DB2pureScale实践过程
1、环境准备
硬件环境:3 台 x86-64虚拟机,内存要求 1.5G 或以上(主要针对虚拟机,内存过低会造成数据库实例启动失败)
操作系统:Suse Linux Enterprise Server 11.3
DB2 版本:DB2 v10.5
机器名:node01 node02 node03
IP:192.168.18.201 192.168.18.202 192.168.18.203
网关:192.168.18.2
利用iscsi服务来做共享存储功能,其中node01 作为 iscsi 的 Server,node01、node02和 node03 作为 iscsi Client,这样三台虚拟机上都能看到相同的磁盘了(按照developer workers上的 文章 :非 InfiniBand 环境下搭建 DB2 pureScale,我用DB2 v10.5时启动实例失败,可能10.5做了限制,CF与member在同一台机器启动失败,帮多了一台虚拟机)。
2、操作系统安装:
Node01预留出一块分区,不进行格式化(文件类型为0x83 Linux)做为 pureScale 集群的 Sharing Disk 使用,Node02与Node03跟node01 其它 相同就可,
安装必要的包:
libstdc++(32 位和 64 位库)
glibc(32 位和 64 位库)
cpp
gcc
gcc-c++
kernel-source
binutils
ksh-93u-0.8.1
openssh
ntp
完成SUSE 11 SP3的安装。
验证:检查/lib/moles/3.0.76-0.11-default/build/include/linux有无autoconf.h,如果没有autoconf.h,安装DB2时会报Compiling GPL :.......Failure错误。
解决 方法 :cp –v /usr/src/linux-3.0.76-0.11-obj/x86_64/default/include/generated /lib/moles/3.0.76-0.11-default/build/include/linux
3、添加用户和用户组
三台机器全部执行如下命令(如果不做特殊说明,以#表示root身份登录,以$表示db2inst1身份,以下相同)。
#groupadd -g 1001 db2fadm1
#groupadd -g 1002 db2iadm1
#useradd -g db2fadm1 -u 1001 -m -d /home/db2fenc1 -p db2fenc1 db2fenc1
#useradd -g db2iadm1 -u 1002 -m -d /home/db2inst1 -p db2inst1 db2inst1
#mkdir /root/.ssh
# su - db2inst1 -c "mkdir -p /home/db2inst1/.ssh"
4、配置ssh 信任连接
ssh信任通俗的说就是直接ssh不用输入密码
在/etc/hosts添加另外两台机器的IP地址及机器名(确保3台机器名与ip地址全部出现在hosts文件中)
例如我的机器hosts如下:
127.0.0.1 localhost
192.168.18.201 node01.site node01
192.168.18.202 node02.site node02
192.168.18.203 node03.site node03
node01执行如下命令:
#ssh-keygen -t rsa
#cp -v /root/.ssh/id_rsa.pub /root/.ssh/id01
#scp /root/.ssh/id01 node02:/root/.ssh
#scp /root/.ssh/id01 node03:/root/.ssh
#su - db2inst1
$ssh-keygen -t rsa
$cp -v /home/db2inst1/.ssh/id_rsa.pub /home/db2inst1/.ssh/id01
$scp /home/db2inst1/.ssh/id01 node02:/home/db2inst1/.ssh
$scp /home/db2inst1/.ssh/id01 node03:/home/db2inst1/.ssh
node02执行如下命令:
#ssh-keygen -t rsa
#cp -v /root/.ssh/id_rsa.pub /root/.ssh/id02
#scp /root/.ssh/id02 node01:/root/.ssh/
#scp /root/.ssh/id02 node03:/root/.ssh/
#su - db2inst1
$ssh-keygen -t rsa
$cp -v /home/db2inst1/.ssh/id_rsa.pub /home/db2inst1/.ssh/id02
$scp /home/db2inst1/.ssh/id02 node01:/home/db2inst1/.ssh/
$scp /home/db2inst1/.ssh/id02 node03:/home/db2inst1/.ssh/
node03执行如下命令:
#ssh-keygen -t rsa
#cp -v /root/.ssh/id_rsa.pub /root/.ssh/id03
#scp /root/.ssh/id03 node01:/root/.ssh
#scp /root/.ssh/id03 node02:/root/.ssh
#su - db2inst1
$ssh-keygen -t rsa
$cp -v /home/db2inst1/.ssh/id_rsa.pub /home/db2inst1/.ssh/id03
$scp /home/db2inst1/.ssh/id03 node01:/home/db2inst1/.ssh/
$scp /home/db2inst1/.ssh/id03 node02:/home/db2inst1/.ssh/
分别在node01、node02、node03执行如下命令
#cd /root/.ssh
#cat id01 id02 id03 > authorized_keys
#chmod 600 authorized_keys
#su - db2inst1
$cd /home/db2inst1/.ssh
$ cat id01 id02 id03 > authorized_keys
测试是否配置成功
3台机器分别以root与db2inst1执行:
#ssh node01 ls
#ssh node02 ls
#ssh node03 ls
#su - db2inst1
$ssh node01 ls
$ssh node02 ls
$ssh node03 ls
确保不用输入密码,则配置成功。
5、ISCSI 共享存储配置
Iscsi server端配置(node01上执行):
修改/etc/ietd.conf,添加如下内容:
Target iqn.2014-03.node01.site:scsidisk01
Lun 0 Path=/dev/sda4,Type=fileio
注意:我的未分区硬盘为/dev/sda4,你的可能不一样的@_@~~~~
添加自启动
#chkconfig -a iscsitarget
检查是否成功
#chkconfig -l iscsitarget
结果:iscsitarget 0:off 1:off 2:off 3:on 4:off 5:on 6:off
重启iscsitarget服务
# /etc/init.d/iscsitarget restart
iscsi client端配置(node01、node02、node03执行,):
iscsitarget文件内容如下:
#! /bin/sh
### BEGIN INIT INFO
# Provides: iscsiclsetup
#node02与node03上如果未装iscsitarget需将下下行的$iscsitarget
# Required-Start: $network $syslog $iscsitarget $remote_fs smartd
# Required-Stop:
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Description: ISCSI client setup
### END INIT INFO
case "$1" in start)
iscsiadm --mode discoverydb --type sendtargets --portal 192.168.18.201 --discover
iscsiadm --m node --targetname iqn.2014-03.node01.site:scsidisk01 --portal 192.168.18.201:3260 --login
;;
stop)
iscsiadm -m node -T iqn.2014-03.node01.site:scsidisk01 -p 192.168.18.201 --logout
;;
restart) ## Stop the service and regardless of whether it was ## running or not, start it again.
$0 stop
$0 start
;;
*)
Esac
保存后执行:#/etc/init.d/iscsiclient restart
验证iscsiclient是否启动成功:
#fdisk -l
检查有无/dev/sdb出现
6、配置Linux环境变量
/etc/profie.local添加内容
alias sl='tail -f /var/log/messages'
alias fc='fcslogrpt /var/log/messages'
export PATH=/root/bin:/usr/sbin/rsct/bin:/opt/ibm/db2/v10.5/bin:$PATH
export PATH=/usr/lpp/mmfs/bin:$PATH
export DB2USENONIB=TRUE
export DB2_CFS_GPFS_NO_REFRESH_DATA=true
然后执行# . /etc/profile.local,完成后你就可以安装purescale了,我猜测应该是设置了变量DB2USENONIB,使purescale不再要求你强制InfiniBand或万兆网卡,使我等穷人可以有机会玩这种高档、洋气、上档次的数据库。。。
7、DB2 V10.5 的安装:
node01:~/server_t # ./db2_install
DBI1324W Support of the db2_install command is deprecated. For
more information, see the DB2 Information Center.
Default directory for installation of procts - /opt/ibm/db2/V10.5
***********************************************************
Install into default directory (/opt/ibm/db2/V10.5) ? [yes/no]
yes
Specify one of the following keywords to install DB2 procts.
SERVER
CONSV
EXP
CLIENT
RTCL
Enter "help" to redisplay proct names.
Enter "quit" to exit.
***********************************************************
server
***********************************************************
Do you want to install the DB2 pureScale Feature? [yes/no]
Yes
曾经出现的错误:
ERROR: An error occurred while compiling IBM General Parallel File System
(GPFS) Portability Layer (GPL) on host "node01". Return code "2". GPL
compilation log file location "/tmp/compileGPL.log.000". The GPFS file system
cannot be mounted properly until the GPL mole is successfully compiled on
this host. For details, see the specified GPL compilation log. After fixing
the problems shown in the log file, re-run the DB2 installer. For information
regarding the GPFS GPL mole compile, see DB2 Information Center.
Compiling GPL :.......Failure
ERROR: A major error occurred while installing "DB2 Server Edition " on this
computer.
解决方案:
查看错误日志:compileGPL.log.000,为以下内容:
cd /usr/lpp/mmfs/src/config; ./configure --genenvonly; if [ $? -eq 0 ]; then /usr/bin/cpp -P def.mk.proto > ./def.mk; exit $? || exit 1; else exit $?; fi
手工执行时会发现在./configure --genenvonly; 这一步报找不到
/usr/bin/diff: /lib/moles/3.0.76-0.11-default/build/include/linux/autoconf.h: No such file or directory
Kernel source tree does not have the correct autoconf.h file.
See /usr/lpp/mmfs/src/README for further information
手工拷呗一下autoconf.h文件即可
#cp –v /usr/src/linux-3.0.76-0.11-obj/x86_64/default/include/generated/autoconf.h /lib/moles/3.0.76-0.11-default/build/include/linux/
GPFS 文件系统配置与挂载
方法1:使用db2cluster_prepare
node01上执行:
#/opt/ibm/db2/v10.5/instance/db2cluster_prepare -instance_shared_dev /dev/sdb
DBI1446I The db2cluster_prepare command is running.
DB2 installation is being initialized.
Total number of tasks to be performed: 1
Total estimated time for all tasks to be performed: 60 second(s)
Task #1 start
Description: Creating IBM General Parallel File System (GPFS) Cluster and Filesystem
Estimated time 60 second(s)
Task #1 end
The execution completed successfully.
For more information see the DB2 installation log at
"/tmp/db2cluster_prepare.log".
DBI1070I Program db2cluster_prepare completed successfully.
此时df -l查看一下会发现多了一个挂载点
node01:/opt/ibm/db2/V10.5/instance # df -l
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 19599036 8122392 10481060 44% /
udev 958688 120 958568 1% /dev
tmpfs 958688 76 958612 1% /dev/shm
/dev/sda3 10327940 154460 9648836 2% /home
/dev/db2fs1 15728640 627712 15100928 4% /db2sd_20140401103940
曾经出现报错:
DBI20022E The DB2 installer detected that the variable record "GPFS_CLUSTER" is
defined in the global registry. However, the GPFS cluster does not exist on
host "node01".
Creating IBM General Parallel File System (GPFS) Cluster and Filesystem :.......Failure
查看/tmp/ibm.db2.cluster.GuOypP发现有如下内容报错:
014-04-01-10.26.12.358494+480 I5385E400 LEVEL: Warning
PID : 7469 TID : 139670848014112 PROC : db2cluster
INSTANCE: NODE : 000
HOSTNAME: node01
FUNCTION: DB2 UDB, oper system services, sqloMessage, probe:1
MESSAGE : Cannot obtain registry variables
DATA #1 : Hexmp, 4 bytes
0x00007FFF17631758 : B400 0F87
解决方案:由于此前我在此机器上试过N次db2cluster_prepare,包括V9.8、V10.1,V10.5安装,导致全局注册表变量没有删除干净,使用db2greg -mp
V,GPFS_CLUSTER,NAME,db2cluster_20140403105617.site,-,DB2_CREATED将其删除。
#cp -v /var/db2/global.reg /var/db2/global.reg_20140401
#db2delgreg -delvarrec service= GPFS_CLUSTER
总结 :db2cluster_prepare这个命令失败时
检查iscsi client是否准备好,fdisk -l查看一下是否有/dev/sdb
全局注册表变量是否未删除干净 ,db2greg -mp查看
检查一下是否tsa的domain存在,lsrpdomain,使用rmrpdomain将其删掉,如果其node为活动需先将其node停掉。具体参考tsa相关命令,
检查一下gpfs cluster domain是否未清理干净,如果未清理干净,需要使用将fs、nsd、node清理掉,具体命令参考gpfs信息中心。
方法2:手工挂载GPFS
遇到过使用db2cluster_prepare时无法成功,手工安装(不确定是否遇到了 传说 中的bug)。
创建cluster,不加-filesystem -disk选项:
node01:
#db2cluster -cfs -create -domain mydomain -host node01
#db2cluster -cfs -add -host node02
# db2cluster -cfs -add -host node03
说明:上面如果不出故障当然可以加上-filesystem –disk参数,当然也可以用mmaddnode –N XXX来添加节点
添加许可协议:
提供两种方法
#mmchlicense server --accept -N node01,node02,node03
#/opt/ibm/db2/v10.5/bin/db2cluster -cfs -add -license
创建nsd:任意node执行
编写newNSD文件内容如下
%nsd:
device=/dev/sdb
nsd=nsd1
usage=dataAndMetadata
#mmcrnsd -F /tmp/newNSD (-v no)
如果报mmcrnsd: Disk device sdb refers to an existing NSD,而使用mmlsnsd 又查找不到相应的nsd,添加-v no可以跳过此验证。
#mmlsnsd 查看创建的nsd名称,记下,在第3步时需要用到.
创建Cluster File System并挂载
启动所有node,任意node执行
#mmstartup -a
#mmgetstate -a
确保所有node全部启动成功为active
# mmcrfs -T /db2sd_20140401 db2sd_20140401 nsd1(此处的nsd1为第2步的nsd名称)
#mmmount all -a
--曾经出现的错误:mmstartup -a无响应
,查看日志/var/adm/ras/mmfs.log.previous
Tue Apr 1 22:02:11 CST 2014: runmmfs starting
Removing old /var/adm/ras/mmfs.log.* files:
Unloading moles from /lib/moles/3.0.76-0.11-default/extra
runmmfs: The /lib/moles/3.0.76-0.11-default/extra/mmfslinux.ko kernel extension does not exist.
runmmfs: Unable to verify kernel/mole configuration.
Loading moles from /lib/moles/3.0.76-0.11-default/extra
runmmfs: The /lib/moles/3.0.76-0.11-default/extra/mmfslinux.ko kernel extension does not exist.
runmmfs: Unable to verify kernel/mole configuration.
Tue Apr 1 22:02:11 CST 2014 runmmfs: error in loading or unloading the mmfs kernel extension
Tue Apr 1 22:02:11 CST 2014 runmmfs: stopping GPFS
解决方案:重新编译一下gpfs的源码,因为手工卸载gpfs。
/usr/lpp/mmfs/src/README有详细的编译方法:主要命令方法如下:
#cd /usr/lpp/mmfs/src
#make Autoconfig
#make InstallImages
make InstallImages会在/lib/moles/`uname -r`/extra目录生成3个文件,大功告成.
创建实例
创建实例前:
node02#/opt/ibm/db2/V10.5/instance/db2icrt -cf node01 -cfnet node01
-m node02 -mnet node02 -instance_shared_dir /db2sd_20140401
-tbdev 192.168.18.2 -u db2fenc1 db2inst1
-tbdev 官方解释为:Specifies a shared device path for a device that will act as a tiebreaker in the DB2 pureScale environment to ensure that the integrity of the data is maintained. 通俗的讲就是在member出现故障时,判断哪个member可以恢复服务,穷屌丝们就用网关IP来代替了,只要能 ping 通即可判断为可用。
此时执行:# db2instance -instance db2inst1 -list可以查看
node01:/opt/ibm/db2/V10.5/instance # mmlscluster
GPFS cluster information
========================
GPFS cluster name: db2cluster_20140401103900.site
GPFS cluster id: 6571095102926235332
GPFS UID domain: db2cluster_20140401103900.site
Remote shell command: /var/db2/db2ssh/db2locssh
Remote file command: /var/db2/db2ssh/db2scp
GPFS cluster configuration servers:
-----------------------------------
Primary server: node01.site
Secondary server: node02.site
Node Daemon node name IP address Admin node name Designation
----------------------------------------------------------------------
1 node01.site 192.168.18.201 node01.site quorum-manager
2 node02.site 192.168.18.202 node02.site quorum-manager
曾经出现报错:
错误1、报2632-044、2632-068,此类错误为创建tsa domain时的错误,原因在于虚拟机是拷贝的,不是重新安装的。
解决方法:#/usr/sbin/rsct/install/bin/recfgct
启动实例
node01:$/home/db2inst1/sqllib/adm/db2start
怎么样,报错了吧,应该是SQL1721N
SQL1721N Starting the DB2 database manager failed because of a problem with a configuration file that is needed by RDMA.受打击吧。
你装完了实例启动不了,没关系,这么高档的玩意怎么能让你这么快启动啊。
你得设置两个注册表变量才能用普通网络.
$db2set DB2_SD_SOCKETS_RESTRICTIONS=false
$db2set DB2_CA_TRANSPORT_METHOD=SOCKETS
使用如下命令可以查看CF与member的状态。
#db2instance -instance db2inst1 -list
node01:/home/db2inst1 # db2instance -instance db2inst1 -list
ID TYPE STATE HOME_HOST CURRENT_HOST ALERT PARTITION_NUMBER LOGICAL_PORT NETNAME
-- ---- ----- --------- ------------ ----- ---------------- ------------ -------
0 MEMBER STARTED node02 node02 NO 0 0 node02
128 CF PRIMARY node01 node01 NO - 0 node01
HOSTNAME STATE INSTANCE_STOPPED ALERT
-------- ----- ---------------- -----
node01 ACTIVE NO NO
node02 ACTIVE NO NO
此时你可以使用lssam查看tsa的两个节点的状态。
#lssam
添加成员
将node03添加为另一个member,如果实例没有启动会自动启动实例,所以预先将上一步的两台机器上的db2set执行完毕先。
node01:
#/opt/ibm/db2/v10.5/instance/db2iupdt -d -add -m node03 –mnet node03 db2inst1
#su - db2inst1 -c "db2start member 1"
开启你的purescale之旅
#db2sampl
执行完毕后两台member都可以看到数据库sample,可以同时对库进行操作