zoukankan      html  css  js  c++  java
  • 企业级自动化部署方案——ansible实现lvs+keepalived高可用架构

    耗时8小时左右

    总体设计

    在这里插入图片描述

    ansible-playbook目录结构

    入口文件
    因为不同的主机配置不同,所以按主机分类设置了3个role

    [root@ansible ~]# cat /etc/ansible/work_dir/lvs.yaml
    - hosts: [nfs]
      roles:
        - nfs
    - hosts: [rs]
      roles:
        - web
    - hosts: [ds]
      roles:
        - keepalived
    

    NFS服务playbook结构

    [root@ansible ~]# tree /etc/ansible/roles/nfs
    /etc/ansible/roles/nfs
    ├── files
    ├── handlers
    │   └── main.yaml
    ├── tasks
    │   └── main.yaml
    ├── templates
    └── vars
        └── main.yaml
    

    WEB服务playbook结构

    [root@ansible ~]# tree /etc/ansible/roles/web
    /etc/ansible/roles/web
    ├── files
    ├── handlers
    │   └── main.yaml
    ├── tasks
    │   └── main.yaml
    ├── templates
    │   ├── ifcfg-lo.j2
    │   └── rs_test.j2
    └── vars
        └── main.yaml
    

    Keepalived+LVS服务playbook结构

    [root@ansible ~]# tree /etc/ansible/roles/keepalived
    /etc/ansible/roles/keepalived
    ├── files
    ├── handlers
    ├── tasks
    │   └── main.yaml
    ├── templates
    │   ├── keepalived_conf.j2
    │   └── keepalived_service.j2
    └── vars
        └── main.yaml
    

    执行过程

    [root@ansible work_dir]# pwd
    [root@ansible work_dir]# ansible-playbook lvs.yaml
    

    在这里插入图片描述在这里插入图片描述

    结果测试

    1.查看浮动ip
    在ds1 (主) 上查看IP信息
    在这里插入图片描述在ds2(备) 上查看IP信息
    在这里插入图片描述浮动IP在负载均衡主节点上
    在网页上访问测试
    在这里插入图片描述在这里插入图片描述通过LVS访问NFS(把NFS挂载到了/var/www/html/nfs)
    在这里插入图片描述实际页面应该只有一个 Welcome to NFS! ,这是多次测试ansible-playbook导致的
    2.测试故障切换

    [root@ftp ~]# while :; do curl 192.168.213.200;sleep 2;done
    

    停止rs1的httpd服务,业务没有中断
    在这里插入图片描述当rsl systemctl start httpd 停止httpd服务后,所有的访问请求都分配到rs2上;当rsl启动httpd服务,所有的访问请求都平均分配到两个rs节点上(wrr算法,weight都为1)

    在sleep 2的时候会出现2次访问不到的情况curl: (7) Failed connect to 192.168.213.200:80; Connection refused
    在sleep 3/4/5的时候会出现1次访问不到的情况
    在sleep 6的时候访问正常
    可见,这个节点移除是需要时间的

    停止ds1(主)的keepalived服务,服务不受影响,vip漂移到了ds2(备)上
    在这里插入图片描述在这里插入图片描述当dsl重启keepalived服务后,vip会漂移回来

    实现过程问题记录

    1.在rs1,rs2上绑定VIP到回环网卡
    2.调整内核参数,关闭arp响应要 sysctl -p
    3.keepalived首次启动失败
    通过日志文件/var/log/messages查看错误

    (Line 12) WARNING - interface eth0 for vrrp_instance VI_1 doesn’t exist
    

    问题: keepalived新版本会检查/etc/keepalived/keepalived.conf配置文件,配置有误会导致程序启动失败(如默认的配置文件中网卡为eth0,而实际网卡为ens33)

    解决方法: 修改配置文件后再启动进程(用以下方法可以方便的修改网卡名称)

    #/etc/ansible/roles/keepalived/templates/keepalived_conf.j2
    interface {{ net_name }}
    

    4.systemctl无法彻底停掉keepalived
    现象描述: 无法正常stop掉keepalived进程,再次启动时虽然可以启动,但进程状态里面会提示:Can’t open PID file /var/run/keepalived.pid (yet?) after start

    问题: systemd的启动脚本有问题,无法创建PID文件

    解决方法: 注释掉启动脚本中的如下行,重载 systemctl daemon-reload

    #/lib/systemd/system/keepalived.service
    KillMode=process #只杀掉程序的主进程,不管打开的子进程
    

    这个问题可能和keepalived的版本有关,不一定都需要处理这个问题
    5.keepalived开启顺序影响部分配置
    当2台服务器都设置为BACKUP模式时,先开启keepalived进程的会先绑定VIP,后开启的即使优先级高也不会去抢占,除非先开启的挂掉,即双BACKUP模式下,要先开启优先级高的服务器的keepalived进程(个人验证的是这样的)

    6.keepalived中的两种模式

    (1)master->backup模式
    一旦主库宕机,虚拟ip会自动漂移到从库,当主库修复后,keepalived启动后,还会把虚拟ip抢占过来,即使设置了非抢占模式(nopreempt)抢占ip的动作也会发生。
    (2)backup->backup模式
    当主库宕机后虚拟ip会自动漂移到从库上,当原主库恢复和keepalived服务启动后,并不会抢占新主的虚拟ip,即使是优先级高于从库的优先级别,也不会发生抢占。为了减少ip漂移次数,通常是把修复好的主库当做新的备库。

    在数据库的应用场景中,不建议数据库的频繁切换,可配置为keepalived的VIP不抢占模式
    7.在Linux中,挂载到目录后,文件夹原来的数据会被隐藏,无法看到测试结果(只能看到NFS上的文件),所以新建了目录 /var/www/html/nfs 进行挂载,既能看到测试结果,又能访问到NFS服务器

    8.ds1和ds2的keepalived.conf文件除了一些参数不同,其余都一样,可以应用templates处理

    vrrp_instance VI_1 {
        {% if ds_master == ansible_hostname%}
    	state MASTER
        priority 150
        {% elif ds_slave == ansible_hostname%}
    	state BACKUP
    	priority 100
        {% endif %}
    }
    

    vars变量有部分重复定义,但只写一个role中对集群不同主机的配置会有影响,暂时未想到解决办法

    执行有些慢,可能是因为开了7台虚拟机的原因,也可能是网络原因

    调整

    1.调整了keepalived的playbook顺序:将 Modify configuration 最后执行,并添加handler

    - name: Modify configuration
      template: src=keepalived_conf.j2 dest=/etc/keepalived/keepalived.conf
      notify:
        - Restart_keepalived
    

    2.静态文件 keepalived.service 放到了files
    3.准备优化rs数量,但语法未通过 待更新

    {% for i in range(1,{{ rs_num }}+1) %}
        real_server {{ rs{{ i }}_ip }} 80 {
            weight 1
            TCP_CHECK {
                connect_timeout 8
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
            }
        }
    {% endfor %}
    

    在这里插入图片描述

  • 相关阅读:
    深浅拷贝的区别
    python 连接mysql数据库
    前端 之HTML基础
    MySQL 多键
    MySQL 存储引擎 字段类型 约束条件
    MySQL数据库的基础知识
    全局解释器和协程
    进程剩余部分和线程
    计算机网络体系结构整理-第三单元网络交换
    计算机网络体系结构整理-第二单元IP技术
  • 原文地址:https://www.cnblogs.com/zhaoya2019/p/12609142.html
Copyright © 2011-2022 走看看