這是第二部分,主要是Mysql數據庫的分布式設計。我建立環境的時候,基本上沒有把數據庫分開。為用到的時候,做准備吧。
主從結構的數據庫設計
www.eol.org 項目本身有主從數據庫和讀寫分開的數據庫設計。
(Master/Slave)和Rails核心數據庫與應用核心數據庫分離。主要依靠以下插件實現:
use_db : 主要功能是將不同的models 分布到不同的數據庫。詳細說明見下:(http://rails.elctech.com/blog/using-and-testing-rails-with-multiple-databases)
masochism : 主要用於ActiveRecord時,將讀寫操作分開詳細說明參考如下網址(http://www.planetrubyonrails.org/tags/view/masochism)
分布式機構的Mysql數據庫設計
在本程序中,分布式數據庫的實現,主要通過創建連接到不同數據庫的Abstract Class Models, 其他的Models再通過繼承虛類的方式,而連接不同的數據庫。這樣就實現了,將Models分布到不同的數據庫。
在本項目中,有兩個Abstract Class Model分別對應應用數據庫,和日志庫。這兩個Abstract Class Model分別為:
Ruby代碼
- SpeciesSchemaModel - LoggingModel
和它們對應的數據庫可以從database.yml的定義中找到,分別是
Java代碼
- environment_data (e.g. development_data) - environment_logging (e.g. development_logging)
讀寫分開的分布數據庫機制
讀寫分開的數據庫機制是依靠masochism plugin建立兩個數據庫完成的。這兩個數控庫也可以從config/database.yml中看到描述
Ruby代碼
- master_database (master database 存儲核心的Rails數據) - master_data_database (master database 存儲應用本書的數據)
另外,為了區分數據的訪問,分別設計兩個不同的Abstract class讀取以上兩個不同的Master數據庫它們各自擁有直接的Sql查詢權限。
Ruby代碼
- MasterDatabase (for the core rails database) - SpeciesSchemaWriter (for the species data database)
對於日志數據,是沒有必要讀寫分開的。所以,將保留簡單的單獨數據庫結構。
通過ActiveRecord將讀寫操作分開,需要在以下文件進行設置
environment.rb (例如: config/environments/production.rb):
Ruby代碼
config.after_initialize do ActiveReload::ConnectionProxy.setup! ActiveReload::ConnectionProxy.setup_for SpeciesSchemaWriter, SpeciesSchemaModel end
這裡應該特別指出的是:要想使用這個分布設置,一定要打開緩存。
Ruby代碼
config.cache_classes = true
值得一提是因為,這一設置,在production模式下是默認打開的,但在development模式下並沒有打開。如果,要想在development模式下測試這個功能,就需要手動打開這個設置。
這樣通過上面的設置,沒有寫操作的SELECT查詢語句將會在SLAVE的數據庫執行,類似如下的寫操作,將會在Master庫執行:
Ruby代碼
SpeciesSchemaModel.connection.execute("DELETE FROM data_objects WHERE id in (#{data_objects})")
如果,你是在development模式下運行,那麼你沒有必要擔心,分布數據庫的作用。實際上在development模式下,master_database master_data_database實際是同一個development庫
,而且即使它們分開的建立在數據庫中,也不會造成影響。