Администратор Flask — сеанс маршрутизации, балансировка нагрузки, репликация данных. Подчиненный не обновляет модели администратора

У меня есть работающее приложение 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))

person Busturdust    schedule 05.01.2016    source источник
comment
Я полагаю, что недостаток может заключаться в конструкции арки?   -  person Busturdust    schedule 06.01.2016


Ответы (1)


Проблема заключалась в том, что isolation level было установлено по умолчанию, а repeatable read установка read commited сделала свое дело.

person Busturdust    schedule 11.01.2016