Flask Admin - 路由会话、负载平衡、数据复制。从站不更新管理模型

Flask Admin - Routing Session, Load Balancing, Data Replication. Slave does not update Admin Models

我有一个工作的 Flask 应用程序,并且正在完成所需的生产配置和架构设计。

想要的设计。

2 台 WAMP 服务器 1 个 Apache 反向代理负载平衡器。

用户将访问负载平衡器,并由其中一台 WAMP 服务器提供服务。

2 MYSQL 数据库将在主从数据复制中配置。

Data provider只会更新Master,web server也只会更新master,从Slave中获取所有查询。

因此,即使负载均衡器可能将您连接到主服务器上的 Web 服务器,它仍在从从服务器读取数据。

我的问题是,如果在数据库中创建了一条新记录,Flask - Admin 将仅在用户正在查看 master 上的管理页面时更新模型。

主从数据库都显示正确的数据。但主从管理模型没有。为了让管理模型更新,我不得不重新启动从服务器。

感谢阅读。如果有任何需要的信息,请告诉我,我会传递给您。

我正在使用 Windows WAMP 服务器 2.5。 Python 3.4。烧瓶项目

代理-html.conf

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED

<Proxy balancer://mycluster>
    BalancerMember http://100.100.100.1:8080 route=route1
    BalancerMember http://100.100.100.2:8080 route=route2
    ProxySet stickysession=ROUTEID
</Proxy>
    ProxyPass / balancer://mycluster/

<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Allow from all
</Location>

Web 服务器管理摘录

class RoutingSession(Session):
    def get_bind(self, mapper=None, clause=None):
        if self._flushing:
            return engines['edit_leader']
        else:
            return engines['edit_follower']

session_factory = sessionmaker(class_=RoutingSession, autocommit=False)

Session = scoped_session(session_factory)


@contextmanager
def session_scope():
    """Provide a transactional scope around a series of operations."""
    session = Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        Session.remove()

with session_scope() as temp_session:
    admin.add_view(my_admin.ComputerAdmin(Computer, temp_session))
    admin.add_view(my_admin.DriveAdmin(Drive, temp_session))
    admin.add_view(my_admin.RoomAdmin(Room, temp_session))
    admin.add_view(my_admin.WorkgroupAdmin(Workgroup, temp_session))
    admin.add_view(my_admin.UserAdmin(User, temp_session))
    admin.add_view(my_admin.PhoneCategoryAdmin(PhoneCategory, temp_session))
    admin.add_view(my_admin.RoomExtensionAdmin(RoomPhoneNumber, temp_session))
    admin.add_view(my_admin.PhoneNumberAdmin(PhoneNumber, temp_session))
    admin.add_view(my_admin.RoomIntercomAdmin(RoomIntercomNumber, temp_session))
    admin.add_view(my_admin.StationTypeAdmin(StationType, temp_session))

问题是 isolation level 被设置为默认值 repeatable read 将其设置为 read commited 就成功了