LDAP LB HA

"LDAP Load Balance And High Availability"

Posted by Stephen on January 20, 2021

前言

之前了解过Openldap同步机制来实现openldap服务器的冗余,但是会面临两个问题:

  1. 两台服务器无法通过负载均衡对外提验证服务
  2. 服务器单点故障

所以需要对服务器构建负载均衡且高可用的系统架构,避免服务器单点故障并实现负载均衡从而提高服务器性能。

本文章主要介绍LVS(Linux Virtual Server)与OpenLDAP应用服务器的结合实现负载均衡,并结合LVS、Keeplived实现OpenLDAP服务器服务器负载均衡且高可用的架构。

环境

系统环境

Distributor ID:	Kernel
Description:	Kernel 18.04.4 LTS
Release:	18.04
Codename:	bionic
Linux version :       5.3.0-46-generic ( buildd@lcy01-amd64-013 ) 
Gcc version:         7.5.0  ( Ubuntu 7.5.0-3ubuntu1~18.04 )

软件信息

version : 	
     None

正文

1、负载均衡、高可用

高可用

要实现服务高可用,目前常用的开源软件有:Keepalived。服务高可用架构,使用VIP作为前端相应的IP地址,但同时只能一台服务器提供服务,另外一台作为备机。当一台服务器出现故障时,HA软件通过检测机制,在备机上配置VIP地址并启动应用进程来实现切换。

负载均衡

实现服务器负载均衡有两种方法:

一种通过硬件设备实现,例如:F5、NetScaler、A10 Networks负载均衡器。

一种通过linux开源免费软件实现应用服务器负载均衡,例如:LVS、Nginx等。

nginx通过server -> proxy_pass-> upstream的名称映射到实际的ip地址

2、LVS介绍

2.1、LVS调度算法

本节介绍实现LVS负载均衡常见的8种调度算法。可以根据自己的环境来选择适合自己的环境的调度策略,来提高后端realserver的性能。

  • 轮询

    该算法将用户请求有次序地分发到后端的应用服务器,对所有realserver一视同仁,而并不计算具体服务器上的链接和负载情况,适用于服务器性能相同的环境。

  • 加权轮询

    该算法根据各个后端服务器的不同负载能力,给后端服务器设置不同的权重,处理能力前的应用服务器的权重设置较大,来响应更多的用户请求,适用于服务器性能差距大的环境。

  • 最少连接

    该算法将用户发送的请求分配到连接最少的后端应用服务器上。

  • 加权最少连接

    该算法根据应用服务器的不同负载能力,设置大小不同的权值,权重较大且连接请求数少的应用服务器优先分配用户请求,并提供响应。

  • 基于局部性的最小连接

    该算法是针对目标ip地址的负载均衡算法,主要用于缓存集群系统。此算法会根据用户请求的目标ip地址找出与目标地址最近的应用服务器,如果服务器没有超载,则请求被分发到该应用服务器,如果服务器不可用或者负载大,则使用最少连接算法,选择目标应用服务器。

  • 带复制且基于局部性的最少连接

    该算法也是针对目标ip地址的负载均衡算法,主要用于缓存集群系统。与基于局部性的最小连接的区别在于,前者维护一个ip地址到一组服务器的映射。而后者则维护一个ip地址到一台应用服务的映射。

  • 目标地址散列

    该算法将用户请求的目标地址作为散列键,并尝试从静态分配的散列表中找到对应的应用服务器。如果目标应用服务器没有超载,那么将用户的请求信息分发到该应用服务器,否则,返回空。

  • 源地址散列

    该算法将请求的源地址作为散列键,并尝试从静态分配的散列表中找出对应的应用服务器。如果目标应用服务器可用并没有超载,那么将用户请求的信息分发至此应用服务器,否则,返回空。

2.2、LVS集群工作模式

LVS集群工作模式有以下三种

  • NAT:网络地址转换模式

  • DR:直接路由模式

  • TUN:隧道模式

前期概念了解:

  1. director:

  2. switch:

  3. realserver:

  4. RIP:

  5. DIP:

LVS NAT 网络地址转换模式

image

用户发起请求,前端Director通过网络地址转换,将重写请求报文的目标地址,并根据Director的调度算法,将用户请求分发至后端的realserver;realserver接受请求,并将结果响应至Director,Director将响应报文的源地址重写,再返回给用户,完成整个负载调度的过程。

