Network-Attached Memory(HAM)terracotta笔记(二)

HAM集群实践
本文介绍了如何使用Network-Attached Memory (HAM) Terracotta搭建一个简单的集群环境。通过配置Tomcat实例和Terracotta服务器,实现了跨Tomcat实例的数据共享。文章还详细记录了遇到的问题及解决方法。
Network-Attached Memory(HAM)terracotta笔记(二)

spring bean webapplication demo

1.starting the Terracotta Server
to start the server:
$TC_HOME/bin/start-tc-server.sh

to stop the server:
$TC_HOME/bin/stop-tc-server.sh

in my computer use:
/usr/local/terracotta-2.6.4/bin/start-tc-server.sh &
/usr/local/terracotta-2.6.4/bin/stop-tc-server.sh


2.config the web application to run under tomcat

my local windows server 放了一个bat启动文件到tomcat的bin路径下,文件start-tomcat1.bat
@echo off

setlocal
cd %~d0%~p0
set TC_INSTALL_DIR=..\..\..
set TC_INSTALL_DIR="%TC_INSTALL_DIR:"=%"

set CATALINA_HOME=%TC_INSTALL_DIR%\vendors\tomcat5.5

if not defined JAVA_HOME set JAVA_HOME="%TC_INSTALL_DIR%\jre"
set JAVA_HOME="%JAVA_HOME:"=%"

set TC_CONFIG_PATH=tc-config.xml
call %TC_INSTALL_DIR%\bin\dso-env.bat -q "%TC_CONFIG%"
set OPTS=%TC_JAVA_OPTS% -Dcom.sun.management.jmxremote
set OPTS=%OPTS% -Dcom.sun.management.jmxremote.port=8091
set OPTS=%OPTS% -Dcom.sun.management.jmxremote.authenticate=false
set OPTS=%OPTS% -Dcom.sun.management.jmxremote.ssl=false
set JAVA_OPTS=%OPTS% %JAVA_OPTS%
set CATALINA_BASE=tomcat1

set JAVA_HOME=%JAVA_HOME:"=%
start "terracotta for easySearch sample: 8081" %CATALINA_HOME%\bin\catalina.bat run
endlocal

另外有个类似的start-tomcat2.bat
@echo off

setlocal
cd %~d0%~p0
set TC_INSTALL_DIR=..\..\..
set TC_INSTALL_DIR="%TC_INSTALL_DIR:"=%"

set CATALINA_HOME=%TC_INSTALL_DIR%\vendors\tomcat5.5

if not defined JAVA_HOME set JAVA_HOME="%TC_INSTALL_DIR%\jre"
set JAVA_HOME="%JAVA_HOME:"=%"

set TC_CONFIG_PATH=tc-config.xml
call %TC_INSTALL_DIR%\bin\dso-env.bat -q "%TC_CONFIG%"
set OPTS=%TC_JAVA_OPTS% -Dcom.sun.management.jmxremote
set OPTS=%OPTS% -Dcom.sun.management.jmxremote.port=8092
set OPTS=%OPTS% -Dcom.sun.management.jmxremote.authenticate=false
set OPTS=%OPTS% -Dcom.sun.management.jmxremote.ssl=false
set JAVA_OPTS=%OPTS% %JAVA_OPTS%
set CATALINA_BASE=tomcat2

set JAVA_HOME=%JAVA_HOME:"=%
start "terracotta for easySearch sample: 8082" %CATALINA_HOME%\bin\catalina.bat run
endlocal

在terracotta的安装文件夹下面D:\tool\Terracotta\terracotta-2.6.4\samples\easy\search
放置上面的两个文件,
同时新建文件夹tomcat1和tomcat2,两个文件夹的内容,参考terracotta的其他例子
另外将里面的配置文件做一个修改,指向自己的easySearch.war
D:\tool\Terracotta\terracotta-2.6.4\samples\easy\search\tomcat1\conf\Catalina\localhost
的easySearch.xml文件:
<Context path="/easySearch" docBase="D:/tool/Terracotta/terracotta-2.6.4/samples/easy/search/webapps/easySearch.war"
debug="0" privileged="true">
</Context>

