sky_cheng

导航

 

一、安装haproxy作为端口转发服务器(主服务器:172.28.5.4,备服务器:172.28.5.8,浮点IP为:172.28.5.6)

1、安装依赖包

yum -y install wget  gcc gcc-c++

1、下载

cd /usr/local/src

wget https://github.com/haproxy/haproxy/archive/v1.5-dev20.tar.gz 

2、解压 

tar -zvxf v1.5-dev20.tar.gz

cd haproxy-1.5-dev20

3、编译

查看内核版本
[root@localhost haproxy-1.5-dev20]# uname -a Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
make TARGET=linux310 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy

4、配置文件

mkdir /etc/haproxy
touch /etc/haproxy/haproxy.conf
vim /etc/haproxy/haproxy.conf

 

global
  log 127.0.0.1 local2 ###[err warning info debug]
  chroot /usr/local/haproxy
  pidfile /var/run/haproxy.pid ###haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
  maxconn 65535 ###最大连接数,默认4000
  daemon

defaults
  mode tcp
  log global
  timeout connect 20s
  timeout server 60s
  timeout client 60s
  retries 3

listen stats
  mode http
  bind 0.0.0.0:8888 #监听端口
  stats refresh 10s #统计页面自动刷新时间
  stats uri /stats #统计页面url
  stats realm Haproxy Manager #统计页面密码框上提示文本
  stats auth admin:xxxxxx #统计页面用户名和密码设置
  stats hide-version #隐藏统计页面上HAProxy的版本信息

listen cmppv2
  bind :7890 #监听端口
  server s1 xxx.xxx.xxx.xxx:7890 #转发IP+端口

  #负载均衡模式

  server s-1 xxx.xxx.xxx.xxx:7082 weight 1 check inter 1000
  server s-2 xxx.xxx.xxx.xxx:7082 weight 1 check inter 1000


listen cmppv22
  bind :7891 #监听端口
  server s2 xxx.xxx.xxx.xxx:7891 #转发IP+端口

  5、启动haproxy

ln -s /usr/local/haproxy/sbin/haproxy /usr/local/bin/
haproxy -f /etc/haproxy/haproxy.conf

6、查看启动结果

ps -ef|grep ha

 

  

启动成功

 7、添加统计端口8888和我们测试用端口7890和7891到防火墙

firewall-cmd --zone=public --add-port=7890/tcp --permanent
firewall-cmd --zone=public --add-port=7891/tcp --permanent
firewall-cmd --zone=public --add-port=8888/tcp --permanent
firewall-cmd --reload

 浏览器打开ip:8888/stats

目前两个端口的当前连接数都是0,找一台机器telnet测试

[root@zabbix_server src]# telnet 172.28.18.104 7890
Trying 172.28.18.104...
Connected to 172.28.18.104.
Escape character is '^]'.

此时,7890端口对应的当前连接数为1

telnet 7891

[root@zabbix_server src]# telnet 172.28.18.104 7891
Trying 172.28.18.104...
Connected to 172.28.18.104.
Escape character is '^]'.

  此时7891对应的连接为1。

同样的在172.28.5.8的备份服务器上也安装haproxy。

至此haproxy转发服务器配置完毕

 

二、安装keepalived做haproxy主备服务器高可用

在两台服务器上分别安装keepalived

1、安装依赖包

yum -y install wget  pcre*  openssl-devel  zlib

2、下载

cd /usr/local/src
wget http://www.keepalived.org/software/keepalived-1.3.4.tar.gz --no-check-certificate

3、解压

tar -zxvf keepalived-1.3.4.tar.gz
cd  keepalived-1.3.4

4、编译

./configure --prefix=/usr/local/keepalived-1.3.4
make && make install

5、配置文件

mkdir /etc/keepalived
touch /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf

global_defs {
  router_id LVS_DEVEL
  vrrp_skip_check_adv_addr
  #vrrp_strict
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}