NAT特点:

  • 集群节点根diector必须在同一个IP网络中;
  • RIP通常是私有地址,仅用于各集群节点之间的通信;
  • director位于client和real server之间,并负责处理进出的所有通信;
  • realserver必须将网关指向DIP;
  • 支持端口映射;
  • realserver可以使用任意OS;
  • 比较大规模应用该场景中,director易成为系统瓶颈
LVS TUN 隧道模式

image

IP隧道模式工作在网络层,director通过接受TCP/IP请求,并将请求进行重新封装及通过调度策略转发至后端realserver,响应报文则直接由后端realserver进行响应。但director和后端realserver之间通过IP Tunneling协议进行转发,所以后端realserver必须支持IP Tunneling。

LVS-TUN特点:

  • 集群节点可以跨越Internet;

  • RIP必须是公网地址;

  • director仅负责处理入站请求,响应报文则由realserver直接发往客户端;

  • realserver网关不能指向director;

  • 只有支持隧道功能的os才能用于realserver;

  • 不支持端口映射。

LVS DR(直接路由)模式

image

直接路由模式工作在数据链路层,director和后端realserver使用同一个VIP地址进行对外提供服务,但此时只有director接收用户请求,后端realserver对本地中的ARP请求进行屏蔽,屏蔽通过arp_ignore和arp_announce两个选项进行配置。前端director接收用户请求后,并根据调度算法定位后端对应的realserver,将其目的MAC地址更为为指定realserver的MAC地址,然后转发至匹配的realserver。响应报文由realserver直接响应用户,完成整个调度过程。

LVS-DR特点:

  • 集群节点跟director必须在同一个物理网络中
  • RIP可以使用公网地址,实现便捷的远程管理和监控
  • director仅负责处理入站请求,响应报文则由realserver直接发往客户端
  • realserver不能将网关指向DIP
  • 不支持端口映射

2.3、ipvsadm命令

ipvsadm的管理集群服务的命令行工具。为了更好地配置LVS,我们需要了解ipvsadm命令的用法,方便后期运维、管理LVS负载均衡服务器。

$ ipvsadm -A|E|D|C|R|S -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
  • -A : 在内核的虚拟服务器列表中添加一条VIP记录。
  • -E :修改内核虚拟服务器列表中的一条VIP记录。
  • -t:表示集群服务所使用的TCP协议
  • -u:表示集群服务所使用的UDP协议
  • -f:表示给后端realserver指定端口贴上防火墙的标签
  • serveice-address:表示集群服务所使用的ip地址,简称VIP
  • -s:表示集群服务所使用的调度算法
  • -p:设置集群持久连接时间。
  • -M:定义集群服务的子网掩码。

3、LVS与openldap集成

  1. 编译安装ipvsadm

    容器启动后会有一些问题: 一、由于内核限制,无法启动ipvsadm 解决方法:宿主机先安装ipvsadm,同时要运行下ipvsadm命令,每次重启宿主机后都要运行下ipvsadm命令,不然docker里的ipvsadm还是会报错 宿主机安装ipvsadm:

    sudo yum install ipvsadm
    

    二、无法修改/proc下的文件,就无法为RS设置拒绝ARP响应 解决方法:启动容器时设置高权限,加–privileged,在制作镜像时无法加入高权限,所以只能在容器用高权限启动后再运行rs.sh脚本进行lvs的相关设置

  2. 前端负载均衡规划

    1. 定义前端VIP地址
    2. 配置本机内核路由转发功能
    3. 定义虚拟VIP主机出口路由接口
    4. 配置防火墙
    5. 定义虚拟服务器记录及调度策略
    6. 添加后端realserver及模式
    7. 查看虚拟服务器以及后端realserver
  3. 后端realserver部署

    1. 配置本机本地回环地址VIP
    2. 配置VIP地址出口路由地址及出口设备名
    3. 禁止本机ARP请求
    4. 验证配置结果
  4. 客户端验证

    1. 通过命令setup/authconfig-tui配置Openldap客户端
    2. 通过代码在客户端验证
    3. 通过代码模拟realserver异常
    4. 通过代码在客户端验证账号

