# Skype 计划 PostgreSQL 扩展到 10 亿用户 > 原文: [http://highscalability.com/blog/2008/4/5/skype-plans-for-postgresql-to-scale-to-1-billion-users.html](http://highscalability.com/blog/2008/4/5/skype-plans-for-postgresql-to-scale-to-1-billion-users.html) Skype [使用 PostgreSQL 作为后端数据库](https://developer.skype.com/SkypeGarage/DbProjects/SkypePostgresqlWhitepaper)。 PostgreSQL 在数据库世界中没有得到足够的运行,因此我很高兴地看到 PostgreSQL 如何被用作“满足[Skype]大部分业务需求的主要数据库”。 他们的方法是使用传统的存储过程接口来访问数据,并在该层代理服务器之上,该代理服务器将 SQL 请求散列到一组实际执行查询的数据库服务器上。 结果是他们认为水平扩展的系统可以扩展到可处理 10 亿用户。 * Skype 的目标是一种可以处理 10 亿以上用户的体系结构。 使用一台真正的大型计算机实际上无法解决此级别的缩放问题,因此我们的蒙版超级英雄水平缩放可以解决。* 硬件是带有 SCSI RAID 的双或四皓龙。* 遵循常见的数据库进度:从一个 DB 开始。 添加按功能划分的新数据库。 复制以只读为主的数据,以实现更好的读取访问。 然后跨多个节点水平分区数据。* 无论如何,在此博客的第一篇文章中,Skype 使用传统的数据库体系结构,其中所有数据库访问都封装在存储过程中。 这使他们可以在不影响前端服务器的情况下进行后台性能调整。 而且它很适合使用 PL / Proxy 进行分区的策略。* [PL /代理](https://developer.skype.com/SkypeGarage/DbProjects/PlProxy)用于通过创建水平分区的集群来扩展其系统的 [OLTP](http://en.wikipedia.org/wiki/OLTP) 部分: -数据库查询由代理跨 一组数据库服务器。 代理根据字段值(通常是主键)创建分区。 -例如,您可以根据用户名通过散列在整个群集中对用户进行分区。 根据哈希将每个用户放入一个碎片中。 -远程数据库调用使用一种称为 plproxy 的新 PostgreSQL 数据库语言执行。 来自[的示例 Kristo Kaiv 的博客](http://kaiv.wordpress.com/category/plproxy/): ``` First, code to insert a user in a database: CREATE OR REPLACE FUNCTION insert_user(i_username text) RETURNS text AS $$ BEGIN PERFORM 1 FROM users WHERE username = i_username; IF NOT FOUND THEN INSERT INTO users (username) VALUES (i_username); RETURN 'user created'; ELSE RETURN 'user already exists'; END IF; END; $$ LANGUAGE plpgsql SECURITY DEFINER; Heres the proxy code to distribute the user insert to the correct partition: queries=# CREATE OR REPLACE FUNCTION insert_user(i_username text) RETURNS TEXT AS $$ CLUSTER 'queries'; RUN ON hashtext(i_username); $$ LANGUAGE plproxy; Your SQL query looks normal: SELECT insert_user("username"); ``` -查询的结果与在远程数据库上执行的查询完全相同。 -当前,他们可以将 Dual Opteron 服务器上的 1000-2000 请求/秒路由到 16 个分区集群。* 他们喜欢 OLTP 的 PL /代理方法,因为: -PL /代理服务器形成可伸缩且统一的“ DB 总线”。 代理服务器很健壮,因为在冗余配置中,如果一个服务器出现故障,您可以直接连接到另一个服务器。 而且,如果代理层变慢,则可以添加更多代理并在它们之间进行负载平衡。 -可以添加更多分区以提高性能。 -故障转移期间,只有故障分区上的数据不可用。 所有其他分区均正常运行。* [PgBouncer](https://developer.skype.com/SkypeGarage/DbProjects/PgBouncer) 用作 PostgreSQL 的连接池。 PL /代理“在打开每个后端进程与每个分区的连接时会浪费一些连接”,因此池管理器有助于减少连接数量。* 使用 [WAL(预写日志)传送](http://www.postgresql.org/docs/8.1/static/wal-intro.html)创建热备用服务器。 这些服务器似乎不能用于只读操作。* 更复杂的组织通常使用 OLTP 数据库系统来处理高性能事务需求,然后创建单独的系统来满足更多非事务性需求。 例如, [OLAP(在线分析处理)](http://en.wikipedia.org/wiki/Online_analytical_processing)系统通常用于处理复杂的分析和报告问题。 这些在模式,索引等方面与 OLTP 系统不同。 Skype 还将单独的系统用于 Web 应用程序的表示层,发送电子邮件和定价发票。 这要求将数据从 OLTP 移至其他系统。 -最初 [Slony1](http://slony.info/) 用于将数据移至其他系统,但是“随着复杂性和负载的增加,Slony1 开始给我们带来越来越大的痛苦。” -为解决此问题,Skype 开发了他们的轻量级排队和复制工具包,称为 [SkyTools](https://developer.skype.com/SkypeGarage/DbProjects/SkyTools) 。 代理方法很有趣,并且是我们之前从未见过的架构。 它的力量来自使问题解决间接化的另一个层次,它具有以下优点:* 应用程序独立于数据库服务器的结构。 封装在代理服务器中。* 应用程序无需响应分区,映射或其他更改而进行更改。* 负载平衡,故障转移和读/写拆分对于应用程序是不可见的。 的缺点是:* 性能降低。 添加了另一跳,必须解析查询才能执行所有透明的魔术。* 无法跨分区执行联接和其他数据库操作。* 增加了处理代理服务器的代理配置和 HA 的管理复杂性。 容易看出优势大于弊端。 在不更改应用程序的情况下,您可以滑入代理层,并以低价获得很多非常酷的功能。 如果您是 MySQL 用户,并且对这种方法感兴趣,那么请查看 [MySQL 代理](海洋植物 [http://underwaterseaplants.awardspace.com/seagrapes.htm”](海葡萄... [http:// underwaterseaplants。 awardspace.com/plantroots.htm“](植物根 上面关于万亿用户的评论很有趣,因为目前世界上只有 67 亿人,而问题不是 Skype 是否可以支持一万亿用户,而是我们的星球是否可以支持一万亿人:D 好文章 我们现在有 2 个 PgBouncer,12 个节点和 12 个 WAL 备份服务器,并且一切正常。 服务器是 1u 双胞胎,双四核 Intel xeon,具有 32GB 内存和 2 x sas,每个双胞胎上的硬件 raid1。 --- [http://www.unixvps.com](http://www.unixvps.com) 我想知道为什么您选择 PostgreSQL 而不是 MySQL? 如果您需要任何事务性的东西(而不是 MyISAM),那么 PostgreSQL 的伸缩性要好于使用 InnoDB 的 MySQL。 我还猜想 Skype 中的某些人比 MySQL 更了解 PG,而 MySQL 和 PG 对存储过程,触发器等的支持要好得多, 里斯