免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: send_linux
打印 上一主题 下一主题

MySQL在企业中分布式的应用讨论,欢迎参与!(获奖名单已公布-2012-10-24) [复制链接]

论坛徽章:
0
41 [报告]
发表于 2012-09-01 12:36 |只看该作者
水贴太多了。没几个技术贴。。。。

论坛徽章:
0
42 [报告]
发表于 2012-09-02 12:09 |只看该作者
1.        整体框架
整个服务器组由三个部分组成,客户端(Clientsvr),代理服务器(proxysvr),数据库服务器(sqlsvr),客户端通过代理服务器对数据库服务器进行访问,不能跨层访问。

2.        Sqlsvr
这层的服务器跑mysql和sqlsvr,sqlsvr是我们自己写的一个应用程序,主要是访问本地数据库,提供统一的访问接口,监控,也是后面的扩服等需要。整个层的数据库都只能通过sqlsvr进行访问。下面将对该层的服务器称为sqlsvr
2.1.        这层的服务器分成若干组,每组由多个sqlsvr组成,1个主,多个从,用来做读写分离。如上图8个sqlsvr,分成4组,2个一组,一主一从
2.2.        数据库中的表分散在各个组中。每个表中的主key做为存储在哪个sqlsvr上的依据。比如user表中userid是主key,将key除以4,余1的存储在第一组,余2的存储在第二组。当然实际中的计算方法稍微复杂一点。
3.        Proxysvr
Proxysvr也是我们自己写的应用程序,功能和mysql proxy差不多,可能看到这里大家会有疑问为什么不用mysql proxy,这个后面再解释。
3.1.        Proxy主要进行负载均衡,解析sql语句,根据sqlsvr的负载,决定分配到哪组的哪个sqlsvr。
3.2.        缓存数据。每次查询的时候先查找本地,如果没有在从sqlsvr上取。甚至有的写操作都在本地进行。
3.3.        处理需要操作整个表的sql语句,比如查询最大的数。

4.        心跳服务器组
心跳服务器以机房为单位,一个机房一组,会定时查询该机房的每个服务器的运行情况。Proxysvr会也有心跳服务器的功能,作为心跳服务器的备份。


5.        操作类型
因为proxysvr有缓存作用,所以一般一个proxysvr会对映几个组,访问这组的服务器都会通过特定的proxysvr进行。但是并不是所有的sql语句都遵守这个规定,而且proxysvr会有宕机的时候,所以需要将sql语句分成几个类型,不同的类型有不同的操作策略。
5.1.        涉及事务的操作,后面会详细解释。
5.2.        重要数据。读操作必须从sqlsvr中读取,写操作必须通过sqlsvr写入mysql后才从proxysvr返回给client。
5.3.        一般数据。写操作会写入proxysvr中,进过一段时间将脏数据刷入sqlsvr。读操作必须通过指定的proxysvr读取。
5.4.        容忍误差的数据。写操作如同3,读操作根据打分策略选择指定的proxysvr或则其他的proxysvr读取。


6.        读写分离
通过proxysvr解析sql语句,对不同的sqlsvr进行读写。


7.        数据库的访问方法
每个表会有个主key,通过算法转化成32位的数字X,然后对X取模,余数为几就在第几组服务器进行访问。


8.        sqlsvr扩服
如果是单纯的读压力过大,会增加从sqlsvr,如果整组压力过大,会增加一组服务器。然后更新proxysvr的分流的算法。因为我们是在线扩服的,实际情况会复杂点。比如,我们发现1组的服务器的压力超过某个临界值,我们会添加一些从sqlsvr在这一组,等数据基本同步后,控制台服务器会通知全部的proxysvr,proxysvr会进入扩服阶段。此时proxysvr会拒绝4.1操作,阻塞涉及到扩服的sqlsvr的写操作,直到扩服务完成。等数据全部同步完毕后,然后将之前添加在1组的从服务器变成新的服务器组假如是2组,2组依然是1主多从的结构,扩服完成。经过一段时间的稳定后,删除1组上的老数据,删除2组上本来是第一组的程序。此外Proxysvr还会更新分流的算法。比如有a,b,c,d组服务器,以前的key是模4,再发现a组压力大后,添加e组,现在扩服后key就会摸8,余0在a组,余1在e组,余2,余3都在b组。


9.        proxysvr数目变化
因为4.3操作会到指定的proxysvr,client会通过心跳服务器来计算4.3操作应该在哪个proxysvr 上进行,当数目变化后,client会更新。


10.        宕机
Sqlsvr宕机,如果是从,proxysvr会更新算法。如果是主,那么会选择1个从sqlsvr变成主sqlsvr。
Proxysvr宕机,在一定时段内,4.3的操作会阻塞,直到proxysvr恢复。其他操作无影响。超过指定时间段,proxysvr的数目会更新,如同9。


