负载均衡高可用服务keepalived

高可用服务(冗余服务)介绍

作用简述: 避免单点故障 (主服务器出现故障, 备用服务器顶上)

各个服务对应高可用:

(1) 负载均衡服务: keepalived

(2) 数据库服务: MHA

(3) 存储服务器: Heartbeat + debd(数据同步服务) 或 keepalived + sersync / 脚本

(4) 备份服务器: 数据同步(rsync + 定时任务)

keepalived实现负载均衡服务器 高可用过程:

keepalived软件介绍:

(1) 利用keepalived软件实现管理LVS服务(互相搭配)

(2) 利用keepalived软件实现后端节点健康检查功能

(3) 利用keepaliced软件实现冗余功能(高可用功能)

keepalived实现高可用(冗余)服务原理

利用利VRRP协议

(1) 当多台同样功能服务器启动后 , 服务器之间会通过vrrp协议连接 对比各自配置文件权限数值 竞选出主备关系

(2) 主服务器会生成一个VIP信息(虚拟IP)

(3) 主服务器会持续发送组播包 证明自己还没出故障 防止出现脑裂故障 (多台服务器都成为主服务器现象) 当没有接收到主服务器发送的组播包时 备用服务器会取代主服务器的位置 变成主服务器 以保证架构稳定运行 当主服务器再次启动会抢占回资源 变回主服务器

PS: VRRP协议传输数据时使用的是明文传输 (可设为密文 但没必要)

nginx 负载均衡高可用服务部署过程

keepalived搭建负载均衡服务器高可用架构

第一步: 准备架构环境

准备环境 最少两台lb负载均衡服务器 并部署nginx服务和keepalived服务

yum -y install keepalived 直接安装即可

第二步: 编写配置文件

nginx

编写主配置文件 实现负载均衡服务

vim /etc/nginx/nginx.conf

 upstream old{

 server 10.0.0.7:80;

 server 10.0.0.8:80;

 server 10.0.0.9:80;

 }

 server{

 listen 80;

 server_name localhost;

 location / {

 proxy_pass http://old;

 proxy_set_header Host $host;

 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404 http_429 non_idempotent;

 proxy_set_header X-Forwarded-For $remote_addr;

 }

 }

keepalived

编写配置文件实现高可用

vim /etc/keepalived/keepalived.conf

(主要编写前35行 以下先暂时删除)

! Configuration File for keepalived                  注释信息

global_defs { ß 定义全局配置    

 notification_email { ß 定义通知邮箱地址信息

 [email protected]

 [email protected]

 [email protected]

 }

 notification_email_from [[email protected]](mailto:[email protected]) 

 smtp_server 192.168.200.1

 smtp_connect_timeout 30

 router_id lb01             标识主机身份信息

}

vrrp_instance old {         定义一个高可用组

 state MASTER               定义主备主机 BACKUP(备用)

 interface eth0             定义在那张网卡上生成VIP信息

 virtual_router_id 60       高可用组数值标识,主备需要一致 63会出问题

 priority 110               定义权限数值 数值高的为主服务器

 advert_int 1               组播包发送间隔时间(默认为秒)

 authentication {           设置组播通讯认证功能

 auth_type PASS

 auth_pass 1111

 }

 virtual_ipaddress {

 10.0.0.3                    指定VIP(虚拟IP)地址信息

 }

}

第三步: 启动服务

systemctl start keepalived 启动服务

ip a 检查是否配置成功(主服务器是否有VIP地址)

keepalived高可用服务常见问题

第一种 : 高可用脑裂问题

出现原因:

一般为主服务器还可用 备用服务器收不到组播包信息 自然自身变成主服务器

造成故障可能原因

(1) 防火墙服务开启了 阻止了组播包的通讯

(2) 高可用集群之间 通讯连接头问题 无法传输组播包

(3) 仲裁服务器出现问题

解决办法:

利用脚本 通过监控VIP地址 发生主备切换及时查看是什么原因造成的

监控脑裂脚本

#!/bin/bash

ip a|grep 10.0.0.3 &>/dev/null ß 查看是否有vip地址

if [ $? -eq 0 ]

then

 echo "master and backup change"|mail -s "check keepalived server" [[email protected]](mailto:[email protected])  
若是发生切换 发送邮件通知

fi

放入定时任务中执行即可

第二种 : keepalived存在价值

当负载均衡服务因为各种事情关闭 这时keepalived服务还在运行 并不会交出vip权限 这样会造成网站无法访问

解决思路: 编写一个监控nginx服务进程或监控nginx服务端口的脚本 然后调入到keeplived配置文件中

需求:

a 实现主服务器有问题, 切换到备服务器

b 实现主服务器恢复, 自动切换回主服务器

weight权重数值: 利用权重数值和优先级进行运算

运算条件: 和监控的脚本有关:

