Redis SENTINEL ANNOUNCE-IP, ANNOUNCE-PORT
|Redis Sentinel Course||Redis Technical Support||Redis Enterprise Server|
Redis SENTINEL ANNOUNCE-IP, ANNOUNCE-PORT Parameter
Sentinel, Docker, NAT, and possible issues
Docker uses a technique called port mapping:
programs running inside Docker containers may be exposed with a different port compared
to the one the program believes to be using. This is useful in order to run multiple
containers using the same ports, at the same time, in the same server.
Docker is not the only software system where this happens, there are other Network Address Translation setups where ports may be remapped, and sometimes not ports but also IP addresses.
Remapping ports and addresses creates issues with Sentinel in two ways:
- Sentinel auto-discovery of other Sentinels no longer works, since it is based on hello messages where each Sentinel announce at which port and IP address they are listening for connection. However Sentinels have no way to understand that an address or port is remapped, so it is announcing an information that is not correct for other Sentinels to connect.
- Slaves are listed in the INFO output of a Redis master in a similar way: the address is detected by the master checking the remote peer of the TCP connection, while the port is advertised by the slave itself during the handshake, however the port may be wrong for the same reason as exposed in point 1.
Since Sentinels auto detect slaves using masters INFO output information,
the detected slaves will not be reachable, and Sentinel will never be able to failover the master,
since there are no good slaves from the point of view of the system,
so there is currently no way to monitor with Sentinel a set of master and slave instances deployed with Docker,
unless you instruct Docker to map the port 1:1.
For the first problem, in case you want to run a set of Sentinel instances using Docker with forwarded ports (or any other NAT setup where ports are remapped), you can use the following two Sentinel configuration directives in order to force Sentinel to announce a specific set of IP and port:
sentinel announce-port <port>
The above two configuration directives are useful in environments where,
because of NAT, Sentinel is reachable from outside via a non-local address.
When announce-ip is provided, the Sen tinel will claim the specified IP address in HELLO messages used to gossip its presence, instead of auto-detecting the local address as it usually does.
Similarly when announce-port is provided and is valid and non-zero, Sentinel will announce the specified TCP port.
The two options don't need to be used together, if only announce-ip is provided, the Sentinel will announce the specified IP and the server port as specified by the "port" option. If only announce-port is provided, the Sentinel will announce the auto-detected local IP and the specified port.
Note that Docker has the ability to run in host networking mode (check the
--net=host option for more information).
This should create no issues since ports are not remapped in this setup.
|<< AUTH-PASS||ANNOUNCE||Redis Cluster >>|