Mysql数据库实现读写分离

2018-12-10  本文已影响0人  清风徐来_简

一、配置多个数据库

settings.py中配置

DATABASES = {
    'default': {
         'ENGINE': 'django.db.backends.mysql',
          'NAME': 'db8',
          'HOST':'127.0.0.1',
          'PORT':3306,
          'USER':'root',
          'PASSWORD':'',
      },
    'slave': {
          'ENGINE': 'django.db.backends.mysql',
          'NAME': 'db9',
          'HOST':'127.0.0.1',
          'PORT':3306,
          'USER':'root',
          'PASSWORD':'',
      },
}

二、手动读写分离

在使用数据库时,通过.using(slave)来手动指定要使用的数据库

查看需要using指定:
    user = User.objects.using('slave').filter(username=user, password=pwd).first()
保存:
    user_obj.save(using='db8')
删除:
    user_obj.delete(using='db8')

三、自动读写分离

通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法。这里这里主要用其中的两个:def db_for_read()决定读操作的数据库,def db_for_write()决定写操作的数据库。

class MasterSlaveDBRouter():
  '''数据库主从读写分离路由'''
    def db_for_read(self, model, **hints):
    """读数据库"""
        return "default"

    def db_for_write(self, model, **hints):
    """写数据库"""
        return "slave"

    def allow_relation(self, obj1, obj2, **hints):
    """是否运行关联操作"""
        return True
DATABASE_ROUTERS =["utils.db_router.MasterSlaveDBRouter"]

四、一主多从

附:

将数据库的所有表导出到d盘下的abc.sql:
mysqldump -u root -p db8 >d:abc.sql
将abc.sql文件的数据导入到db9数据库内:
mysql -u root -p db9 <d:abc.sql

上一篇 下一篇

猜你喜欢

热点阅读