m***h 发帖数: 77 | 1 我有这么一个production上的java app,一台server,每天早晨定点run一个job(
Spring-Quartz),大概20分钟的模样。现在要把它搬到replicated VM/cluster里去
,所以
面临的问题是怎样实现cluster里schedule job的问题:保证还在同样的时间总有1个也
只有1个job运行。我知道利用database write lock应该可以,但是这个系统本身并不
带数据库,所以不想为了这个目的再单独install 和maintain个数据库,也没有
zookeeper之类。所以面临的问题是需要一个简单可靠不折腾的办法。各位有什么建议
没有? |
g*****g 发帖数: 34805 | 2 没 zookeeper没数据库就写共享文件。本质是一样的。
【在 m***h 的大作中提到】 : 我有这么一个production上的java app,一台server,每天早晨定点run一个job( : Spring-Quartz),大概20分钟的模样。现在要把它搬到replicated VM/cluster里去 : ,所以 : 面临的问题是怎样实现cluster里schedule job的问题:保证还在同样的时间总有1个也 : 只有1个job运行。我知道利用database write lock应该可以,但是这个系统本身并不 : 带数据库,所以不想为了这个目的再单独install 和maintain个数据库,也没有 : zookeeper之类。所以面临的问题是需要一个简单可靠不折腾的办法。各位有什么建议 : 没有?
|
m***h 发帖数: 77 | 3 谢谢回答,不过没有NFS,也没有EBS,shared volume...
这个job是从ElasticSearch里读数据输出报告,只有ES是现成可“写”的。
BTW,我在试http://docs.hazelcast.org,以前没用过这个,不过看着挺neat,可以在app level组cluster,支持distributed map, cache, 包括lock。不过一个问题是cluster discovery (http://docs.hazelcast.org/docs/3.5/manual/html/hazelcastclusters.html):multicast经常在network这一层出问题production不是很实际,TCP/Unicast方式需要至少一个node的hostname或IP,这就牵扯更多了,service registry discovery越滚越大。 |
c*m 发帖数: 836 | 4 最简单可靠不折腾的方法,就是“指定一个”run,而不是“任意一个”run。 |
N*****m 发帖数: 42603 | 5 你不单独维护数据库,为啥要单独维护一个hazelcast server?
app level一样可以起个数据库
【在 m***h 的大作中提到】 : 谢谢回答,不过没有NFS,也没有EBS,shared volume... : 这个job是从ElasticSearch里读数据输出报告,只有ES是现成可“写”的。 : BTW,我在试http://docs.hazelcast.org,以前没用过这个,不过看着挺neat,可以在app level组cluster,支持distributed map, cache, 包括lock。不过一个问题是cluster discovery (http://docs.hazelcast.org/docs/3.5/manual/html/hazelcastclusters.html):multicast经常在network这一层出问题production不是很实际,TCP/Unicast方式需要至少一个node的hostname或IP,这就牵扯更多了,service registry discovery越滚越大。
|
m***h 发帖数: 77 | 6 我尝试用hazelcast主要是因问它可以embedded在app里,这样我所有的app 就自己组成
一个cluster,可以share数据什么的
import com.hazelcast.config.Config;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import java.util.concurrent.locks.Lock;
public class DistributedLock {
public static void main(String[] args) {
Config config = new Config();
HazelcastInstance h = Hazelcast.newHazelcastInstance(config);
Lock lock = h.getLock("my-distributed-lock");
lock.lock();
try {
//do something here
} finally {
lock.unlock();
}
}
}
【在 N*****m 的大作中提到】 : 你不单独维护数据库,为啥要单独维护一个hazelcast server? : app level一样可以起个数据库
|
N*****m 发帖数: 42603 | 7 数据库也可以啊,随便搞个H2,jdbc一连就可以了,比hazelcast还简单
hazelcast还没法persistent
【在 m***h 的大作中提到】 : 我尝试用hazelcast主要是因问它可以embedded在app里,这样我所有的app 就自己组成 : 一个cluster,可以share数据什么的 : import com.hazelcast.config.Config; : import com.hazelcast.core.Hazelcast; : import com.hazelcast.core.HazelcastInstance; : import java.util.concurrent.locks.Lock; : public class DistributedLock { : public static void main(String[] args) { : Config config = new Config(); : HazelcastInstance h = Hazelcast.newHazelcastInstance(config);
|
g*****g 发帖数: 34805 | 8 S3. Cheap and effective.
【在 m***h 的大作中提到】 : 谢谢回答,不过没有NFS,也没有EBS,shared volume... : 这个job是从ElasticSearch里读数据输出报告,只有ES是现成可“写”的。 : BTW,我在试http://docs.hazelcast.org,以前没用过这个,不过看着挺neat,可以在app level组cluster,支持distributed map, cache, 包括lock。不过一个问题是cluster discovery (http://docs.hazelcast.org/docs/3.5/manual/html/hazelcastclusters.html):multicast经常在network这一层出问题production不是很实际,TCP/Unicast方式需要至少一个node的hostname或IP,这就牵扯更多了,service registry discovery越滚越大。
|
g*****g 发帖数: 34805 | 9 结点当了就玩完了。
【在 c*m 的大作中提到】 : 最简单可靠不折腾的方法,就是“指定一个”run,而不是“任意一个”run。
|
c*m 发帖数: 836 | 10 他这个本来就一个instance在run, 可见也不是啥非常critical的东西。在现实工作里
,节点当了一般会马上trigger alert, 这个时候来个人重启一下就好了。我个人觉得
,这是最经济实惠又符合绝大多数工作环境的做法。
如果需要自动fail over,我觉得你前面说的S3是最简单的方法。如果因为种种原因不
允许跟外界通讯,那么次简单的方法就是在instance启动的时候start 一个listening
thread,跟其他instance 通讯。
【在 g*****g 的大作中提到】 : 结点当了就玩完了。
|
|
|
H****S 发帖数: 1359 | 11 Zookeeper + curator leader latch 是最不折腾但又可靠的方式了。
【在 m***h 的大作中提到】 : 我有这么一个production上的java app,一台server,每天早晨定点run一个job( : Spring-Quartz),大概20分钟的模样。现在要把它搬到replicated VM/cluster里去 : ,所以 : 面临的问题是怎样实现cluster里schedule job的问题:保证还在同样的时间总有1个也 : 只有1个job运行。我知道利用database write lock应该可以,但是这个系统本身并不 : 带数据库,所以不想为了这个目的再单独install 和maintain个数据库,也没有 : zookeeper之类。所以面临的问题是需要一个简单可靠不折腾的办法。各位有什么建议 : 没有?
|
m***h 发帖数: 77 | 12 谢谢各位的建议,汇报一下进展
1,in-app cluster/data grid, Hazelcast, infra不可行,因为整个系统正向
container方向转,infra team搞了一套东西,wrap了Kubernets 和 docker,但是有一
个limit-只能有一个port forwarding,系统已经用来expose 8080了,这样Hazelcast
nodes没办法通讯
2,H2类似的embedded小db,也是同样的问题,cluster 需要hostname和open port。
结论是要么用external db/s3/EBS/zookeeper,或者single container with
monitoring and restarting
3,这个single container就是CDM建议的方向,infra有现成的,但是这个小job和一些
Kafka的consumer绑在一起,不希望这些consumer局限于一个container,而剥离这两个
module也麻烦。
看来怎么都得折腾了。
4,Kafka伴随的zookeeper,归另一个team,爱搭不理的。
5,S3貌似在同一个region可以保证consistency,Netflix有个相关的open source http://techblog.netflix.com/2014/01/s3mper-consistency-in-cloud.html,可以做为选择
6,我们另外一个数据处理的部分有可能用Cassandra,这也是个candidate,DBA team关
系不错,头儿还是老中。上次用它还是0.6 version,估计变化很大了。 |
N*****m 发帖数: 42603 | 13 s3mper用dynamodb
那你还不如直接用dynamo得了
Hazelcast
【在 m***h 的大作中提到】 : 谢谢各位的建议,汇报一下进展 : 1,in-app cluster/data grid, Hazelcast, infra不可行,因为整个系统正向 : container方向转,infra team搞了一套东西,wrap了Kubernets 和 docker,但是有一 : 个limit-只能有一个port forwarding,系统已经用来expose 8080了,这样Hazelcast : nodes没办法通讯 : 2,H2类似的embedded小db,也是同样的问题,cluster 需要hostname和open port。 : 结论是要么用external db/s3/EBS/zookeeper,或者single container with : monitoring and restarting : 3,这个single container就是CDM建议的方向,infra有现成的,但是这个小job和一些 : Kafka的consumer绑在一起,不希望这些consumer局限于一个container,而剥离这两个
|
m***h 发帖数: 77 | 14 确实,其实S3,还有Dynamodb和Cassandra本来都不是为我这个要求设计的。
技术的选择经常更多基于技术之外的因素。如果另外一个project用C*的话,可能就搭
那趟车了。
关于Cassandra...java driver我记得早年用Vector很多,现在似乎推荐DataStax自己
的了?
【在 N*****m 的大作中提到】 : s3mper用dynamodb : 那你还不如直接用dynamo得了 : : Hazelcast
|
k**n 发帖数: 3989 | 15 一般需要一个queue.. cluster server workers 到queue 里取job 运行...
【在 m***h 的大作中提到】 : 我有这么一个production上的java app,一台server,每天早晨定点run一个job( : Spring-Quartz),大概20分钟的模样。现在要把它搬到replicated VM/cluster里去 : ,所以 : 面临的问题是怎样实现cluster里schedule job的问题:保证还在同样的时间总有1个也 : 只有1个job运行。我知道利用database write lock应该可以,但是这个系统本身并不 : 带数据库,所以不想为了这个目的再单独install 和maintain个数据库,也没有 : zookeeper之类。所以面临的问题是需要一个简单可靠不折腾的办法。各位有什么建议 : 没有?
|
b*******s 发帖数: 5216 | |