敬请期待该系列的后续内容。
企业级研发管理平台在生产环境落地和研发活动落地之后,随着更多的研发团队完成迁移,承载的压力不断加大,对稳定性的要求也越来越高。沉淀在研发管理平台上的研发过程数据(覆盖协作关联、持续集成和构建、测试案例和结果等),以及作为资产的源代码、交付软件,不仅要满足灾备恢复的最低要求,也要尽可能提高研发管理平台的高可用性。
从主动策略入手,可以参考本文"高可用"部分中提到的主备机模式,通过同步、监控、切换和调度环节的具体操作步骤来实现。从被动策略入手,可以按照本文"生产环境巡检"中对手工排错的详细介绍,快速定位研发管理平台的故障。通过预先架构、定时监控、偶发排错等环节,保证生产环境长期平稳运行。
企业级研发管理平台所在的 IT 环境,通常在架构阶段已经进行了全面的评估和规划,在生产环境上线之后,尽量保证用户直接面对的界面和模块(如组成 URL 的 IP、端口号和应用名)不变或少变。但在真实的企业场景中,仍不可避免的碰到 IT 环境变化的情况,比如基于传统 IT 架构的"单点架构"可能要迁移到企业内的私有云上,URI、数据库服务、LDAP 服务都可能重新规划和配置;再如研发组织拆分或合并、公司商号变更都可能重新整合 IT 资源,导致原有生产环境必须进行应用层面或数据层面的迁移操作。
如何适应企业内部的 IT 环境变化,将研发管理平台变更和迁移的影响降到最小,可以按照本文"环境演进"中的详细步骤进行模拟和预演。
基于前文详述的研发管理平台 CLM 单点架构的场景(如图 1),一旦出现 RTC 服务中断、访问不可用的故障,可以通过手动巡检,按照从前端到后端的顺序进行排错和定位,包括如下步骤。
点击查看大图
确认 Web 浏览器上是否可以通过 IHS 反向代理,正常访问 Jazz 平台(https://clm.rnd.demo.com/jts/admin)和 RTC 管理平台(https://clm.rnd.demo.com/ccm/admin)。
如果可以正常访问 Jazz 平台控制台,点击 Users-> Acquired Floating License Leases,(URL 是 https://clm.rnd.demo.com/jts/admin#action=com.ibm.team.repository.activeFloatingLicenses)查看当前登录和使用 CLM 应用的用户,以及登录 session 的 timeout 时间(如图 2)。
点击查看大图
在 Jazz 平台控制台,点击 Server->Configuration->Registered Applications(URL 是 https://clm.rnd.demo.com/jts/admin#action=com.ibm.team.repository.admin.registeredApplications),查看注册使用的 CLM 应用(如图 3)。如果 Settings 是灰色的,点击进入后可以验证应用不可访问,可能是对应的 WAS 实例或 CLM 应用没有启动。
点击查看大图
如果 WAS 实例已经启动,应用不可访问,则需要在 WAS 管理台(https://clm. demo.com:9043/ibm/console)上查看或操作应用(如图 4)。
点击查看大图
如果通过 IHS 反向代理不能正常访问 Jazz 平台和 RTC 的 URL,首先要排除 IHS 反向代理服务器(clm.rnd.demo.com)哪个环节出现了问题:是 IHS?还是 WAS 运行有问题?还是 WAS 应用服务器(clm. demo.com)上的应用没有启动?
因为用于测试的 snoop 应用是只部署在 IHS 反向代理服务器上,通过访问 https://clm.rnd.demo.com/snoop 可以简单判断问题来源:如果访问不可用,同时 https://clm.rnd.demo.com 可访问,说明 IHS 反向代理服务器上的 IHS 运行正常,而 WAS 运行可能存在问题。通过命令终端使用 ps 命令对 IHS 和 WAS 进行检查,如下。如果 WAS 的一个 java 进程和 IHS 的若干进程运行正常,即可排除问题出在 IHS 反向代理服务器上(如清单 1)。
- [
- root@clm logs
- ]#
- ps
- -
- ef
- |
- grep java
- |
- grep
- WebSphere
- |
- wc
- -
- l
- 1
- [root@clm logs]# ps -ef | grep java | grep WebSphere
- .....
- ppServer/bin:/opt/IBM/WebSphere/AppServer/nulldllsdir:/usr/lib: -Djava.endorsed.dirs=
- /opt/IBM/WebSphere/AppServer/endorsed_apis:/opt/IBM/WebSphere/AppServer/java/jre/lib/
- endorsed -Djava.security.auth.login.config=/opt/IBM/WebSphere/AppServer/profiles/
- AppSrv01/properties/wsjaas.conf -Djava.security.policy=/opt/IBM/WebSphere/AppServer/
- profiles/AppSrv01/properties/server.policy com.ibm.wsspi.bootstrap.WSPreLauncher
- -nosplash -application com.ibm.ws.bootstrap.WSLauncher com.ibm.ws.runtime.WsServer
- /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config clmNode01Cell clmNode01 server1
- [root@clm logs]# ps -ef | grep httpd
- root 8967 1 0 12:00 ? 00:00:03 /opt/IBM/HTTPServer/bin/httpd
- -d /opt/IBM/HTTPServer -k start
- nobody 9093 8967 0 12:00 ? 00:00:00 /opt/IBM/HTTPServer/bin/httpd
- -d /opt/IBM/HTTPServer -k start
- nobody 9125 8967 0 12:00 ? 00:00:01 /opt/IBM/HTTPServer/bin/httpd
- -d /opt/IBM/HTTPServer -k start
- nobody 9154 8967 1 12:00 ? 00:04:46 /opt/IBM/HTTPServer/bin/httpd
- -d /opt/IBM/HTTPServer -k start
- nobody 9968 8967 2 15:44 ? 00:00:43 /opt/IBM/HTTPServer/bin/httpd
- -d /opt/IBM/HTTPServer -k start
- nobody 10014 8967 2 15:51 ? 00:00:33 /opt/IBM/HTTPServer/bin/httpd
- -d /opt/IBM/HTTPServer -k start
- root 10099 6188 0 16:11 pts/0 00:00:00 grep httpd
这些检查操作也可以由脚本(如清单 2)完成,如果发现进程不存在,可以强制启动响应进程。
- #clm-start.sh
- #/bin/bash
- flag_ihs_run= && echo $flag_ihs_run
- flag_was_run= && echo $flag_was_run
- echo `date +%Y%m%d-%H%M%S`
- #Check IHS Process
- flag_ihs_run=`ps -ef | grep \[h\]ttpd | awk '{print $2}' | head -1` && echo $flag_ihs_run
- if [ ! -z $flag_ihs_run ]; then
- echo "ihs is already run, pid: $flag_ihs_run"
- else
- echo "ihs is starting to run....";
- /opt/IBM/HTTPServer/bin/apachectl start
- echo "ihs is ready!";
- fi
- #Check WAS process
- flag_was_run=`ps -ef | grep \[W\]ebSphere | awk '{print $2}' | head -1` && echo $flag_was_run
- if [ ! -z $flag_was_run ]; then
- echo "was is already run, pid: $flag_was_run"
- else
- echo "was is starting to run....";
- /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin/startServer.sh server1
- echo "was is ready!";
- fi
上面脚本由 crontab 定义:在上班时间内每 15 分钟执行一次(如下),即可自动进行巡检。
- [
- root@clm logs
- ]#
- crontab
- -
- l
- */15 8-11,13-19 * * * clm-start.sh >> clm-start-per-15m.log
如果 Web 浏览器不能直接访问 Jazz 平台(https://clm.demo.com:9443/jts/admin)和 RTC 管理平台(https://clm.demo.com:9443/ccm/admin),则要排除 WAS 应用服务器(clm.demo.com)上 WAS 运行问题?还是应用运行问题?
通过 ps 命令或 crontab 定期检查。如果证明 WAS 进程运行正常,则需要检查 WAS 和 CLM 的 log 来确认,应用运行层面的问题所在。
通过 WAS 自带的 SystemOut.log 和 SystemErr.log(如清单 3),排查 WAS 运行时错误信息 。
- [
- root@clm
- ~]#
- tail
- -
- f
- /
- opt
- /
- IBM
- /
- WebSphere
- /
- AppServer
- /
- profiles
- /
- AppSrv01
- /
- logs
- /
- server1
- /
- SystemOut
- .
- log
- ......
- [9/13/16 16:26:58:690 GMT+08:00] 00000001 BatchSensorCo I CWLRB5904I:
- BatchSensorComponent starting...
- [9/13/16 16:26:58:704 GMT+08:00] 00000001 BatchSensorCo I CWLRB5905I:
- Successfully activated GridEndpointSensorMBean.
- [9/13/16 16:26:58:710 GMT+08:00] 00000001 RMIConnectorC A ADMC0026I:
- The RMI Connector is available at port 2809
- [9/13/16 16:26:58:715 GMT+08:00] 00000001 JMXConnectors I ADMC0058I:
- The JMX JSR160RMI connector is available at port 2809
- [9/13/16 16:26:58:765 GMT+08:00] 00000001 WsServerImpl A WSVR0001I:
- Server server1 open for e-business
- ..........
- [root@clm ~]# tail -f /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1/SystemErr.log
- ..........
- [9/12/16 16:05:20:776 CST] 0000019f SystemErr R
- at org.eclipse.soda.sat.core.internal.record.
- ExportProxyServiceRecord$ExportedServiceInvocationHandler
- .invoke(ExportProxyServiceRecord.java:56)
- [9/12/16 16:05:20:776 CST] 0000019f SystemErr R
- at com.sun.proxy.$Proxy1468.getConnection(Unknown Source)
- [9/12/16 16:05:20:776 CST] 0000019f SystemErr R
- at com.ibm.team.repository.service.internal.rdb.ConnectionFactory.
- createConnection(ConnectionFactory.java:90)
- [9/12/16 16:05:20:776 CST] 0000019f SystemErr R ... 117 more
- [9/13/16 12:00:22:169 CST] 00000179 SystemErr R
- Returning connection to the pool Connection #19527 has 1 open statements
- [9/13/16 12:00:22:218 CST] 00000177 SystemErr R
- Returning connection to the pool Connection #19438 has 1 open statements
- [9/13/16 12:00:22:219 CST] 00000179 SystemErr R
- Open statement #21281
- [9/13/16 12:00:22:219 CST] 00000177 SystemErr R
- Open statement #21283
- ..........
通过 CLM 提供的 jts.log(如清单 4),排查 Jazz 平台运行时错误信息,其中涉及到数据库连接,应用初始化等。
- [
- root@clm
- ~]#
- tail
- -
- f
- /
- opt
- /
- IBM
- /
- WebSphere
- /
- AppServer
- /
- profiles
- /
- AppSrv01
- /
- logs
- /
- jts
- .
- log
- 2016-09-13 16:26:57,195 [Component Resolve Thread (Bundle 94)]
- INFO nternal.OverridablePropertyFileServerConfiguration
- - CRJAZ1363I Loading the configuration from
- "file:////opt/IBM/JazzTeamServer/server/conf/jts/teamserver.properties".
- 2016-09-13 16:34:00,223 [WebContainer : 1]
- INFO pository.service.internal.ServerDescriptionService
- - CRJAZ1779I This server is configured as a JTS.
- 2016-09-13 16:34:03,385 [WebContainer : 1]
- INFO rvice.mapping.internal.ServerRenameProgressService
- - CRJAZ2558I Setting the local server rename state to false
- and the openServerDescriptionServiceTemporarily state to false.
- 2016-09-13 16:34:08,896 [WebContainer : 1]
- INFO .repository.service.internal.rdb.ConnectionFactory
- - CRJAZ1365I The server is attempting to connect to the following database:
- "//db.demo.com:50000/JTS:user=xxxxxxxx;password=xxxxxxxx;"
- 2016-09-13 16:34:11,333 [WebContainer : 1]
- INFO .repository.service.internal.rdb.ConnectionFactory
- - CRJAZ1364I The connection to the following database was successful:
- Db Product Name: DB2/LINUXPPC64
- Db Product Version: SQL10053
- Db URL: jdbc:db2://db.demo.com:50000/JTS:user=xxxxxxxx;password=xxxxxxxx;
- Jdbc Driver Name: IBM Data Server Driver for JDBC and SQLJ
- Jdbc Driver Version: 4.17.28
- 2016-09-13 16:34:12,577 [WebContainer : 1]
- INFO pository.service.internal.ServerDescriptionService
- - CRJAZ1971I The server is configured with:
- Public URI: "https://clm.rnd.demo.com/jts"
- 2016-09-13 16:34:16,830 [WebContainer : 1]
- INFO mapping.internal.GlobalServerRenameProgressService
- - CRJAZ2523I Setting the global server rename state to false and the validation state to false.
- 2016-09-13 16:34:16,897 [ Thread-115]
- INFO ping.internal.ServerRenameOverallStatusRestService
- - CRJAZ2412I There are no mapping events to process.
- 2016-09-13 16:34:21,177 [WebContainer : 1]
- WARN com.ibm.team.repository.servlet.TeamServerServlet
- - CRJAZ2076I Product Details:
- Jazz Foundation - Core Libraries, Version 5.0.2 (RJF-I20141028-1603)
- 2016-09-13 16:35:19,822 [WebContainer : 2 @@ 16:34
- jazzldapadmin <Initial Page Load@ed3c9846-6495-49e7-88ab-38fe33d3adf1> /ccm/admin]
- INFO com.ibm.team.jfs
- - CRJZS5650I Indices directory is /opt/IBM/JazzTeamServer/server/conf/jts/indices
- 2016-09-13 16:35:20,102 [WebContainer : 2 @@ 16:34
- jazzldapadmin <Initial Page Load@ed3c9846-6495-49e7-88ab-38fe33d3adf1> /ccm/admin]
- INFO com.ibm.team.jfs
- - CRJZS5800I Private applications are using a transactional RDF index
- .....
- 2016-09-13 16:35:22,861 [WebContainer : 2 @@ 16:34
- jazzldapadmin <Initial Page Load@ed3c9846-6495-49e7-88ab-38fe33d3adf1> /ccm/admin]
- WARN com.ibm.team.jfs
- - CRJZS6072W The server did not shut down properly,
- which might have corrupted the text indexes located at
- /opt/IBM/JazzTeamServer/server/conf/jts/indices/_6Lqhkj9EEeagwqqVIfHl-A/jfs-textindex.
- 2016-09-13 16:35:22,983 [WebContainer : 2 @@ 16:34
- jazzldapadmin <Initial Page Load@ed3c9846-6495-49e7-88ab-38fe33d3adf1> /ccm/admin]
- INFO com.ibm.team.jfs
- - CRJZS5656I Text indexer for private applications has started
......
通过 CLM 提供的 ccm.log(如清单 5),排查 RTC(CCM 应用)运行和错误信息。其中涉及到数据库连接,应用初始化等。
- [
- root@clm
- AppServer
- ]#
- tail
- -
- f
- /
- opt
- /
- IBM
- /
- WebSphere
- /
- AppServer
- /
- profiles
- /
- AppSrv01
- /
- logs
- /
- ccm
- .
- log
- Jazz Team Server location: "https://clm.rnd.demo.com/jts/"
- 2016-09-13 16:34:18,479 [WebContainer : 3]
- INFO mapping.internal.GlobalServerRenameProgressService
- - CRJAZ2523I Setting the global server rename state to false and the validation state to false.
- .......
- 2016-09-13 16:34:28,616 [WebContainer : 3]
- WARN com.ibm.team.repository.servlet.TeamServerServlet
- - CRJAZ2076I Product Details:
- Change and Configuration Management - Core Libraries, Version 5.0.2 (RTC-I20141031-0926)
- Jazz Foundation - Core Libraries, Version 5.0.2 (RJF-I20141028-1603)
- 2016-09-13 16:34:48,776 [ccm: AsynchronousTaskRunner-0 @@ 16:34]
- INFO com.ibm.team.enterprise.services.common
- - Perform Enterprise Extensions migration tasks
- 2016-09-13 16:34:48,807 [ccm: AsynchronousTaskRunner-0 @@ 16:34]
- INFO com.ibm.team.enterprise.services.common
- - Initialize migration task 'Migrate system definitions from EMF to JFS'
- 2016-09-13 16:34:49,633 [WebContainer : 3 @@ 16:34 <unauthenticated>
- <com.ibm.team.enterprise.services
- .common.EnterpriseExtensionsMigrationTaskContext@efd289a8-b849-4e61-b9e2-9ddd832547e9>
- /ccm/storage/enterprise_migration/_version=4.0]
- INFO com.ibm.team.jfs
- - CRJZS5650I Indices directory is /opt/IBM/JazzTeamServer/server/conf/ccm/indices
- 2016-09-13 16:34:49,871 [WebContainer : 3 @@ 16:34 <unauthenticated>
- <com.ibm.team.enterprise.services
- .common.EnterpriseExtensionsMigrationTaskContext@efd289a8-b849-4e61-b9e2-9ddd832547e9>
- /ccm/storage/enterprise_migration/_version=4.0]
- INFO com.ibm.team.jfs
- - CRJZS5800I Private applications are using a transactional RDF index
- .......
- 2016-09-13 16:34:52,758 [ccm: AsynchronousTaskRunner-0 @@ 16:34] INFO
- com.ibm.team.enterprise.services.common
- - Initialize migration task 'Set component UUID for build maps'
- 2016-09-13 16:34:52,779 [ccm: AsynchronousTaskRunner-0 @@ 16:34] INFO
- com.ibm.team.enterprise.services.common
- - The migration task 'Set component UUID for build maps' has completed successfully previously
- so it does not need to rerun
- .......
如果需要更多的 log,则修改应用配置文件 log4j.properties,例如输出 RTC 更多的 debug 信息,打开/opt/IBM/JazzTeamServer/server/conf/ccm/log4j.properties 的 debug 开关(如清单 6)
- [
- root@clm
- ~]#
- tail
- -
- f
- /
- opt
- /
- IBM
- /
- JazzTeamServer
- /
- server
- /
- conf
- /
- ccm
- /
- log4j
- .
- properties
- #Uncomment to enable tracing for Dependency Build
- #log4j.logger.com.ibm.team.enterprise.dependencyset.service=DEBUG
- #log4j.logger.com.ibm.team.enterprise.internal.dependencyset.service.utils=DEBUG
- #log4j.logger.com.ibm.team.enterprise.internal.build.preprocess.service=DEBUG
- log4j.logger.com.ibm.team.tpt.internal.service.ImpexService=DEBUG
通过访问 WebUI 上 CCM 内部工具调试页面(如图 5),URL 添加"?internal=true",如"https://clm.rnd.demo.com/ccm/admin?internal=true#action=com.ibm.team.repository.admin.reloadLoggingSettings"。点击 Reload Log Settings 按钮,允许在不启动应用的前提下,在 ccm.log 文件中加入更多的 debug 信息。
点击查看大图
如果步骤 3 中,查看 jts.log(如清单 7)显示 DB2 数据库连接失败,则需要进一步确认数据库连接。
- 2016
- -
- 09
- -
- 13
- 16
- :
- 50
- :
- 43
- ,
- 614
- [
- WebContainer
- :
- 10
- @@
- 16
- :
- 50
- <unauthenticated>
- <com.ibm.team.repository.ContributorSynchronizingTask@6b5fe622-98e4-489a-bc21-de90a5909c41>
- /jts/contributorRecords/] ERROR com.ibm.team.repository
- - CRJAZ2654E The server was unable to connect to the database because the database connection
- settings are invalid or because database is unreachable (SQLSTATE: 08001, SQLCODE: -4499).
- Verify the connection settings in your teamserver.properties file. See the Jazz Team Server
- log for more information.
- com.ibm.db2.jcc.am.DisconnectNonTransientConnectionException:
- [jcc][t4][2043][11550][4.17.28] Exception java.net.ConnectException:
- Error opening socket to server db.demo.com/192.168.100.122 on port 50,000 with message:
- Connection refused. ERRORCODE=-4499, SQLSTATE=08001
- at com.ibm.db2.jcc.am.fd.a(fd.java:328)
- at com.ibm.db2.jcc.am.fd.a(fd.java:408)
- at com.ibm.db2.jcc.t4.yb.a(yb.java:440)
- at com.ibm.db2.jcc.t4.yb.<init>(yb.java:96)
- at com.ibm.db2.jcc.t4.a.b(a.java:353)
- at com.ibm.db2.jcc.t4.b.newAgent_(b.java:2048)
- at com.ibm.db2.jcc.am.Connection.initConnection(Connection.java:747)
- at com.ibm.db2.jcc.am.Connection.<init>(Connection.java:693)
- at com.ibm.db2.jcc.t4.b.<init>(b.java:333)
- at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:233)
- at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:199)
- at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:474)
- at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:115)
- at com.ibm.team.repository.service.db.provider.AbstractDbProvider
- .getConnection(AbstractDbProvider.java:205)
- at com.ibm.team.repository.jdbcdriver.internal.db2.Db2Provider
- .getConnection(Db2Provider.java:1879)
- at sun.reflect.GeneratedMethodAccessor711.invoke(Unknown Source)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
- at java.lang.reflect.Method.invoke(Method.java:611)
- at org.eclipse.soda.sat.core.internal.record
- .ExportProxyServiceRecord.invoke(ExportProxyServiceRecord.java:361)
- at org.eclipse.soda.sat.core.internal.record
- .ExportProxyServiceRecord.access$0(ExportProxyServiceRecord.java:347)
- at....
如果 DB2 数据库连接失败,潜在原因可能包括 DB2 设置变化、网络变化、DB2 进程崩溃等;需要确认 DB2 配置信息、网络状态、重新启动 DB2 服务等。另外,对于重要配置文件 teamserver.properties 可能被误改。例如 Jazz 平台配置文件(如清单 8),实例用户错为 db2inst2。
- [
- root@clm
- ~]#
- cat
- /
- opt
- /
- IBM
- /
- JazzTeamServer
- /
- server
- /
- conf
- /
- jts
- /
- teamserver
- .
- properties
- .....
- com.ibm.team.repository.db.jdbc.location=//db.demo.com\:50000/JTS\:user\=db2inst2;
- password\={password};
- ......
另外需要确认 DB2 数据库服务器是否可以连通。在 clm.demo.com 检查 hosts 文件,是否能找到 DB2 数据库服务器,执行 ping 通 db.demo.com,判断 DB2 所在操作系统是否可连通。如果可以连通,则登陆到 db.demo.com,看是否可成功连接 CLM 应用对应的 DB2 数据库,如 JTS 和 CCM(如清单 9)。
- [
- root@db
- ~]#
- su
- -
- db2inst1
- [db2inst1@db ~]$ db2 connect to JTS
- Database Connection Information
- Database server = DB2/LINUXPPC64 10.5.3
- SQL authorization ID = DB2INST1
- Local database alias = JTS
- [db2inst1@db ~]$ db2 connect to CCM
- Database Connection Information
- Database server = DB2/LINUXPPC64 10.5.3
- SQL authorization ID = DB2INST1
- Local database alias = CCM
如果连接没有问题,可以通过命令"df -h",查看 DB2 数据库服务器的硬盘空间是否充足。
对于更多的 DB2 信息,可以查看 DB2 数据库 log(/home/db2inst1/sqllib/db2dump/db2diag.log)的异常来判断。例如 DB2 的 log 提示内存变更(如清单 10)。
- [
- db2inst1@db
- ~]
- $ tail
- -
- f
- /
- home
- /
- db2inst1
- /
- sqllib
- /
- db2dump
- /
- db2diag
- .
- log
- Perform ABP Start and cat_nodenum is 0, my node num is 0
- 2016-09-13-14.59.44.478774+480 I11161077A545 LEVEL: Event
- PID : 31519 TID : 17579728892384 PROC : db2sysc 0
- INSTANCE: db2inst1 NODE : 000 DB : JTS
- APPHDL : 0-40008 APPID: *LOCAL.DB2.160913065856
- AUTHID : DB2INST1 HOSTNAME: db.demo.com
- EDUID : 21736 EDUNAME: db2stmm (JTS) 0
- FUNCTION: DB2 UDB, config/install, sqlfLogUpdateCfgParam, probe:20
- CHANGE : STMM CFG DB JTS : "Database_memory" From: "412368" <automatic>
- To: "418080" <automatic>
基于主备机模式的高可用方案(如图 6),需要权衡以下因素并判断是否满足高可用的要求
点击查看大图
同步所包含的备份、传输和恢复几个环节可以基于脚本做自动化调度,也可以尝试基于监控平台工具(如 Zabbix)来做监控、决策和调度。对于数据库的备份和恢复,其中 DB2 数据库备份使用 db2 backup/restore 命令(只列出 JTS 代码如清单 11);derby 数据库备份直接压缩数据目录即可,如 CCM,压缩目录/opt/IBM/JazzTeamServer/server/conf/ccm,恢复反之。
- su - db2inst1
- #Backup JTS
- db2 "CONNECT TO jts"
- db2 "FORCE APPLICATIONS ALL"
- db2 "BACKUP DB jts TO /db2backup"
- #Restore JTS
- db2 "RESTORE DB jts FROM /db2backup ON /db2fs DBPATH ON /db2path"
对于 WAS、IHS 和 CLM 应用配置的备份:
对于 WAS、IHS 和 CLM 应用配置的恢复操作,是备份的反操作,但要特别注意恢复的操作顺序:
监控的思路分为两类,并使用不同监控项目和手段(如图 7):
点击查看大图
监控的结果,是决定是否进行主备机环境切换的依据。如果在生产环境对进程的运行状态进行定时巡检的前提下,监控机模拟用户仍然不能正常访问 CLM 应用,则要考虑是否要进行不同层级的主备机环境切换(如图 8 和如表 1)。
No | 监控机监控结果 | 应对方案 | 注意 |
---|---|---|---|
1 | 只有生产环境数据库进程启动失败 | 修改生产环境应用服务器的 IP 映射,将原数据库 IP 映射到备用环境的数据库 | |
2 | 只有生产环境应用服务器进程启动失败 | 修改 DNS 或 IHS 反向代理设置并重启,生产环境将全部切换到备用环境 | DNS 重起有可能影响其他在用应用的使用 |
修改 DNS 或 IHS 反向代理设置并重启;修改备用环境的应用服务器的 IP 映射,将原备用数据库 IP 修改成生产环境的数据库 | DNS 重起有可能影响其他在用应用的使用 | ||
3 | 生产环境数据库和应用服务器进程都启动失败 | 修改 DNS 或 IHS 反向代理设置并重启,生产环境将全部切换到备用环境 | DNS 重起有可能影响其他在用应用的使用 |
点击查看大图
对生产环境中 IHS 反向代理服务器、WAS/CLM 应用服务器、以及 DB2 数据库服务器,分别触发同步或监控脚本;基于经验、依赖关系,手动设置 crontab,需要错开触发的时间点。在调度环节,需要进一步引入专业框架和工具,如使用 Zabbix 进行监控、决策和动作触发,使用 Ansible 或 Puppet 进行持续部署和编排。对于成熟的运维体系,需要探索和尝试满足特定条件和需求的方案。
对 RTC 生产环境的运维,除了日常的监控和巡检以外,生产环境还可能随着 RTC 落地的不同阶段不断演进,以满足运营的需求。环境演进的过程中,可能做 URI 的变更或相关集成环境的变更,也可能做应用和数据库的迁移。
URI 是 CLM 唯一的访问名,URI 变更需要进行 rename 操作。假设从单点架构中去除 IHS 反向代理服务器,URI 需要改为 WAS 应用服务器的机器名,即从 https://clm.rnd.demo.com 变更为 https://clm.demo.com:9443。URI 是保存在数据库中的,因此这种操作在环境变化或迁移的场景下是会经常做的。
使用 repotools-jts 脚本,生成 rename 映射文件(如清单 12)。
- mkdir
- -
- p
- /
- auto
- /
- rename
- cd /opt/IBM/JazzTeamServer/server
- ./repotools-jts.sh -generateURLMappings toFile=/auto/rename/mappings.txt
- adminUserId=jazzldapadmin
- adminPassword=password additionalURLFile=/auto/rename/additionalurl.txt
- repositoryURL=https://clm.rnd.demo.com/jts
修改 rename 文件(/auto/rename/mappings.txt)中的 target URL,从 https://clm.rnd.demo.com 修改为 https://clm.demo.com:9443(如清单 13)。
- #qm
- source=https://clm.rnd.demo.com/qm
- target=https://clm.demo.com:9443/qm
- #ccm
- source=https://clm.rnd.demo.com/ccm
- target=https://clm.demo.com:9443/ccm
- #rm
- source=https://clm.rnd.demo.com/rm
- target=https://clm.demo.com:9443/rm
- #convert
- source=https://clm.rnd.demo.com/converter/htmlgen
- target=https://clm.demo.com:9443/converter/htmlgen
- #clmhelp
- source=https://clm.rnd.demo.com/clmhelp
- target=https://clm.demo.com:9443/clmhelp
....
修改后,使用 repotools-jts 脚本,验证 rename 映射文件是否可用(如清单 14)。
- cd
- /
- opt
- /
- IBM
- /
- JazzTeamServer
- /
- server
- ./repotools-jts.sh -verifyURLMappings mappingFile=/auto/rename/mappings.txt
- adminUserId=jazzldapadmin adminPassword=password
停止 WAS 应用服务器,使用 repotools-jts 命令,开始 rename 过程(如清单 15)。
- cd
- /
- opt
- /
- IBM
- /
- JazzTeamServer
- /
- server
- ./repotools-jts.sh -importURLMappings fromFile=/auto/rename/mappings.txt
- teamserver.properties=/opt/IBM/JazzTeamServer/server/conf/jts/teamserver.properties
注意:Rename 过程在 5.0.2 版本中仍需要 ImportURLMappings.activate 文件,需要从 IBM Support 获取,并拷贝到/opt/IBM/JazzTeamServer/server 目录下。Rename 过程中需要再次确认,按照提示,标示 YES 或 Y,进行多次确认。Rename 过程完成后,重新启动 WAS 应用服务器,并在 Web 浏览器上验证应用和已存在项目区域(Project Area)相关的 URL。
如果 rename 过程成功完成,需要在 Web 浏览器上验证 URI 可用,按照 Web 页面(https://clm.demo.com:9443/jts/serverRenameStatus)上的指引完成 URI 验证过程(如图 9)。
点击查看大图
注意:如果某些应用或已有项目区域的 URL 连接失败,需要按照提示重新进行 rename 过程。如果全部验证通过,则提示 rename 过程成功完成(如图 10)。
点击查看大图
如果 RTC 生产环境的 DB2 数据库服务器面临迁移、机器名变化、端口变化,则需要在 JTS、CCM 等应用的控制台分别修改数据库连接属性(如图 11、12)。
点击查看大图
点击查看大图
注意:Jazz 平台和 RTC 应用的控制台是分开的,需要在不同页面修改,同时也可以通过各个应用的 teamserver.properties 配置文件,直接修改 DB2 连接的相关参数(如清单 16 显示 RTC 参数)。重起应用即可生效。
- [
- root@clm
- ~]#
- cat
- /
- opt
- /
- IBM
- /
- JazzTeamServer
- /
- server
- /
- conf
- /
- ccm
- /
- teamserver
- .
- properties
- #This configuration update was requested by "yuantao".
- The old contents of this file were copied to
- "/opt/IBM/JazzTeamServer/server/conf/ccm/teamserver-1476780533523bakup.properties".
- #Tue Oct 18 16:48:53 CST 2016
- ...
- com.ibm.team.repository.server.jts.url=https\://clm.rnd.demo.com/jts
- com.ibm.team.enterprise.build.preprocess.considerOnlyOutgoingChangesetsInPersonalBuild=true
- com.ibm.team.repository.db.jdbc.location=//db.demo.com\:50000/CCM\:user\=db2inst1;
- password\={password};
- com.ibm.team.repository.db.jdbc.password=[dN2q16In5Iw\=]
- com.ibm.team.jfs.index.root.directory=indices
- com.ibm.team.repository.changeEvent.expirationDefault=1209600
- com.ibm.team.repository.server.webapp.url=https\://clm.rnd.demo.com/ccm
- com.ibm.team.repository.db.repoLockId=_lrTLIEHREeaSopZylsT7FQ
- com.ibm.team.repository.oauth.accessToken.timeout=-1
- com.ibm.team.datawarehouse.db.vendor=DB2
- com.ibm.team.repository.web.suppressedPages={"com.ibm.team.repository.web.admin"\:
- ["com.ibm.team.repository.provision"]}
- com.ibm.team.repository.db.vendor=DB2
....
如果试用环境使用最简安装,即用 derby 作为数据库,而其中的一些数据需要保留,则需要在切换到生产环境时,把 derby 在试用阶段的数据转换到生产环境的 DB2 数据库中。CLM 提供了转换工具如下。
步骤 1:通过 repotools-jts 和其他 repotools 工具分别对不同的应用进行 export 操作(如清单 17),数据被打包成.tar 文件。
- cd
- /
- opt
- /
- IBM
- /
- JazzTeamServer
- /
- server
- ./repotools-jts.sh -export toFile=/backup/export-jts.tar
- teamserver.properties=/opt/IBM/JazzTeamServer/server/conf/jts/teamserver.properties
- ./repotools-ccm.sh -export toFile=/backup/export-ccm.tar
- teamserver.properties=/opt/IBM/JazzTeamServer/server/conf/ccm/teamserver.properties
步骤 2:通过修改 Jazz 平台和 CCM 应用的 Web 管理台(如图 11,12)上的 JDBC Vendor 和 JDBC Location,或直接修改 teamserver.properties 配置文件(如清单 16),将数据库相关属性从原 Derby 改成 DB2 数据库的。
步骤 3:通过 repotools-jts 和其他 repotools 工具进行 import 操作(如清单 18),将打包的.tar 文件导入到 DB2 中数据库
- cd
- /
- opt
- /
- IBM
- /
- JazzTeamServer
- /
- server
- /
- ./repotools-jts.sh -import fromFile=/backup/export-jts.tar
- teamserver.properties=/opt/IBM/JazzTeamServer/server/conf/jts/teamserver.properties
- ./repotools-ccm.sh -import fromFile=/backup/export-ccm.tar
- teamserver.properties=/opt/IBM/JazzTeamServer/server/conf/ccm/teamserver.properties
步骤 4:上述步骤并不迁移 DW 数据库,因此在 DB2 上创建用于数据抽取的 DW 数据库(如清单 19)
- cd
- /
- opt
- /
- IBM
- /
- JazzTeamServer
- /
- server
- /
- .
- /
- repotools
- -
- jts
- .
- sh
- -
- createWarehouse
如果 LDAP 服务器面临迁移、机器名变化、端口变化,需要先修改 WAS 的 LDAP 配置(如图 13),确认来自于新 LDAP 的管理员账号能够正常 WAS 控制台,重新启动 WAS 应用服务。
点击查看大图
再修改 Jazz 平台上的 LDAP 相关设置:登录 https://clm.rnd.demo.com/ccm/admin,点击 Server->Configuration-> Advanced Properties,修改 com.ibm.team.repository.service.jts.internal.userregistry.ldap.LDAPUserRegistryProvider 下属的相关属性(如图 14)。
点击查看大图
如果涉及到 LDAP 的结构变化,需要修改 WAS 和 Jazz 平台上 Filter 和 Map 类型的属性(如图 15)。
点击查看大图
如果邮件服务器面临迁移、机器名变化、端口变化,需要在 Jazz 平台修改相关设置(如图 16)。
点击查看大图
基于单点架构,应用迁移也有多种场景和可能。如果 IHS 反向代理服务器不变,只是迁移 WAS 应用服务器到同名的另一台 WAS 应用服务器,可以通过直接拷贝 WAS 和 CLM 目录直接实现;如果需要迁移到不同名的另一台 WAS 应用服务器,则需要重新设置和部署 WAS 应用。如果 IHS 反向代理服务器迁移到另一台不同名机器上,则需要 URI 变更,也要进行 rename 操作,同步数据。
如果只是从 DB2 数据库服务器 1 迁移到 DB2 数据库服务器 2,则只需要把 DB2 数据备份(扩展名为.001 的 DB2 备份文件,由 db2 backup 命令生成)放入/db2backup 目录,通过 db2 restore 命令直接导入成同名数据库。如果现有 DB2 数据库服务器 2 环境中部分数据库需要保持原有数据库名称,则需要导入备份数据时将原数据库名称作改名处理,即 jts 数据库中的数据强制导入到 jts2(如清单 20)。
- #同名恢复命令
- db2 "RESTORE DB jts FROM /db2backup ON /db2fs DBPATH ON /db2path"
- db2 "RESTORE DB ccm FROM /db2backup ON /db2fs DBPATH ON /db2path"
- db2 "RESTORE DB dw FROM /db2backup ON /db2fs DBPATH ON /db2path"
- #改名恢复命令
- db2 "RESTORE DB jts FROM /db2backup ON /db2fs DBPATH ON /db2path into jts2"
- db2 "RESTORE DB ccm FROM /db2backup ON /db2fs DBPATH ON /db2path into ccm2"
- db2 "RESTORE DB dw FROM /db2backup ON /db2fs DBPATH ON /db2path into dw2"
如果 DB2 数据库在做备份的过程中还有应用连接,在导入数据后,会导致 RTC 应用启动过程中提示 repository 死锁,需要使用不同应用的 repotools 工具,分别做解锁操作(如清单 21)。
- cd
- /
- opt
- /
- IBM
- /
- JazzTeamServer
- /
- server
- ./repotools-jts.sh -resetRepoLockId
- ./repotools-ccm.sh -resetRepoLockId
对于任何配置和修改,都需要在配套环境中进行试验后再交付到生产环境;生产环境的控制权限要统一设置、统一管理;不同角色和团队的权限,基于 RTC 自身的功能,按照组织和时间两个层次进行划分。
来源: http://www.ibm.com/developerworks/cn/middleware/library/mw-1705-srinivasan/index.html