Rails读写分离实现

报表组件读写分离实现

由于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贴上,用作示例:

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

def self.create_report new_report
    ReportUpdate.create(new_report.attributes)
  end

end

 

 

数据库配置文件代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值