對**的資料庫作讀寫分離(read/write splitting)可以提高效能,在django中對此提供了支援,下面我們來簡單看一下。注意,還需要運維人員作資料庫的讀寫分離和資料同步。
我們知道在django專案的settings中,可以配置資料庫,除了預設的資料庫,我在下面又加了乙個db2
。因為是演示,我這裡用的是預設的sqlite,如果希望用mysql,看這裡 。
databases = ,
'db2': ,
}
這裡我簡單建立一張產品表
from django.db import models
class
products
(models.model):
"""產品表"""
prod_name = models.charfield(max_length=30)
prod_price = models.decimalfield(max_digits=6, decimal_places=2)
建立完成後,執行資料庫遷移操作:
python manage.py makemigrations # 在migrations資料夾下生成記錄,遷移前檢查
python manage.py migrate # 建立表
在migrations資料夾下生成記錄,並在遷移前檢查是否有問題,預設值檢查defualt
資料庫,但是可以在後面的資料庫路由類(router)中通過allow_migrate()
方法來指定是否檢查其它的資料庫。
其實第二步遷移預設有引數python manage.py migrate --database default
,在預設資料庫上建立表。因此完成以上遷移後,執行python manage.py --database db2
,再遷移一次,就可以在db2上建立相同的表。這樣在專案根目錄下,就有了兩個表結構一樣的資料庫,分別是db.sqlite3和db2.sqlite3。
手動讀寫分離
在使用資料庫時,通過.using(db_name)
來手動指定要使用的資料庫
models.products.objects.using('default').create(prod_name='熊貓公仔', prod_price=12.99)
return httpresponse('寫入成功')
defread
(request):
obj = models.products.objects.filter(id=1).using('db2').first()
return httpresponse(obj.prod_name)自動讀寫分離
通過配置資料庫路由,來自動實現,這樣就不需要每次讀寫都手動指定資料庫了。資料庫路由中提供了四個方法。這裡這裡主要用其中的兩個:def db_for_read()
決定讀操作的資料庫,def db_for_write()
決定寫操作的資料庫。
定義router類
新建myrouter.py
指令碼,定義router類:
class
router:
defdb_for_read
(self, model, **hints):
return
'db2'
defdb_for_write
(self, model, **hints):
return
'default'
配置router
settings.py
中指定database_routers
database_routers = ['myrouter.router',]
可以指定多個資料庫路由,比如對於讀操作,django將會迴圈所有路由中的db_for_read()
方法,直到其中乙個有返回值,然後使用這個資料庫進行當前操作。
一主多從方案
class
router:
defdb_for_read
(self, model, **hints):
""" 讀取時隨機選擇乙個資料庫
"""import random
return random.choice(['db2', 'db3', 'db4'])
defdb_for_write
(self, model, **hints):
""" 寫入時選擇主庫
"""return
'default'
class
router:
defdb_for_read
(self, model, **hints):
return
'db1'
return
'db2'
defdb_for_write
(self, model, **hints):
return
'db1'
return
'db2'
更多請參考官網
django資料庫讀寫分離
settings.py檔案中資料庫配置 用sqlite3 databases db2 用mysql databases db2 python manage.py makemigrations python manage.py migrate database db2 將default庫中的表結構同步...
資料庫讀寫分離
隨著乙個 的業務不斷擴充套件,資料不斷增加,資料庫的壓力也會越來越大,對資料庫或者sql的基本優化可能達不到最終的效果,我們可以採用讀寫分離的策略來改變現狀。讀寫分離現在被大量應用於很多大型 這個技術也不足為奇了。ebay就做得非常好。ebay用的是oracle,聽說是用 quest share p...
資料庫讀寫分離
隨著乙個 的業務不斷擴充套件,資料不斷增加,資料庫的壓力也會越來越大,對資料庫或者sql的基本優化可能達不到最終的效果,我們可以採用讀寫分離的策略來改變現狀。讀寫分離現在被大量應用於很多大型 這個技術也不足為奇了。ebay就做得非常好。ebay用的是oracle,聽說是用 quest share p...