前言
之前了解过Openldap同步机制来实现openldap服务器的冗余,但是会面临两个问题:
- 两台服务器无法通过负载均衡对外提验证服务
- 服务器单点故障
所以需要对服务器构建负载均衡且高可用的系统架构,避免服务器单点故障并实现负载均衡从而提高服务器性能。
本文章主要介绍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:隧道模式
前期概念了解:
-
director:
-
switch:
-
realserver:
-
RIP:
-
DIP:
LVS NAT 网络地址转换模式
用户发起请求,前端Director通过网络地址转换,将重写请求报文的目标地址,并根据Director的调度算法,将用户请求分发至后端的realserver;realserver接受请求,并将结果响应至Director,Director将响应报文的源地址重写,再返回给用户,完成整个负载调度的过程。
NAT特点:
- 集群节点根diector必须在同一个IP网络中;
- RIP通常是私有地址,仅用于各集群节点之间的通信;
- director位于client和real server之间,并负责处理进出的所有通信;
- realserver必须将网关指向DIP;
- 支持端口映射;
- realserver可以使用任意OS;
- 比较大规模应用该场景中,director易成为系统瓶颈
LVS TUN 隧道模式
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(直接路由)模式
直接路由模式工作在数据链路层,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集成
-
编译安装ipvsadm
容器启动后会有一些问题: 一、由于内核限制,无法启动ipvsadm 解决方法:宿主机先安装ipvsadm,同时要运行下ipvsadm命令,每次重启宿主机后都要运行下ipvsadm命令,不然docker里的ipvsadm还是会报错 宿主机安装ipvsadm:
sudo yum install ipvsadm
二、无法修改/proc下的文件,就无法为RS设置拒绝ARP响应 解决方法:启动容器时设置高权限,加–privileged,在制作镜像时无法加入高权限,所以只能在容器用高权限启动后再运行rs.sh脚本进行lvs的相关设置
-
前端负载均衡规划
- 定义前端VIP地址
- 配置本机内核路由转发功能
- 定义虚拟VIP主机出口路由接口
- 配置防火墙
- 定义虚拟服务器记录及调度策略
- 添加后端realserver及模式
- 查看虚拟服务器以及后端realserver
-
后端realserver部署
- 配置本机本地回环地址VIP
- 配置VIP地址出口路由地址及出口设备名
- 禁止本机ARP请求
- 验证配置结果
-
客户端验证
- 通过命令setup/authconfig-tui配置Openldap客户端
- 通过代码在客户端验证
- 通过代码模拟realserver异常
- 通过代码在客户端验证账号
4、realserver健康监测
-
定义realserver监控脚本
- 定义监控脚本
- 进行后端realserver进程健康状况监测
- 模拟端口异常
- director监控脚本异常报警
- 在客户端验证账号是否正常
- 获取ipvsadm集群服务后端realserver状态
- 恢复异常realserver
- Director监控脚本恢复报警
- 查看ipvsadm集群服务后端realserver状态
-
自动部署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模式配置等。
-
自动部署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
-
自动部署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、部署规划
主机 | 系统版本 | 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上模拟Keepalived服务异常,命令如下
$ service keepalived stop
-
在节点1上监测Keepalived日志,日志内容如下
$ docker logs my_keepalived_node_1
从结果发现,节点1停止Keepalived进城后,将VIP地址移除。
-
在节点2监测Keepalived日志,日志内容如下
$ docker logs my_keepalived_node_2
以上内容,在节点上获取VIP信息、集群服务以及后端realserver的添加、规则的配置等操作。
-
获取VIP及集群信息
$ ip addr | grep eth0
注:节点2成功获取VIP地址后,通过ipvsadm指令查看当前就能资源池,它包含后端两台realserver,且负载均衡调度策略为轮询,可以根据当前实际环境及业务特性合理配置调度策略。
后记
None