一、HA高可用服务
1、概述
高可用:HA(HighAvailablity) ------》Keepalived
选型 | 说明 |
---|---|
keepalived | 活着 高可用软件,负载使用,一些不涉及数据服务. |
heartbeat | 心跳 高可用软件,涉及数据库,存储数据相关可以用。heartbeat + drbd |
商业高可用软件 | RoseHA |
2、原理
keepalived是基于VRRP协议实现高可用.
VRRP虚拟路由器冗余协议,最开始是给网络设备实现高可用.目前keepalive实现vrrp协议,通过vrrp实现高可用.
分为主,备一般是2个节点.主备之间通过vrrp协议发送数据包沟通.
主给备定期发送数据包,备收到数据包表示主还活着,备无法收到数据包,表示主挂了,备胎转正了,接管用户请求流量.
vrrp协议使用组播的ip. 224.xx.xx.xx
3、极速上手指南
高可用环境准备 | 需要安装的服务 |
---|---|
Lb01 | nginx + keepalived |
Lb02 | nginx + keepalived |
部署服务
yum install -y keepalived
keepalived配置文件分类(分为3个部分)
/etc/keepalived/keepalived.conf配置文件结构 | 说明 |
---|---|
global_defs | 全局定义部分 |
vrrp_instance | vrrp协议配置,vip,主备,网卡....经常改动部分 |
用于管理与配置lvs的部分 | virtual_server部分 用于管理控制lvs的.(lvs再说) |
perl
! Configuration File for keepalived
global_defs {
router_id lb01
#每一个keepalived的名字,当前网络中唯一
}
#vrrp实例配置部分 用于配置VIP virtual_ipaddress
vrrp_instance vip_3 {
#vrrp实例名字,设置在1对主备之间使用的名字.注意在同一对主备之间这个名字要一致.
state MASTER #主/备 MASTER主 BACKUP备 注意大写
interface eth0 #指定网卡网卡
virtual_router_id 51 #1对主备之间id号同一即可.
priority 100 #优先级 数字越大优先级越高 设置建议: 主>备 100 50 相差50
advert_int 1 #心跳间隔 多久发送一次vrrp数据
authentication {
#授权与认证,保持默认即可. 对数据包进行加密
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置vip(虚拟IP),不能与内网IP重复。保证lb的心跳IP唯一
10.0.0.3 dev eth0 label eth0:0
}
lb01
csharp
[root@clb1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance vip_3 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
lb02
csharp
[root@clb2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance vip_3 {
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
4、抓包查看
5、问题
1)脑裂故障
现象:主备都有vip.
原因:
- 备认为主挂了,接管资源生成VIP.实际上主并没有挂,仍有VIP.
- 有很多原因可以导致脑裂,开启防火墙,selinux,keepalived配置,物理线路.
解决:
- 监控(备节点监控),只要备节点有vip就告警.
2)keepalived基于主机高可用软件
keepalived只会在主机挂了,网络断开后,才会进行主备切换. 默认情况下keepalived不会监控某个服务.
项目步骤:
- 书写脚本,过滤服务进程数,端口数量,检查是否运行.
- 然后进行判断如果服务没有运行,则关闭keepalived.
- 修改keepalived配置文件,通过keepalived调用这个脚本.
书写脚本
注意给脚本执行权限. 脚本名字中不要包含服务名字.
bash
#!/bin/bash
#author: lidao996
#desc: 监控 nginx 端口数量
port_cnt=`ss -lntup |grep nginx |wc -l`
if [ $port_cnt -eq 0 ];then
systemctl stop keepalived
fi
书写keepalived配置文件
csharp
[root@clb1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
#定义监控脚本
vrrp_script keep_lb.sh {
script /server/scripts/keep_lb.sh
interval 2
weight 1
user root
}
vrrp_instance vip_3 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3 dev eth0 label eth0:0
}
}
6、进阶用法
1)非抢占模式
keepalived 主备默认是抢占式,主挂了,备接管.主恢复,不希望主重新抢回资源.
配置非抢占式模式即可.
2个节点状态是备,并且配置nopreempt选项
2)双主模式
应对高并发的时候设置的双主模式.
二、Https证书
1、Https概述
基于http协议,传输的时候进行加密.
如果不使用https,数据传输都是明文的.
应用场景:
- 目前大部分的业务都是使用https加密.
- 企业想使用http 2.0 基于https.
部署https加密的流程
- 域名 *.jd.com www.jd.com
- 根据域名申请https证书(私钥与公钥(ca证书)),自己创建.
- 进行配置web/lb.
2、Https加密流程(单台)
申请的https证书的域名与网站域名一致,才能正常使用. 否则用户访问会有警告与提示.
ini
[root@web01 ]# mkdir -p /etc/nginx/ssl_keys/
[root@web01 ]# cat /etc/nginx/conf.d/ssl.oldboylinux.cn.conf
server {
listen 443 ssl;
server_name ssl.oldboylinux.cn;
root /app/code/ssl;
#ssl key
ssl_certificate /etc/nginx/ssl_keys/ssl.oldboylinux.cn.pem;
ssl_certificate_key /etc/nginx/ssl_keys/ssl.oldboylinux.cn.key;
location / {
index index.html;
}
}
[root@web01 /etc/nginx/ssl_keys]# mkdir -p
/app/code/ssl
[root@web01 /etc/nginx/ssl_keys]# echo
ssl.oldboylinux.cn web01 > /app/code/ssl/index.ht
3、http跳转https
ini
server {
listen 80;
server_name ssl.oldboylinux.cn;
return 301 https://ssl.oldboylinux.cn$request_uri;
}
server {
listen 443 ssl;
server_name ssl.oldboylinux.cn;
root /app/code/ssl;
ssl_certificate /etc/nginx/ssl_keys/ssl.oldboylinux.cn.pem;
ssl_certificate_key /etc/nginx/ssl_keys/ssl.oldboylinux.cn.key;
location / {
index index.html;
}
}
4、网站集群https配置
1)全部加密
Web01
ini
server {
listen 443 ssl;
server_name ssl.oldboylinux.cn;
root /app/code/ssl;
ssl_certificate /etc/nginx/ssl_keys/ssl.oldboylinux.cn.pem;
ssl_certificate_key /etc/nginx/ssl_keys/ssl.oldboylinux.cn.key;
location / {
index index.html;
}
}
Clb01
ini
upstream ssl_pools {
server 10.0.0.7:443 ;
}
server {
listen 80;
server_name ssl.oldboylinux.cn;
return 301 https://ssl.oldboylinux.cn$request_uri;
}
server {
listen 443 ssl;
server_name ssl.oldboylinux.cn;
root /app/code/ssl;
ssl_certificate /etc/nginx/ssl_keys/ssl.oldboylinux.cn.pem;
ssl_certificate_key /etc/nginx/ssl_keys/ssl.oldboylinux.cn.key;
location / {
proxy_pass https://ssl_pools;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
配置http 2.0
arduino
listen 443 ssl http2;
2)外网加密
ini
#web配置
server{
listen 80;
server_name ssl.oldboylinux.cn;
root /app/code/ssl;
location / {
index index.html;
}
}
#lb配置
upstream ssl_pools {
server 10.0.0.7:80 ;
}
server {
listen 80;
server_name ssl.oldboylinux.cn;
return 301 https://ssl.oldboylinux.cn$request_uri;
}
server {
listen 443 ssl http2;
server_name ssl.oldboylinux.cn;
ssl_certificate /etc/nginx/ssl_keys/ssl.oldboylinux.cn.pem;
ssl_certificate_key /etc/nginx/ssl_keys/ssl.oldboylinux.cn.key;
location / {
proxy_pass http://ssl_pools;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
}
}
温馨提示:
用户 负载加密(https) 负载到web未加密(http) 配置php网站的时候有问题.
对php动态部分进行配置.
fastcgi_param HTTPS on; #前面部分的请求是https