MySQL【高可用篇】01:MySQL8.0.25基于双主+keepalived的MySQL高可用搭建

一、环境准备

1、环境信息

192.168.5.161
192.168.5.162

在这里插入图片描述

2、关闭防火墙

systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service

在这里插入图片描述

3、关闭selinux

(1)查询selinux是否关闭

sestatus

如下是没关闭
在这里插入图片描述

(2)编辑配置文件

关闭selinux,将SELINUX改为disabled
在这里插入图片描述

(3)重启机器

shutdown -r now

在这里插入图片描述

(4)再次检查selinux

sestatus

在这里插入图片描述

4、安装好mysql

参考:
第二阶段【环境搭建】13:Linux环境使用脚本自动安装MySQL8.0.25版本数据库
在这里插入图片描述

5、配置文件参数检查

cd /data/mysql/conf/
vim my.cnf

(1)log-bin

查看binlog是否开启,如下有log-bin的配置说明是开启的
在这里插入图片描述

(2)server-id

修改server-id,为ip后2段的数字
在这里插入图片描述

(3)innodb_buffer_pool_size

这里一般设置为机器总内存的60%~80%
在这里插入图片描述

(4)gtid相关参数

gtid_mode和enforce_gtid_consistency都设置为on
在这里插入图片描述

6、重启mysql

如果上一步的配置文件有修改的话,需要重启mysql

/etc/init.d/mysql.server restart

在这里插入图片描述

7、创建用户并赋予权限

(1)创建复制用户

2个节点都执行

create user 'repl'@'%' identified with mysql_native_password by 'admin'; 
grant replication slave on *.* to 'repl'@'%';

在这里插入图片描述

(2)创建keepalived心跳检查用户

2个节点都执行

create user keepalived_r@'localhost' identified by 'admin'; 
grant select on *.* to keepalived_r@'localhost';

在这里插入图片描述

8、使得主从数据一致

(1)创建目录

2个节点都执行

mkdir -p /data/backup

在这里插入图片描述

(2)主库数据备份

在161节点进行数据备份

cd /data/backup/
mysqldump -uroot -padmin --single-transaction --all-databases --master-data=2 --set-gtid-purged=on > alldb_bak_for_gtid.sql

在这里插入图片描述

(3)将备份传到从库

将161备份的数据传输到162上

cd /data/backup/
scp alldb_bak_for_gtid.sql 192.168.5.162:/data/backup

在这里插入图片描述

(4)清空从库的gtid_executed

162节点执行

reset master;

在这里插入图片描述

(5)导入数据

162节点导入备份的数据

cd /data/backup
mysql -uroot -padmin < alldb_bak_for_gtid.sql

在这里插入图片描述

二、建立双主复制关系

1、建立161到162的复制关系

(1)建立复制关系

在162上执行

stop slave;
reset slave;

change master to 
master_host='192.168.5.161',
master_user='repl',
master_password='admin',
MASTER_AUTO_POSITION=1;

在这里插入图片描述

(2)开启复制

start slave;

在这里插入图片描述

(3)查看复制状态

show slave status\G;

在这里插入图片描述

2、建立162到161的复制关系

(1)建立复制关系

在161上执行

stop slave;
reset slave;

change master to 
master_host='192.168.5.162',
master_user='repl',
master_password='admin',
MASTER_AUTO_POSITION=1;

在这里插入图片描述

(2)开启复制

start slave;

在这里插入图片描述

(3)查看复制状态

show slave status\G;

在这里插入图片描述

3、验证数据是否正常同步

(1)161创建数据库

create database dba_test;

在这里插入图片描述

(2)检查162是否同步

show databases;

在这里插入图片描述

(3)162删除这个测试库

drop database dba_test;

在这里插入图片描述

(4)检查161是否删除了

show databases;

在这里插入图片描述

三、安装keepalived

1、安装keepalived

在161和162节点都进行安装

yum install -y keepalived

在这里插入图片描述

2、加入到开启启动

2个节点都执行

systemctl enable keepalived.service

在这里插入图片描述

3、修改161机器的keepalived配置文件

vim /etc/keepalived/keepalived.conf

加入如下内容:

