免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2457 | 回复: 3
打印 上一主题 下一主题

报表组件读写分离实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-01 16:32 |只看该作者 |倒序浏览
报表组件读写分离实现

由于Kelude数据量不断增大,报表组件个别报表的查询会对生产主库造成很大压力。
为了防止给主库造成过大压力,从而影响kelude线上使用,因此将报表组件连接我们的备库——slave库。

分析如下:¶
1.slave库为kelude线上主库的备份库,为只读库,其它配置与主库相同;slave库的数据与主库的数据实时进行同步,是binlog同步的 ,延时一般情况下是300毫秒左右。
2.虽然slave库在数据同步时有些许延时,但是作为报表分析,这一点上的延时基本可以忽略不计。

切库过程:¶
1.经过分析,和与DBA的沟通了解后,决定将报表组件的连接库切换为slave库。
2.更改数据库配置文件database.yml后,测试时发现,当有更新报表参数、或是订阅报表操作时,会报错。
3.经过bug定位,发现连到slave库时只有只读权限,是没有写权限的,因此保存用户的订阅参数当然会报错。
4.报表组件目前所有的写操作只涉及user_preferences,和reports两张数据库表。分析后,决定将涉及到这两张表写操作的Model类与主库中对应的表相映射。也就是说,报表组件所有的写仍在主库上进行,而所有的读是在slave库上,这也真正符合读写分离的要求。

附:¶
将一个用作写的Model贴上,用作示例:

  1. class ReportUpdate < ActiveRecord::Base
  2. establish_connection :master_db
  3. set_table_name "reports"
  4. #These methods are created for db slice:ReadOnly.
  5. def self.update_report report
  6. ReportUpdate.find(report.id).update_attributes(report.attributes)
  7. end

  8. def self.create_report new_report
  9.     ReportUpdate.create(new_report.attributes)
  10.   endend

复制代码
数据库配置文件代码:

jobs:
adapter: mysql
host: *
username: *
password: *
database: *
encoding: utf8
master_db:
adapter: mysql
host: *
username: *
password: *
database: *
encoding: utf8
mysql: &using
adapter: mysql
host: *
username: *
password: *
database: *
encoding: utf8
development:
<<: *using
production:
<<: *using
test:
<<: *localhost

论坛徽章:
0
2 [报告]
发表于 2011-09-01 22:38 |只看该作者
好艹艹啊。

论坛徽章:
0
3 [报告]
发表于 2011-09-03 06:36 |只看该作者
话说这样可以将性能提高不少啊,谢谢分享

论坛徽章:
0
4 [报告]
发表于 2011-09-03 07:51 |只看该作者
又多了一个Ruby和Rails粉丝。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP