WebSphere教程FG013-WebSphere ND集群高可用配置与故障切换实战
本文档风哥主要介绍WebSphere Application Server ND 9.0.5的集群高可用配置与故障切换,包括高可用概述、高可用架构、故障切换机制、会话复制、故障切换测试等内容,风哥教程参考WebSphere官方文档高可用配置章节,适合WebSphere管理员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 WebSphere高可用概述
WebSphere高可用是确保应用持续可用的关键能力,通过冗余和故障切换机制实现。学习交流加群风哥微信: itpux-com
- 消除单点故障:关键组件冗余部署
- 快速故障切换:故障时自动切换
- 数据一致性:会话数据不丢失
- 服务连续性:用户无感知切换
1.1.1 高可用指标
可用性等级:
等级 可用性 年停机时间 描述
──────────────────────────────────────────────────────
2个9 99% 87.6小时 基本可用
3个9 99.9% 8.76小时 较高可用
4个9 99.99% 52.6分钟 高可用
5个9 99.999% 5.26分钟 极高可用
6个9 99.9999% 31.5秒 容错系统
# 高可用计算公式
可用性 = (总时间 – 停机时间) / 总时间 × 100%
示例:
年总时间:365 × 24 × 60 = 525600分钟
允许停机:52.6分钟
可用性 = (525600 – 52.6) / 525600 = 99.99%
# WebSphere高可用组件
1. Deployment Manager高可用
– 主备DMgr
– 共享配置存储
– 自动故障切换
2. 应用服务器高可用
– 集群部署
– 会话复制
– 负载均衡
3. Web服务器高可用
– 多Web服务器
– 负载均衡器
– 健康检查
4. 数据库高可用
– 数据库集群
– 主从复制
– 故障切换
1.2 WebSphere高可用架构
WebSphere高可用架构:
1.2.1 架构设计
┌─────────────────────────────────────────────────────────┐
│ 外部负载均衡器 │
│ (F5/Nginx/HAProxy) │
└─────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
│ │ │
┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐
│ WebServer │ │ WebServer │ │ WebServer │
│ (主) │ │ (备) │ │ (备) │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
└───────────────┼───────────────┘
│
┌─────────────────────┴─────────────────────┐
│ WebSphere Cell │
│ ┌─────────────────────────────────────┐ │
│ │ DMgr (主) DMgr (备) │ │
│ │ 共享配置存储 │ │
│ └─────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────┐ │
│ │ 应用服务器集群 │ │
│ │ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │ │
│ │ │S1 │ │S2 │ │S3 │ │S4 │ │S5 │ │ │
│ │ └───┘ └───┘ └───┘ └───┘ └───┘ │ │
│ │ 会话复制 (内存到内存) │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
│
┌─────────────────────┴─────────────────────┐
│ 数据库集群 │
│ ┌───┐ ┌───┐ ┌───┐ │
│ │主 │ │从1│ │从2│ │
│ └───┘ └───┘ └───┘ │
└─────────────────────────────────────────────┘
# 架构层次
层次1:外部负载均衡
– 流量分发
– 健康检查
– 故障切换
层次2:Web服务器层
– 静态资源服务
– 请求路由
– Plugin负载均衡
层次3:应用服务器层
– 应用运行
– 会话管理
– 业务处理
层次4:数据层
– 数据存储
– 数据复制
– 数据备份
1.3 WebSphere高可用组件
WebSphere高可用组件:
1.3.1 核心组件
1. 集群(Cluster)
– 多个应用服务器实例
– 运行相同应用
– 提供负载均衡和高可用
2. 会话复制(Session Replication)
– 会话数据同步
– 内存到内存复制
– 故障时恢复会话
3. 复制域(Replication Domain)
– 定义复制范围
– 配置复制策略
– 管理复制成员
4. 健康策略(Health Policy)
– 监控服务器健康
– 自动故障检测
– 自动恢复动作
# 会话复制模式
1. 内存到内存复制
– 实时会话同步
– 低延迟
– 需要足够内存
复制模式:
– 单点复制:复制到一个备份
– 双点复制:复制到两个备份
– 全复制:复制到所有成员
2. 数据库持久化
– 会话存储到数据库
– 高可靠性
– 性能较低
3. 文件持久化
– 会话存储到文件
– 简单配置
– 性能较低
# 健康策略配置
健康条件:
– 内存使用率过高
– CPU使用率过高
– 响应时间过长
– 连接池耗尽
恢复动作:
– 重启服务器
– 联系支持
– 发送通知
– 无动作
1.4 WebSphere故障切换机制
WebSphere故障切换机制:
1.4.1 故障切换流程
1. 应用服务器故障切换
故障检测:
– Plugin检测服务器不可达
– 健康检查失败
– 心跳超时
切换过程:
1. Plugin标记服务器为不可用
2. 请求路由到其他服务器
3. 从会话复制获取会话数据
4. 继续处理请求
恢复时间:
– 检测时间:5-10秒
– 切换时间:1-2秒
– 总恢复时间:约10秒
2. DMgr故障切换
故障检测:
– 主DMgr心跳检测
– 网络不可达
– 进程不存在
切换过程:
1. 备DMgr检测主DMgr故障
2. 备DMgr接管管理职责
3. 更新DNS或VIP
4. 继续管理Cell
恢复时间:
– 检测时间:10-30秒
– 切换时间:5-10秒
– 总恢复时间:约30秒
3. Web服务器故障切换
故障检测:
– 负载均衡器健康检查
– HTTP请求失败
– TCP连接失败
切换过程:
1. 负载均衡器标记服务器为不可用
2. 流量路由到其他Web服务器
3. Plugin更新服务器状态
4. 继续处理请求
恢复时间:
– 检测时间:3-5秒
– 切换时间:立即
– 总恢复时间:约5秒
# 故障切换配置
Plugin配置:
健康检查配置:
– 检查间隔:5秒
– 失败阈值:3次
– 恢复阈值:2次
Part02-生产环境规划与建议
2.1 WebSphere高可用规划
WebSphere高可用规划需要考虑多个因素:
2.1.1 高可用规划要素
1. 可用性目标
– 99.9%:基本高可用
– 99.99%:标准高可用
– 99.999%:极高可用
2. 故障容忍
– 单点故障:至少2个实例
– 双点故障:至少3个实例
– 多点故障:5个以上实例
3. 数据中心
– 单机房:机架冗余
– 双机房:机房冗余
– 多机房:地域冗余
4. 恢复时间目标
– RTO(恢复时间目标):服务恢复时间
– RPO(恢复点目标):数据丢失量
# 高可用规划模板
可用性目标:99.99%
集群成员:5个
数据中心:2个(主备)
RTO:5分钟
RPO:0(会话复制)
故障容忍:2个节点
# 不同规模高可用配置
小型(99.9%):
– 集群成员:2个
– 数据中心:1个
– 会话复制:单点
– Web服务器:2个
中型(99.99%):
– 集群成员:3-5个
– 数据中心:2个
– 会话复制:双点
– Web服务器:3个
大型(99.999%):
– 集群成员:5个以上
– 数据中心:3个
– 会话复制:全复制
– Web服务器:5个以上
2.2 WebSphere DMgr高可用规划
WebSphere DMgr高可用规划:
2.2.1 DMgr高可用方案
方案1:共享存储方案
– 主备DMgr共享配置目录
– 使用共享文件系统(NFS/GPFS)
– 主DMgr故障时备DMgr接管
架构:
┌─────────────────────────────────────────┐
│ 共享存储(NFS/GPFS) │
│ /shared/was/config │
└─────────────────────────────────────────┘
↑ ↑
│ │
┌─────┴─────┐ ┌─────┴─────┐
│ DMgr(主) │ │ DMgr(备) │
│ Active │ │ Standby │
└───────────┘ └───────────┘
方案2:数据库方案
– 配置存储在数据库
– 主备DMgr共享数据库
– 自动故障切换
方案3:虚拟IP方案
– 主DMgr绑定VIP
– 故障时VIP漂移到备DMgr
– 客户端无感知切换
# DMgr高可用配置
1. 准备共享存储
# 创建共享目录
mkdir -p /shared/was/config
chown -R websphere:websphere /shared/was
# NFS挂载
mount -t nfs nas.fgedu.net.cn:/was_share /shared/was
2. 配置主DMgr
# 使用共享目录创建Profile
/WebSphere/app/bin/manageprofiles.sh -create \
-templatePath /WebSphere/app/profileTemplates/management \
-profileName Dmgr01 \
-profilePath /WebSphere/app/profiles/Dmgr01 \
-cellName fgeduCell01 \
-nodeName fgeduCellManager01 \
-dmgrProfileRoot /shared/was/config
3. 配置备DMgr
# 在备节点创建相同配置
# 使用相同的共享目录
4. 配置自动切换
# 使用Pacemaker/Keepalived
# 监控DMgr进程
# 自动启动备DMgr
2.3 WebSphere集群高可用规划
WebSphere集群高可用规划:
2.3.1 集群高可用配置
1. 集群成员分布
– 不同物理服务器
– 不同机架
– 不同机房
2. 会话复制配置
– 启用内存到内存复制
– 配置复制域
– 设置备份数量
3. 健康策略配置
– 内存监控
– CPU监控
– 响应时间监控
– 自动重启
# 集群成员分布示例
集群:fgeduCluster(5成员)
机房A(主):
– server1:物理服务器1
– server2:物理服务器2
– server3:物理服务器3
机房B(备):
– server4:物理服务器4
– server5:物理服务器5
# 会话复制配置
复制域:fgeduReplicationDomain
复制模式:双点复制
备份数量:2
成员配置:
– server1 -> 复制到 server2, server4
– server2 -> 复制到 server3, server5
– server3 -> 复制到 server1, server4
– server4 -> 复制到 server5, server1
– server5 -> 复制到 server4, server2
# 健康策略配置
策略名称:fgeduHealthPolicy
条件:
– 内存使用率 > 90%
– CPU使用率 > 95%
– 响应时间 > 5000ms
动作:
– 重启服务器
– 发送告警通知
2.4 WebSphere容灾规划
WebSphere容灾规划:
2.4.1 容灾方案
1. 同城双活
– 两个数据中心同时运行
– 数据实时同步
– 负载分担
架构:
┌─────────────────────────────────────────────────────────┐
│ 全局负载均衡 │
└─────────────────────────────────────────────────────────┘
│ │
┌────┴────┐ ┌────┴────┐
│ 数据中心A│ │ 数据中心B│
│ (主) │ │ (备) │
│ 50%流量 │ │ 50%流量 │
└─────────┘ └─────────┘
2. 异地容灾
– 主数据中心运行
– 备数据中心待命
– 故障时切换
架构:
┌─────────────────────────────────────────────────────────┐
│ DNS切换/全局负载均衡 │
└─────────────────────────────────────────────────────────┘
│ │
┌────┴────┐ ┌────┴────┐
│ 北京机房 │ │ 上海机房 │
│ (主) │ │ (备) │
│ 100%流量│ │ 待命 │
└─────────┘ └─────────┘
3. 两地三中心
– 生产中心 + 本地灾备 + 异地灾备
– 最高级别容灾
架构:
┌─────────────────────────────────────────────────────────┐
│ 全局负载均衡 │
└─────────────────────────────────────────────────────────┘
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│ 生产中心 │ │ 本地灾备 │ │ 异地灾备 │
│ 北京 │ │ 北京 │ │ 上海 │
│ 100%流量│ │ 同步复制 │ │ 异步复制 │
└─────────┘ └─────────┘ └─────────┘
# 容灾切换流程
1. 检测故障
2. 确认需要切换
3. 启动备中心服务
4. 更新DNS/负载均衡
5. 验证服务可用
6. 通知相关人员
# 容灾演练
演练频率:每季度一次
演练内容:
– 模拟主中心故障
– 执行切换流程
– 验证服务恢复
– 记录演练结果
– 改进容灾方案
Part03-生产环境项目实施方案
3.1 WebSphere高可用配置实战
WebSphere高可用配置操作:
3.1.1 创建高可用集群
1. 创建集群
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123
# 创建集群
AdminClusterManagement.createCluster(‘[-clusterName fgeduHACluster]’)
# 添加成员(分布在多个节点)
AdminClusterManagement.createClusterMember(‘[-clusterName fgeduHACluster -memberNode fgeduNode01 -memberName server1]’)
AdminClusterManagement.createClusterMember(‘[-clusterName fgeduHACluster -memberNode fgeduNode02 -memberName server2]’)
AdminClusterManagement.createClusterMember(‘[-clusterName fgeduHACluster -memberNode fgeduNode03 -memberName server3]’)
# 保存配置
AdminConfig.save()
2. 创建复制域
# 创建复制域
AdminConfig.create(‘ReplicationDomain’, AdminConfig.getid(‘/Cell:fgeduCell01/’),
‘[[name fgeduHAReplicationDomain] [replicatorEntry []]]’)
# 配置复制域属性
domain = AdminConfig.getid(‘/ReplicationDomain:fgeduHAReplicationDomain/’)
AdminConfig.modify(domain, ‘[[numberOfReplicas 2]]’)
# 保存配置
AdminConfig.save()
3. 启用集群高可用
# 获取集群配置
cluster = AdminConfig.getid(‘/ServerCluster:fgeduHACluster/’)
# 启用高可用
AdminConfig.modify(cluster, ‘[[enableHA true]]’)
# 配置复制域
stateMgr = AdminConfig.list(‘StateManagerProvider’, cluster)
AdminConfig.modify(stateMgr, ‘[[replicationDomain fgeduHAReplicationDomain]]’)
# 保存配置
AdminConfig.save()
# 同步节点
AdminNodeManagement.syncActiveNodes()
# 启动集群
AdminClusterManagement.startCluster(‘fgeduHACluster’)
# 验证配置
print AdminConfig.showAttribute(cluster, ‘enableHA’)
true
# 完整配置脚本
#!/bin/bash
# create_ha_cluster.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “创建高可用集群…”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 << 'EOF'
# 创建集群
print "1. 创建集群..."
AdminClusterManagement.createCluster('[-clusterName fgeduHACluster]')
# 添加成员
print "2. 添加集群成员..."
AdminClusterManagement.createClusterMember('[-clusterName fgeduHACluster -memberNode fgeduNode01 -memberName server1]')
AdminClusterManagement.createClusterMember('[-clusterName fgeduHACluster -memberNode fgeduNode02 -memberName server2]')
AdminClusterManagement.createClusterMember('[-clusterName fgeduHACluster -memberNode fgeduNode03 -memberName server3]')
# 创建复制域
print "3. 创建复制域..."
AdminConfig.create('ReplicationDomain', AdminConfig.getid('/Cell:fgeduCell01/'),
'[[name fgeduHAReplicationDomain] [replicatorEntry []]]')
# 启用高可用
print "4. 启用高可用..."
cluster = AdminConfig.getid('/ServerCluster:fgeduHACluster/')
AdminConfig.modify(cluster, '[[enableHA true]]')
stateMgr = AdminConfig.list('StateManagerProvider', cluster)
AdminConfig.modify(stateMgr, '[[replicationDomain fgeduHAReplicationDomain]]')
# 保存配置
print "5. 保存配置..."
AdminConfig.save()
# 同步节点
print "6. 同步节点..."
AdminNodeManagement.syncActiveNodes()
# 启动集群
print "7. 启动集群..."
AdminClusterManagement.startCluster('fgeduHACluster')
print "高可用集群创建完成"
EOF
echo "完成"
3.2 WebSphere会话复制配置实战
WebSphere会话复制配置:
3.2.1 会话复制配置
1. 配置Web容器会话管理
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123
# 获取集群Web容器配置
cluster = AdminConfig.getid(‘/ServerCluster:fgeduHACluster/’)
webContainer = AdminConfig.list(‘WebContainer’, cluster)
# 配置会话管理
sessionMgr = AdminConfig.list(‘SessionManager’, webContainer)
AdminConfig.modify(sessionMgr, ”’
[[enable true]
[sessionTimeout 30]
[enableUrlRewriting false]
[enableCookies true]
[cookieName JSESSIONID]
[cookieSecure true]]
”’)
# 配置会话复制
tuningParams = AdminConfig.list(‘TuningParams’, sessionMgr)
AdminConfig.modify(tuningParams, ”’
[[maxInMemorySessionCount 1000]
[allowOverflow true]
[scheduleInvalidation false]]
”’)
# 配置复制设置
replication = AdminConfig.list(‘SessionDatabasePersistence’, sessionMgr)
AdminConfig.modify(replication, ”’
[[enable true]
[usePersistence false]]
”’)
# 保存配置
AdminConfig.save()
2. 配置会话复制属性
# 设置复制属性
sessionProps = AdminConfig.list(‘SessionManager’, webContainer)
# 配置内存到内存复制
AdminConfig.create(‘MemoryToMemorySessionReplication’, sessionProps, ”’
[[replicationType BOTH]]
”’)
# 保存配置
AdminConfig.save()
# 同步节点
AdminNodeManagement.syncActiveNodes()
# 重启集群
AdminClusterManagement.restartCluster(‘fgeduHACluster’)
3. 验证会话复制
# 创建测试应用
cat > /tmp/test_session.jsp << 'EOF'
<%@ page import="java.util.*" %>
<%
String sessionId = session.getId();
Integer count = (Integer) session.getAttribute("count");
if (count == null) count = 0;
count++;
session.setAttribute("count", count);
%>
Session ID: <%= sessionId %>
Count: <%= count %>
Server: <%= java.net.InetAddress.getLocalHost().getHostName() %>
EOF
# 部署测试应用
# 访问测试页面
# 停止一个服务器
# 再次访问,验证会话保持
# 会话复制验证脚本
#!/bin/bash
# test_session_replication.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “测试会话复制…”
# 获取会话ID
SESSION_ID=$(curl -s -c /tmp/cookie.txt http://localhost:9080/fgeduapp/test_session.jsp | grep “Session ID” | awk ‘{print $3}’)
echo “会话ID: $SESSION_ID”
# 多次请求
for i in {1..5}; do
echo “请求 $i:”
curl -s -b /tmp/cookie.txt http://localhost:9080/fgeduapp/test_session.jsp
echo “”
sleep 1
done
# 停止一个服务器
echo “停止server1…”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “AdminControl.invoke(AdminControl.queryNames(‘type=Server,name=server1,*’), ‘stop’)”
# 再次请求
echo “故障切换后请求:”
curl -s -b /tmp/cookie.txt http://localhost:9080/fgeduapp/test_session.jsp
echo “测试完成”
3.3 WebSphere故障切换测试实战
WebSphere故障切换测试:
3.3.1 故障切换测试
1. 测试应用服务器故障切换
# 查看当前集群状态
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 \
-c “print AdminClusterManagement.getClusterState(‘fgeduHACluster’)”
websphere.cluster.running
# 查看成员状态
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 << 'EOF'
members = AdminClusterManagement.listClusterMembers('fgeduHACluster').split('\n')
for member in members:
if member:
state = AdminControl.getAttribute(AdminControl.queryNames('type=ClusterMember,name=' + member + ',*'), 'state')
print member + ': ' + state
EOF
server1: STARTED
server2: STARTED
server3: STARTED
# 模拟服务器故障
# 停止server1
kill -9 $(ps -ef | grep server1 | grep java | awk '{print $2}')
# 等待故障检测
sleep 10
# 检查集群状态
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 << 'EOF'
members = AdminClusterManagement.listClusterMembers('fgeduHACluster').split('\n')
for member in members:
if member:
try:
state = AdminControl.getAttribute(AdminControl.queryNames('type=ClusterMember,name=' + member + ',*'), 'state')
print member + ': ' + state
except:
print member + ': STOPPED'
EOF
server1: STOPPED
server2: STARTED
server3: STARTED
# 测试应用访问
curl -s http://localhost:9080/fgeduapp/test.jsp
# 应该正常返回
# 恢复server1
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c "AdminControl.invoke(AdminControl.queryNames('type=Server,name=server1,*'), 'start')"
2. 测试会话故障切换
# 创建测试会话
curl -s -c /tmp/session.txt http://localhost:9080/fgeduapp/test_session.jsp
Session ID: abc123
Count: 1
Server: server1
# 停止server1
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c "AdminControl.invoke(AdminControl.queryNames('type=Server,name=server1,*'), 'stop')"
# 使用相同会话访问
curl -s -b /tmp/session.txt http://localhost:9080/fgeduapp/test_session.jsp
Session ID: abc123
Count: 2
Server: server2
# 会话保持,计数增加
3. 故障切换测试脚本
#!/bin/bash
# failover_test.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
CLUSTER=fgeduHACluster
APP_URL=http://localhost:9080/fgeduapp/test.jsp
echo "=== 故障切换测试 ==="
# 初始状态
echo "1. 初始状态:"
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c "print AdminClusterManagement.getClusterState('$CLUSTER')" 2>/dev/null
# 测试应用访问
echo “”
echo “2. 测试应用访问:”
curl -s $APP_URL
# 模拟故障
echo “”
echo “3. 模拟server1故障…”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “AdminControl.invoke(AdminControl.queryNames(‘type=Server,name=server1,*’), ‘stop’)” 2>/dev/null
sleep 5
# 检查状态
echo “”
echo “4. 故障后状态:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminClusterManagement.getClusterState(‘$CLUSTER’)” 2>/dev/null
# 测试应用访问
echo “”
echo “5. 故障后应用访问:”
curl -s $APP_URL
# 恢复
echo “”
echo “6. 恢复server1…”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “AdminControl.invoke(AdminControl.queryNames(‘type=Server,name=server1,*’), ‘start’)” 2>/dev/null
sleep 10
# 最终状态
echo “”
echo “7. 最终状态:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminClusterManagement.getClusterState(‘$CLUSTER’)” 2>/dev/null
echo “”
echo “=== 测试完成 ===”
3.4 WebSphere高可用监控实战
WebSphere高可用监控:
3.4.1 高可用监控配置
1. 配置健康策略
# 通过管理控制台
故障诊断 > 健康策略 > 新建
策略名称:fgeduMemoryPolicy
条件:内存使用率 > 90%
动作:重启服务器
策略名称:fgeduCPUPolicy
条件:CPU使用率 > 95%
动作:重启服务器
# 通过wsadmin配置
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123
# 创建健康策略
healthPolicy = AdminConfig.create(‘HealthPolicy’, AdminConfig.getid(‘/Cell:fgeduCell01/’),
‘[[name fgeduMemoryPolicy] [description “Memory usage policy”]’)
# 添加条件
AdminConfig.create(‘HealthCondition’, healthPolicy,
‘[[conditionType memory] [threshold 90]]’)
# 添加动作
AdminConfig.create(‘HealthAction’, healthPolicy,
‘[[actionType RESTART_SERVER]]’)
# 保存配置
AdminConfig.save()
2. 监控脚本
#!/bin/bash
# ha_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
CLUSTER=fgeduHACluster
ALERT_EMAIL=admin@fgedu.net.cn
echo “=== 高可用监控 ===”
# 集群状态
CLUSTER_STATE=$(/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminClusterManagement.getClusterState(‘$CLUSTER’)” 2>/dev/null)
echo “集群状态: $CLUSTER_STATE”
# 成员状态
echo “”
echo “成员状态:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 << 'EOF' 2>/dev/null
members = AdminClusterManagement.listClusterMembers(‘fgeduHACluster’).split(‘\n’)
active_count = 0
for member in members:
if member:
try:
state = AdminControl.getAttribute(AdminControl.queryNames(‘type=ClusterMember,name=’ + member + ‘,*’), ‘state’)
print member + ‘: ‘ + state
if state == ‘STARTED’:
active_count += 1
except:
print member + ‘: STOPPED’
print “活动成员数: ” + str(active_count)
EOF
# 会话复制状态
echo “”
echo “会话复制状态:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminConfig.showAttribute(AdminConfig.getid(‘/ServerCluster:fgeduHACluster/’), ‘enableHA’)” 2>/dev/null
echo “=== 监控完成 ===”
3. 告警配置
# 配置SNMP告警
# 配置邮件告警
# 配置短信告警
# 告警脚本
#!/bin/bash
# send_alert.sh
SUBJECT=$1
MESSAGE=$2
echo “$MESSAGE” | mail -s “$SUBJECT” $ALERT_EMAIL
echo “告警已发送: $SUBJECT”
Part04-生产案例与实战讲解
4.1 多机房高可用部署案例
多机房高可用部署案例:
4.1.1 案例背景
企业背景:
– 应用:电商系统
– 可用性要求:99.99%
– 数据中心:北京(主)+ 上海(备)
– 集群成员:6个(北京3个 + 上海3个)
架构设计:
– 全局负载均衡:F5 GTM
– 本地负载均衡:F5 LTM
– 会话复制:跨机房内存复制
– 数据同步:Oracle ADG
4.1.2 部署实施
1. 北京机房配置
# 创建集群成员
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123
# 添加北京成员
AdminClusterManagement.createClusterMember(‘[-clusterName fgeduCluster -memberNode BJNode01 -memberName BJServer1]’)
AdminClusterManagement.createClusterMember(‘[-clusterName fgeduCluster -memberNode BJNode02 -memberName BJServer2]’)
AdminClusterManagement.createClusterMember(‘[-clusterName fgeduCluster -memberNode BJNode03 -memberName BJServer3]’)
2. 上海机房配置
# 添加上海成员
AdminClusterManagement.createClusterMember(‘[-clusterName fgeduCluster -memberNode SHNode01 -memberName SHServer1]’)
AdminClusterManagement.createClusterMember(‘[-clusterName fgeduCluster -memberNode SHNode02 -memberName SHServer2]’)
AdminClusterManagement.createClusterMember(‘[-clusterName fgeduCluster -memberNode SHNode03 -memberName SHServer3]’)
3. 配置跨机房会话复制
# 创建复制域
AdminConfig.create(‘ReplicationDomain’, AdminConfig.getid(‘/Cell:fgeduCell01/’),
‘[[name fgeduCrossDCReplicationDomain] [replicatorEntry []]]’)
# 配置双点复制
domain = AdminConfig.getid(‘/ReplicationDomain:fgeduCrossDCReplicationDomain/’)
AdminConfig.modify(domain, ‘[[numberOfReplicas 2]]’)
# 启用高可用
cluster = AdminConfig.getid(‘/ServerCluster:fgeduCluster/’)
AdminConfig.modify(cluster, ‘[[enableHA true]]’)
stateMgr = AdminConfig.list(‘StateManagerProvider’, cluster)
AdminConfig.modify(stateMgr, ‘[[replicationDomain fgeduCrossDCReplicationDomain]]’)
# 保存配置
AdminConfig.save()
4. 配置F5负载均衡
# GTM配置
# 宽带DNS解析
# 健康检查
# LTM配置
# Pool配置
# Monitor配置
# 会话保持
5. 验证部署
# 检查集群状态
AdminClusterManagement.getClusterState(‘fgeduCluster’)
websphere.cluster.running
# 检查成员分布
AdminClusterManagement.listClusterMembers(‘fgeduCluster’)
BJServer1
BJServer2
BJServer3
SHServer1
SHServer2
SHServer3
# 测试跨机房切换
# 停止北京机房所有服务器
# 验证上海机房接管
4.2 故障切换演练案例
故障切换演练案例:
4.2.1 演练计划
演练目标:
– 验证高可用配置有效性
– 测试故障切换时间
– 验证会话数据不丢失
– 检验运维响应流程
演练场景:
1. 单服务器故障
2. 多服务器故障
3. 机房故障
4. 数据库故障
# 演练脚本
#!/bin/bash
# ha_drill.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
CLUSTER=fgeduHACluster
LOG_FILE=/var/log/ha_drill.log
log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” | tee -a $LOG_FILE
}
log “=== 高可用演练开始 ===”
# 场景1:单服务器故障
log “场景1:单服务器故障”
log “停止server1…”
START_TIME=$(date +%s)
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “AdminControl.invoke(AdminControl.queryNames(‘type=Server,name=server1,*’), ‘stop’)” 2>/dev/null
# 等待故障检测
sleep 10
# 测试应用访问
log “测试应用访问…”
RESPONSE=$(curl -s -o /dev/null -w “%{http_code}” http://localhost:9080/fgeduapp/test.jsp)
END_TIME=$(date +%s)
RECOVERY_TIME=$((END_TIME – START_TIME))
log “响应码: $RESPONSE”
log “恢复时间: ${RECOVERY_TIME}秒”
# 恢复server1
log “恢复server1…”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “AdminControl.invoke(AdminControl.queryNames(‘type=Server,name=server1,*’), ‘start’)” 2>/dev/null
# 场景2:会话保持测试
log “”
log “场景2:会话保持测试”
# 创建会话
log “创建会话…”
SESSION_ID=$(curl -s -c /tmp/drill_session.txt http://localhost:9080/fgeduapp/test_session.jsp | grep “Session ID” | awk ‘{print $3}’)
log “会话ID: $SESSION_ID”
# 停止处理会话的服务器
log “停止server2…”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “AdminControl.invoke(AdminControl.queryNames(‘type=Server,name=server2,*’), ‘stop’)” 2>/dev/null
sleep 5
# 验证会话
log “验证会话…”
NEW_SESSION=$(curl -s -b /tmp/drill_session.txt http://localhost:9080/fgeduapp/test_session.jsp | grep “Session ID” | awk ‘{print $3}’)
log “新会话ID: $NEW_SESSION”
if [ “$SESSION_ID” == “$NEW_SESSION” ]; then
log “会话保持成功”
else
log “会话保持失败”
fi
# 恢复server2
log “恢复server2…”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “AdminControl.invoke(AdminControl.queryNames(‘type=Server,name=server2,*’), ‘start’)” 2>/dev/null
log “=== 演练完成 ===”
# 生成报告
log “”
log “=== 演练报告 ===”
log “单服务器故障恢复时间: ${RECOVERY_TIME}秒”
log “会话保持测试: $([ “$SESSION_ID” == “$NEW_SESSION” ] && echo “成功” || echo “失败”)”
4.3 高可用故障处理案例
高可用故障处理案例:
4.3.1 会话复制失败案例
故障现象:
用户登录后刷新页面需要重新登录
故障诊断:
1. 检查会话复制配置
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminConfig.showAttribute(AdminConfig.getid(‘/ServerCluster:fgeduCluster/’), ‘enableHA’)”
true
2. 检查复制域
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminConfig.list(‘ReplicationDomain’)”
(fgeduCell01/fgeduReplicationDomain)
3. 检查日志
grep -i “replication” /WebSphere/app/profiles/AppSrv01/logs/server1/SystemOut.log
[4/10/26 10:00:00:000 CST] 00000001 DRSImpl E DRS0001E: 无法建立复制连接
4. 分析原因
– 防火墙阻止复制端口
– 复制端口默认:9352
解决方案:
1. 检查防火墙
iptables -L -n | grep 9352
2. 开放复制端口
iptables -I INPUT -p tcp –dport 9352 -j ACCEPT
service iptables save
3. 重启集群
AdminClusterManagement.restartCluster(‘fgeduCluster’)
4. 验证会话复制
# 登录应用
# 刷新页面
# 检查是否保持登录状态
# 故障处理结果
问题原因:防火墙阻止复制端口
解决方案:开放端口
处理时间:10分钟
# 预防措施
1. 部署前检查防火墙配置
2. 监控复制状态
3. 定期演练故障切换
Part05-风哥经验总结与分享
5.1 WebSphere高可用检查清单
WebSphere高可用检查清单:
配置检查:
□ 集群已创建
□ 成员数量足够(>=3)
□ 会话复制已启用
□ 复制域已配置
□ 健康策略已配置
网络检查:
□ 复制端口已开放
□ 负载均衡已配置
□ 健康检查已配置
□ DNS解析正确
监控检查:
□ 集群状态监控
□ 成员状态监控
□ 会话复制监控
□ 告警配置完成
演练检查:
□ 故障切换演练完成
□ 会话保持验证通过
□ 恢复时间达标
□ 演练报告完成
# 高可用检查脚本
#!/bin/bash
# ha_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “=== WebSphere高可用检查 ===”
# 集群状态
echo “1. 集群状态:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminClusterManagement.getClusterState(‘fgeduHACluster’)” 2>/dev/null
# 高可用配置
echo “”
echo “2. 高可用配置:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminConfig.showAttribute(AdminConfig.getid(‘/ServerCluster:fgeduHACluster/’), ‘enableHA’)” 2>/dev/null
# 成员状态
echo “”
echo “3. 成员状态:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminClusterManagement.listClusterMembers(‘fgeduHACluster’)” 2>/dev/null
# 复制域
echo “”
echo “4. 复制域:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-c “print AdminConfig.list(‘ReplicationDomain’)” 2>/dev/null
echo “”
echo “=== 检查完成 ===”
5.2 WebSphere高可用常见问题
WebSphere高可用常见问题及解决方案:
5.2.1 常见问题汇总
问题1:会话复制失败
原因:网络问题、防火墙、配置错误
解决:检查网络、开放端口、检查配置
问题2:故障切换慢
原因:检测时间长、会话复制慢
解决:优化检测时间、优化会话复制
问题3:会话丢失
原因:会话复制未启用、备份数不足
解决:启用会话复制、增加备份数
问题4:脑裂问题
原因:网络分区、心跳失败
解决:配置仲裁机制、监控网络
问题5:性能下降
原因:会话复制开销大
解决:优化复制策略、增加资源
5.3 WebSphere高可用最佳实践
基于多年WebSphere运维经验,总结高可用最佳实践:
5.3.1 高可用设计原则
- 消除单点故障:所有关键组件冗余部署
- 快速故障检测:配置合理的健康检查
- 自动故障切换:减少人工干预
- 数据一致性:启用会话复制
5.3.2 高可用运维建议
- 定期演练:验证高可用配置有效性
- 持续监控:监控集群和成员状态
- 及时告警:配置完善的告警机制
- 文档完善:记录配置和演练结果
本文档详细介绍了WebSphere ND 9.0.5的集群高可用配置与故障切换,包括高可用概述、高可用架构、故障切换机制、会话复制、故障切换测试等内容。通过学习本文档,读者可以掌握WebSphere高可用配置的方法和最佳实践。更多视频教程www.fgedu.net.cn
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
