【问题标题】:django database routing: automatic failover?django 数据库路由:自动故障转移?
【发布时间】:2019-10-08 15:02:36
【问题描述】:

我有一个用 Django 框架编写的应用程序,它使用 PostgreSQL 数据库。

因为我们对停机时间和冗余非常敏感,所以数据库使用流式复制到两台热备服务器。但是,就目前而言,当主数据库出现故障时,我必须手动更改 settings.py 中的数据库服务器地址,以便 Django 进行切换。

我对 Django 数据库路由还不是很熟悉,所以我不知道该怎么做,但是是否可以在 Django 中将所有三个数据库配置为具有路由层自动 确定其中哪一个是当前活动的 master 并相应地路由其查询?

(在运行时会很完美,但我会欣然接受“启动时”,并在程序文档中添加一行以在对数据库故障转移做出反应时重新启动 uwsgi vassal)。

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    您可以使用 Django 使用多个数据库。 ORM 对它有很好的支持。这可以从settings.py 获得。此外,可以设置默认数据库,Django 将使用该数据库(默认)。

    这是来自文档

    DATABASES = {
                'default': {
                    'NAME': 'app_data',
                    'ENGINE': 'django.db.backends.postgresql',
                    'USER': 'postgres_user',
                    'PASSWORD': 's3krit'
                },
                'users': {
                    'NAME': 'user_data',
                    'ENGINE': 'django.db.backends.mysql',
                    'USER': 'mysql_user',
                    'PASSWORD': 'priv4te'
                }
            }
    
    DATABASES dict 的

    只是“别名”

    Django 的 QuerySet 支持using(db_alias) 方法,可以帮助您在数据库之间进行路由。

    【讨论】:

    • 是的,我已经做到了,但我需要让 Django 自动决定使用哪个数据库,具体取决于哪个数据库对写入开放(因此,当前的 Master)
    • 如果我理解正确你的问题,,,当 django 执行查询时,例如 Mode.objects.all() (本例使用'default')... Model.objects.all() Model.objects.using('default').all()
    • 我已经修改了这个问题,因为显然我并不完全清楚。我知道如何使用多个数据库。我想要是让django自动根据它们中的哪个当前是主数据库来确定它应该使用哪个数据库。
    • 您需要定义一个数据库路由器,检查 Django 是否能够连接到数据库。如果不是,则返回不同的数据库。来自DATABASES 设置。更多详情请关注此帖:stackoverflow.com/questions/26608906/…
    • 我认为你对 Django 的要求太高了,这不是它的用途。在我看来,更好的解决方案是为您的数据库和其他一些基础设施设置 CNAME,这些基础设施可以 ping 主数据库并在主数据库无响应时将 CNAME 更新到您的备用数据库之一。 Django 不会意识到任何改变,但 DNS 会将查询路由到正确的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2018-03-15
    • 1970-01-01
    • 2018-08-17
    • 2014-10-21
    • 1970-01-01
    • 2011-09-12
    相关资源
    最近更新 更多