Flask Admin - 路由会话,负载平衡,数据复制。 Slave不会更新Admin Models

时间:2016-01-05 15:59:14

标签: apache flask wamp load-balancing flask-admin

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

理想的设计。

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

用户将点击负载均衡器,并由其中一个WAMP服务器提供服务。

2个MYSQL数据库将在Master - Slave Data Replication中进行统一。

数据提供者只会更新Master,而Web服务器也只会更新master,从Slave获取所有查询。

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

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

主数据库和从属数据库都显示正确的数据。但主管理员和奴隶管理员模型没有。为了让管理模型更新,我被迫重启奴隶服务器。

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

我正在使用Windows WAMP Server 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))

1 个答案:

答案 0 :(得分:0)

问题是将isolation level设置为默认值repeatable read,将其设置为read commited诀窍