OSC 第 85 期高手问答 — 数据库架构选型和运维

叶秀兰 发布于 2015/08/03 16:40
阅读 5K+
收藏 22

OSCHINA 本期高手问答(8月4日- 8月10日)我们请来了 @grassbell陈栋)为大家解答关于 数据库架构选型和运维 方面的问题。

陈栋@grassbell ,杭州沃趣网络科技有限公司 CEO,2004.12~2012.5 年就职于阿里巴巴。从应用数据库支持,到产品数据库运维,经历了 Oracle 从 PC Server+ 磁盘阵列 到 IBM 小型机+高端存储的升级,也经历了从集中式 Oracle 到分布式MySQL 的变迁。2009 年开始带领 DBA 团队,负责所有 DB 相关项目的开发、测试、上线、日常优化工作,及所有线上Oracle、MySQL、Greenplum 数据库的运维,并包括主机、存储的规划和日常管理。期间形成了一套成熟的数据库运维理念,能为各种场景提供合理的数据库架构,并对各种疑难紧急情况进行有效处理。 

2012.6 月离开阿里,组建沃趣科技,期望凭借在互联网行业积累的多年的运维经验,为传统行业客户提供最专业的数据库产品及服务。

在 去“IOE”的大背景下,Oracle、MySQL、PgSQL、x86、flash、自动化运维.....我们该如何选择应对?各种数据库又应该选用怎 样的架构呢?从数据库运维的角度,都载过哪些跟头该如何避免呢?我们说没有最好的技术,只有最适合的技术。大家都结合自己实际的业务场景,来聊聊这些话题 吧。

高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就 数据库架构选型和运维 方面问题向 @grassbell陈栋)提问,请直接回帖提问。

加载中
0
如比如比
如比如比
@grassbell :陈总,你好,在系统中,数据查询性能低下时(表里的记录件数很大),除了按照画面的检索条件建立索引外,还有什么好方法。
如比如比
如比如比
回复 @grassbell : 不是现在的,是以前的。
grassbell
grassbell
回复 @茶壶 : 现在还是9i?
如比如比
如比如比
回复 @grassbell : 多谢,我们的那个项目连Oracle9i的bug都给测出来了。
grassbell
grassbell
这个问题犹如在问一条SQL该如何优化一样。之前运维过一套CRM系统,很多大表关联,除了基本的index和表关联调整优化外,更多是从应用需求入手,是否可以默认增加一些条件限制,是否可以build结果表,是否可以通过搜索引擎......另外SSD和Flash硬件技术的引入,可以让IO性能提升一个数量级,也是一种方式。
0
如比如比
如比如比

@grassbell :陈总,可以再问一个么,对于24小时服务在线的系统来说,数据库怎样搞比较好(表结构可能发生表更)?

