设为首页 收藏本站
查看: 1272|回复: 0

[经验分享] keepalived高可用集群学习以及实验总结

[复制链接]

尚未签到

发表于 2018-12-30 11:12:04 | 显示全部楼层 |阅读模式
  HA Cluster实现方案:
vrrp协议的实现
keepalived
ais: 完备HA集群
RHCS(cman)
heartbeat
corosync + pacemaker  :corosync是集群框架引擎程序,pacemaker是集群资源管理器,crmsh是pacemaker命令行管理工具
  stonish : shooting the other node in the header 节点爆头,比如硬件设备方面的电源交换机,代理调度器节点都可以向其发送信号切断故障一方的电源,从而使得明确退出服务,而不会因判定失误导致竞争,导致集群崩溃
  keepalived : HA集群软件实现,为 ipvs 而生

                 vrrp协议:Virtual   Redundant  Routing  Protocol
术语:
虚拟路由器: Virtual   Router
虚拟路由器标识:VRID(0-255)
物理路由器:
master : 主设备
backup: 备用设备
priority  : 优先级
VIP :Virtual  IP
VMAC : Virtual  MAC
GraciousARP
通告:心跳,优先级等; 周期性;
抢占式,非抢占式;
安全工作:
认证:
无认证、简单字符认证、MD5
工作模式:
主/备:单虚拟路径器;
主/主 :主/备(虚拟路径器1)   , 备/主(虚拟路径器2)
  keealived:
vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务
基于vrrp协议完成地址流动;
为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
为ipvs集群的各个RS做健康状态监测:
基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事物;

        组件:
核心组件:
vrrp stack
checkers
ipvs  wrapper
控制组件:配置文件分析器
IO复用器
内存管理组件
HA Cluster的配置前提:
(1)各个节点时间必须同步:
ntp,  chrony :注意使用vim /etc/chrony.conf,可以比ntpdate时间精度更好,并且时效更快  systemctl restart  chronyd.service
(2) 确保iptables以及selinux不会成为阻碍;
(3) 各个节点之间可通过主机名互相通信(对KA并非必须)
建议使用/etc/hosts文件实现; ip  node1.com node1...;
exec bash --> 重新启动一个bash进程取代之前的进程,从而实现环境配置文件重新加载生效;
(4)  确保各个节点的用于集群服务的接口支持MULTICAST通信;  D类IP 224-239;
(5) 各个集群节点之间ssh基于key登陆实现   
ssh-keygen  -t rsa  -N '';
ssh-copy-id  -i  .ssh/id_rsa_pub  root@localhost(本机拷贝后实现自己连自己也不需要密码),   scp  -rp  .ssh/   user@remotename:root/
  keepalived安装配置:
centos7.4   随base仓库提供:

        程序环境:
主配置文件: /etc/keepalived/keepalived.conf
主程序文件: /usr/sbin/keepalived
Unit File  :  keepalived.service
Unit File的环境配置文件: /etc/sysconfig/keepalived
配置文件组件部分:
TOP  HIERACHY
GLOBAL CONFIGURATION
Global    definitions
Static    routes/address
VRRPD    CONFIGURATION
vrrp    synchronization    group(s)  :vrrp  同步组
vrrp    instance(s)  :  每个vrrp  instance即一个vrrp路由器;
LVS CONFIGURATION
Virtual  server group
Virtual  server  :ipvs集群的vs和rs;
单主配置示例:
!Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_emali  from keepalived@localhost
smtp_server  127.0.0.1
smtp_connect_timeout  30
router_id  node1
vrrp_mcast_group4  224.0.100.19
}
vrrp_instance  VI_1 {
state   BACKUP
interface  ens33
virtual_router_id 14
priority  98
advert_int  1
authentication {
auth_type  PASS
auth_pass 2525fs
}
virtual_ipaddress {
172.18.0.100/16  dev ens33
#   172.18.0.101/16  dev ens33  label  ens33:1
}
track_interface {
ens33
ens34
}
}
配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;
nopreempt: 定义工作模式为 非抢占式模式;
preempt_delay 300 :抢占式模式下,节点上线后触发新选举操作的延迟时长;
定义通知脚本:
notify_master     传递的参数字符;当前节点成为主节点时触发的脚本;
notify_backup     :当前节点转为备用节点时触发的脚本;
notify_fault     : 当前节点转为失败状态时触发脚本;
notify    :通用格式的通知触发机制,一个脚本可以完成以上三种状态的转换时的通知;
双主模型示例:
! Configuration  File  for  keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19  :使用ipv4地址组播,如一主多备模式,通告检测心跳线检测,一个vrrp虚拟路由器所在网络中的集群中,有可能只有少数服务器是负载均衡集群服务器,使用特定的组播地址可以使得心跳线检测时广播指定组中的集群服务器,从而不影响其他主机
}
vrrp_instance VI_1 {
state MASTER
interface  ens33
virtual_router_id  11
priority  100
adver_int 1
authentication {
auth_type PASS
auth_pass 4234sdf
}
virtual_ipaddress {
172.18.0.100/16  dev ens33
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 12
priority_router_id 98
advert_int 1
authentication {
auth_type PASS
auth_pass sg1234
}
virtual_ipaddress {
172.18.0.101/16  dev ens33  label ens33:0
}
notify_master  "/etc/keepalived/notify.sh master"
notify_backup  "/etc/keepalived/notify.sh  backup"
notify_fault   "/etc/keepalived/notify.sh  fault"
}
通知脚本的使用方式:
示例通知脚本:
#/bin/bash
#
contact='root@localhost'
notify() {
local mailsubject="$(hostname) to be $1,vip floating"
local mailbody="$(date + '%F %T')" : vrrp  transiton, $(hostname)  changed to be $1
echo "$mailbody" | mail  -s "$mailsubject" $contact
}
case  $1 in
master)
notify  master;;
backup)
notify  backup
systemctl  restart  nginx   #借助/etc/keepalived/notify.sh监控状态检测脚本当检测当前高可用节点为backup状态时,执行简单重启修复操作
;;
fault)
notify  fault
;;
*)
echo "Usage:  $(basename  $0)  {master|backup|fault}"
exit 1;;
esac
脚本调用方法:
notify_master  "/etc/keepalived/notify.sh master"
notify_backup  "/etc/keepalived/notify.sh  backup"
notify_fault   "/etc/keepalived/notify.sh  fault"
高可用的ipvs集群示例:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.19
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
10.1.0.93/16 dev eno16777736
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
  *虚拟服务器配置
