MySQL主从配置+Keepalived高可用性配置


MySQL主从配置+Keepalived高可用性配置

简介:

​ Keepalived的作用是检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

Keepalived 的工作流程主要包括以下几个关键步骤:

  1. 主从服务器配置
    • 在主从服务器上安装并配置 Keepalived 服务。
    • 定义 vrrp_instance ,设置主从状态(MASTERBACKUP)、优先级、虚拟路由器 ID 等。
    • 配置虚拟 IP 地址。
  2. 心跳检测
    • 通过 vrrp_script 定义检测脚本,通常用于检测服务(如 MySQL 服务)的状态或服务器的健康状况。
    • 按照设定的时间间隔(interval)执行检测脚本。
  3. 主服务器工作
    • 主服务器正常运行时,持有虚拟 IP 地址,并对外提供服务。
  4. 故障检测与切换
    • 当主服务器发生故障(如服务停止、服务器宕机),检测脚本返回异常结果。
    • Keepalived 根据优先级,选择优先级较高的从服务器进行切换。
  5. 从服务器接管
    • 被选中的从服务器切换为主状态,并获取虚拟 IP 地址。
    • 开始对外提供服务,接替原主服务器的工作。
  6. 持续监控与恢复
    • 即使在切换后,Keepalived 仍持续监控服务器状态。
    • 当原主服务器恢复正常,根据配置决定是否重新切换回来。

总的来说,Keepalived 通过心跳检测和优先级机制,实现了服务的高可用性和自动故障切换。

以下是在两台 CentOS 7 服务器上实现 MySQL 数据库主从备份,并利用 Keepalived 实现主服务器故障自动切换从服务器功能的详细步骤:

一、MySQL 主从配置

(一)主服务器配置

  1. 安装 MySQL 服务
   yum install mysql-server
  1. 编辑 MySQL 配置文件 /etc/my.cnf
   [mysqld]
   log-bin=mysql-bin
   server-id=1

server-id = 1是指数据库的唯一ID号,默认从1开始。

log-bin = mysql-bin启用二进制日志,备份复制其实就是根据日志来的。

  1. 重启 MySQL 服务
   systemctl restart mysqld
  1. 创建用于从服务器复制的用户
   mysql> CREATE USER'epl'@'%' IDENTIFIED BY 'password';
   mysql> GRANT REPLICATION SLAVE ON *.* TO'epl'@'%';
   mysql> FLUSH PRIVILEGES;
  1. 查看主服务器状态
   mysql> SHOW MASTER STATUS;
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |     2259 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

记录下 FilePosition 的值。

(二)从服务器配置

  1. 安装 MySQL 服务(同主服务器步骤)
  2. 编辑 MySQL 配置文件 /etc/my.cnf
   [mysqld]
   server-id=2
   log-bin = mysql-bin
   replicate-do-db = testdb       

以上选项中,server-id = 2表示从数据库ID,一定不能和主数据库一样。

replicate-do-db = testdb设置了允许同步复制的数据库为testdb,如果不设置则可注释掉该行。

  1. 重启 MySQL 服务(同主服务器步骤)

  2. 执行同步命令

   mysql> CHANGE MASTER TO MASTER_HOST='主服务器 IP', MASTER_USER='epl', MASTER_PASSWORD='password', MASTER_LOG_FILE='主服务器的 File 值', MASTER_LOG_POS=主服务器的 Position 值;
   mysql> START SLAVE;

如果主数据库不断的写入数据,那么Position一直变化,不容易同步。可以到主数据库中,使用以下命令停止数据库写入操作

flush tables with read lock;

操作后别忘记恢复锁定进行解锁

unlock tables; 
  1. 查看从服务器状态
   mysql> SHOW SLAVE STATUS\G;
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.161
                  Master_User: epl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.00001
          Read_Master_Log_Pos: 711642
               Relay_Log_File: mariadb-relay-bin.000040
                Relay_Log_Pos: 567390
        Relay_Master_Log_File: mysql-bin.00001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: testdb
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0