4、realserver健康监测

  1. 定义realserver监控脚本

    1. 定义监控脚本
    2. 进行后端realserver进程健康状况监测
    3. 模拟端口异常
    4. director监控脚本异常报警
    5. 在客户端验证账号是否正常
    6. 获取ipvsadm集群服务后端realserver状态
    7. 恢复异常realserver
    8. Director监控脚本恢复报警
    9. 查看ipvsadm集群服务后端realserver状态
  2. 自动部署LVS、realserver

    通过自定义脚本自动化部署前端负载均衡及后端realserver,此脚本支持三个参数,分别是start、stop、status,用于实现LVS的配置、暂停及查看状态。

    通过脚本编程定制两个脚本分别用于前端调度器及后端realsever的部署,本节通过shell脚本编程实现部署,脚本名称分别是:director-config.sh和realserver-config.sh,脚本支持三个选项,分别是start(配置)、status(查看状态)、stop(清除配置策略)。

    dirtcotr-config.sh主要用于前端负载均衡配置,如VIP地址、后端realserver地址、调度算法等。realserver-config.sh主要用于后端realserver相关配置,如lo端口配置vip、arp_ignore、arp_announce模式配置等。

    1. 自动部署LVS

      前端负载均衡部署脚本

      $ cat >> director-config.sh << EOF
      #! /bin/bash
      # LVS script for VS/DR mode
      . /etc/rc.d/init.d/functions	# 加载系统函数
      VIP=192.168.218.214			# 前端提供服务器虚拟地址
      RIP1=192.168.218.205
      RIP2=192.168.218.206		# 后端真实服务器地址
      PORT=389	# 指定端口
      case "$1" in
      start)
      	/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up
      	/sbin/route add -host $VIP dev eth0:1	#定义虚拟vip主机路由
      	echo 1 > /proc/sys/net/ipv4/ip_forward	#开启系统路由转发功能
      	/sbin/iptables -F # 清除防火墙规则
      	/sbin/iptables -Z # 重置防火墙计数器
      	/sbin/ipvsadm -C
      	/sbin/ipvsadm -A -t $VIP:$PORT -s rr
      	/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP1 -g
      	/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP2 -g
      	/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
      ;;
      stop)
      	echo 0 > /proc/sys/net/ipv4/ip_forward
      	/sbin/ipvsadm -C
      	/sbin/ifconfig eth0:1 down
      	/sbin/route del $VIP
      	/bin/rm -f /var/lock/subsys/ipvsadm
      	echo "ipvs is stopped..."
      ;;
      status)
      	if [! -e /var/lock/subsys/ipvsadm ]; then
      		echo "ipvsadm is stopped..."
      	else
      		echo "ipvs is running ..."
      		ipvsadm -L -n
      	fi
      ;;
      *)
      	echo "Usage:$0 {start|stop|status}"
      ;;
      esac
      EOF
      

      通过以下命令添加director-config.sh脚本执行权限并运行

      chmod +x director-config.sh
      ./director-config.sh start
      
    2. 自动部署realserver

      后端realserver部署脚本如下

      $ cat > realserver-config.sh << EOF
      #!/bin/bash
      # Script to start LVS DR real server
      # description:LVS DR real server
      . /etc/rc.d/init.d/functions
      VIP=192.168.218.214
      host=`/bin/hostname`
      case "$1" in
      start)
      	/sbin/ifconfig lo down
      	/sbin/ifconfig lo up
      	echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
      	echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
      	echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
      	echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
      	/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
      	/sbin/route add -host $VIP dev lo:0
      ;;
      stop)
      	/sbin/ifconfig lo:0 down
      	echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
      	echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
      	echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
      	echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
      ;;
      status)
      	islothere=`/sbin/ifconfig lo:0 | grep $VIP`
      	isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
      	if [ ! "$islothere" -o ! "$isrothere" ]; then
      		echo "LVS-DR real server Stopped."
      	else
      		echo "LVS-DR real server Running."
      	fi
      ;;
      *)
      	echo "$0:Usage: $0 {start|stop|status}"
      ;;
      esac
      EOF
      

      通过以下命令添加执行权限并执行

      chmod +x realserver-config.sh
      ./realserver-config.sh start
      

5、openldap开源负载高可用架构