virtual_server 172.18.0.100  80 {
delay_loop 3
lb_algo  rr
lb_kind DR
protocol  TCP

                     sorry_server 127.0.0.1 80
real_server  10.1.0.69  80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 1
nb_get_retry  3
delay_before_retry 1
}
}
}
可单独定义块           
TCP_CHECK {
nb_get_retry  3
delay_before_retry 2
connect_timeout 3
}   
keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先级的动态调整:
分两步: (1)  先定义一个脚本;(2)  调用此脚本;
vrrp_script  chk_down{
script  "killall   -0  nginx && exit 0 || exit1"
interval  1
weight  -5  *脚本监测健康状态失败则priority减5降级
fall 2
rise  1
}
  自我实验与总结:
  Nginx + Keepalived 搭建高可用负载均衡集群
  1.环境规划:
主机:                      Ip地址                        http端口

     nginx_master      172.18.252.221 ;                 16915、16916
nginx_slave         172.18.252.222
tomcat_server_1    172.18.252.223
tomcat_server_2    172.18.252.224
tomcat_server_3    172.18.252.225
nginx_master  VIP  : 172.18.252.230
1.操作系统版本:CentOS6.5   x86_64
2.内核版本         :2.6.32-504.el6.x86_64
3.nginx版本         : nginx-1.8.0-1.el6.ngx.x86_64
4.keepalived版本 :keepalived-1.2.19
前端双nginx+keepalived,nginx反向代理到后端tomcat集群实现负载均衡,keepalived实现集群高可用,主nginx故障后虚拟IP自动漂移到备用nginx服务器
后端tomcat每个主机都开启两个端口提供业务:16915,16916
二、安装
前端两台主机分别安装nginx和keepalived
1) 编译安装keepalived
#安装依赖
yum  install  kernel-*   gcc  make   openssl-*
#下载keepalived-1.2.19.tar.gz
wget  http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
#解压
tar xvzf  keepalived-1.2.19.tar.gz
cd keepalived-1.2.19
#配置
./configure  --sysconfdir=/etc  --with-kernel-dir=--with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64
#编译并安装
make -j  2  && make install
#查看keepalived版本,验证安装成功
keepalived  -v
#设置开机自启动
chkconfig  keepalived  on
2)RPM包安装nginx
官方nginx  yum 源:/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx_repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
enabled=1
gpgcheck=0
yum源设置好后直接安装即可:
yum  -y install nginx
chkconfig  nginx  on
三、配置
1)前端两台主机nginx的配置完全一样
#vim  /etc/nginx/conf.d/upstream.conf
upstream   tomcatclu_16915  {
server  172.18.252.223:16915;
server  172.18.252.224:16915;
server  172.18.252.225:16915;
hash  $remote_addr  consistent;
}
upstream  tomcatclu_16916 {
server  172.18.252.223:16916;
server  172.18.252.224:16916;
server  172.18.252.225:16916;
hash   $remote_addr  consistent;
}
#vim  /etc/nginx/conf.d/server.conf
server {
listen  16915;
server_name  www.magedu.com;
location  /  {
proxy_pass  http://tomcatclu_16915;
}
location  /nginx_status {
stub_status  on;
access_log  off;
allow  127.0.0.1;
#要允许公司ip访问nginx  status
allow  192.168.252.0/24;
deny   all;
}
}
server   {
listen  16916;
server_name  www.magedu.com;
location  /  {
proxy_pass  http://tomcatclu_16915;
}
location  /nginx_status {
stub_status  on;
access_log  off;
allow  127.0.0.1;
#要允许公司Ip访问nginx  status
allow  192.168.252.0/24;
deny  all;
}
}
2)nginx_master的keepalived的配置
root@nginx_master ~]# vim /etc/keepalived/keepalived.conf
!Configuration  File   for  keepalived
global_defs  {
router_id nginx-ha1
}
vrrp_script  check_nginx {
#检查nginx状态的脚本,文章后面给出
script  "/data/script/check_nginx.sh"
#执行间隔2秒
interval 2
}
vrrp_instance  VI_1 {
state  MASTER
interface  eth0
#同一keepalived集群的virtual_router_id必须相同,默认51
virtual_router_id  55
priority 100
advert_int  1
#不抢占:如果集群里已存在MASTER状态的主机,即使优先级高于MASTER也不抢占为MASTER,只在优先级高的主机上设置即可
authentication  {
auth_type  PASS
auth_pass 1111
}
virtual_ipaddress {
#虚拟IP
172.18.252.230/16
}
track_script  {
check_nginx
}
track_interface {
eth0
eth1
}
}
3)nginx_slave的keepalived配置
  [root@nginx_slave ~]# vim /etc/keepalived/keepalived.conf
  ! Configuration File for keepalived
  global_defs {
router_id nginx-ha2
}
  vrrp_script check_nginx {
script "/data/script/check_nginx.sh"
interval 2
}
  vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 55
