Keepalived安装及配置实现虚拟IP与Namenode HA中Active地址端口的代理
一、背景
由于NameNode做了HA,因此需要使用Keepalived将NameNode的8020/9820端口代理出去,比如代理一个虚拟ip+端口
使用说明:如果在192.168.66.21、192.168.66.22节点安装了Keepalived,并创建了虚拟IP192.168.66.130和虚拟端口29870、28020,则在192.168.66.21、192.168.66.22节点上,若standby节点为192.168.66.22,则此192.168.66.22主机将无法telnet通192.168.66.130:29870、192.168.66.130:28020
二、下载
下载keepalived-2.2.4.tar.gz,并上传至服务器
https://www.keepalived.org/download.html
三、安装
1、解压
tar -zxvf keepalived-2.2.4.tar.gz -C /opt/module/
2、安装依赖包
yum install -y gcc openssl-devel popt-devel
3、编译安装
cd /opt/module/keepalived-2.2.4/ ./configure --prefix=/usr/local/keepalived make && make install
4、复制配置
cp /opt/module/keepalived-2.2.4/keepalived/etc/init.d/keepalived /etc/init.d/ mkdir -p /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ cp /opt/module/keepalived-2.2.4/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/sbin/keepalived /usr/bin/
5、主节点操作
(1)检测active节点
vim /etc/keepalived/chkHealth.sh
#!/bin/bash status=`curl -HGET http://192.168.66.21:9870/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus` active="active" result=$(echo $status | grep "${active}") if [ "$result" != "" ];then echo "result=$result" exit 0 else exit 1 fi
最后赋予权限
chmod +x /etc/keepalived/chkHealth.sh
(2)keepalived.conf配置
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived global_defs { notification_email { } router_id HA_NETDISK script_user root } vrrp_script chk_ha_service { script "/etc/keepalived/chkHealth.sh" interval 3 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 79 priority 200 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.66.130 } track_script { chk_ha_service } } virtual_server 192.168.66.130 29820 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 persistence_timeout 1 protocol TCP real_server 192.168.66.21 9820 { weight 1 TCP_CHECK { connect_timeout 1 nb_get_retry 3 delay_before_retry 3 connect_port 9820 } } } virtual_server 192.168.66.130 29870 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 persistence_timeout 1 protocol TCP real_server 192.168.66.21 9870 { weight 1 TCP_CHECK { connect_timeout 1 nb_get_retry 3 delay_before_retry 3 connect_port 9870 } } }
说明:大致的思路是创建了一个192.168.66.130的虚拟IP,当建立TCP连接之后,访问虚拟IP的29820端口时,Keepalived会先调用chkHealth.sh脚本进行判断,若主节点192.168.66.21的NameNode处于active状态,则将请求转发至192.168.66.21的9820端口。同理,访问虚拟IP的29870端口时,Keepalived会先调用chkHealth.sh脚本进行判断,若主节点192.168.66.21的NameNode处于active状态,则将请求转发至192.168.66.21的9870端口
值得注意的是interface ens33中的ens33表示网卡名称,可以使用ifconfig查看你自己的网卡名称
完成之后赋予权限:
chmod 644 /etc/keepalived/keepalived.conf
(3)启停
service keepalived start
service keepalived stop
service keepalived status
service keepalived restart
ps -ef | grep keepalived
(4)日志路径说明:/var/log/messages
6、从节点操作
(1)检测active节点
vim /etc/keepalived/chkHealth.sh
#!/bin/bash status=`curl -HGET http://192.168.66.22:9870/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus` active="active" result=$(echo $status | grep "${active}") if [ "$result" != "" ];then echo "result=$result" exit 0 else exit 1 fi
最后赋予权限
chmod +x /etc/keepalived/chkHealth.sh
(2)keepalived.conf配置
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived global_defs { notification_email { } router_id HA_NETDISK script_user root } vrrp_script chk_ha_service { script "/etc/keepalived/chkHealth.sh" interval 3 weight -10 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 79 priority 195 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.66.130 } track_script { chk_ha_service } } virtual_server 192.168.66.130 29820 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 persistence_timeout 1 protocol TCP real_server 192.168.66.22 9820 { weight 1 TCP_CHECK { connect_timeout 1 nb_get_retry 3 delay_before_retry 3 connect_port 9820 } } } virtual_server 192.168.66.130 29870 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 persistence_timeout 1 protocol TCP real_server 192.168.66.22 9870 { weight 1 TCP_CHECK { connect_timeout 1 nb_get_retry 3 delay_before_retry 3 connect_port 9870 } } }
说明1:大致的思路是创建了一个192.168.66.130的虚拟IP,当建立TCP连接之后,访问虚拟IP的29820端口时,Keepalived会先调用chkHealth.sh脚本进行判断,若主节点192.168.66.22的NameNode处于active状态,则将请求转发至192.168.66.22的9820端口。同理,访问虚拟IP的29870端口时,Keepalived会先调用chkHealth.sh脚本进行判断,若主节点192.168.66.22的NameNode处于active状态,则将请求转发至192.168.66.22的9870端口
说明2:interface指网卡名称,可以使用ifconfig查看网卡名称
完成之后赋予权限:
chmod 644 /etc/keepalived/keepalived.conf
(3)启停
service keepalived start service keepalived stop service keepalived status service keepalived restart ps -ef | grep keepalived #开机自启 systemctl enable keepalived.service
(4)日志路径说明:/var/log/messages
7、测试
(1)将keepalived启动起来
(2)访问虚拟IP+29870端口,发现处于激活状态的是slave3节点
(3)将slave3节点的NameNode 停掉,再次访问,发现keepalived将链接转发到了slave22节点上了
hdfs --daemon stop namenode
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)