当前位置: 首页 > 面试题库 >

读取从站,读写主站设置

张浩阔
2023-03-14
问题内容

我有一个Flask,SQLAlchemy
webapp,它使用一个mysql服务器。我想将数据库设置扩展为具有只读从​​属服务器,以便可以在继续写入主数据库服务器的同时在主服务器和从属服务器之间分散读取。

我研究了几种选择,我相信我无法使用普通的SQLAlchemy做到这一点。我打算在我的web应用程序中创建2个数据库句柄,每个用于主数据库服务器和从数据库服务器。然后,使用简单的随机值,将主/从数据库句柄用于“
SELECT”操作。

但是我不确定这是否是使用SQLAlchemy的正确方法。关于如何实现这一目标的任何建议/提示?提前致谢。


问题答案:

我在http://techspot.zzzeek.org/2012/01/11/django-style-database-routers-in-
sqlalchemy/
上的博客中提供了有关如何执行此操作的示例。基本上,您可以增强会话,以便在逐个查询的基础上从主服务器或从服务器中进行选择。这种方法的一个潜在故障是,如果您有一个事务调用了六个查询,那么您可能最终会在一个请求中使用两个从属....但是我们只是在尝试模仿Django的功能:)

一种稍微少用的魔术方法(也可以更明确地确定使用范围)是视图可调用项(无论在Flask中如何调用)的装饰器,如下所示:

@with_slave
def my_view(...):
   # ...

假设您有一个Session并设置了一些引擎,with_slave会做类似的事情:

master = create_engine("some DB")
slave = create_engine("some other DB")
Session = scoped_session(sessionmaker(bind=master))

def with_slave(fn):
    def go(*arg, **kw):
        s = Session(bind=slave)
        return fn(*arg, **kw)
    return go

这个想法是,调用将Session(bind=slave)调用注册表以获取当前线程的实际Session对象,如果不存在则创建它-
但是,由于我们传递了一个参数,scoped_session将断言我们在此处创建的Session是绝对是全新的。

您将其指向所有后续SQL的“从属”。然后,当请求结束时,您将确保Flask应用正在调用Session.remove()以清除该线程的注册表。下次在同一线程上使用注册表时,它将是绑定到“主服务器”的新会话。

或一个变体,您只想为该调用使用“从属”,这是“安全的”,因为它将所有现有的绑定还原回Session:

def with_slave(fn):
    def go(*arg, **kw):
        s = Session()
        oldbind = s.bind
        s.bind = slave
        try:
            return fn(*arg, **kw)
        finally:
            s.bind = oldbind
    return go

对于这些装饰器中的每个装饰器,您都可以撤消操作,将会话绑定到“从属”,其中装饰器将其置于“主”上以进行写操作。如果在这种情况下您想要一个随机的奴隶,那么如果Flask发生某种“请求开始”事件,您可以在那时进行设置。



 类似资料:
  • 找到默认主页入口 我们知道页面入口都是配置在路由中的,我们来看下app/config/routing.yml发现没有“/”的路由,但是我们发现了这么几句: app: resource: "@AppBundle/Controller/" type: annotation annotation的意思是“注解”,也就是说这一部分路由配置放在了注释里面,而资源在@AppBundl

  • 当配置好MySQL主从复制后,由于数据复制是单向的,所有对数据库的更新操作都必须在主服务器上进行,只有在主库上更新,才能避免用户对主服务器上数据库内容的更新与对从服务器上数据库内容的更新一致,而不会发生冲突。 MySQL复制环境用户授权方案 生产授权方案1 方案1、2对比推荐使用方案1,生产环境中推荐使用忽略授权表方式授权 数据库 用户名 密码 IP地址 端口 权限 主库 web passwd 1

  • 我正在学习NLTk,我需要加载一个大文件,我不想把它保存在我的桌面上。我怎么能用网站上托管的python读取文件? 我在这里尝试了这段代码,但它不起作用,我假设openwith是它的rson,但我需要使用openwith,因为在这种情况下我需要将它保存为file-myfile。 这就是错误: 如何在脚本中使用该文件而不下载整个文件? 我更改了代码以处理请求 但是现在当我运行这个我得到这个错误:

  • 问题内容: 假设我有[从IP地址],它是[主IP地址]的从设备。 现在,我的主服务器已关闭,我需要将此从服务器设置为手动(不使用哨兵自动故障转移和WITH redis命令)。 是否可以在不重新启动Redis服务的情况下执行此操作?(并丢失所有缓存的数据) 问题答案: 用于提升奴隶主 http://redis.io/commands/slaveof

  • 我正在尝试从连接到主机模式下的Android手机的USB设备中获取一些数据。我可以发送数据到它,但读取失败。 我一直从方法获得,它指示某种错误,它总是超时。也许问题来自于连接配置,我试了几次(读作:试错),没有一次奏效,令人惊讶的是,我不需要任何配置来发送数据到设备。 编辑 还必须注意的是,我使用的电缆是micro-USB到micro-USB的,它只能以一种方式工作,即只有当插头A连接到电话和插头

  • 问题内容: 有没有办法以编程方式找到它?我需要此作为自动运行的一部分;因此,如果现有的远程API调用可以做到这一点,这将非常有帮助。 问题答案: 您无需解析HTML-通过添加URL后缀,可以将大多数Hudson页面转换为API调用,例如 拨打以下电话: http:// hudson:8080 / computer / api / json 如果您更喜欢json,则将json切换为xml或pytho