高可用服务(冗余服务)介绍
作用简述: 避免单点故障 (主服务器出现故障, 备用服务器顶上)
各个服务对应高可用:
(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发送过来的请求
最后重启服务后生效