---
title: "Keepalived 笔记"
date: 2019-10-30T11:22:03+08:00
lastmod: 2019-10-30T11:22:03+08:00
tags: ["keepalived", "高可用", "负载均衡"]
categories: ["ha/lb"]
---

## 两个 haproxy 不抢占
- 环境
    - haproxy 服务器
        - haproxy101: 10.1.1.101
        - haproxy102: 10.1.1.102
    - 虚拟地址
        - ip: 10.1.1.100
- 在全部 haproxy 服务器上安装 keepalived
    ```bash
    yum install keepalived
    ```
- 在全部 haproxy 服务器上配置 haproxy 和 keepalived 自启动
    ```bash
    systemctl enable haproxy
    systemctl enable keepalived
    ```
- MASTER/BACKUP 完整配置
    ```
    global_defs {
        router_id haproxy101 #BACKUP 这里是 haproxy102
        script_user root
        enable_script_security
    }
    vrrp_script chk_haproxy {
        script "/usr/bin/systemctl status haproxy"
        interval 2
        weight 0
        fall 2
        rise 2
    }
    vrrp_instance VI_1 {
        state BACKUP #MASTER 和 BACKUP 这里都是 BACKUP
        virtual_router_id 1
        priority 150 #BACKUP 这里是 100
        advert_int 2
        nopreempt #BACKUP 优先级低，需注释此行
        interface eth0
        track_script {
            chk_haproxy
        }
        authentication {
            auth_type PASS
            auth_pass 1011100
        }
        virtual_ipaddress {
            10.1.1.100/24 dev eth0
        }
    }
    ```

## 两个 LVS-DR 调度器不抢占均衡后端 MySQL 和 Ceph 负载
- 环境
    - keepalived 服务器
        - ka101: 10.1.1.101
        - ka102: 10.1.1.102
    - 虚拟地址
        - ip: 10.1.1.100
    - mysqld 服务器
        - mysql103: 10.1.1.103
        - mysql104: 10.1.1.104
        - mysql105: 10.1.1.105
    - ceph-radosgw 服务器
        - ceph106: 10.1.1.106
        - ceph107: 10.1.1.107
        - ceph108: 10.1.1.108
- 在全部 keepalived 服务器上安装 keepalived
    ```bash
    yum install keepalived
    ```
- 在全部 keepalived 服务器上配置 keepalived 自启动
    ```bash
    systemctl enable keepalived
    ```
- MASTER/BACKUP 完整配置
    - 全局和实例配置
        ```
        global_defs {
            router_id keepalive101 #BACKUP 配置 keepalive102
        }
        vrrp_instance V1_1 {
            state BACKUP #BACKUP 也配置 BACKUP
            interface eth0
            virtual_router_id 1
            priority 150 #BACKUP 配置 100
            advert_int 1
            nopreempt #BACKUP 优先级低，需注释此行
            authentication {
                auth_type PASS
                auth_pass 1011100
            }
            virtual_ipaddress {
                10.1.1.100/24 dev eth0
            }
        }
        ```
    - LVS 均衡 mysql galera cluser 负载
        ```
        virtual_server 10.1.1.100 3306 {
            delay_loop 16
            lb_algo sh
            lb_kind DR
            protocol TCP
            real_server 10.1.1.103 3306 {
                weight 1
                TCP_CHECK {
                    connect_timeout 4
                    delay_before_retry 2
                    connect_port 3306
                }
            }
            real_server 10.1.1.104 3306 {
                weight 1
                TCP_CHECK {
                    connect_timeout 4
                    delay_before_retry 2
                    connect_port 3306
                }
            }
            real_server 10.1.1.105 3306 {
                weight 1
                TCP_CHECK {
                    connect_timeout 4
                    delay_before_retry 2
                    connect_port 3306
                }
            }
        }
        ```
    - LVS 均衡 ceph radosgw 负载
        ```
        virtual_server 10.1.1.100 7480 {
            delay_loop 16
            lb_algo sh
            lb_kind DR
            protocol TCP
            real_server 10.1.1.106 7480 {
                weight 1
                HTTP_GET {
                    url {
                        path /
                        status_code 200
                    }
                    connect_timeout 8
                    nb_get_retry 2
                    delay_before_retry 2
                    connect_port 7480
                }
            }
            real_server 10.1.1.107 7480 {
                weight 1
                HTTP_GET {
                    url {
                        path /
                        status_code 200
                    }
                    connect_timeout 8
                    nb_get_retry 2
                    delay_before_retry 2
                    connect_port 7480
                }
            }
            real_server 10.1.1.108 7480 {
                weight 1
                HTTP_GET {
                    url {
                        path /
                        status_code 200
                    }
                    connect_timeout 8
                    nb_get_retry 2
                    delay_before_retry 2
                    connect_port 7480
                }
            }
        }
        ```
