架构师必备技能:数据库优化手术刀——实战分库分表

在最初,应用的数据量比较少,没有任何压力,一般会将所有的数据放在一个库中。但是随着业务的增长,数据量急剧增长,DB压力增大,似乎随时都会挂掉。此时,优化DB的使用已经是势在必行,以下有几个方案。

1

优化对DB的使用

读写分离(肯定一开始就做了……)、索引、使用合理的sql等等。一些简单的优化可以先做,复杂的优化如果时间允许能先做是最好的,但如果是一直被业务赶着走,抽不出时间做,只好先选择其它的措施。

2

升级机器配置

升级机器配置,加CPU、加内存,换SSD。简单粗暴,无论怎么样,机器比人便宜,如果没时间做业务上的优化,先走这条路,直到最后升级机器已经没有效果。

3

拆库

随着业务的继续发展,最终,机器也升级到没得升了,基本的sql优化也做了,但数据库还是扛不住。只能开始拆库,可以选择垂直拆分与水平拆分。

其中垂直拆分是最简单的,也是成本最低的,对线上业务的影响也不大。可以按业务模块进行拆分,这样相对清晰。可以将新拆分出来的库作为原来库的从库,保持数据的同步。挑个流量低峰时间做切换,先关闭写入服务,之后将服务切换到新拆分出来的库即可。

按业务模块拆分数据库以后,可以支撑业务的运行很长时间了。除非,某个业务模块已经发展到单DB、抑或单表也无法支撑的程度。这个时候需要着手进行水平拆分了,按什么维度进行拆分需要综合考虑事务支持、数据的分布是否均匀、能否方便后续的数据处理等问题,一般选择用户id,业务编号等。

水平拆分可选择取模,或者波动更小的一致性hash。但是无论是取模还是一致性hash,都涉及到如何选择拆分的规模的问题,也即初始我们要拆分多少个表,多少个库,拆小了,跟不上业务的发展,很快就得继续做拆分。拆大了,机器闲置也浪费资源。

这就牵扯到未来如果加机器,如何平滑过渡,最好都不用停机的问题。毕竟,7*24小时才是互联网服务的正确姿势。 之前网上看到过一个方案可以借鉴下。

Java

就是在前面加一个索引,存储当前数据的映射,新增数据库以后,所有操作都先查索引,获取映射的库进行相应的操作。那么对于旧的数据,还是到原来的db读写。新的数据由于索引不存在,重新计算其索引,并落到对应的DB。另外,其任务对旧数据进行迁移,不过要注意迁移的过程要对数据进行锁定,防止不一致的情况,在流量低峰进行即可。这个方案配合一致性哈希会好一些,需要迁移的数据相对少。

每晚8:00烛光学院的讲师将会在腾讯课堂烛光学院Java高级免费试听课程中给大家详细讲解数据库呦

Java学习资料获取或免费进入课堂权限获取(复制下段连接至浏览器即可)

data:text/html;charset=UTF-8;base64,5p625p6E5biI5a2m5Lmg6LWE5paZ5YWN6LS56aKG5Y+W6K+35Yqg5omj5omj5Y+35pivMTAxODkyNTc4MA==

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
小卢 blog:http://www.yqshare.com 欢迎联系,共同学习! 网络上流传的 进程手术刀1.0版及源代码。 作者: xotianhu VCCODE网络版斑竹 功能: 1.显示系统进程及进程的模块、线程信息。 2.能杀死任意进程包括系统服务进程。 3.能释放任意进程中的任意模块,不过有些关键模块释放不了。 4.结束任意进程中的任意线程。 代码说明: 1.界面用了Brent Corkum的系列菜单及按钮,引用的文件有BCMenu.h,BCMenu.cpp,BtnST.cpp,BtnST.h,HyperLink.cpp,HyperLink.h,BCMenu.cpp,BCMenu.h。 3.类说明CKillProcess---应用类,CKillProcessDlg---主对话框,CProcessTree---进程树 2.由于时间仓促,代码有些乱,但内容很简单。 3.进程技术用到了PSAPI(枚举进程),TOOLHELP32(枚举线程),远线程(释放模块)。本人比较满意的一点是用了远线程,一开始仿照原先作的远线程例子写了很麻烦需要动态调用的线程函数,结果弄了半天不行,后来又用IDA反汇编仔细研究WINDOWS远线程的特点,总算悟出点东东,于是一行语句就搞定了,哈哈。 4.用到了CMap映射类把列表项映射到相关进程及模块,感觉——是不是能提高效率? 5.此为练习之作,没什么特别的技术,因此可以——Random Copy,但Copy时别忘了把xotianhu改名,我有很深的教训就是有一次COPY别人作业把别人名字也COPY上了,结果让老师笑话了一顿。 编译平台: 1.该代码在Windows2000+sp2+VC.net平台下编译通过。 应用: 1.可以用来结束有些以服务进程形式的HACKER及病毒进程。 2.可以干掉以DLL形式存在的木马。 警告: 1.不要太随意得KILL进程,有些服务进程你KILL了之后要倒霉的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值