我们目前正在 Linux 机器上运行 Java 集成应用程序。首先是应用程序的概述。
Java 应用程序是一个独立的应用程序(未部署在任何 Java EE 应用程序服务器上,如 OracleAS、WebLogic、JBOSS 等)。独立我的意思是它不是桌面应用程序。但是,它是从 Main 类的命令行运行的。用户根本不直接与此应用程序交互。使用 API 将消息转储到队列中,然后由我的应用程序读取,该应用程序 24/7 全天候运行。我不会将其定义为桌面应用程序,因为用户没有与其直接交互。(不确定这是否是符合条件的正确推理)。
它使用 Spring 并连接到 WebSphere MQ 和 Oracle 数据库我们使用 Spring 侦听器(Spring Message Driven POJOs)来侦听 WebSphere MQ 上的队列。一旦队列中有消息,应用程序就会从 MQ 读取消息并将其转储(插入/更新)到数据库中。
现在的问题是:
我认为我对一些概念感到困惑,这就是为什么我请你帮助我解决这个问题:
我们有一个大型网络应用程序,供许多用户(公司)使用,部署在用户场所。但现在我们正在转向SaaS,因此为了将应用程序设置为像这样,我们正在做一些调整。
为了处理我们的用户,我们像这样工作:每个用户都有一个数据库。当然,我们需要负载平衡,因为我们需要很多服务器,所以我提出了“分片”架构。我的想法是拥有彼此完全独立的网络服务器。因此,我们将所有用户数据分割到 10 台服务器中。因此,当用户登录时,实际上他将连接到服务器 4。为了保持可用性,实际上其中一台服务器将是一个由两到三台服务器组成的小型集群,其数据库在它们之间进行复制。我们在每个“集群”中使用内存缓存。我们甚至可以在这个级别进行负载平衡,我们只是认为我们不需要它,因为数据/用户已经分开了。
一些问题:
这是分片吗?请注意,每个集群服务于给定的用户组,并且集群之间没有关系。我们在每个集群中没有一个带有联合数据库的主数据库,但具有相同的数据库结构,只是它被分割在服务器之间。
当用户第一次到达(未经身份验证)时,如何重定向用户?这里不就是负载均衡应用的地方吗?但如果用户数据在服务器之间分割呢?我一直在想,这里我们有一个“公共/身份验证集群”,它将处理未经身份验证的用户,即网站的“公共”部分。并且根据一个非常简单的内存缓存数据库,它将用户重定向到其数据所在的相应集群。如果是这样 ..
我如何重定向它们?我认为唯一的方法是将他们发送到类似此处解释的地方。只是我不想要 server123.mysite.com。
我认为“公共/身份验证集群”设计得不好。因为我有 2-3 个服务器,仅用于向所有用户提供主站点(在身份验证之前),而在后面,我有 5-6 个集群,其中一些可能正在休眠。或者相反:我有一个负载很重的集群,而公共集群正在休眠,因为它的唯一任务是显示主页并处理重定向到登录过程。
如果这一切都有效的话
感谢您的帮助。
我们有一个多容器应用程序,它使用微服务架构,在 Docker Compose 中运行。
例如,当我对 Web 应用程序进行代码更改时,我需要使用新代码重建图像,然后在我的撰写堆栈中再次运行它,而无需任何停机时间。
这是我们正在使用的当前事件序列:
docker-compose down docker-compose up运行后docker-compose down,所有应用程序都关闭。然后docker-compose up将整个堆栈带回来。
有没有一种方法可以在 Docker Compose 中重新部署单个镜像而不会出现任何停机时间和整个应用程序堆栈?
我有两个在 Linux 上运行的 SQL Server 2019 实例。这两个实例都包含一个使用 AlwaysOn 可用性组同步的数据库。数据库中的数据是同步的,但问题是SQL代理作业不是数据库本身的一部分。
因此,当我在主副本上创建 SQL Server 代理作业时,此配置不会复制到辅助副本。因此,在创建每个工作之后,我总是必须去中学并在那里创建工作。我必须时刻记录我所做的所有改变。
使用可用性组时,是否有内置方法可以在 Linux 上自动执行 SQL Server 作业的跨副本同步?AG 副本之间的作业同步似乎应该已经由 SQL Server/SQL Server Agent 工具原生支持,但我没有从 Microsoft 找到任何内容,只有一个名为DBA Tools的第三方工具,我可以用它来编写自己的自动化脚本在 PowerShell 中。
sql-server high-availability sql-agent sql-agent-job availability-group
这是一个场景:一个查询memcached缓存的简单网站.每10-15分钟由批处理作业更新相同的缓存.有了这种模式,有什么可能出错(例如缓存未命中)?
我担心可能发生的所有可能的比赛情况.例如,如果网站对memcached中缓存的对象执行GET操作,而批处理作业覆盖了同一对象,那么会发生什么?
我试图弄清楚通过wcf使用rabbitmq集群的最佳解决方案是什么.
目前的设置:
Web角色将消息发布到rabbit1节点,worker也监听rabbit1节点.如果rabbit1节点失败,系统(web和worker)都应该切换到rabbit2.这就是问题,如何以更优雅的方式实现它,而不是处理应用程序代码中的连接失败.
首先,我现在看到的唯一方法是使用wcf4路由备份端点功能.这种方式只解决了客户端(Web角色)的问题,但没有解决wcf服务端(worker角色)的问题.
是否存在分布式高可用性,最终是一致的db,它支持标量值的幂等操作?
如果我们使用正常更新,那么我们可能会在不同节点上有2个不同的值,并且没有一个值是正确的,因为我们需要通过两个事务值来增加金额.
是否有分布式数据库,我可以发送命令增加(键,属性[列],差异),以便当我收到响应时,我可以确定该操作将在其他副本上执行,无论帐户的当前值如何?通过这种方式,即使两个不同的节点增加了不同的值,我也将具有增加操作的最终一致性,因为该增加将传播到其他副本.
我不是在讨论条件更新,因为它不适用于cassandra这样的高可用性db(这就是为什么它们没有这个功能),我对原子增加操作感兴趣.
谢谢.
PS在幂等增加的情况下,我会有一个命令增加(key,attribute,diff,lock_key),这样如果db已经收到相同的lock_key相同的命令,db就不会增加
TL;博士:
有没有办法在分布式AP类数据库中制作精确的计数器?2个问题:1)如果我发送操作来增加一个计数器并且我没有得到响应,我会再次发送该请求,但不想两次增加计数器.2)如果该计数器在另一个副本上同时更新,我希望最终合并这个增加,而不是覆盖这些值.那么是否有像增加("John的余额",+ 5.67,"sdfsdfas")这样的命令,其中sdfsdfas是用于丢弃重复更新的字符串.是否有一个db复制这种命令?
database high-availability eventual-consistency cassandra nosql
我使用HA namenode配置Hadoop 2.2.0稳定版本,但我不知道如何配置对群集的远程访问.
我有HA namenode配置了手动故障转移和我定义dfs.nameservices,我可以从群集中包含的所有节点访问具有nameservice的hdfs,但不能从外部访问.
我可以通过直接联系活动的namenode来对hdfs执行操作,但我不想这样,我想联系群集然后被重定向到活动的namenode.我认为这是HA群集的正常配置.
现在有人怎么做?
(提前致谢...)
是否有积极开发的分布式,高可用性文件系统(适用于Linux)?
让我更具体一点:
分布式意味着它可以优雅地处理客户端到服务器的延迟,就像您在全球公共互联网上找到的那样(300毫秒及以上),偶尔也会出现连接错误.这意味着需要非常好的客户端缓存(即使用回调).NFS不会这样做.它还意味着无需IPSEC VPN即可加密线上数据.
高可用性意味着数据可以存储在多个服务器上,而客户端足够智能,可以在遇到问题时尝试其他服务器.将这些智能放在客户端非常重要,这就是为什么这种东西不能只被移植到NFS上的原因.对于只读数据,至少需要这样.这对于读写数据会很好,但我知道这很难.
文件系统意味着导出POSIX接口的内核驱动程序,并且在不可信任的客户端面前强制执行权限和访问控制.SAN系统通常假设客户端值得信赖.
我是OpenAFS的难民.我喜欢它,但此时我不能再接受它要求所有文件服务器在所有其他文件服务器上有效"拥有"的要求.必须运行Kerberos基础结构(我不需要)的专有磁盘格式和开销也变得越来越成问题.
除了具有这些属性的OpenAFS之外,还有其他系统吗?Intermezzo和Coda可能有资格但不再是活跃的项目.Lustre很酷,但似乎是专为超低延迟数据中心而设计的.Ceph很棒但不是真正的文件系统,更多的是在文件系统下运行的东西(是的,有CephFS,但它确实是Ceph的展示,并且显然没有生产就绪,并且没有时间表).Tahoe-LAFS很酷但它和GoogleFS并不是真正的文件系统,因为它们不通过内核模块导出POSIX接口.我对GFS(全局文件系统)的理解是客户端可以直接操作磁盘上的数据结构,因此它们是隐含的根级信任(这也是它快速的部分原因) - 如果我错了,请纠正我这里.
需要开源,因为我无法承担将我的数据锁定在专有的东西.我不介意为软件付费,但在这种情况下我不能被扣为人质.
谢谢,
我有一个应用程序,目前有以下设置:
设置看起来像这样:

