• 当前位置: 首 页 > 教育百科 > 学历/技能 > 正文

    构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

    :2024年12月31日
    青菜浪人

    通过Keepalived配置,实现MySQL集群高可用性。在主机之间免密管理,通过Ansible批量操作。安装MySQL使用rpm包,通过yum命令直装。通过Ansible配置MySQL服务组,进行批量操作。

    需求描述

    为了防止MySQL集群在双主模式下可能出现的单点故障风险,利用Keepalived进行配置,从而实现MySQL集群的高可用性。

    环境准备

    主机
    IP
    Master-1
    192.168.100.101/24
    Master-2
    192.168.100.102/24
    Slave-1
    192.168.100.103/24
    Slave-2
    192.168.100.104/24

    配置主机之间免密

    1.使用ssh-keygen在Master-1上生成秘钥

    ssh-keygen

    修改hosts文件,添加主机名映射(将Master-1作为控制节点)

    vim /etc/hosts

    拷贝秘钥,实现Master-1免密管理其他三台主机

    for i in {102..104}; do ssh-copy-id root@192.168.100.$i; done

    安装Ansible

    利用Ansible批量管理,Master-1作为控制节点对其他三台主机做批量操作。

    1.安装Ansible

    dnf install ansible-core

    2.添加服务组

    #在文件末尾添加如下参数

    vim /etc/ansible/hosts

    [mysql]

    Master-2

    Slave-1

    Slave-2

    3.ping测试,全绿表示免密成功,且主机之间通讯没有问题。

    ansible mysql -m ping

    image-20241230151818273

    安装mysql

    我这里采用rpm包进行安装,在4台虚拟机上进行安装

    #mysql下载地址

    https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-1.el9.x86_64.rpm-bundle.tar

    这里已经配置好本地yum仓库,使用yum命令直装

    #Master-1节点执行

    dnf localinstall *.rpm

    ansible mysql -m shell -a "dnf localinstall *.rpm -y"

    启动并修改mysql密码

    systemctl start mysqld

    #获取默认密码

    cat /var/log/mysqld.log |grep password|awk '{print $NF}'

    修改密码

    mysql --connect-expired-password -uroot -p"pM8t>RW:TtB>" -e "alter user 'root'@'localhost' identified by 'Qclr@123';flush privileges;"

    使用ansible启动其他三台主机的mysql服务

    #启动mysql

    ansible mysql -m shell -a "systemctl start mysqld"

    获取默认密码

    ansible mysql -m shell -a "cat /var/log/mysqld.log |grep password|awk '{print \$NF}'"

    修改密码,这里为了方便操作,将密码进行统一

    ansible mysql -m script -a "/root/reset_mysqpasswd.sh"

    #批量脚本内容

    #!/usr/bin/env bash

    list=(

    "+.c43u!;A2T1"

    ":.CrA,4Ow+SP"

    "RuL&YfF6aggB"

    )

    for i in${list[@]}

    do

    name=$(hostname)

    if [[ $name == "Master-2" ]];then

    mysql --connect-expired-password -uroot -p"$i" -e "alter user 'root'@'localhost' identified by 'Qclr@123';flush privileges;"

    elif [[ $name == "Slave-1" ]];then

    mysql --connect-expired-password -uroot -p"$i" -e "alter user 'root'@'localhost' identified by 'Qclr@123';flush privileges;"

    elif [[ $name == "Slave-2" ]];then

    mysql --connect-expired-password -uroot -p"$i" -e "alter user 'root'@'localhost' identified by 'Qclr@123';flush privileges;"

    else

    echo"bey~"

    exit 1

    fi

    done

    安装keepalived

    通过配置Keepalived在MYSQL双主模式下实现VIP(虚拟IP)的动态漂移,以确保MYSQL数据库的高可用性。

    1.在Master-1和Master-2上安装keepalived

    dnf install keepalived -y

    ssh Master-2 dnf install keepalived -y

    修改配置文件,确定主备关系

    ! Configuration File for keepalived

    global_defs {

    router_id 1

    script_user root

    enable_script_security

    }

    vrrp_script check_mysql {

    script "/etc/keepalived/check_mysql.sh"

    interval 3

    weight -50

    fall 2

    rise 1

    }

    vrrp_instance VI_1{

    state MASTER

    interface ens160

    mcast_src_ip 192.168.100.101

    virtual_router_id 51

    priority 101

    advert_int 2

    authentication{

    auth_type PASS

    auth_pass 123

    }

    virtual_ipaddress{

    192.168.100.254/24

    }

    track_script{

    check_mysql

    }

    }

    编写检测脚本,当发现mysql进程不存在时,关闭keepalived实现VIP切换

    #!/usr/bin/env bash

    if pgrep mysqld 1>/dev/null ;then

    true

    else

    systemctl stop keepalived.service

    exit 1

    fi

    将配置文件拷贝至Master-2

    scp -r /etc/keepalived/* Master-2:/etc/keepalived/

    修改Master-2配置文件,将其设置为备份主机

    启动服务,可以看到此时的vip在Master-1上

    systemctl start keepalived

    配置mysql主从复制

    配置Master-1

    修改Master-1服务器的mysql配置文件

    vim /etc/my.cnf

    #添加以下内容↓↓↓

    server_id=101

    binlog-ignore-db=mysql

    log-bin=mall-mysql-bin

    binlog_cache_size=1M

    binlog_format=mixed

    expire_logs_days=7

    slave_skip_errors=1062

    #开启GTID

    gtid_mode=ON

    enforce_gtid_consistency=ON

    添加完毕后重启mysql服务,使配置生效

    systemctl restart mysqld

    创建数据库同步用户,并赋予权限

    mysql -uroot -p"Qclr@123" <<EOF

    create user 'qclr'@'%' identified by 'Qclr@123';

    grant replication slave,replication client on *.* to 'qclr'@'%';

    flush privileges;

    EOF

    配置Master-2

    修改Master-2服务器的mysql配置文件

    vi /etc/my.cnf

    #添加以下内容↓↓↓

    server_id=102

    binlog-ignore-db=mysql

    log-bin=mall-mysql-bin

    binlog_cache_size=1M

    binlog_format=mixed

    expire_logs_days=7

    slave_skip_errors=1062

    #开启GTID

    gtid_mode=ON

    enforce_gtid_consistency=ON

    添加完毕后重启mysql服务,使配置生效

    systemctl restart mysqld

    与Master-1一样,创建一个数据库同步用户,并赋予权限

    mysql -uroot -p"Qclr@123" <<EOF

    create user 'qclr'@'%' identified by 'Qclr@123';

    grant replication slave,replication client on *.* to 'qclr'@'%';

    flush privileges;

    EOF

    配置slave-1

    修改mysql配置文件,添加如下内容

    vim /etc/my.cnf

    ## 设置 server_id,同一局域网中需要唯一

    server_id=103

    binlog-ignore-db=mysql

    log-bin=mall-mysql-slave1-bin

    binlog_cache_size=1M

    binlog_format=mixed

    expire_logs_days=7

    slave_skip_errors=1062

    relay_log=mall-mysql-relay-bin

    read_only=1

    #开启GTID

    gtid_mode=ON

    enforce_gtid_consistency=ON

    重启mysql服务使配置文件生效

    systemctl restart mysqld

    配置主从同步

    登录slave节点,指定Master数据库信息

    mysql -uroot -p"Qclr@123"<<EOF

    change replication source to source_host='192.168.100.254',source_port=3306,source_user='qclr',source_password='Qclr@123',source_auto_position=1;

    start slave;

    flush privileges;

    EOF

    #开启主从同步

    mysql> start slave;

    #查看从数据库是否开启同步

    mysql> show slave status \G;

    #如配置出错,则需要先停止再重置

    stop slave

    reset slave

    reset master

    出现下图两个YES,表示配置成功

    配置Slave-2

    修改mysql配置文件,添加如下内容

    vim /etc/my.cnf

    ## 设置 server_id,同一局域网中需要唯一

    server_id=104

    binlog-ignore-db=mysql

    log-bin=mall-mysql-slave1-bin

    binlog_cache_size=1M

    binlog_format=mixed

    expire_logs_days=7

    slave_skip_errors=1062

    relay_log=mall-mysql-relay-bin

    read_only=1

    #开启GTID

    gtid_mode=ON

    enforce_gtid_consistency=ON

    重启mysql服务使配置文件生效

    systemctl restart mysqld

    登录slave节点,指定Master数据库信息

    mysql -uroot -p"Qclr@123"<<EOF

    change replication source to source_host='192.168.100.254',source_port=3306,source_user='qclr',source_password='Qclr@123',source_auto_position=1;

    start slave;

    flush privileges;

    EOF

    #开启主从同步

    mysql> start slave;

    #查看从数据库是否开启同步

    mysql> show slave status \G;

    配置Master之间互为主从关系

    注:为了防止双主情况下数据库生成的主键冲突,在MYSQL数据库中设置Master-1和Master-2的自增初始值(auto_increment_offset)分别为1,2,设置增长步长(auto_increment_increment)都为2

    #Master-1配置文件末尾添加如下内容

    auto_increment_increment=2

    auto_increment_offset=1

    #Master-2配置文件末尾添加如下内容

    auto_increment_increment=2

    auto_increment_offset=2

    1.配置两个主节点之间互相复制数据

    #Master-1

    mysql -uroot -p"Qclr@123"<<EOF

    change replication source to source_host='192.168.100.102',source_port=3306,source_user='qclr',source_password='Qclr@123',source_auto_position=1;

    start slave;

    flush privileges;

    EOF

    #Master-2

    mysql -uroot -p"Qclr@123"<<EOF

    change replication source to source_host='192.168.100.101',source_port=3306,source_user='qclr',source_password='Qclr@123',source_auto_position=1;

    start slave;

    flush privileges;

    EOF

    #开启主从同步

    mysql> start slave;

    #查看从数据库是否开启同步

    mysql> show slave status \G;

    Master-1

    Master-2

    效果测试

    在Master-2创建新数据库

    在其他三个节点上查看,可以看到数据已被同步

    模拟Master-1故障,查看vip是否会切换至Master-2

    关闭Master-1的mysql服务

    在Master-2查看,可以看到VIP已切换至Master-2

    查看slave-1和2的同步状态,可以看到从库不受影响,同步状态正常

    再次创建数据库测试,主从同步正常

    原文来源:https://mp.weixin.qq.com/s/T7Go5Krw2L_JFlXa0yzBpQ

    [编辑:王振袢 &发表于江苏]
    [我要纠错]

    来源:本文内容搜集或转自各大网络平台,并已注明来源、出处,如果转载侵犯您的版权或非授权发布,请联系小编,我们会及时审核处理。
    声明:江苏教育黄页对文中观点保持中立,对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,不对文章观点负责,仅作分享之用,文章版权及插图属于原作者。

    关键词: 需求 描述 为了 防止 MySQL
    有价值
    0
    无价值
    0
    猜您喜欢
    最热文章

    暂不支持手机端,请登录电脑端访问

    正在加载验证码......

    请先完成验证