2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-29 15:28:56 +00:00

ovndb-servers.ocf: add LB support for managing ovndb cluster:

using pacemaker so that controllers can be placed in different fault domains.
More background about the discussions can be found on:
https://mail.openvswitch.org/pipermail/ovs-discuss/2018-May/046770.html

Signed-off-by: aginwala <aginwala@ebay.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Numan Siddique <nusiddiq@redhat.com>
Tested-by: Numan Siddique <nusiddiq@redhat.com>
This commit is contained in:
aginwala
2018-06-02 09:11:56 -07:00
committed by Ben Pfaff
parent 7a68987a4d
commit 33f9c9eafa
2 changed files with 83 additions and 24 deletions

View File

@@ -243,12 +243,13 @@ node at which the active server is run, it is not efficient to instruct all the
ovn-controllers and the ovn-northd to listen to the latest active server's
ip-address.
This problem can be solved by using a native ocf resource agent
``ocf:heartbeat:IPaddr2``. The IPAddr2 resource agent is just a resource with
an ip-address. When we colocate this resource with the active server, pacemaker
will enable the active server to be connected with a single ip-address all the
time. This is the ip-address that needs to be given as the parameter while
creating the `ovndb_servers` resource.
This problem can be solved by two ways:
1. By using a native ocf resource agent ``ocf:heartbeat:IPaddr2``. The IPAddr2
resource agent is just a resource with an ip-address. When we colocate this
resource with the active server, pacemaker will enable the active server to be
connected with a single ip-address all the time. This is the ip-address that
needs to be given as the parameter while creating the `ovndb_servers` resource.
Use the following command to create the IPAddr2 resource and colocate it
with the active server::
@@ -258,3 +259,22 @@ with the active server::
$ pcs constraint order promote ovndb_servers-master then VirtualIP
$ pcs constraint colocation add VirtualIP with master ovndb_servers-master \
score=INFINITY
2. Using load balancer vip ip as a master_ip. In order to use this feature,
one needs to use listen_on_master_ip_only to no. Current code for load
balancer have been tested to work with tcp protocol and needs to be
tested/enchanced for ssl. Using load balancer, standby nodes will not listen on
nb and sb db ports so that load balancer will always communicate to the active
node and all the traffic will be sent to active node only. Standby will
continue to sync using LB VIP IP in this case.
Use the following command to create pcs resource using LB VIP IP::
$ pcs resource create ovndb_servers ocf:ovn:ovndb-servers \
master_ip="<load_balance_vip_ip>" \
listen_on_master_ip_only="no" \
ovn_ctl=<path of the ovn-ctl script> \
op monitor interval="10s" \
op monitor role=Master interval="15s"
$ pcs resource master ovndb_servers-master ovndb_servers \
meta notify="true"

View File