11.        事务
我们做的事务不能算事务,只是为完整性做的功能。单个sqlsvr的事务没有变化,当涉及多个sqlsvr的事务的时候,会在proxysvr上进行处理
11.1.        向涉及的sqlsvr提交开始事务,拉取数据。
11.2.        修改数据,存储本地log。
11.3.        提交修改数据,提交事务。等待反馈。
11.4.        如果因为网络宕机等原因,会在下次sqlsvr连接正常时提交。如果多次依然会未能解决,报警,人工介入。
这部分一直没有找的好的解决方案,如果大家有好的方法,希望能指点下。还好需要人工介入的时候概率非常低,因为这种情况一般是硬盘原因,而且还有数台备份,一起坏的概率太低了。


12.        Clientsvr
Clientsvr主要是对外提供数据库的访问,让用户感觉只有1个数据库,屏蔽后面的细节。
Clientsvr目前做了2种,一种是封装好的源码,数据服务器编程的时候就一起编译。一种是当成服务器跑,业务服务器通过协议进行连接。其实整个程序的框架是真实的用户连接到前面的连接服务器,逻辑由各个业务服务器来处理,业务服务器将复杂的数据操作交给数据服务器,数据服务器会通过clientsvr对数据库进行访问。业务服务器也可以通过clientsvr来访问数据库。


13.        其他
轮子这个问题就不多说了,这个设计很多上也是公司业务所决定的。当初设计的时候本来是想完全不用考虑业务的,做一个比较通用的分布式数据库。但是后来不得不在通用性和效率之间折中,所以结合业务砍掉了些功能。比如老数据和新数据的热点问题,以前的方案会区分处理的,比如会有老数据库和新数据库,有增量查询,新老数据融合这些东西,但是开发成本大,收益底,对公司业务没有帮助,就被砍了。虽然大家觉得比较酷。以后要是有这方面的需求,只能通过业务上来做处理或者通过合理的主key分配来解决这些问题。

这个数据库有很多覆盖分布式数据库的特点,读写分离,分表,没有单点,高并发,在线扩容,局部数据之间没有干扰等。
但是数据库不支持外联,不支持jion这些跨表的操作,这些操作或者对数据完整性的保证全部通过业务逻辑来做。
数据库回档很繁琐,需要人工介入,哪些大侠有这边面的经验,请赐教。

论坛徽章:
0
43 [报告]
发表于 2012-09-02 12:11 |只看该作者
本帖最后由 ccgame3636_cu 于 2012-09-02 12:13 编辑

忘了传个图,还不会传图就传个附件吧,大家见谅.
可能上面直接说大家还比较糊涂,这个是公司的一个项目,我觉的和这次讨论的话题结合还是比较紧密,就跟大家一起探讨下。
因为是公司的项目,所以在细节上我做了些处理,其次我们是第一次做这方面的产品,经验也比较少,希望大家多多指点,也给我们提下宝贵的意见。最后谢绝转载
这个数据库目标是应付数百万级的在线用户产生的数据操作,以后能平滑升级到千万级甚至亿级,但是现在还没有应用到生成环境,所以很多细节上的问题还没有暴露,现在还在大规模的测试当中。欢迎大家多多指点,多交流。

QQ截图20120902114726.jpg (83.67 KB, 下载次数: 46)

QQ截图20120902114726.jpg

论坛徽章:
0
44 [报告]
发表于 2012-09-02 12:49 |只看该作者
读写分离的话,也可以尝试一下这个
http://code.taobao.org/p/myrelay/wiki/index/

回复 7# Gray1982


   

论坛徽章:
0
45 [报告]
发表于 2012-09-03 13:33 |只看该作者
回复 44# xiaojl


    这个在生产环境用过吗?稳定否?

论坛徽章:
0
46 [报告]
发表于 2012-09-03 13:39 |只看该作者
我在生产环境主要使用的是master-slave的方式
1、双master,做HA。
2、读slave,写master(这个无争议啊)
3、可以采用mysql-porxy,但是这个网上说稳定性不够,前面也有提到,所以没有在生产环境使用,哪方面不稳定还希望能详细给出。
4、master单独服务器,slave与动态服务器一起。
5、mysql的主从同步时一定要注意版本,我吃过大亏的。

常用的就是这样。还希望有大牛能给出好的方案。

论坛徽章:
0
47 [报告]
发表于 2012-09-04 09:21 |只看该作者
我们在用MYSQL双主复制。自己写了些小脚本。没用MYSQLPROXY,效果也可以。

论坛徽章:
0
48 [报告]
发表于 2012-09-04 22:32 |只看该作者
ccgame3636_cu 发表于 2012-09-02 12:09
1.        整体框架
整个服务器组由三个部分组成,客户端(Clientsvr),代理服务器(proxysvr),数据库服务 ...




这一套很有借鉴意义

论坛徽章:
0
49 [报告]
发表于 2012-09-05 18:15 |只看该作者
本帖最后由 qu521jiao 于 2012-09-05 18:15 编辑

提个问题,有没有朋友在同一台ubuntu服务器上做过mysql主备,可不可以把实现过程贴出来,谢谢了

论坛徽章:
0
50 [报告]
发表于 2012-09-05 23:10 |只看该作者
回复 49# qu521jiao


    同一台做主从,有一点意义吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP