实际的生产环境中:
由单台Mysql作为独立的数据库是不能满足实际需求的。一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
基本的原理是:
让主数据库处理增、改、删操作(INSERT、UPDATE、DELETE),
而从数据库处理SELECT查询操作。
在django项目中的应用
1. 在项目中的settings文件中配置数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'qqsx_gz',
'USER':'root',
'PASSWORD':'1234',
'PORT':'3306',
'HOST':'localhost'
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'qqsx_02',
'USER': 'root',
'PASSWORD': '1234',
'HOST': 'localhost',
'PORT': '3306'
},
}
2. 在mysql中创建 qqsx_02 数据库:
3. 将qqsx_gz数据库表同步到qqsx_02数据库:
命令行执行迁移
python manage.py migrate --database slave # 将主数据库中的数据表迁移到从数据库
mysql的读写分离在django框架中有两种方式设置:
1. 手动方式:
在使用数据库时,通过.using(db_name)来手动指定要使用的数据库
例如:
GoodInfo.object.using('default').all() 说明default这个设置下的数据库是用来专门读取数据的
Usermessage.object.using('slave').create() 说明slave这个设置下的数据库是专门来写入数据的
2. 自动方式:
a. 在项目的根目录创建myrouter.py脚本:
class DBRouter(object):
def db_for_read(self, model, **hints):
return 'default'
def db_for_write(self, model, **hints):
return 'slave'
b. 在项目中的配置文件加上数据库路由相关配置
DATABASE_ROUTERS = ['myrouter.DBRouter']
tips: 拓展知识:
1 一主多从方案:
class Router:
def db_for_read(self, model, **hints):
""" 读取时随机选择一个数据库 """
import random
return random.choice(['db2', 'db3', 'db4'])
def db_for_write(self, model, **hints):
""" 写入时选择主库 """
return 'default'
2 分库分表:
class Router:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'app01':
return 'db1'
if model._meta.app_label == 'app02':
return 'db2'
def db_for_write(self, model, **hints):
if model._meta.app_label == 'app01':
return 'db1'
if model._meta.app_label == 'app02':
return 'db2'