Hi Xin,

I've been struggling with graceful sw deploy for the past week. Although, I
don't consider myself an expert, I might help you by giving you my final
working configs for Zerg and App vassals.

Emperor:
Executed from systemd with single arg
uwsgi --emperor /path/to/vassal/

helloworld_zerg.ini:

[uwsgi]
master = true
zergpool =
/home/foo/var/uwsgi/helloworld.zerg:/home/foo/var/uwsgi/helloworld.sock

helloworld-6bb4c51.ini:

[uwsgi]

chdir           = /home/foo/deploy/%n
virtualenv      = /home/foo/venv/helloworld
module          = helloworld.wsgi

master          = true
lazy-apps       = false
enable-threads  = true
thunder-lock    = true
processes       = 4
zerg            = /home/foo/var/uwsgi/helloworld.zerg
stats           = /home/foo/var/uwsgi/%n.stats
vacuum          = true
worker-reload-mercy = 600

hook-accepting1-once = write:/home/foo/var/uwsgi/%n.ready ok
hook-as-user-atexit = unlink:/home/foo/var/uwsgi/%n.ready

* there is only one emperor process
* there is one zerg vassal per app
* normally, there is one vassal with N workers per app. During sw deploy,
there may be two App vassals running. Therefor, there is a git hash in
vassal's name.
* I had trouble with zerg-pool on uWSGI 2.0.7, so I upgraded to 2.0.12.
These examples were tested on that version.

My deployment of new sw looks like:
1) create new file "vassal/helloworld-<newhash>.ini"
2) wait until "helloworld-<newhash>.ready" file is created
3) connect to "helloworld-<oldhash>.stats" and wait until all workers are
in idle state
4) remove old vassal "vassal/helloworld-<oldhash>.ini"

between steps 2)3), new vassal will start serving requests and old one will
stop. Curiously, no pausing of old vassal was necessary.
Step 3) is necessary, because deleting .ini file in step 4) will trigger
non-graceful shutdown.

On Wed, Feb 3, 2016 at 10:57 AM, xin <[email protected]> wrote:
> If I send a SIGTSTP signal to pause master 1111,  the request (curl -s -v
> "http://localhost:9090";)  will be suspended,  obviously attached zerg
> instance can't work.

You should not touch Zerg vassal (or breathe nearby). No reloads, no
pausing.. If I accidentally reload zerg, I have to kill -9 him to recover
(emperor will spawn a new one).

>       In doc
>
https://uwsgi-docs.readthedocs.org/en/latest/articles/TheArtOfGracefulReloading.html
,
> exists the same problem I think. If I shutdown the sleeping instance (
> hook-accepting1-once = writefifo:/var/run/sleeping.fifo Q), the instance
> with zerg server will quit. BTW,  I want only one instance exists at the
> same time.
>
>      (3)
>
>        If use emperor to manage instance,  if I spawn a zerg instance and
> graceful shutdown the current instance,  emperor always try to respawn the
> main instance,  although the zerg instance indeed exists. so how to use
> emperor to finish zero-downtime reload with zerg mode ?

I had the same problem with examples from that document. I recon, they just
give you hints, rather than guiding you by hand with full working examples
(which is a pity).

In emperor mode, you cannot permanently shutdown vassal by sending him
"q"/"Q" to FIFO. Emperor will notice the death of his vassal and respawn
it. Vassals in the "new/running/sleeping" example will simply "dance"
ad-infinitum ("sleeping" with become a "new" one after shutdown and
respawn).

The only way I found to permanently shutdown vassal (in emperor mode) was
to delete his .ini file.

Regards,

BranoZ
_______________________________________________
uWSGI mailing list
[email protected]
http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi

Reply via email to