vrrp_script chk_haproxy { #调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
  script "/usr/local/keepalived-1.3.4/check_haproxy.sh"

  timeout 10  #脚本执行超时设置为10秒,默认为2秒,采用默认值可能导致脚本还没有执行完就已经超时了,所以设置超时时间为10秒

  interval 2 #每2秒检查执行一次
  weight 2
  fall 2 #如果连续两次检测为错误状态则认为服务部可用
  rise 1 #检测一次成功就认为服务正常
}

vrrp_instance VI_1 { #配置虚拟路由实例
  state MASTER #定义该节点为MASTER节点
  interface em1 #定义VIP绑定的物理网卡
  virtual_router_id 51 #设置虚路由拟路由id,同一集群的节点群必须相同
  priority 150 #设定优先级
  advert_int 1 #设定master与backup之间vrrp通告的时间间隔,单位是秒
  #nopreempt #设定keepalived的切换模式,默认是抢占failover,这里是非抢占,没有启用
  authentication { #定义验证方式与密码
    auth_type PASS
    auth_pass xxxxxx
  }
  #unicast_src_ip 172.28.18.104 #自己ip
  #unicast_peer { ##单播模式
   # 172.28.18.69 ##另一个ip
  #}
  virtual_ipaddress {
    172.28.18.8
  }
  track_script { #用于追踪脚本执行状态,定义在vrrp_instance段中
    chk_haproxy
  }
}

 

将路径为/usr/local/keepalived-1.3.4/sbin/keepalived拷贝到/usr/sbin/下

[root@localhost sbin]# cp /usr/local/keepalived-1.3.4/sbin/keepalived /usr/sbin/

将路径为/usr/local/src/keepalived-1.3.4/keepalived/etc/init.d的文件keepalived拷贝到/etc/init.d下

cp /usr/local/src/keepalived-1.3.4/keepalived/etc/init.d/keepalived /etc/init.d/

将路径为/usr/local/keepalived-1.3.4/etc/sysconfig/keepalived的文件拷贝到 /etc/sysconfig/keepalived

cp /usr/local/keepalived-1.3.4/etc/sysconfig/keepalived  /etc/sysconfig/
/usr/local/keepalived-1.3.4/check_haproxy.sh用于检测haproxy进程是否存在,不存在的话,尝试启动haproxy,如果启动没有成功,则关闭自己服务器的keepalived服务文件内容如下
#!/bin/bash
COUNT=$(ps -C haproxy --no-header |wc -l)
echo $COUNT

if [ $COUNT -eq 0 ]
then
        haproxy -f /etc/haproxy/haproxy.conf 2>/dev/null
        #echo "重启haproxy"
        sleep 3
        COUNT=$(ps -C haproxy --no-header |wc -l)
        if [ $COUNT -eq 0 ]
        then
                #echo "停止keepalived"
                killall keepalived 2>/dev/null
fi fi

这里同时也给出nginx的检查脚本

[root@localhost tcpConf]# vim /usr/local/keepalived-1.3.4/check_nginx.sh 
#!/bin/bash
COUNT=$(ps -ef | grep "nginx: master process"| grep -v grep|wc -l)
echo $COUNT

if [ $COUNT -eq 0 ]
then
    systemctl start nginx
    sleep 3
    COUNT=$(ps -ef | grep "nginx: master process"| grep -v grep|wc -l)
    if [ $COUNT -eq 0 ]
    then
        killall keepalived 2>/dev/null
    fi
fi

 

6、添加执行权限

chmod +x /etc/init.d/keepalived
chmod +x /usr/local/keepalived-1.3.4/check_haproxy.sh

 

7、添加keepalived到系统服务(centos6)

chkconfig --add keepalived

centos7直接设置自启动并启动服务

 

[root@localhost keepalived-1.3.4]# systemctl is-enabled keepalived
disabled
[root@localhost keepalived-1.3.4]# systemctl enable keepalived    
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
[root@localhost keepalived-1.3.4]# systemctl is-enabled keepalived
enabled

 

[root@localhost keepalived-1.3.4]# systemctl start keepalived 
[root@localhost keepalived-1.3.4]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-07-12 23:37:00 EDT; 1s ago
  Process: 20505 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 20506 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─20506 /usr/sbin/keepalived -D
           ├─20507 /usr/sbin/keepalived -D
           └─20508 /usr/sbin/keepalived -D

 

 

