[Nut-upsdev] Questions about failover architecture
Sebastian Kuttnig
sebastian.kuttnig at gmail.com
Mon May 12 15:02:14 BST 2025
Hello Jim,
I am following the direction of the `clone` drivers, although using the
modern `upsdrvquery.c` API.
Essentially I am parsing the protocol lines directly reading from the
driver sockets, as the clone drivers do.
As for ups.conf, I start up as follows without problems:
[ups]
driver = dummy-ups
port = /etc/nut/5E.dev
[ups2]
driver = dummy-ups
port = /etc/nut/APC.dev
[failover]
driver = failover
port = dummy-ups-ups,dummy-ups-ups2
Is this what you had in mind?
Appreciate any pointers regarding the `upsdrvctl` and `nutshutdown`
specifics.
Sebastian
Am Mo., 12. Mai 2025 um 15:53 Uhr schrieb Jim Klimov <
jimklimov+nut at gmail.com>:
> Sounds great, thanks for the update!
>
> For communications with the other drivers (from failover or multiplexor),
> I suggest using the local driver socket line the clone* drivers do: this
> removes a dependency on `upsd` both for the service startup (no
> chicken-and-egg issue of drivers before upsd, but upsd before the failover
> driver) and for FSD end-game (after all services stopped, we just need to
> start the drivers to talk to the UPS, no need for upsd so they can see each
> other).
>
> Speaking of the latter, the `nutshutdown` script (or `upsdrvctl`) may need
> an update to know to start those additional drivers. Or perhaps do them one
> by one in case of shutdown command specifically (or any command generally),
> until one succeeds.
>
> Jim
>
>
> On Mon, May 12, 2025 at 3:22 PM Sebastian Kuttnig via Nut-upsdev <
> nut-upsdev at alioth-lists.debian.net> wrote:
>
>> Hello again,
>>
>> I can report back that my failover driver is progressing nicely, and a
>> lot of
>> things seem to overlap with what could very well also be useful and maybe
>> used
>> eventually for a future multiplexing driver.
>>
>> Basically, my failover logic takes driver names (sockets) in
>> comma-separated
>> form from the `port` variable and keeps track of these drivers, monitoring
>> their information and failing over where necessary. Basic configuration
>> looks
>> like:
>>
>> [failover]
>> driver = failover
>> port = dummy-ups-ups,dummy-ups-ups2
>>
>> I could well picture a multiplexing driver accepting a similar format,
>> merging
>> variables of both drivers and resolving conflicts by port argument order
>> (`dummy-ups-ups`, then `dummy-ups-ups2`) in its most basic form.
>>
>> Additionally, this could be extended with preference arguments, such as:
>>
>> prefer.ups.status = dummy-ups-ups
>> prefer.battery.voltage.nominal = dummy-ups-ups2
>>
>> Such definitions would take precedence over the port argument order, for
>> more
>> granular control. This could be similar to what is used in `ups.conf` for
>> `default.<variable>` or `override.<variable>`, format-wise.
>>
>> If either driver were to drop offline, the other driver could take over
>> with
>> its full set of variables, regardless of other set preferences.
>>
>> Just a rough sketch of what I have in my mind. Time permitting, I'll start
>> working on this at some point after I finish my failover explorations.
>>
>> Sebastian
>>
>> Am Mo., 12. Mai 2025 um 14:16 Uhr schrieb Greg Troxel via Nut-upsdev <
>> nut-upsdev at alioth-lists.debian.net>:
>>
>>> Wow, that's quite the tale!
>>>
>>> I take away from this:
>>>
>>> There is a real example of wanting to merge two information sources.
>>>
>>> It's very complicated.
>>>
>>> Anybody wishing to succeed in a very complicated situation needs to
>>> really pay attention, to twice as many things as they thought when
>>> they started.
>>>
>>> It's unclear how to generalize from this to a solution that will work
>>> for the next person.
>>>
>>> but if someone wants to write soemthing that is an aggregating driver
>>> (looks like a driver, talks to N driver), and do so in a way that
>>> doesn't cause any significant pain for others that seems like a fine
>>> thing for them to do.
>>>
>>> I would suggest having some sort of config file that for each variable
>>> says which driver to prefer, and some kind of timeout for not available
>>> to flip to the backup. I guess for starters, one could configure two
>>> drivers in "fancier/less-reliable" and "old-school" slots, and prefer
>>> fancier for all except shutdown and status.
>>>
>>> I fear that the next layer is merging status from two where they don't
>>> quite match.
>>>
>>>
>>>
>>> _______________________________________________
>>> Nut-upsdev mailing list
>>> Nut-upsdev at alioth-lists.debian.net
>>> https://alioth-lists.debian.net/cgi-bin/mailman/listinfo/nut-upsdev
>>>
>> _______________________________________________
>> Nut-upsdev mailing list
>> Nut-upsdev at alioth-lists.debian.net
>> https://alioth-lists.debian.net/cgi-bin/mailman/listinfo/nut-upsdev
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/nut-upsdev/attachments/20250512/b8dfdef5/attachment-0001.htm>
More information about the Nut-upsdev
mailing list