读写分离
在工程中,通常需要实现mysql读写分离。在Django中需要支持读写分离的话,只需要很简单的几步就可以了。
首先,配置读库和写库。
在django项目的settings.py中,配置读库和写库。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'WIPS',
'USER': 'mysql',
'PASSWORD': '360tianxun#^)Sec',
'HOST': '',
'PORT': '',
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'TEST',
'USER': 'mysql',
'PASSWORD': '360tianxun#^)Sec',
'HOST': '',
'PORT': '',
},
}
接下来,需要创建数据库的路由分发类。
可以在appname/utils下创建一个db_router.py文件,在文件中定义db_router类。类中实现读库写库的选择。
class DBRouter(object):
def db_for_read(self, model, **hints):
return "slave"
def db_for_write(self, model, **hints):
return "default"
def allow_relation(self, obj1, obj2, **hints):
return True
最后,在settings.py中添加路由配置。
DATABASE_ROUTERS = ['appname.utils.db_router.DBRouter' ]
重新启动Django就完成了。
这里需要注意的是,Django只完成了读写分离,但mysql主库、从库的同步操作并不归django负责,依然需要mysql实现。
一主多从
一主多从的方案在实际应用中是更常见的配置。在上面配置的基础上,只需要修改几个地方,就可以实现一主多从了。
首先,修改settings.py,增加全部从库的设置。
其次,修改db_router类中db_for_read(),下面是随机选取读库的例子。也可以根据实际的需要,选取不同的调度算法。
class DBRouter(object):
def db_for_read(self, model, **hints):
import random
return random.choice(['slave', 'slave2', 'slave3'])
分库
当需要不同的app使用不同的库时,可以利用model中的app_label来实现db的路由。
class DBRouter(object):
def db_for_read(self, model, **hints):
if model._meta.app_label == 'app01':
import random
return random.choice(['app01_slave1', 'app01_slave2', 'app01_slave3'])
if model._meta.app_label == 'app02':
return "app02_slave"
按照上面的操作就很容易实现mysql的读写分离、一主多从和分库了。但这个方法只建议用在小项目上。