托管在SAE上的Django应用,如果使用共享型MySQL数据库服务,可以通过配置数据库路由,实现读写分离。利用SAE从库的价格优势,减少云豆开销。
SAE共享型MySQL数据库的计费策略:
新浪云SAE共享型数据库支持读写分离(Read/Write Splitting),即主数据库(Master)处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库(Slave)处理SELECT查询操作。
并且从SAE共享型MySQL的使用价格上来看:
共享型MySQL(主库) 请求次数10000次 400云豆/百万次 4元/百万次 磁盘容量20MB 5云豆/GB/天 0.05元/GB/天 共享型MySQL(从库) 请求次数10000次 150云豆/百万次 1.5元/百万次
从库的每百万次请求价格仅为主库的37.5%,因此充分利用从库的价格优势,可以减少应用在数据库服务上的云豆开销。
不过需要注意的是:MySQL从库有时候会因为网络抖动或者用户SQL语句不够优化,导致从库数据同步会有些微延时(3-10秒)。如果用户有对数据实时性要求比较高的查询,建议在主库上进行操作。
参考SAE共享型MySQL说明文档:http://www.sinacloud.com/doc/sae/php/mysql.html
Django数据库路由配置:
参考Django多数据库配置文档:https://docs.djangoproject.com/en/1.8/topics/db/multi-db/
假设settings.py位于mysite目录下,在settings.py中添加如下配置:
if 'SERVER_SOFTWARE' in os.environ:
from sae.const import (
MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASS, MYSQL_DB, MYSQL_HOST_S
)
else:
# Make `python manage.py syncdb` works happy!
MYSQL_HOST = 'localhost'
MYSQL_HOST_S = 'localhost'
MYSQL_PORT = '3306'
MYSQL_USER = '****'
MYSQL_PASS = '****'
MYSQL_DB = 'app_name'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': MYSQL_DB,
'USER': MYSQL_USER,
'PASSWORD': MYSQL_PASS,
'HOST': MYSQL_HOST,
'PORT': MYSQL_PORT,
'CHARSET': 'utf8',
},
'slave': {
'ENGINE': 'django.db.backends.mysql',
'NAME': MYSQL_DB,
'USER': MYSQL_USER,
'PASSWORD': MYSQL_PASS,
'HOST': MYSQL_HOST_S,
'PORT': MYSQL_PORT,
'CHARSET': 'utf8',
}
}
class PrimarySlaveRouter(object):
def db_for_read(self, model, **hints):
"""
Reads always go to slave.
"""
return 'slave'
def db_for_write(self, model, **hints):
"""
Writes always go to primary.
"""
return 'default'
def allow_relation(self, obj1, obj2, **hints):
"""
Relations between objects are allowed.
"""
return True
def allow_migrate(self, db, app_label, model=None, **hints):
"""
All non-auth models end up in this pool.
"""
return True
DATABASE_ROUTERS = ['mysite.settings.PrimarySlaveRouter']
设置完成后,数据库的读取操作将路由至从库;而新增、删除、修改操作使用主库。
本文链接:http://bookshadow.com/weblog/2015/10/30/sae-django-mysql-routing/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。