@@ -9,6 +9,7 @@
: ${SB_MASTER_PROTO_DEFAULT="tcp"}
: ${MANAGE_NORTHD_DEFAULT="no"}
: ${INACTIVE_PROBE_DEFAULT="5000"}
: ${LISTEN_ON_MASTER_IP_ONLY_DEFAULT="yes"}
CRM_MASTER="${HA_SBIN_DIR}/crm_master -l reboot"
CRM_ATTR_REPL_INFO="${HA_SBIN_DIR}/crm_attribute --type crm_config --name OVN_REPL_INFO -s ovn_ovsdb_master_server"
@@ -21,6 +22,10 @@ SB_MASTER_PROTO=${OCF_RESKEY_sb_master_protocol:-${SB_MASTER_PROTO_DEFAULT}}
MANAGE_NORTHD=${OCF_RESKEY_manage_northd:-${MANAGE_NORTHD_DEFAULT}}
INACTIVE_PROBE=${OCF_RESKEY_inactive_probe_interval:-${INACTIVE_PROBE_DEFAULT}}
# In order for pacemaker to work with LB, we can set LISTEN_ON_MASTER_IP_ONLY
# to false and pass LB vip IP while creating pcs resource.
LISTEN_ON_MASTER_IP_ONLY=${OCF_RESKEY_listen_on_master_ip_only:-${LISTEN_ON_MASTER_IP_ONLY_DEFAULT}}
# Invalid IP address is an address that can never exist in the network, as
# mentioned in rfc-5737. The ovsdb servers connects to this IP address till
# a master is promoted and the IPAddr2 resource is started.
@@ -117,6 +122,16 @@ ovsdb_server_metadata() {
<content type="string" />
</parameter>
<parameter name="listen_on_master_ip_only" unique="1">
<longdesc lang="en">
If set to yes, the OVNDBs will listen on master IP. Otherwise, it will
listen on 0.0.0.0. Set to yes when using pacemaker managed vip resource
as MASTER_IP; set to no when using external LB VIP.
</longdesc>
<shortdesc lang="en">Listen on master IP or 0.0.0.0</shortdesc>
<content type="string" />
</parameter>
</parameters>
<actions>
@@ -157,22 +172,25 @@ ovsdb_server_notify() {
${OVN_CTL} --ovn-manage-ovsdb=no start_northd
fi
conn=`ovn-nbctl get NB_global . connections`
if [ "$conn" == "[]" ]
then
ovn-nbctl -- --id=@conn_uuid create Connection \
# Not needed while listening on 0.0.0.0 as we do not want to allow
# local binds. However, it is needed if vip ip is binded to nodes.
if [ "x${LISTEN_ON_MASTER_IP_ONLY}" = xyes ]; then
conn=`ovn-nbctl get NB_global . connections`
if [ "$conn" == "[]" ]
then
ovn-nbctl -- --id=@conn_uuid create Connection \
target="p${NB_MASTER_PROTO}\:${NB_MASTER_PORT}\:${MASTER_IP}" \
inactivity_probe=$INACTIVE_PROBE -- set NB_Global . connections=@conn_uuid
fi
fi
conn=`ovn-sbctl get SB_global . connections`
if [ "$conn" == "[]" ]
then
ovn-sbctl -- --id=@conn_uuid create Connection \
conn=`ovn-sbctl get SB_global . connections`
if [ "$conn" == "[]" ]
then
ovn-sbctl -- --id=@conn_uuid create Connection \
target="p${SB_MASTER_PROTO}\:${SB_MASTER_PORT}\:${MASTER_IP}" \
inactivity_probe=$INACTIVE_PROBE -- set SB_Global . connections=@conn_uuid
fi
fi
else
if [ "$MANAGE_NORTHD" = "yes" ]; then
# Stop ovn-northd service. Set --ovn-manage-ovsdb=no so that
@@ -295,15 +313,13 @@ ovsdb_server_start() {
set ${OVN_CTL}
set $@ --db-nb-addr=${MASTER_IP} --db-nb-port=${NB_MASTER_PORT}
set $@ --db-sb-addr=${MASTER_IP} --db-sb-port=${SB_MASTER_PORT}
if [ "x${LISTEN_ON_MASTER_IP_ONLY}" = xno ]; then
set $@ --db-nb-port=${NB_MASTER_PORT}
set $@ --db-sb-port=${SB_MASTER_PORT}
if [ "x${NB_MASTER_PROTO}" = xtcp ]; then
set $@ --db-nb-create-insecure-remote=yes
fi
if [ "x${SB_MASTER_PROTO}" = xtcp ]; then
set $@ --db-sb-create-insecure-remote=yes
else
set $@ --db-nb-addr=${MASTER_IP} --db-nb-port=${NB_MASTER_PORT}
set $@ --db-sb-addr=${MASTER_IP} --db-sb-port=${SB_MASTER_PORT}
fi
if [ "x${present_master}" = x ]; then
@@ -313,15 +329,33 @@ ovsdb_server_start() {
# Force all copies to come up as slaves by pointing them into
# space and let pacemaker pick one to promote:
#
if [ "x${NB_MASTER_PROTO}" = xtcp ]; then
set $@ --db-nb-create-insecure-remote=yes
fi
if [ "x${SB_MASTER_PROTO}" = xtcp ]; then
set $@ --db-sb-create-insecure-remote=yes
fi
set $@ --db-nb-sync-from-addr=${INVALID_IP_ADDRESS} --db-sb-sync-from-addr=${INVALID_IP_ADDRESS}
elif [ ${present_master} != ${host_name} ]; then
# TODO: for using LB vip, need to test for ssl.
if [ "x${LISTEN_ON_MASTER_IP_ONLY}" = xyes ]; then
if [ "x${NB_MASTER_PROTO}" = xtcp ]; then
set $@ --db-nb-create-insecure-remote=yes
fi
if [ "x${SB_MASTER_PROTO}" = xtcp ]; then
set $@ --db-sb-create-insecure-remote=yes
fi
fi
# An existing master is active, connect to it
set $@ --db-nb-sync-from-addr=${MASTER_IP} --db-sb-sync-from-addr=${MASTER_IP}
set $@ --db-nb-sync-from-port=${NB_MASTER_PORT}
set $@ --db-nb-sync-from-proto=${NB_MASTER_PROTO}
set $@ --db-sb-sync-from-port=${SB_MASTER_PORT}
set $@ --db-sb-sync-from-proto=${SB_MASTER_PROTO}
fi
$@ start_ovsdb
@@ -416,6 +450,11 @@ ovsdb_server_promote() {
;;
esac
# Restart ovs so that new master can listen on tcp port
if [ "x${LISTEN_ON_MASTER_IP_ONLY}" = xno ]; then
${OVN_CTL} stop_ovsdb
ovsdb_server_start
fi
${OVN_CTL} promote_ovnnb
${OVN_CTL} promote_ovnsb