Administrar temporizadores systemd que activan servicios oneshot conflictivos

Administrar temporizadores systemd que activan servicios oneshot conflictivos

Estoy trabajando en la creación de servicios que puedan realizar una copia de seguridad lógica de MySQL y una copia de seguridad física de MySQL. Las copias de seguridad lógicas se realizarían cada 4 horas, mientras que las copias de seguridad físicas se realizarían una vez al día a una hora específica. Ambos dependen de apagar el esclavo MySQL en el que se basa la copia de seguridad. También deben controlar que no se ejecuten al mismo tiempo. Además, cuando arranca/reinicia, estos no deben ejecutarse ni en la primera invocación.

La copia de seguridad lógica se utiliza mysqldumpy luego se carga en S3. La copia de seguridad física toma una instantánea del EBS.

He estado ejecutando una versión de caso de estrés simple en la que ambos se activan en un intervalo de 1 minuto. La base de datos está vacía y es pequeña. El volumen de EBS es 1GiB. Ambas cosas se pueden hacer en menos de un minuto.

Utilizo un servicio de temporizador para activar el oneshot. También hice que cada temporizador fuera Conflictsa entre sí y también lo reinicié en ExecStopPost.

Se ve un ejemplo del archivo de servicio. Cada uno hace referencia al otro.

[Unit]
After=mysql-slave.service
Conflicts=other-backup-type.timer

[Service]
Type=oneshot
# Just arbitrary name for this example
ExecStart=do_backup.sh
ExecStopPost=/bin/systemctl start other-backup-type.timer

Lo que he visto systemctl list-timerses que ambos temporizadores están sincronizados. Cuando ambos lleguen a 0, uno se activará. Lo que descubrí es que una vez hecho esto, el otro no se activará. Parece que en este caso, el cronómetro se detiene, pero nunca se dispara el otro disparo.

¿Hay alguna manera de manejar esto adecuadamente sin tener que compensar el tiempo? Descubrí que si hago que el período de tiempo se desplace ligeramente, funciona (los segundos no pueden ser un factor de 60). Estoy comprobando si hay una manera mejor o más elegante de respaldar esto.

Respuesta1

No estoy del todo seguro de si esta es la respuesta 100% correcta. He realizado muchas permutaciones y, en base a esto, se me ocurrió esto.

Observacionalmente, parece que si tengo 2 temporizadores (A y B) que están configurados Conflicts=y también tienen una colisión al expirar con otro temporizador (por ejemplo, ambos configurados para activarse cada minuto), entonces el que se activa (digamos que es A ) primero detiene el otro y luego activa su servicio. Sin embargo, esta parada provoca que se pierda el disparo del servicio del temporizador B. Supongo que el gatillo se saca de alguna cola y termina siendo lanzado en el proceso de parada.

información relacionada