该工作制片查询对于需要被添加到其经常需要被添加到工作队列每N分钟的工作列表新项目的数据库.这个作业生成器是我整个架构中唯一的节点,如果失败,将导致整个过程失败.我可以让数据库服务器,队列服务器或多个工作服务器发生故障,并且该过程将继续运行.
如何修改作业生成器以使其不是单点故障?我不知道如何分发它所做的工作,即每隔N分钟查询一次数据库,并将要处理的新作业排入队列.这是一项独特的任务.
我考虑过有多个生产者,每个生产者都会使用模数来处理1/P工作,其中P是生产者的数量.
就像是:
itemsToBeProcess = db.FetchItems()
for (item in itemsToBeProcessed) {
if item.id % producerNumber == 0) // Queue job
}
Run Code Online (Sandbox Code Playgroud)
这会将生产者的工作分成多个服务器.然而,这仍然不是理想的,因为如果单个生产者下降超过1/P值的工作将停止处理.所以,它仍然是部分失败.
任何人都可以提供任何关于我如何使这个工作生产者不是我的应用程序中的单点故障的指导?
architecture ×1
cassandra ×1
concurrency ×1
database ×1
docker ×1
failover ×1
filesystems ×1
hadoop ×1
java ×1
memcached ×1
nameservice ×1
nfs ×1
nosql ×1
openafs ×1
rabbitmq ×1
scalability ×1
sharding ×1
spring ×1
sql-agent ×1
sql-server ×1
wcf ×1