`
twtmnm1314
  • 浏览: 68521 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

使用Mysql来搭建可扩展的SNS网站(浅谈)

阅读更多

近几年WEB2.0的火爆,带动了Mysql的使用热潮,不管是小企业还是大网站,都有意无意的开始使用Mysql来搭建新数据平台,传统网站随着业访问量,数据量的急剧膨胀,集中式的数据库也越来越成为瓶颈,很难做进一步的扩展,做读写分离,而这些都是Mysql的优势所在,容易扩展使Mysql渐渐成为了企业新的选择。
说到可扩展性,和APP一样,当数据库压力上来时,只要通过不断增加数据库服务器来解决,尽量不去调整应用程序,服务器硬件坏掉了,直接拿台新的服务器顶上就可以了,这是我设计的初衷。下面我会通过Mysql来浅谈SNS数据库的设计思路(注:只是我的理解),SNS关注的是个体(userid),比如我的好友,我的日志,我的相册,我的帮派等等,强调人的个体行为,现在很火的SNS网站如51.com,Facebook,Myspace都是通过Mysql来搭建的,接下来我将尝试探讨这种业务类型的设计轨迹,如何做到可扩展性。
先从如何分库开始,考虑按用户(userid)属性来分库,用户有好友,有博客,有相册等,只要是用户的行为,都跟着用户走,单库中包含了用户的所有行为,这种分法定位起来很容易,找到某个库后就找到了用户的所有行为,很方便。也可以按业务类型来分库,每个业务独立成库,分成好友库,博客库,相册库等,不同业务模块各自独立,这种分法思路很清晰,分库的规则可以不同业务灵活多变,开发起来也相对比较简单。
接下来讨论分表的设计,Mysql上设计数据库我力求做到小快灵的原则,单库数据量要比较小,数据库要做到快速响应,表设计要非常灵活,不同的业务可以选择相应的分表规则,小快灵的思想要求表设计很容易做水平扩展,数据量过大时很容易进行表拆分。从设计思路上来说,可以使用配置表(元数据)来存储分表的配置信息,假设今年的注册用户规划在2000万左右,考虑分成4张表,table1存储1-500万的数据,500万-1000万存储在table2,。。。每个表保留500万的数据,分表规则和查询路由通过配置表来维护,某天我们发现table1的数据量过于活跃,数据库压力很大,同样的开始考虑拆表,修改分表配置信息,同时把table1拆成两张表存到两台服务器来分担压力,当然也不一定说是访问压力才导致分表,当表的记录数大到一定的数量,同样也需要拆表。采用配置信息来维护分表的规则非常灵活,一切以配置信息为准,不过太灵活也意味这风险点很高,配置信息的重要性不言而喻。接下来我提到的是采用mod取模来分表,初期考虑采用mod(4)分成4张表,根据取模的结果0,1,2,3分成4张表,随着业务发展的带来数据量的膨胀,访问压力加大,需要对表作进一步拆分,因为取模带来的特殊性以及拆表尽量不做数据迁移的原则,我建议通过倍数来扩展,采用mod(8)来扩展表,接下来考虑使用mod(16)来拆分,不断的通过倍数来做扩展。相对于配置信息分表,取模设计相对来说并不是那么的灵活,不过灵活也不一定全是好事,万一配置信息被人误调整过,那就麻烦了。
经常看到很多表中没有主键,这对于严谨的系统设计来说,通常是不可接受的,大部分表会使用自增id来做主键,刚开始可能是单表,接下来可能拆成多张表,用auto incremental很难保证在多个表中保持唯一性,那如何保证分表(user_table1,user_table2,…)之间id的唯一性呢?考虑oracle使用序列来保证id的唯一性,序列是凌驾于表之上的,同样考虑在Mysql数据库中增加一张序列表,模拟oracle的序列实现方式,需要自增的表都可以在这里面添加一条记录,对于分表来说,每个子表调用的是同一条记录,应用程序直接调用这条记录来做自增,来保证id的唯一性。这仅仅是一种实现方式,如果只要求id的唯一性,可以使用函数来生成,也可以按照某种规则如时间精确到毫秒来保证id的唯一,方法太多了。
围绕可扩展性,简单提了一些分库,分表,id生成的设计思路,这仅仅是整个网站中的冰山一角,还有太多的细节上需要我们去思考,如基础数据表,仅仅几十条数据不做分表分库,当其他表拆成多个库时这些数据保存在哪儿,专门建个基础库还是每个库都保留一份呢,分表,到底分多少个合适,是用Myisam存储引擎还是用Innodb呢?这些都需要我们细细的思索,细节决定成败,关注每个细节,每个表的实现方式,尽量多参与到业务中去,多了解产品经理,开发的想法,多去了解Mysql的实现方式,Mysql自身的优势,Mysql可扩展性的优势,多了解业界成熟的设计思路,结合自身的业务模式,设计出更合理的系统。

分享到:
评论

相关推荐

    使用Mysql来搭建可扩展的SNS网站(浅谈)

    标题与描述:“使用Mysql来搭建可扩展的SNS网站(浅谈)” 知识点解析: 在探讨使用MySQL来搭建可扩展的社交网络服务(SNS)网站的过程中,文章重点介绍了如何利用MySQL数据库来应对SNS网站特有的数据挑战,特别是在...

    mysql集群搭建教程

    MYSQL集群搭建教程 MYSQL集群搭建是指将多个MYSQL服务器组合成一个集群,以提高数据库的高可用性和负载能力。本文将详细介绍MYSQL集群的搭建过程。 Knowledge Point 1: MYSQL集群架构 MYSQL集群架构主要包括管理...

    基于nginx tcp负载均衡 + redis的集群聊天服务器,网络层使用muduo库搭建,数据库使用MySQL.zip

    基于nginx tcp负载均衡 + redis的集群聊天服务器,网络层使用muduo库搭建,数据库使用MySQL 基于nginx tcp负载均衡 + redis的集群聊天服务器,网络层使用muduo库搭建,数据库使用MySQL 基于nginx tcp负载均衡 + ...

    Mysql 高可用 InnoDB Cluster 多节点搭建过程

    Mysql 高可用 InnoDB Cluster 多节点搭建过程是指使用 Mysql 的 InnoDB Cluster 功能来搭建一个高可用性的集群环境。在这个过程中,我们将使用四台服务器,node01、node02、node03 作为集群节点,node04 作为管理...

    MySQL Cluster集群搭建详解

    MySQL Cluster是一种可扩展的、高性能的、容错能力强的集群数据库解决方案。它通过其独特的分布式架构设计,支持在多个节点间进行数据的复制和同步,能够提供高可用性和冗余性。对于想要搭建MySQL Cluster集群的新手...

    windows下mysql同步集群搭建

    Windows 下 MySQL 同步集群搭建 ...* 可扩展性:MySQL Cluster 可以根据需要扩展,能够满足不断增长的业务需求。 MySQL Cluster 是一个高可用、高性能的数据库集群解决方案,能够满足大规模应用程序的需求。

    Linux MySQL集群环境搭建

    数据更新使用读已提交隔离级别来保证所有节点数据的一致性,使用两阶段提交机制保证所有节点都有相同的数据(如果任何一个写操作失败,则更新失败)。无共享的对等节点使得某台服务器上的更新操作在其他服务器上立即...

    基于Windows的MySQL Cluster搭建及配置详解

    MySQL Cluster是一个高性能、可扩展的数据库解决方案,它基于NDBCluster存储引擎,利用无共享的数据存储技术来实现实时同步与快速故障切换。该集群系统支持事务处理,能够确保数据的一致性和高可用性。 **特性简介...

    MySql集群搭建方案

    本文档讲述了MySql集群搭建方案,比较详细的。特分享下载。

    深入浅出MySQL全文

    深入浅出MySQL全文 MySQL 是一种关系型数据库管理系统,广泛应用于各种行业和领域。本资源将从基础篇开始,详细讲解 MySQL 的安装、配置、启动和关闭服务、SQL 基础等知识点。 MySQL 的安装与配置 MySQL 的安装是...

    php+mysql 环境搭建软件及教程

    搭建PHP+MySQL环境是开发基于Web的PHP应用程序的基础步骤,主要涉及Windows环境下WAMP(Windows+Apache+MySQL+PHP)服务器的配置。以下是一个详细的搭建过程: 首先,我们需要理解WAMP环境的构成。WAMP是从LAMP...

    MYSQL集群搭建

    MySQL集群搭建是一个复杂而重要的任务,它涉及到数据库的高可用性、数据安全性以及性能优化等多个方面。本篇文章将深入探讨MySQL集群的相关知识点,包括其基本概念、架构、配置步骤以及常见问题。 首先,MySQL集群...

    基于SSM+mysql架构搭建的客户管理系统源码.zip

    基于SSM+mysql架构搭建的客户管理系统源码 基于SSM+mysql架构搭建的客户管理系统源码 基于SSM+mysql架构搭建的客户管理系统源码 基于SSM+mysql架构搭建的客户管理系统源码 基于SSM+mysql架构搭建的客户管理系统源码 ...

    开源SNS的架构,elgg,短时间内搭建自己的sns网站

    Elgg是一款强大的开源SNS框架,以其灵活性和可扩展性受到开发者的青睐。本文将深入探讨Elgg的架构特点、安装流程以及如何利用它快速搭建属于自己的SNS网站。 ### Elgg简介 Elgg是一款基于PHP的开源社交网络平台,...

    MYSQL cluster 环境搭建教程

    mysqlcluster的环境搭建,mysql集群应用

    搭建高性能可扩展MySQL数据库视频教程.txt

    搭建高性能可扩展MySQL数据库视频教程.txt

    PHP+MYSQL一键搭建

    在搭建过程中,我们通常会使用集成环境如phpStudy,这是一个非常流行的PHP开发工具,提供了包括PHP、MySQL在内的多种服务器软件的一键安装服务。例如,你提供的压缩包文件名"phpStudy_64"就很可能是一个64位版本的...

    搭建EF和Mysql的环境

    在构建一个基于Entity Framework (EF) 和 MySQL 数据库的开发环境时,首先需要了解的是如何在Visual ...一旦环境搭建成功,就可以开始使用EF进行数据访问层的代码编写,并利用MySQL的强大功能进行数据的存储和查询。

    mysql 主从复制环境搭建

    MySQL 主从复制环境搭建 MySQL 是一个轻量级的开源框架,具有速度快、多线程、多用户和跨平台等特点。MySQL 主从复制是指将一个 MySQL 服务器的数据实时同步到另一个 MySQL 服务器上,通常用于提高数据安全、负载...

Global site tag (gtag.js) - Google Analytics