global_defs {
   router_id 192.168.5.161

}

vrrp_script check_mysql {
   script "/home/mysql/bin/checkmysql.sh /tmp/mysql.sock"
   interval 3
   weight 2
}




vrrp_instance MYSQL_MM2 {
    state BACKUP
    interface ens33
    virtual_router_id 100
    priority 99
    nopreempt
    advert_int 2

    authentication {
        auth_type PASS
        auth_pass xxx
    }

    track_script {
        check_mysql
    }

    unicast_peer {
       192.168.5.162
    }

    virtual_ipaddress {
        192.168.5.100
    }
     notify_master "/sbin/arping -I ens33 -c3 -s192.168.5.100 192.168.5.2 > /tmp/arping.log;"
}

在这里插入图片描述

重点修改的参数如下:

router_id:改为本机IP
vrrp_instance:改为MYSQL_MM加VIP尾数
interface:ens33是网卡名称
virtual_router_id:改为VIP尾数
unicast_peer:改为同组另外一台机器的IP
virtual_ipaddress:改为VIP
notify_master:中的192.168.5.100改为新的VIP,192.168.5.2改为这一组keepalived所在网段的网关。

4、修改162机器的keepalived配置文件

vim /etc/keepalived/keepalived.conf

加入如下内容:

global_defs {
   router_id 192.168.5.162

}

vrrp_script check_mysql {
   script "/home/mysql/bin/checkmysql.sh /tmp/mysql.sock"
   interval 3
   weight 2
}




vrrp_instance MYSQL_MM2 {
    state BACKUP
    interface ens33
    virtual_router_id 100
    priority 99
    nopreempt
    advert_int 2

    authentication {
        auth_type PASS
        auth_pass xxx
    }

    track_script {
        check_mysql
    }

    unicast_peer {
       192.168.5.161
    }

    virtual_ipaddress {
        192.168.5.100
    }
     notify_master "/sbin/arping -I ens33 -c3 -s192.168.5.100 192.168.5.2 > /tmp/arping.log;"
}

在这里插入图片描述

重点修改的参数如下:

router_id:改为本机IP
vrrp_instance:改为MYSQL_MM加VIP尾数
interface:ens33是网卡名称
virtual_router_id:改为VIP尾数
unicast_peer:改为同组另外一台机器的IP
virtual_ipaddress:改为VIP
notify_master:中的192.168.5.100改为新的VIP,192.168.5.2改为这一组keepalived所在网段的网关。

四、配置检测脚本

1、编写脚本

在161和162上配置切换脚本

mkdir -p /home/mysql/bin
mkdir -p /home/mysql/log/
vim /home/mysql/bin/checkmysql.sh

在这里插入图片描述
脚本内容如下:
注意,修改脚本里的密码

#!/bin/bash

PATH=$PATH:/usr/local/mysql/bin


if [[ -n $1 ]]
then
    MYSQL_SOCK="$1"
else
    MYSQL_SOCK="/tmp/mysql.sock"
fi

MYSQL_USERNAME="keepalived_r"
MYSQL_PASSWORD="admin"







for i in 1 2 3
do
        alive1=`mysqladmin -S $MYSQL_SOCK             -u$MYSQL_USERNAME -p$MYSQL_PASSWORD  ping | grep -c alive `
    if  [ $alive1 -eq 1   ]
    then
        echo "alive"
        exit 0 ;
    else
        if [[ $i -eq 3 ]]
        then


                systemctl restart keepalived
                
                echo "$(date +"%Y%m%d %H:%M:%S") keepalived restart" >> /home/mysql/log/keeplived.log

        else
            sleep 0.9
        fi

    fi
done

在这里插入图片描述
给脚本可执行权限

chmod 700 /home/mysql/bin/checkmysql.sh

在这里插入图片描述

2、启动Keepalived

(1)161上先启动Keepalived

service keepalived start

在这里插入图片描述

查看是否获取到vip

ip a

在这里插入图片描述

(1)162上再启动Keepalived

service keepalived start

在这里插入图片描述

查看是否获取到vip,这个没有vip说明是正常的,现在vip还在161上面。

ip a

在这里插入图片描述