- 在全部 mysql 和 ceph-radosgw 服务器上配置虚拟 ip
    ```bash
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    ip addr add 10.1.1.100/32 brd 10.1.1.100 dev lo
    ip route add 10.1.1.100 dev lo
    ```

## 不抢占自动切换两台 Redis 主从状态
- 环境
    - Redis 服务器
        - redis101: 10.1.1.101
        - redis102: 10.1.1.102
    - 虚拟地址
        - ip: 10.1.1.100
- 在全部 redis 服务器上安装 keepalived
    ```bash
    yum install keepalived
    ```
- 在全部 redis 服务器上配置 redis 和 keepalived 自启动
    ```bash
    systemctl enable redis
    systemctl enable keepalived
    ```
- MASTER/BACKUP 完整配置
    ```
    global_defs {
        router_id redis101 #BACKUP 这里是 redis102
        script_user root
        enable_script_security
    }
    vrrp_script chk_redis {
        script "/usr/bin/systemctl status redis"
        interval 2
        weight 0
        fall 2
        rise 2
    }
    vrrp_instance VI_1 {
        state BACKUP #MASTER 和 BACKUP 这里都是 BACKUP
        virtual_router_id 51
        priority 150 #BACKUP 这里是 100
        advert_int 1
        nopreempt #BACKUP 优先级低，需注释此行
        interface eth0
        notify_master /etc/keepalived/scripts/master.sh
        notify_backup /etc/keepalived/scripts/backup.sh
        track_script {
            chk_redis
        }
        authentication {
            auth_type PASS
            auth_pass 123456
        }
        virtual_ipaddress {
            10.1.1.100/24 dev eth0
        }
    }
    ```
- 在全部 redis 服务器上创建 /etc/keepalived/scripts/master.sh 脚本，内容如下
    ```bash
    #!/bin/bash
    #
    /usr/bin/sed -i '/^slaveof/d' /etc/redis.conf
    /usr/bin/systemctl restart redis
    ```
- 在 redis101 上创建 /etc/keepalived/scripts/backup.sh 脚本，内容如下
    ```bash
    #!/bin/bash
    #
    /usr/bin/sed -i '/^slaveof/d' /etc/redis.conf
    echo 'slaveof 10.1.1.102 6379' >> /etc/redis.conf
    /usr/bin/systemctl restart redis
    ```
- 在 redis102 上创建 /etc/keepalived/scripts/backup.sh 脚本，内容如下
    ```bash
    #!/bin/bash
    #
    /usr/bin/sed -i '/^slaveof/d' /etc/redis.conf
    echo 'slaveof 10.1.1.101 6379' >> /etc/redis.conf
    /usr/bin/systemctl restart redis
    ```
- 在全部 redis 服务器上赋予脚本可执行权限
    ```bash
    chmod 0755 /etc/keepalived/scripts/*.sh
    ```
- 修改 redis 配置
    ```
    requirepass redis_password
    maxclients 1000
    maxmemory 4294967296
    maxmemory-policy volatile-lru
    ```
- 在全部 redis 服务器上启动 redis 和 keepalived 服务
    ```bash
    systemctl start redis
    systemctl start keepalived
    ```