查看Slave_IO_RunningSlave_SQL_Running是否都为yes(一定要全部为yes)

二、Keepalived 安装与配置

(一)主服务器配置

  1. 安装 Keepalived
   yum install keepalived
  1. 编辑配置文件 /etc/keepalived/keepalived.conf
    global_defs {
       router_id LVS_DEVEL
   }

   vrrp_script check_mysql {
       script "/etc/keepalived/check_mysql.sh"
       interval 5
   }

   vrrp_instance VI_1 {
       state MASTER
       interface ens33
       virtual_router_id 51
       priority 100
       advert_int 1
       nopreempt
       authentication {
           auth_type PASS
           auth_pass 1111
       }
       track_script {
           check_mysql
       }
       virtual_ipaddress {
           10.0.0.167
       }
        nopreempt
   }

以下是对上述 Keepalived 配置中每个参数的详细解释:

  1. global_defs: 全局定义部分。

    • router_id LVS_DEVEL: 为 Keepalived 实例设置一个标识,通常用于在多个 Keepalived 实例之间进行区分。
  2. vrrp_script: 用于定义一个 VRRP 脚本。

    • check_mysql: 脚本的名称。
    • script "/etc/keepalived/check_mysql.sh": 指定要执行的脚本路径。
    • interval 5: 表示每隔 5 秒执行一次该脚本。
  3. vrrp_instance: 定义一个 VRRP 实例。

    • state MASTER: 初始状态为主服务器。
    • interface ens33: 指定用于 VRRP 通信的网络接口。
    • virtual_router_id 51: 虚拟路由器的标识符,同一组 VRRP 实例的此值必须相同。
    • priority 100: 节点的优先级,数值越大优先级越高,决定主服务器的选举。
    • advert_int 1: 通告间隔,即向其他节点发送通告的时间间隔(单位为秒)。
    • nopreempt: 表示当此节点恢复正常时,不抢占当前的主服务器角色。
    • authentication:认证相关设置。
      • auth_type PASS: 认证类型为密码认证。
      • auth_pass 1111: 认证密码。
    • track_script: 跟踪指定的脚本。
      • check_mysql: 跟踪前面定义的名为 check_mysql 的脚本。
    • virtual_ipaddress: 定义虚拟 IP 地址,当此节点成为主服务器时,该 IP 地址将被绑定到指定的接口上。外部连接使用此虚拟IP地址
  4. 创建vi /etc/keepalived/check_mysql.sh脚本文件:

    #!/bin/bash
    # 检查 MySQL 进程是否存在,存在返回0
    if pgrep -f "mysqld" > /dev/null; then
        exit 0
    else
        exit 1
    fi
    
    
  5. 启动 Keepalived 服务,并设置开机启动

   systemctl start keepalived
   systemctl enable keepalived

(二)从服务器配置

  1. 安装 Keepalived(同主服务器步骤)
  2. 编辑配置文件 /etc/keepalived/keepalived.conf
  global_defs {
   router_id LVS_DEVEL
}
vrrp_script check_mysql {
       script "/etc/keepalived/check_mysql.sh"
       interval 5
   }
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.167
    }

    track_script {
        check_mysql
    }
}

  • state BACKUP:初始状态为备份服务器。

  • priority:节点的优先级,数值越大优先级越高,决定主服务器的选举。

  1. 创建脚本文件,同上
  2. 启动 Keepalived 服务,并设置开机启动
systemctl restart keepalived
systemctl enable keepalived

以上配置完毕后。测试停止主服务器或者关机主服务器后,MySQL连接都会切换到从服务器上。且主服务恢复后,不会抢占,等到从服务器故障后,主服务器再切回来。

请确保在配置过程中,根据实际的服务器环境和需求进行相应的调整。同时,要注意防火墙和网络设置,以确保服务器之间的通信正常。

教程