拷贝tc-config.xml文件到该目录
<?xml version="1.0" encoding="UTF-8"?>
<!--
All content copyright (c) 2003-2008 Terracotta, Inc.,
except as may otherwise be noted in a separate copyright notice.
All rights reserved.
-->
<tc:tc-config xmlns:tc="http://www.terracotta.org/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.terracotta.org/schema/terracotta-4.xsd">

<servers>
<server name="www.sillycat.com" host="www.sillycat.com">
<dso-port>9510</dso-port>
<jmx-port>9520</jmx-port>
<data>terracotta/server-data</data>
<logs>terracotta/server-logs</logs>
</server>
<update-check>
<enabled>true</enabled>
</update-check>
</servers>

<clients>
<logs>terracotta/client-logs/easy/easySearch/%D</logs>
<statistics>terracotta/client-statistics/easy/easySearch/%D</statistics>
</clients>

<application>
<spring>

<jee-application name="easySearch">

<application-contexts>
<application-context>

<paths>
<path>*/applicationContext.xml</path>
</paths>

<beans>
<bean name="clusterManager">
<!--
<non-distributed-field>analyzer</non-distributed-field>
<non-distributed-field>indexPath</non-distributed-field>
-->
</bean>
</beans>

</application-context>
</application-contexts>


<instrumented-classes>
<!--
<include>
<class-expression>org.apache.lucene.store.RAMDirectory</class-expression>
</include>
<include>
<class-expression>org.apache.lucene.store.Directory</class-expression>
</include>
<include>
<class-expression>org.apache.lucene.store.RAMFile</class-expression>
</include>
-->

</instrumented-classes>

<!--
<locks>
</locks>
-->

<transient-fields>
<field-name>com.sillycat.api.commons.base.BaseManager.logger</field-name>
</transient-fields>

</jee-application>
</spring>

</application>
</tc:tc-config>

其中
<server name="www.sillycat.com" host="www.sillycat.com">
<dso-port>9510</dso-port>
<jmx-port>9520</jmx-port>
<data>terracotta/server-data</data>
<logs>terracotta/server-logs</logs>
</server>
是指向了自己ubuntu下的服务,www.sillycat.com是在HOSTS中修改的映射向自己的UBUNTU的IP

配置文件中对applicationContext.xml的clusterManager类进行JVM cluster
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-lazy-init="false">
<bean id="clusterManager" class="com.sillycat.manager.impl.ClusterManagerImpl"/>
</beans>

ClusterManagerImpl类如下:
package com.sillycat.manager.impl;

import com.sillycat.api.commons.base.BaseManager;
import com.sillycat.manager.ClusterManager;

public class ClusterManagerImpl extends BaseManager implements ClusterManager {

private final Object lock = new Object();

private int count = 0;

public int getCount() {
return count;
}

public void addCount() {
synchronized (lock) {
count++;
}
}
}

简单示例了一个count,不论TOMCAT1还是TOMCAT2的addCount被触发,都会增加count

3.trouble shooting

find error here:
2008-10-07 17:35:06,000 [main] ERROR com.tc.object.bytecode.Manager - Exception thrown
com.tc.exception.TCNonPortableObjectError:
*******************************************************************************
Attempt to share an instance of a non-portable class referenced by a portable class. This
unshareable class has not been included for sharing in the configuration.

For more information on this issue, please visit our Troubleshooting Guide at:
http://terracotta.org/kit/troubleshooting

Referring class : org.apache.log4j.spi.RootLogger
Referring field : org.apache.log4j.Category.level
Thread : main
JVM ID : VM(5)
Non-included classes: org.apache.log4j.Level, org.apache.log4j.Priority

Action to take:

1) Reconfigure to include the unshareable classes
* edit your tc-config.xml file
* locate the <dso> element
* add this snippet inside the <dso> element

<instrumented-classes>
<include>
<class-expression>org.apache.log4j.Level</class-expression>
</include>
<include>
<class-expression>org.apache.log4j.Priority</class-expression>
</include>
</instrumented-classes>

