У меня есть работающее приложение Flask, и я работаю над желаемой производственной конфигурацией и архитектурой.
Желаемый дизайн.
2 сервера WAMP 1 балансировщик нагрузки обратного прокси-сервера Apache.
Пользователи попадут в балансировщик нагрузки и будут обслуживаться одним из серверов WAMP.
2 базы данных MYSQL будут настроены на репликацию данных Master-Slave.
Поставщик данных будет обновлять только Master, а веб-сервер также будет обновлять только Master, получая все запросы от Slave.
Таким образом, несмотря на то, что балансировщик нагрузки может подключить вас к веб-серверу на ведущем устройстве, он все равно читает данные с ведомого устройства.
Моя проблема заключается в том, что если в базе данных создается новая запись, Flask - Admin будет обновлять модель только в том случае, если пользователь просматривает страницу администратора на мастере.
И основная, и подчиненная базы данных показывают правильные данные. но главные и подчиненные модели администратора - нет. Чтобы обновить модель администратора, я вынужден перезагрузить подчиненный сервер.
Спасибо за прочтение. Пожалуйста, дайте мне знать, если есть какая-либо необходимая информация, и я передам ее.
Я использую Windows WAMP Server 2.5. Питон 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>
Выдержка из администратора веб-сервера
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))