From 3bef84147bd7df52e8303bcb5481ce5d3351f997 Mon Sep 17 00:00:00 2001 From: Yanis Guenane Date: Tue, 7 Apr 2015 12:42:35 +0200 Subject: Loadbalancer: Add support for Redis Add support for Redis in the loadbalancer setup. Redis loadbalancing system is particular as it does not provide clustering capabilities yet, hence this pattern[1] will be applied. [1] https://github.com/falsecz/haredis Change-Id: I80a6c284af9eceb6b669a03c5d93256261523331 --- manifests/loadbalancer.pp | 27 +++++++++++++++++++++ manifests/redis_notification.pp | 38 ++++++++++++++++++++++++++++++ templates/redis/redis-notifications.sh.erb | 30 +++++++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 manifests/redis_notification.pp create mode 100644 templates/redis/redis-notifications.sh.erb diff --git a/manifests/loadbalancer.pp b/manifests/loadbalancer.pp index 1d60507..cb54682 100644 --- a/manifests/loadbalancer.pp +++ b/manifests/loadbalancer.pp @@ -130,6 +130,10 @@ # (optional) Enable or not RabbitMQ binding # Defaults to false # +# [*redis*] +# (optional) Enable or not Redis binding +# Defaults to false +# class tripleo::loadbalancer ( $controller_virtual_ip, $control_virtual_interface, @@ -157,6 +161,7 @@ class tripleo::loadbalancer ( $horizon = false, $mysql = false, $rabbitmq = false, + $redis = false, ) { if !$controller_host and !$controller_hosts { @@ -572,4 +577,26 @@ class tripleo::loadbalancer ( } } + if $redis { + haproxy::listen { 'redis': + ipaddress => [$controller_virtual_ip], + ports => 6379, + options => { + 'timeout' => [ 'client 0', 'server 0' ], + 'mode' => 'tcp', + 'balance' => 'first', + 'option' => ['tcp-check',], + 'tcp-check' => ['send info\ replication\r\n','expect string role:master'], + }, + collect_exported => false, + } + haproxy::balancermember { 'redis': + listening_service => 'redis', + ports => '6379', + ipaddresses => $controller_hosts_real, + server_names => $controller_hosts_names_real, + options => ['check', 'inter 2000', 'rise 2', 'fall 5'], + } + } + } diff --git a/manifests/redis_notification.pp b/manifests/redis_notification.pp new file mode 100644 index 0000000..ad059a0 --- /dev/null +++ b/manifests/redis_notification.pp @@ -0,0 +1,38 @@ +# Copyright 2015 Red Hat, Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# == Class: tripleo::redis_notification +# +# Configure the Redis notification script that talks to HAProxy +# +# === Parameters: +# +# [*haproxy_monitor_ip*] +# (String) IP address on which HAProxy is listening on +# Defaults to 127.0.0.1 +# +class tripleo::redis_notification ( + $haproxy_monitor_ip = '127.0.0.1', +) { + + file { '/usr/local/bin/redis-notifications.sh' : + ensure => file, + content => template('tripleo/redis/redis-notifications.sh.erb'), + owner => 'root', + group => 'root', + mode => '0755', + } + +} diff --git a/templates/redis/redis-notifications.sh.erb b/templates/redis/redis-notifications.sh.erb new file mode 100644 index 0000000..aa368e9 --- /dev/null +++ b/templates/redis/redis-notifications.sh.erb @@ -0,0 +1,30 @@ +#!/bin/bash +HAPROXY="<%= @haproxy_monitor_ip %>:1993" +CMD="$1" +ARGS="$2" +ARG1=`echo $ARGS | awk '{print $1}'` + + +call_curl () { + DATA=`echo "s=$1&action=$2&b=%234" | sed -e s/:/%3A/` + curl --silent -o /dev/null $HAPROXY --data "$DATA" + echo curl $HAPROXY --data "$DATA" + return 0 +} + + +[ "$CMD" = "+odown" ] && [ "$ARG1" = "master" ] && \ + call_curl `echo $ARGS | awk '{print $2 ":" $3 ":" $4}'` 'disable' + +[ "$CMD" = "+sdown" ] && [ "$ARG1" = "slave" ] && \ + call_curl `echo $ARGS | awk '{print $6 ":" $3 ":" $4}'` 'disable' + +[ "$CMD" = "+switch-master" ] && \ + call_curl `echo $ARGS | awk '{print $1 ":" $4 ":" $5}'` 'enable' && + call_curl `echo $ARGS | awk '{print $1 ":" $2 ":" $3}'` 'disable' + +[ "$CMD" = "-odown" ] && [ "$ARG1" = "master" ] && \ + call_curl `echo $ARGS | awk '{print $2 ":" $3 ":" $4}'` 'enable' + +# without exit code, sentinel thinks the script is still running and locks any further execution +exit 0 -- cgit 1.2.3-korg