#备的优先级低
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.18.252.230/16
}
track_script {
check_nginx
}
track_interface {
eth0
eth1
}
}

4)防火墙设置
#iptables放行组播地址流量:
iptables -I  INPUT -d 224.0.0.18  -j  ACCEPT
server iptables save
VRRP报文是通过IP多播的形式发送的,组播地址224.0.0.18是VRRP报文的目的地址。
5)部署nginx状态检查脚本check_nginx.sh
/data/script/check_nginx.sh检查脚本内容如下:
#!/bin/bash
#check   nginx  server   status
#
#nginx  http  端口
PORTS="16915  16916"
functions  check_ports  {
for  port  in  $PORTS;do
nc  -z  127.0.0.1  $port  |grep  -q  succeeded
[ "${PIPESTATUS[1]}" -eq 0 ] && mark=${mark}1
done
#如果mark值为空说明两个端口都不通
#如果mark等于1,说明有一个端口是通的
#如果mark等于11,说明两个端口都是通的
echo $mark
}
ret1=$(check_ports)
#如果nginx端口不通,会尝试重启一次nginx
if  [ "$ret1" !="11" ];then
/sbin/service  nginx  stop
/sbin/service nginx  start
sleep  1
ret2=$(check_ports)
#如果还是有端口不通,表示nginx服务不正常,则停掉keepalived,使VIP发生切换
[ "$ret2" != 11 ]  && /etc/init.d/keepalived   stop
fi
chmod +x  /data/script/check_nginx.sh
补充说明:如果nginx恢复正常后,keepalived不能自动启动,需要编写一个脚本完成这项工作拉起keepalived.脚本放到cron里每分钟执行。
6)开启keepalived的日志:
编辑/etc/sysconfig/keepalived:
KEEPALIVED_OPTIONS="-D -d -S 0"
编辑/etc/rsyslog.conf:
#配置文件最后面加上下面一行
local0.*                                           /var/log/keepalived.log
重启rsyslog:
service     rsyslog     restart
按上面配置后,keepalived会把日志记录到/var/log/keepalived.log
7)启动服务
#先检查nginx配置文件正确性
nginx  -t
#启动nginx服务
service   nginx   start
#同时启动keepalived服务
service  keepalived  start
#过一会查看虚拟ip是否在nginx_master主机上
ip  a   l
四、验证
停掉主节点上的keepalived服务或者重启系统,同时不断的Ping虚拟IP,经过一个请求超时间隔,虚拟IP自动漂移到了从节点上



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-657533-1-1.html 上篇帖子: LVS/NAT + keepalived负载均衡实现 下篇帖子: keepalived vrrp_script的一些实例配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表