如比如比
如比如比
回复 @grassbell : 谢谢回复。
grassbell
grassbell
回复 @茶壶 : 数据库在线修改表结构,只要是向后兼容的都没什么问题,不要有删除字段之类的操作就好。现在的应用框架都支持的
如比如比
如比如比
回复 @grassbell : 是个移动项目,业务总在更新,表结构就经常有变化。java服务是二十四小时在线的,也就是服务不能挺的情况下,表结构要修改。
grassbell
grassbell
你遇到什么具体问题?
0
hzh62
hzh62
@grassbell : 分布式 mysql ,是支持 分布式事务XA 形式的吗,还是采取分库分表后,不支持跨表事务的模型。
grassbell
grassbell
阿里巴巴主要有两个分库分表的中间件:cobar和TDDL。目前绝大部分的分库分表中间件都是不支持跨表事务的。在生产环境下,要做这个的代价比较大。阿里的这两个在分库分表的情况下都没有做分布式事务。
0
江南若水
江南若水
@grassbell :我是该提问呢?还是改回答问题呢。问个问题吧。数据库压力测试怎么弄。
grassbell
grassbell
你还是回答问题吧
0
waylau
waylau
@grassbell :陈总。哪种基于Java 的内存数据库 适合 和 MySQL 混合使用?
你好。
我是Java 开发者,想在原有项目中用 Java 实现实时数据服务(实时告警,实时数据推送)。原项目使用的是 MySQL 的,为了提高数据的实时性,想在项目中加入内存数据库。 看了下,Java 的内存数据库 产品还是比较多的,H2 、Derby、HSQLDB 等,哪些适合与 MySQL混合使用?
eechen
eechen
回复 @waylau : 数据推送一般都是程序自己实现的吧,比如在插入或更新成功后,通知推送服务向用户推送数据。
waylau
waylau
回复 @eechen : 话说 “实时数据库”和“内存数据库”是否有区别?
eechen
eechen
回复 @yaray : memory存储引擎里数据只保存在内存中,在MySQL重启后会丢失,表锁,不支持事务。
zigzagroad
zigzagroad
MySQL有内存型的存储引擎;不过没搞过、不清楚初始化过程,使用上是跟使用普通表是一样的
grassbell
grassbell
这方面不了解
0
永远在一起
@grassbell :我想请问,目前我的了解,现在数据库大概有两种运用方式,一种是把数据库当作数据的桶,仅仅是负责放入数据,需要时取出数据。另外一种情况,是把数据库 当作数据库系统,将尽可能多的运算放入数据库中。目前只接触过第一种方式,但是有书认为,第二种方式的效率更高,对数据库的使用更加充分。不知道陈总对此 怎么看?是否对这两种方式有所偏重。
grassbell
grassbell
数据库范式确实有助于应用梳理业务逻辑,整理数据流。但是绝对的范式在数据库系统中并不是最佳选择。有时候,做一些字段的冗余反而会使数据库响应更直观,快速。关键还在于怎么让业务有效,快速的提供服务。
zr_zhuguojie
zr_zhuguojie
同求陈总的回复,现在设计数据库的时候,有时候会要求严格要求,比如用户只存 用户id,不能存用户名,但是展示或者导出的时候,会去频繁查询用户名
永远在一起
回复 @grassbell : 那看来陈总是比较倾向于将数据库作为数据桶的方式使用。那数据库设计的过程中,一般人都知道有范式的概念,我所在的公司对此并不上心,陈总对此又如何看待,是否要求数据库设计时必须达到某一范式(如果确实有此要求,能透漏一下是那一层次的范式么?)?又或者陈总认为数据库设计中范式并不十分在实际项目中使用呢?
grassbell
grassbell
这是个两难的问题,系统初期,为了快速满足业务需求,数据库可以承担部分业务运算,随着业务量的增加,数据库集中资源瓶颈的问题开始凸显,这个时候需要将数据库用的简单,尽可能将业务计算剥离出去。如果你将数据库用的太重,这个剥离的过程将很痛苦。我建议项目初期还是要对业务主线有个简单预估,应用开发与数据库找到个平衡点,这是一个权衡的过程。
0
GKTest
GKTest
@grassbell :陈总,我想请教,以订单数据库结构为例,单台服务器(假设是2CPU、64G内存),对于Oracle、MySql、PgSql,单表数据记录达到多少会出现明显的性能瓶颈(假设是已经最优化的),因为我没做过大数据高并发,希望知道这个临界点,能更好的根据实际情况用不同的方案。
grassbell
grassbell
目前这几种数据库,单表数据量在1亿条以下时都不会出现明显的性能变差的情况。所以通常做分区表或拆表的原因并不是因为单表不能支撑这么大的数据,而是当单表的数据量太大,比较难维护。如你做一个表结构变更,如果单表太大,会做很久的时间。如你想删除一部分历史数据,如果所有的数据都是在一个单表中,操作会比较慢,但如果你是按时间分区的,只要删除分区表就可以了。所以通常单表的数据量都保持在几千万条以下。
0
施家奇
施家奇

@grassbell :陈总好,前段时间,公司的领导说要搞个高可用的MySQL集群,当时有人提出用MySQL Cluster。我极力反对。反对原因是在我印象中,NDB不支持事务(貌似现在支持),占用内存高,运维经验少。
请问陈总,MySQL Cluster靠谱吗?国内有公司在用吗?

所谓的分布式MySQL,到底是个怎样的东西?

grassbell
grassbell
回复 @whaon : 开源的很多,cobar,tddl,mycat,原理都差不多,或者自己实现。关键问题是业务能否找出一个唯一的分库维度
whaon
whaon
回复 @grassbell : 那这边要怎么实现路由呢
grassbell
grassbell
实际应用的分布式MySQL,不是通过MySQL本身实现分布式,而是通过应用实现数据分布。
grassbell
grassbell
目前主流的分布式MySQL,说简单一点就是把多个MySQL资源集中起来提供给一个应用使用,方便数据库压力大了以后,数据库可以水平扩展。举个例子:淘宝上的商品有百亿级别,如果都放在一个MySQL数据库里面,压力很大,不可能支撑。这样的话,我们想了一个办法,按照卖家来拆分:七格格放在A库,GAP放在B库,格力放在C库,用多个MySQL来承载商品这个应用的访问压力。这个就是水平拆分的分布式。
0
DeanHere
DeanHere
@grassbell :你好,咨询小型MySQL集群解决方案
DeanHere
DeanHere
回复 @grassbell : 谢谢您的建议。
grassbell
grassbell
回复 @DeanHere : 不太建议用NDB Cluster。它在生产环境的验证还是不够。一般业务系统,双master或者一主多从 应该都可以支撑的。
DeanHere
DeanHere
回复 @grassbell : 谢谢您的回复。除此之外,请问您对MYSQL Cluster有什么想法吗。谢谢。
grassbell
grassbell
这个要看您具体业务的压力和需求了。 初创企业可以直接用一个单机的MySQL承载业务。 如果您担心MySQL数据库挂了以后,应用无法提供服务,您需要搭建一个Slave,或者做成双master的MySQL架构,以便一个MySQL出现了故障,另外一台MySQL能够及时提供服务。 如果您只是读的压力比较大,可以多加几个Slave,组成一主多从的架构,将读的压力分离到多个读库上,主提供写的服务。
0
hylent
hylent
@grassbell : 你好,请问你对mongodb怎么看?
grassbell
grassbell
mongodb目前在游戏产业用的比较广泛。如果你的业务数据都能抽象成json的格式,那么mongodb是一个好的选择。但目前mongodb在一些数据高可靠(零数据丢失)、高一致性的场景上还不太适用。
返回顶部
顶部