我们在专用服务器上托管了一个 django“Web 应用程序”(来自地狱)。经过一些基准测试后,我发现“应用程序”在数据库操作方面非常糟糕(目前无法进行重构)。它会产生大量的读写活动。现在,我们正在获得另一台(第二台)专用服务器,以提高性能和一些紧急冗余。两台机器都配备 24 核(Intel(R) Xeon(R) CPU E5645 @ 2.40GHz)和 48GB RAM(此外,还有 Raid 10、6x150gb 15k 硬盘)。
我想知道如何改进这个设置。
- 使用 KVM 进行虚拟化,为 nginx+uwsgi、memcached 和 postgresql 设置单独的虚拟机。最好设置多个 postgresql - 并使用 pg-pool 以充分利用它。
- 不管虚拟化是什么,在每台服务器上安装所有内容,然后使用此镜像设置在数据中心级别获得适当的负载平衡器。
- 再多买几台机器 - 更少的核心、更少的内存(通常比其他两个“主要”机器便宜)并在那里设置一些数据库集群?
- 如果是数据库集群路由 - 那么什么可以为写入和读取提供最佳性能?
(与此同时,我们正在以正确的方式重写该应用程序,但让当前的 - 糟糕的 - 运行得更快一点是至关重要的,我们需要它至少在接下来的 3 个月内承受不断增长的流量......)
您能否就加强设置提供一些建议?重点是为效率低得可笑的地狱应用程序准备数据库机器结构。
答案1
一些基本的操作系统级数据库性能技巧:
拥有的 RAM 多于你知道该如何使用的容量。
如果您可以将整个查询放入 RAM 中,或者至少将数据保存在数据库或 OS 缓存中,那么您的性能将得到大幅提高。把钱花在快速的磁盘和好的 RAID 控制器上。
如果可以获得,请使用 RAID 10,并在 RAID 控制器上使用电池备份,以便可以充分利用写入缓存。调整 Postgres 服务器的设置
(Khaled 的回答中有一个关于调整 Postgres wiki 页面的链接)利用只读从属服务器
如果您运行的是 Postgres 9.x,则可以拥有只读从属服务器。将一些读取密集型工作(如报告)卸载到从属服务器,这样当您尝试进行更新时,主数据库就不会忙于此。绝不 绝不 绝不绝不虚拟化生产数据库服务器
几乎从来没有——虚拟化数据库服务器会降低性能。
对于 DB 特定的提示,你可能需要查看dba.SE-- 通过适当的索引和查询设计可以实现巨大的性能提升。
答案2
我一直被告知——尽管我没有这方面的经验——为了获得最佳数据库速度,您应该在 RAID10 阵列上的裸机(而不是虚拟机)上运行数据库守护程序。据我所知,在这种情况下,RAID1 + LVM 算作 RAID10,并且会占用大量 RAM。虚拟机会占用您的可用 RAM。
另外,我不确定同一物理服务器上的虚拟机前面的良好负载平衡会产生什么作用(不过,也许我完全错了)。