多数据库分片读写分离与动态路由
根据模型类型或用户ID实现水平分片,并动态切换数据库连接。 · 难度:入门 · +10XP
动态数据库分片路由器
本教程超越简单的master/slave读写分离,实现基于哈希的分片策略。例如:将User模型的数据分散到3个数据库实例,根据user_id % 3决定存储位置。同时,针对日志模型使用单独的数据库。你将编写自定义的DatabaseRouter类,实现db_for_read、db_for_write、allow_relation等方法,并利用中间件在请求中注入分片键。
class ShardRouter:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'users':
user_id = hints.get('instance').id
return f'shard_{user_id % 3}'
elif model._meta.app_label == 'logs':
return 'logs_db'
return 'default'
def db_for_write(self, model, **hints):
if model._meta.app_label == 'users':
user_id = hints.get('instance').id
return f'shard_{user_id % 3}'
return 'default'