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
就成功了
我有一个工作的 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
就成功了