Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 自动保存服务器体系结构_Php_Mysql_Node.js_Redis_Server - Fatal编程技术网

Php 自动保存服务器体系结构

Php 自动保存服务器体系结构,php,mysql,node.js,redis,server,Php,Mysql,Node.js,Redis,Server,我想在服务器上保存一个长表单的输入。但我不认为对每个自动保存操作调用db是最好的方法 解决这个问题的好方法是什么 另一个问题是我有3个应用服务器。所以内存缓存不起作用 我在考虑将数据保存在redis中,并在每次调用时更新数据,最后更新数据库。但既然我有3台服务器,我该如何确保电话在队列中 有人能帮忙设计这个架构吗 但我不认为对每个自动保存操作调用db是最好的方法 这才是真正的问题,让我们从这个开始。你为什么这么想? 你想要自动保存,对吗?这是保存用户工作的唯一方法 您列出的所有其他选项(memc

我想在服务器上保存一个长表单的输入。但我不认为对每个自动保存操作调用db是最好的方法

解决这个问题的好方法是什么

另一个问题是我有3个应用服务器。所以内存缓存不起作用

我在考虑将数据保存在redis中,并在每次调用时更新数据,最后更新数据库。但既然我有3台服务器,我该如何确保电话在队列中

有人能帮忙设计这个架构吗

但我不认为对每个自动保存操作调用db是最好的方法

这才是真正的问题,让我们从这个开始。你为什么这么想? 你想要自动保存,对吗?这是保存用户工作的唯一方法

您列出的所有其他选项(memcached/redis、进程内缓存)——它们不仅不能保存用户的工作,而且是定时炸弹。想想所有可能失败的事情:redis死掉,网络分裂,整个数据中心被闪电击中


既然你可以。。。拯救您可能会发现它并没有那么慢(如果这是您关心的问题)。

此解决方案成功地应用于整个行业。 配置负责数据复制的3节点redis群集。 写入只发生在主节点上

redis(主)-应用服务器1, redis(slave1)-应用服务器2, redis(slave2)-应用服务器3

使用slaveof:port命令直接添加从机。 复制是通过线路完成的(不是临时磁盘存储)
Link-

这是扩展架构时面临的一个非常经典的问题,但让我们稍后再讨论扩展,因为基本上您的初始应用程序需要多次调用数据库级别,让我们先对其进行优化

由于您没有给出iops的任何详细信息,我将在下面描述解决iops的方法,按照负载的递增顺序,所有方法都具有级联性质,即最后一种方法实际上构建在所有以前的解决方案之上:

直接数据库方法{db调用每个自动保存操作}:

客户端->应用层->数据库(直接在此处保存数据)

基本上,在任何数据更新上,我们都直接将其传播到数据库级别。此模式中的主要块是数据库 在这种方法中需要注意的事项:

  • 对于最常用的关系数据库,如Mysql:

    • insert查询比update查询花费的时间更少,对于学院项目,您可以根据相同的主键不断更新行,这样会很好地工作
    • 但是在任何中型应用程序中,如果一个表单修改需要30-40个请求,那么更新查询将阻塞您的数据库资源

    • 因此,保持一种补遗式的模式,比如可能保持一个类似于副键的状态,跟踪用户填写表单的级别,但每次更新都要插入数据。并始终按照插入的最新状态读取

    • 为了进一步优化,应使用外键约束等索引

    当这一步失败时,下一步是数据库本身,下一步要优化的是,您正在处理的数据类型,您可以为非事务性数据选择一个无模式的数据库,如mongo、dynamodb等

  • 使用无模式数据库对于大量非事务性数据非常有用,因为它们固有地允许对同一行数据采用补遗方法

    • 对于其他优化,请使用辅助索引更快地查询数据
涉及应用层方法{应用层缓存}:

客户端->应用层(在此处保存一些数据,然后稍后传播)->数据库(最后保存在此处)

  • 当简单数据库无法根据需要提供服务和扩展时,最简单的方法是将一些负载转移到API服务器上。由于水平缩放的相同是更容易和更便宜
  • 这正是您对内存缓存方法的理解,尽管您不需要设计自己的内存缓存方法,但它需要多年的时间来理解大规模web基础设施,然后人们也无法在应用程序层上设计高效的缓存
  • 使用类似的东西,我将其用于一个web应用程序,它有10个ec2 nodejs实例,每个会话存储大约15mb的用户数据。它可以很好地扩展,在所有服务器上维护唯一的用户会话数据,所以每次自动更新时,都会将数据保存到用户会话中,并从会话提交写入数据库。可以通过添加更多api服务器轻松扩展,这是使用它在redis上保存数据的最佳用例{为什么要重新发明轮子?}
重新发明轮子:定制级应用层缓存+db缓存+db优化

客户端->应用层(在这里保存一些数据)->{添加数据库缓存}->数据库(最后在这里保存数据)

  • 这就是我们使用redis/Dynamodb/mongo作为主数据库缓存来设计我们自己的东西的地方。(请注意,如果首先使用非事务性数据库,请使用附录方法——这更适合通过添加非事务性数据库的包装来扩展事务性数据库)

  • 此外,express session的工作方式与此相同,实际上是在应用层缓存redis上的数据,始终尽量减少对db的调用次数

  • 因此,如果您有一个功能齐全的应用程序层缓存和一个优化的数据库,那么就采用这种方法,因为它需要有经验的开发人员,而且资源密集,通常用于非常大规模的应用程序,比如我在express session之后为一个avgd iops为每秒300k reqs的应用程序提供了一层redis缓存

  • a