一、环境准备
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上面