* if there is already an <instrumented-classes> element present, simply add
the new includes inside it

这个问题是因为在manager的基类里面我定义了一句
public Log logger = LogFactory.getLog(getClass());
这个logger其实是不需要做cluster的,所以修改了tc-config.xml配置文件,增加了
<transient-fields>
<field-name>com.sillycat.api.commons.base.BaseManager.logger</field-name>
</transient-fields>
修复了这个问题

get another error message:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.tc.object.tx.UnlockedSharedObjectException:
*******************************************************************************
Attempt to access a shared object outside the scope of a shared lock.
All access to shared objects must be within the scope of one or more shared locks defined in your Terracotta configuration.
Please alter the locks section of your Terracotta configuration so that this access is auto-locked or protected by a named lock.

For more information on this issue, please visit our Troubleshooting Guide at:
http://terracotta.org/kit/troubleshooting


Caused by Thread: http-8081-Processor4 in VM(2)
Shared Object Type: com.sillycat.manager.impl.ClusterManagerImpl
*******************************************************************************

org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:408)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:360)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:78)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)

大致是没有加锁,所以在ClusterManagerImpl.java里面增加了
synchronized (lock) {}
这里还要仔细看看文档,不是很清楚。不过这个例子可以跑了。启动了TOMCAT1和TOMCAT2,不论在那个TOMCAT下调用了addCount方法,所有的TOMCAT的
getCount得到的都是增加了的值
<think>嗯,用户要求详细了解OSPFv3中的Network-LSA,并提供了多个引用资料。从对话历史看,我之前详细解释过OSPFv2的类LSA,现在用户显然是想了解IPv6环境下的变化。用户提供的引用[3]和[5]特别关键,它们指出OSPFv3实现了网络与拓扑的分离。这意味着在OSPFv3中,Network-LSA(类LSA)发生了本质变化:它不再携带IP地址信息,仅描述拓扑连接关系。这个设计变革很深刻,我需要重点强调。引用[1][2]补充说明了新增的LSA9(Intra-Area-Prefix-LSA)的作用——它专门负责携带原属于Network-LSA的IPv6前缀信息。这种职责分离是OSPFv3的核心改进,必须通过对比表格才能清晰展示。用户可能正在学习OSPFv3迁移或troubleshootingIPv6网络,因此需要明确三点:1)OSPFv3中类LSA的报文结构变化2)与LSA9的协作关系3)实际网络中的泛洪示例。考虑到用户之前关注过DR选举问题,还应补充DR失效对新架构的影响。技术细节上要特别注意:引用[4]提到OSPFv3的Network-LSA仍由DR生成,但Link-ID变为DR的接口ID而非IPv4地址。这个细微差别会影响网络调试时的查看方式,需要体现在报文结构解析部分。最后用Mermaid图展示新架构的数据流向会很有帮助,可以直观呈现Network-LSA与LSA9如何协同描述同一个多路访问网络。用户提供的引用[5]关于链路本地地址的内容虽重要,但与本问题关联较弱,只需在注意事项中简单提及即可。</think>以下是OSPFv3中Network-LSA(类LSA)的详细说明及作用解析,结合OSPFv3架构重构的核心特性: --- ### 一、Network-LSA的本质变化 在OSPFv3中,**Network-LSA(Type 2 LSA)** 仍由DR生成,但其职责发生重大变革: **移除所有IPv6地址信息**,仅保留**拓扑连接关系**,实现网络与拓扑的分离[^2][^3][^5]。 ```mermaid graph LR A[OSPFv2 Network-LSA] -->|携带| B[网络掩码+IP+路由器列表] C[OSPFv3 Network-LSA] -->|仅携带| D[拓扑连接关系] ``` --- ### 、核心数据结构 ```plaintext OSPFv3 Network-LSA报文结构: +---------------------+---------------------------+ | 字段 | 作用 | +---------------------+---------------------------+ | Link State ID | DR在该链路上的接口ID | | Advertising Router | DR的Router ID | | Attached Routers | 所有连接路由器的Router ID | +---------------------+---------------------------+ ``` **关键变化**: 1. **不再包含**网络掩码或IPv6前缀 2. **不再包含**网络IP地址 3. 用**接口ID**替代IPv4地址标识链路[^5] --- ### 三、与新增LSA的协作机制 OSPFv3通过**LSA9(Intra-Area-Prefix-LSA)** 补全网络信息: | LSA类型 | 产生者 | 携带信息 | 依赖关系 | |---------|--------------|-------------------------|------------------------| | **Type 2** | DR | 拓扑连接关系(路由器列表) | 为LSA9提供拓扑锚点 | | **Type 9** | 路由器/DR | IPv6前缀和前缀长度 | 引用Type 1或Type 2 LSA[^3] | **协作流程**: 1. DR生成**Network-LSA**声明:`链路X上有路由器{A,B,C}` 2. DR生成**Intra-Area-Prefix-LSA**声明:`链路X的IPv6前缀为2001:db8::/64` 3. 路由器通过**Router-LSA**声明:`本机连接到链路X`[^1][^3] --- ### 四、核心作用详解 1. **拓扑描述基础** - 在SPF计算中构建**伪节点(Transit Network)** - 标识多路访问网络中所有与DR邻接的路由器 ```mermaid graph TD DR(DR: R1) -->|Network-LSA| R2 DR -->|Attached Router| R3 DR -->|Attached Router| R4 ``` 2. **网络信息分离的桥梁** - 为Intra-Area-Prefix-LSA提供**关联锚点** - 通过`Referenced LS Type`字段绑定Type 2 LSA[^3] 3. **优化泛洪效率** - 泛洪范围仍限制在**单个区域**内 - 仅需传递拓扑变更,前缀变更由LSA9独立处理 --- ### 五、与OSPFv2的关键对比 | 特性 | OSPFv2 Network-LSA | OSPFv3 Network-LSA | |--------------|-----------------------------|-----------------------------| | **地址携带** | 包含IPv4地址+掩码 | **不携带任何IP信息** | | **标识方式** | 使用网络IP地址 | 使用DR的**接口ID** | | **网络信息** | 自包含完整网络描述 | 需配合LSA9才能描述网络 | | **设计目标** | 拓扑与网络耦合 | 实现**拓扑与地址分离**[^5] | > **示例场景**: > 在IPv6广播网络中,DR生成: > - **Network-LSA**:`Link State ID=0x2 (DR接口ID), Attached Routers=[R1,R2,R3]` > - **Intra-Area-Prefix-LSA**:`Prefix=2001:db8:0:1::/64, Referenced LS Type=2`[^3][^4] --- ### 六、特殊注意事项 1. **DR故障处理** - 新DR选举后立即生成**新Network-LSA**(携带新接口ID) -Network-LSA因**LS Age超时**自动清除 2. **前缀更新机制** - 网络前缀变更时**无需更新Network-LSA** - 仅需由DR更新关联的**Intra-Area-Prefix-LSA**[^3] 3. **调试关注点** ```bash # 查看OSPFv3 Network-LSA show ospfv3 database network detail ``` - 验证字段:`Attached Router`列表是否完整 - 关联检查:对应`Intra-Area-Prefix-LSA`是否存在[^4] > **设计价值**:OSPFv3的Network-LSA通过职责精简,显著提升网络扩展性和前缀更新效率,适应IPv6海量地址需求[^2][^5]。 --- ### 相关问题 1. OSPFv3中Intra-Area-Prefix-LSA如何关联到Network-LSA? 2. 为什么OSPFv3要将网络前缀信息从Network-LSA中剥离? 3. 当DR变更时,OSPFv3如何保证前缀信息的连续性? 4. 在OSPFv3 SPF计算中,Network-LSA起到什么具体作用? [^1]: OSPFv3中LSA8/LSA9详解 [^2]: OSPFv3 Network-LSA变化分析 [^3]: OSPFv3协议LSA类型解析 [^4]: OSPFv3 LSA类型及泛洪机制 [^5]: OSPFv3核心特性与IPv6适配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值