I've run some tests and this is how it works (i know it's a little strange):
opensearch.hosts: ["http://127.0.0.1:8000"] this option should always point to localhost. This is because port 8000 is used for security/authorization functions.
Localhost instance then is communicating with databases using:
elastfilter.url: "http://<database_ip>:9200" and here database can be remote. Now, this parameter DOES NOT accept multiple values.
For best performance and user experience i recommend to install small instance of database on the same host as UI.
In the Database config set
role.data: false. This will make that this database to act as a client (thus will not require additional license). At the same time make this new client node part of the whole cluster and in result you'll be reasonably protected from connection issues.
As a good advice I can share that we did had deployments where in such cases this "client" database had set
role.master: true. It was working good, so this might be an idea to consider.