weight是正数: 即为 weight 100

脚本运行成功: 最终优先级 = 优先级 + weight

脚本运行错误: 最终优先级 = 优先级 即为原优先级

weight是负数: 即为 weight -100

脚本运行成功: 最终优先级 = 优先级 即为原优先级

脚本运行错误: 最终优先级 = 优先级 – weight数值

运算过程: 假设原优先级为100 脚本错误时即为 100-100=新优先级

脚本编写

#!/bin/bash

port_info=$(netstat -lntup|grep -w 80|wc -l)

if [ $port_info -eq 0 ]

then

 exit 0                        判断符合设置返回值为0

else 

  exit 1                       判断不符合指定返回值为1

fi

判断页面显示是否正常 错误就启用备用负载均衡服务器

#!/bin/bash

code_info="$(curl -I -s -o /dev/null -w "%{http_code}\n" -H hosts:www.oldboy.com 10.0.0.3/oldboy.html)"

if [ $code_info -eq 200 ] 权重数值一定是负值

then

 exit 0

else

 exit 1

fi

将脚本调入到keepalived配置文件中

! Configuration File for keepalived

 global_defs {

 notification_email {

 [email protected]

 [email protected]

 [email protected]

 }

 notification_email_from [email protected]

 smtp_server 192.168.200.1

 smtp_connect_timeout 30

 router_id lb01

 }

vrrp_script check_web {                --- 定义需要监控脚本文件信息

 script "/server/scripts/check_web.sh" --- 绝对路径定义脚本文件/脚本文件必须有执行权限

 interval 2                            --- 脚本执行间隔周期 

 weight 2 --- ???

 }

vrrp_instance oldboy {                  ---  在vrrp_instance模块内调用定义的脚本模块

 state MASTER

 interface eth0

 virtual_router_id 63

 priority 110

 advert_int 1

 authentication {

 auth_type PASS

 auth_pass 1111

 }

 virtual_ipaddress {

 10.0.0.3

 }

 track_script {              --- 定期运行监控脚本

 check_web

 }

 }

企业中服务网络安全访问配置

目的: 尽可能不暴露企业服务器IP地址信息给用户

实现方法

修改lb负载均衡配置文件

upstream oldboy {

 server 10.0.0.7:80;

 server 10.0.0.8:80;

 server 10.0.0.9:80;

}   

server {

 listen 10.0.0.3:80;              定义只监控10.0.0.3ip地址发送过来的请求

 server_name localhost;

 location / {

 proxy_pass http://oldboy;

 proxy_set_header Host $host;

 proxy_set_header X-Forwarded-For $remote_addr;

 }

}

注意项:修改内核

01. nginx程序涉及到IP地址修改,必须重启nginx

02. 监听的地址必须是本地网卡上有的地址

如何监听网卡上没有的地址:

解决方法:

echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf

sysctl -p

高可用双主配置

双主介绍 当用户访问不同的网址时, 高可用集群中不同的主机成为指定域名的主负载服务器

实现原理: 设置多个实例 分开主备服务器配置即可

第一步 编写例子:

vrrp_instance oldboy {

 state MASTER

 interface eth0

 virtual_router_id 63

 priority 110

 advert_int 1

 authentication {

 auth_type PASS

 auth_pass 1111

 }

 virtual_ipaddress {

 10.0.0.3

 }

}

vrrp_instance old {              配置多个实例 将副实例进行降级配置

 state BACKUP

 interface eth0

 virtual_router_id 64            多个实例ID数值要不一致

 priority 100                    权限值降低 配置成为备用服务器

 advert_int 1

 authentication {

 auth_type PASS

 auth_pass 1111

 }

 virtual_ipaddress {

 10.0.0.4                        设置的VIP不要一致

 }

}

第二步 修改负载均衡配置文件

例子: 两种配置方式

方式一:

server {

 listen 10.0.0.3:80;

 server_name www.oldboy.com;

 location / {

 proxy_pass http://oldboy;

 proxy_set_header Host $host;

 proxy_set_header X-Forwarded-For $remote_addr;

 }

}

server {

 listen 10.0.0.4:80;

 server_name bbs.oldboy.com;

 location / {

 proxy_pass http://oldboy;

 proxy_set_header Host $host;

 proxy_set_header X-Forwarded-For $remote_addr;

 }

}

写多个server 比较low 知道就行

方式二:

server {

 listen 10.0.0.3:80;

 listen 10.0.0.4:80;

 server_name localhost;

 location / {

 proxy_pass http://oldboy;

 proxy_set_header Host $host;

 proxy_set_header X-Forwarded-For $remote_addr;

 }

}

在一个server下写多个listen 配置接收多个VIP发送过来的请求

最后重启服务后生效

你可能感兴趣的:(负载均衡高可用服务keepalived)