8、启动(Centos6)

service keepalived start

9、查看

service keepalived  status

启动成功

10、查看网卡的浮点IP设置

ip a

 

设置成功

同样在备份服务器172.28.5.8上也安装keppalived服务,唯一不同的是keepalived配置文件

! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_haproxy {  #调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整
   script "/usr/local/keepalived-1.3.4/check_haproxy.sh"
timeout 10 #脚本执行超时设置为10秒,默认为2秒,采用默认值可能导致脚本还没有执行完就已经超时了,所以设置超时时间为10秒 interval 2 #每2秒检查执行一次 weight 2 fall 2 #如果连续两次检测为错误状态则认为服务部可用 rise 1 #检测一次成功就认为服务正常 } vrrp_instance VI_1 { #配置虚拟路由实例 state BACKUP #定义该节点为BACKUP节点 interface em1 #定义VIP绑定的物理网卡 virtual_router_id 51 #设置虚路由拟路由id,同一集群的节点群必须相同 priority 95 #设定优先级 advert_int 1 #设定master与backup之间vrrp通告的时间间隔,单位是秒 #nopreempt #设定keepalived的切换模式,默认是抢占failover,这里是非抢占,没有启用 authentication { #定义验证方式与密码 auth_type PASS auth_pass xxxxxx } virtual_ipaddress { 172.28.5.6 } track_script { #用于追踪脚本执行状态,定义在vrrp_instance段中 chk_haproxy } }
state BACKUP     #定义该节点为BACKUP节点
priority 95      #设定优先级,备份服务器优先级低一些。主服务器设置的是100
启动备份服务器keepalived服务

启动成功,但是从节点会抢占VIP,说明keepalived节点之间通信失败,此时注意两个问题

1、Keepalived使用vrrp组播,默认地址是224.0.0.18,因此要配置防火墙允许通行vrrp协议,具体操作

iptables:

 vim /etc/sysconfig/iptables
添加
-A INPUT -d 224.0.0.18 -j ACCEPT
service iptables restart

firewalld:

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload

如果添加错误了,可以删除规则重新添加:

[root@localhost zabbix]# firewall-cmd --direct --permanent --remove-rule ipv4 filter INPUT 0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT   
success
[root@localhost zabbix]# firewall-cmd --direct --permanent --remove-rule ipv4 filter OUTPUT 0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT     
success
[root@localhost zabbix]# firewall-cmd --reload
success

 

2、第一种方法添加了还是不行,则可能是上联交换机禁用了组播方式,可以修改keepalivd配置文件,在virtual_ipaddress上添加如下内容改为单播方式

unicast_src_ip 172.28.5.4 #自己ip
unicast_peer { ##单播模式
172.28.5.8 ##另一个ip
}

 

  重启keppalived主从节点服务,此时从节点不会再抢占vip了。

这里需要注意:主备机器的IP地址必须是同一子网段的IP,掩码,网关必须相同,浮点IP也必须一个子网段,否则会出现keepalived无法通信的情况,具体是,备节点启动keepalievd后,会抢占浮点IP。

 

三、测试高可用

1、关闭主服务器172.28.5.4的keepalived服务

service keepalived stop

 

2、查看IP

ip a

 此时浮点IP已经解绑

再关闭172.28.5.4haproxy服务

kill -9 37655

此时telnet 172.28.5.4 7890,已经不能连接

但是 telnet 172.28.5.6 7890 ,依然可以连接,说明172.28.5.6IP已经漂移到172.28.5.8的备份服务器上

3、恢复主服务器haproxy以及keepalived服务

service keepliaved start

keepliaved会自动监测haproxy服务,并重启

 

 

 查看ip

ip a

此时VIP已经成功漂移回主节点服务器,测试 telnet 172.28.5.6 7890成功连接。

在从节点服务器运行

ip a

此时VIP已经解绑。

 

 

 

 
posted on 2019-04-04 16:50  sky_cheng  阅读(2731)  评论(0编辑  收藏  举报