# 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 代理](<A HREF=)，它以另一种方式完成了类似的工作。

    ## 相关文章

    *   [数据库设计的非传统方法：碎片](http://highscalability.com/unorthodox-approach-database-design-coming-shard)的来临*   [PostgreSQProducts-使用 PL / Proxy](http://www.postgresql.at/english/pr_pl_proxy_postgresql_e.html) 无限扩展*   [PL /代理](https://developer.skype.com/SkypeGarage/DbProjects/PlProxy)*   [Heroku](http://highscalability.com/heroku-simultaneously-develop-and-deploy-automatically-scalable-rails-applications-cloud) 也使用 PostgreSQL。*   [MySQL 代理](http://forge.mysql.com/wiki/MySQL_Proxy)*   [PostgreSQL 群集：使用 Kristo Kaiv'使用 plproxy 进行分区（第一部分）](http://kaiv.wordpress.com/2007/07/27/postgresql-cluster-partitioning-with-plproxy-part-i/)。*   [PostgreSQL 集群：用 Kristo Kaiv'使用 plproxy 进行分区（第二部分）](http://kaiv.wordpress.com/2007/09/02/postgresql-cluster-partitioning-with-plproxy-part-ii/)。*   [Skype 上的 PostgreSQL](https://developer.skype.com/SkypeGarage/DbProjects/SkypePostgresqlWhitepaper) 。*   [Kristo Kaiv'撰写的 Skytools 数据库脚本框架& PgQ](http://kaiv.wordpress.com/2007/10/19/skytools-database-scripting-framework-pgq/) 。*   [PostgreSQL 高可用性](http://www.postgresql.org/docs/8.3/static/high-availability.html)。

通过散列，Skype 如何处理重新分区（例如，添加或获取数据库时）

我认为是这样的： [http://tinyurl.com/5fl8hu](http://tinyurl.com/5fl8hu)

plProxy 支持任何哈希算法。 根据先前的注释，这些示例使用默认的 PostgreSQL hashtext（）函数。 但是，如果您愿意，可以自己动手。 plProxy 本质上非常灵活。 配置和利用都通过存储过程/功能完成。

因此，他们将自己的数字带给了十亿用户。 我想大约 5 年后，随着互联网的发展，Skype 肯定会达到一万亿甚至更多。
-----
[http：//underwaterseaplants.awardspace。 com“](<a rel=) >海洋植物
[http://underwaterseaplants.awardspace.com/seagrapes.htm”](<a rel=) >海葡萄... [http：// underwaterseaplants。 awardspace.com/plantroots.htm“](<a rel=) >植物根

上面关于万亿用户的评论很有趣，因为目前世界上只有 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 对存储过程，触发器等的支持要好得多，

里斯