3、测试通过VIP连接MySQL

(1)创建业务用户

随便在哪个节点连接到数据库,创建用户,这里我在161节点执行

create user `u_test`@`%` identified with mysql_native_password by 'admin';
GRANT ALL ON *.* TO `u_test`@`%`;

在这里插入图片描述

(2)进行连接

到没有vip的机器上使用vip进行连接mysql,我这里是162,

mysql -u'u_test' -p'admin' -h 192.168.5.100

如下,能连接上说明是正常的
在这里插入图片描述

五、高可用测试前准备

1、创建测试用户和测试表

CREATE USER 'go_rw'@'%' identified with mysql_native_password by 'admin';
GRANT insert,delete,select,update ON test.* TO 'go_rw'@'%';
create database test;
use test;
CREATE TABLE user_info (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    age INT,
    created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
);

在这里插入图片描述

2、使用AI生成写入MySQL的go程序

(1)提示词

MySQL的IP为:192.168.5.100,用户名是go_rw,密码是admin,
编写一个Go程序,每隔一秒往MySQL的test库user_info写入一行数据,
并输出当前时间和写入成功
user_info表结构如下:
CREATE TABLE user_info (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    age INT,
    created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
);

(2)生成的代码如下

package main

import (
    "database/sql"
    "fmt"
    "time"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // 数据库连接信息
    db, err := sql.Open("mysql", "go_rw:admin@tcp(192.168.5.100)/test")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    // 循环插入数据
    for {
        // 当前时间
        currentTime := time.Now().Format("2006-01-02 15:04:05")

        // 准备插入的数据
        name := "John Doe"
        age := 30

        // 准备 SQL 语句
        insertQuery := "INSERT INTO user_info (name, age, created_at) VALUES (?, ?, ?)"

        // 执行插入操作
        _, err := db.Exec(insertQuery, name, age, currentTime)
        if err != nil {
            fmt.Println("Error inserting data:", err)
        } else {
            fmt.Println("Inserted data successfully at", currentTime)
        }

        // 暂停一秒钟
        time.Sleep(1 * time.Second)
    }
}

3、运行代码

(1)导入依赖

go mod tidy

在这里插入图片描述

(2)运行代码

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

4、查询数据

(1)161查询数据

use test;
select * from user_info order by id desc limit 5;

在这里插入图片描述

(2)162查询数据

use test;
select * from user_info order by id desc limit 5;

在这里插入图片描述

六、停MySQL服务测试高可用

1、停掉有VIP的MySQL的实例

我这里是在161上

/etc/init.d/mysql.server stop

在这里插入图片描述

2、查看go程序的输出

这里发现停掉了几秒,然后又继续了
在这里插入图片描述

3、查看vip是否切换到了162

这里,我们看到vip切换到了162上了。

ip a

在这里插入图片描述

4、启动161上的mysql

/etc/init.d/mysql.server start

在这里插入图片描述

5、停掉新主的mysql

当前vip在162上面,下面我们停掉162的mysql,然后检查vip是否又切换到了161上面。

/etc/init.d/mysql.server stop

在这里插入图片描述

6、查看go的输出

这里发现停掉了几秒,然后又继续了
在这里插入图片描述

7、查看vip是否切换到了161

ip a

在这里插入图片描述

8、启动162上的mysql

/etc/init.d/mysql.server start

在这里插入图片描述

七、重启MySQL所在的机器测试高可用

1、重启161机器

当前的vip是在161上面,关掉161节点的机器
在这里插入图片描述

reboot

在这里插入图片描述

2、观察程序输出

这里发现停掉了几秒,然后又继续了
在这里插入图片描述
此时的vip跳到了162上面
在这里插入图片描述

3、重新启动161的mysql

等161机器重启好之后,重新启动161的mysql

/etc/init.d/mysql.server start

在这里插入图片描述

4、重启162的机器

当前的vip跳到了162了,下面重启162的机器,再进行测试

ip a

在这里插入图片描述

reboot

在这里插入图片描述

5、观察程序输出

这里发现停掉了几秒,然后又继续了
在这里插入图片描述
此时的vip跳到了161上面
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做一个有趣的人Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值