采用keepalived、LVS实现Openldap负载均衡高可用架构来取代商业化架构

5.1、部署规划

image

主机 系统版本 IP地址 主机名 VIP地址
LDAP Master alpine 172.18.0.3 ldap_master 172.18.0.10
LDAP Slave alpine 172.18.0.4 ldap_slave1 172.18.0.10
LVS-Master alpine 172.18.0.11 lvs_master 172.18.0.10
LVS-Slave alpine 172.18.0.12 lvs_slave 172.18.0.10
LAM alpine 172.18.0.9 lam  

5.2、keepalived部署

安装keepalived

​ 环境一致

通过以下命令定义配置文件及Keepalived进程

$ mkdir /etc/keepalived		# 创建Keepalived 配置文件目录
$ cp /usr/local/sbin/keepalived /usr/sbin	# 定义Keepalived二进制命令
$ cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/	# 定义Keepalived配置文件
$ cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/	# 定义Keepalived进程脚本
$ cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/	# 定义Keepalived启动进程

配置Keepalived

# 两台负载均衡的keepalived 配置文件几乎完全相同,唯一区别的是state(状态)及priority(优先级)。Keepalived会根据state和priority判断VIP配置在哪个节点上提供负载服务

$ cat keepalived.conf
# ! Configuration File for keepalived

global_defs {
	notification_email {
		test@qq.com								# 定义接收邮件地址
	}
	notification_email_from keepalived@gby.com	# 当发生故障时,发送者地址
	smtp_server 127.0.0.1						# 定义邮件服务器地址
	smtp_connect_timeout 30						# 超时时间
	router_id 	OpenLDAP-SERVER					# id 名称
}

vrrp_instance VI_1	{							# 实例名称
	state MASTER								# Keepalived类型,备用机为BACKUP
	interface	eth0							#本机网卡
	virtual_router_id 51							# 虚拟路由id,对于同一组应用,master和backup id 名称相同
	priority 99									# 优先级,主服务和备用机优先级不能相同,主大备小
	advert_int 3								# 组播频率
	authentication {
		auth_type PASS							# 认证方式
		auth_pass 1111							# 认证密码
	}
	virtual_ipaddress {							# 虚拟IP地址池,可以配置多个VIP提供冗余
		172.18.0.10						
	}
}

## LVS配置
virtual_server 172.18.0.10 389 {
	delay_loop 6
	lb_algo rr		# 负载均衡模式为rr轮询
	# nat_mask 255.255.255.0
	protocol TCP	# 使用的协议为TCP
	real_server	172.18.0.3 389{
		weight 1	# 配置权重
		TCP_CHECK {
			# tcp_port 389	#检测后端realserver应用端口,这里为389
			connect_timeout 3
			retry 3
			delay_before_retry 3
		}
	}
	real_server 172.18.0.4 389{
		weight 1
		TCP_CHECK {
			# tcp_port 389
			connect_timeout 3
			retry 3
			delay_before_retry 3
		}
	}
}

取消LVS所有配置

# 将LVS上VIP和后端realserver剔除,通过Keepalived来管理VIP及realserver状态
$

通过命令行加载Keepalived进程服务。

日志情况

获取VIP配置信息

$ ip addr | grep -i eth0

通过ipvsadm指令获取集群服务以及后端realserver状态

$ ipvsadm -L -n

5.3、客户端验证

客户端验证

5.4、Keepalived异常检测

按以下步骤对Keepalived进行异常检测

  1. 在节点1上模拟Keepalived服务异常,命令如下

    $ service keepalived stop
    
  2. 在节点1上监测Keepalived日志,日志内容如下

    $ docker logs my_keepalived_node_1
    

    从结果发现,节点1停止Keepalived进城后,将VIP地址移除。

  3. 在节点2监测Keepalived日志,日志内容如下

    $ docker logs my_keepalived_node_2
    

    以上内容,在节点上获取VIP信息、集群服务以及后端realserver的添加、规则的配置等操作。

  4. 获取VIP及集群信息

    $ ip addr | grep eth0
    

注:节点2成功获取VIP地址后,通过ipvsadm指令查看当前就能资源池,它包含后端两台realserver,且负载均衡调度策略为轮询,可以根据当前实际环境及业务特性合理配置调度策略。

后记

None