mysql实战——Mysql8.0高可用之双主+keepalived

一、介绍

利用keepalived实现Mysql数据库的高可用,Keepalived+Mysql双主来实现MYSQL-HA,两台Mysql数据库的数据保持完全一致,实现方法是两台Mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台Mysql数据库宕机后,应用能够自动切换到另外一台Mysql数据库上去,保证系统的高可用。

二、搭建前准备

|----------------|--------------------------------|
| mysql | 8.0.25 |
| keepalived | keepalibed-2.2.8 |
| Mysql-master-1 | 192.168.1.80 |
| Mysql-master-2 | 192.168.1.81 |
| Mysql------vip | 192.168.1.82(这个只是虚拟IP,不用准备虚拟机) |

准备两台机器都安装mysql。

三、搭建

3.1 关闭防火墙

两台机器都关闭firewalld

systemctl stop firewalld

systemctl disable firewalld

systemctl status firewalld

3.2 搭建双主同步

3.2.1修改master-1配置文件

现在需要搭建两个机器的主主同步

vi /etc/my.cnf

[mysqld]

log-bin=mysql-bin #开启主从binlog(二进制日志),主库必须开启

binlog_format=mixed #指定二进制日志格式为mixed,即在语句和行两种模式之间自动切换

server-id=1 #配置server-id(唯一)标识主机,必须与从库不一致

relay-log=relay-bin #指定中继日志文件的名称为relay-bin,用于在主从复制中传输数据

relay-log-index=slave-relay-bin.index #指定中继日志索引文件的名称,用于记录中继日志文件的位置。

auto_increment_increment=2 #指定自增长ID的增量为2,用于在主从复制中避免ID冲突。

auto_increment_offset=1 #指定自增长ID的起始值为1,用于在主从复制中避免ID冲突。

##保存退出,并重启MySQL服务

[root@skymachine ~]# service mysql restart

Shutting down MySQL.. SUCCESS!

Starting MySQL.. SUCCESS!

3.2.2修改master-2配置文件

vi /etc/my.cnf

[mysqld]

log-bin=mysql-bin #开启主从binlog(二进制日志),主库必须开启

binlog_format=mixed #指定二进制日志格式为mixed,即在语句和行两种模式之间自动切换

server-id=2 #配置server-id(唯一)标识主机,必须与从库不一致

relay-log=relay-bin #指定中继日志文件的名称为relay-bin,用于在主从复制中传输数据

relay-log-index=slave-relay-bin.index #指定中继日志索引文件的名称,用于记录中继日志文件的位置。

auto_increment_increment=2 #指定自增长ID的增量为2,用于在主从复制中避免ID冲突。

auto_increment_offset=2 #指定自增长ID的起始值为2,用于在主从复制中避免ID冲突。

##保存退出,并重启MySQL服务

[root@skymachine ~]# service mysql restart

Shutting down MySQL.. SUCCESS!

Starting MySQL.. SUCCESS!

3.2.3 在两台节点分别创建同步用户

mysql> create user 'test'@'%' identified by 'test123';

Query OK, 0 rows affected (0.04 sec)

mysql> grant replication slave on *.* to 'test'@'%';

Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.02 sec)

3.2.4搭建并启动双主复制

master-2

show master status;

记录file和position的值,在master-1中会用到

master-1

change master to master_host='192.168.1.81',master_user='test',master_password='test123',master_log_file='mysql-bin.000001',master_log_pos=870,get_master_public_key=1;
start slave;

如上图io和 sql线程都为yes即成功;

master-1

show master status;

记录file和position,master-2会用到

master-2

change master to master_host='192.168.1.80',master_user='test',master_password='test123',master_log_file='mysql-bin.000001',master_log_pos=871,get_master_public_key=1;
start slave;

如上图两个线程都为yes,即成功。

两个机器都成功,即双主复制搭建成功。

3.2.5测试双主复制

master-1测试

master-2测试

如上面两图,主1创建数据库创建表之后在主2可以看到,主2插入数据主1也可以看到。

3.2.6主备库都关机后需要重新开启同步

若双主都关机后需要重新配置第3.2.4步

3.2.7配置过程中参数说明

状态参数说明

Slave_IO_state 显示当前IO线程的状态,一般情况下就是显示等待主服务器发送二进制日志。

Master_log_file 显示当前同步的主服务器的二进制日志。

Read_master_log_pos 显示当前同步到主服务器上二进制日志的偏移量位置。

Relay_master_log_file 当前中继日志同步的二进制日志。

Relay_log_file 显示当前写入的中继日志。

Relay_log_pos 显示当前执行到中继日志的偏移量位置。

Slave_IO_running 从服务器中IO线程的运行状态,yes代表正常

Slave_SQL_running 从服务器中sql线程的运行状态,YES代表正常

Exec_Master_log_pos 表示同步到主服务器的二进制日志的偏移量位置。

slave启停常用命令

STOP SLAVE IO_THREAD; 停止IO进程

STOP SLAVE SQL_THREAD; 停止SQL进程

STOP SLAVE; 停止IO和SQL进程

START SLAVE IO_THREAD; 启动IO进程

START SLAVE SQL_THREAD; 启动SQL进程

START SLAVE; 启动IO和SQL进程

RESET SLAVE; 用于让从属服务器忘记其在主服务器的二进制日志中的复制位置, 它会删除master.info和relay-log.info文件,以及所有的中继日志,并启动一个新的中继日志,当你不需要主从的时候可以在从上执行这个操作。

SHOW SLAVE STATUS; 查看MySQL同步状态

STOP SLAVE;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;START SLAVE; 经常会朋友mysql主从同步遇到错误的时候,比如一个主键冲突等,那么我就需要在确保那一行数据一致的情况下临时的跳过这个错误,那就需要使用SQL_SLAVE_SKIP_COUNTER = n命令了,n是表示跳过后面的n个事件

CHANGE MASTER TO MASTER_HOST='10.1.1.75', MASTER_USER='replication', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106; START SLAVE; 从指定位置重新同步

3.3keepalived安装部署

在master-1,master-2服务器分别安装keepalived,安装步骤相同,配置文件不同。按照我的步骤即可完成。

3.3.1安装依赖包,下载keepalived(两个节点步骤相同,下面就写一份)

下载到/opt目录下并解压

yum -y install gcc openssl-devel popt-devel psmisc

​yum install wget

Is this ok [y/d/N]: y #安装wget提示,输入y

cd /opt/

wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.8.tar.gz

ll

tar -zxvf keepalived-2.2.8.tar.gz

3.3.2配置keepalived并编译(两个节点步骤相同,下面就写一份)

cd keepalived-2.2.8

./configure --prefix=/opt/keepalived-2.2.8

如上图即成功。

make && make install

如上图即编译成功。

3.3.3将文件复制到对应目录下(两个节点步骤相同,下面就写一份)

[root@128 keepalived-2.2.7]# mkdir /etc/keepalived

[root@128 keepalived-2.2.7]# cp keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf

[root@128 keepalived-2.2.7]# cp keepalived/etc/init.d/keepalived /etc/init.d/

[root@128 keepalived-2.2.7]# cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/

[root@128 keepalived-2.2.7]# cp bin/keepalived /usr/sbin/

3.3.4新建shutdown.sh文件(两个节点步骤相同,下面就写一份)

vi /etc/keepalived/keepalived.conf

复制下面内容,:wq保存并退出。

#!/bin/bash

#该脚本是在mysql服务出现异常时,将keepalived应用停止,从而使虚拟vip主机自动连接到另一台mysql上

killall keepalived

将执行权限设置为可执行

[root@skymachine keepalived]# chmod +x /etc/keepalived/shutdown.sh

3.3.5ifconfig查看网卡名称

master-1,master-2网卡名称为ens33

3.3.6 修改master-1服务器keepalived配置文件(配置文件两个机器不同,3.3.7是master-2的配置)

把原有的keepalived.conf更名为keepalived_bak.conf,然后新建keepalived.conf配置文件

cd /etc/keepalived/

[root@skymachine keepalived]# ll

总用量 4

-rw-r--r-- 1 root root 3550 6月 27 09:34 keepalived.conf

[root@skymachine keepalived]# mv keepalived.conf keepalived_bak.conf

[root@skymachine keepalived]# ll

总用量 4

-rw-r--r-- 1 root root 3550 6月 27 09:34 keepalived_bak.conf

[root@skymachine keepalived]# vi /etc/keepalived/keepalived.conf

将以下内容复制进去

! Configuration File for keepalived

#主要配置故障发生时的通知对象及机器标识

global_defs {

notification_email {

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id MYSQL-1 #主机标识符,唯一即可

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

}

#用来定义对外提供服务的VIP区域及相关属性

vrrp_instance VI_1 {

state BACKUP #表示keepalived角色,都是设成BACKUP则以优先级为主要参考

interface ens33 #指定HA监听的网络接口,刚才ifconfig查看的接口名称

virtual_router_id 151 #虚拟路由标识,取值0-255,master-1和master-2保持一致

priority 100 #优先级,用来选举master,取值范围1-255

advert_int 1 #发VRRP包时间间隔,即多久进行一次master选举

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress { #虚拟出来的地址

192.168.1.82

}

}

#虚拟服务器定义

virtual_server 192.168.1.82 3306 { #虚拟出来的地址加端口

delay_loop 2 #设置运行情况检查时间,单位为秒

lb_algo rr #设置后端调度器算法,rr为轮询算法

lb_kind DR #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选

persistence_timeout 50 #会话保持时间,单位为秒

protocol TCP #指定转发协议,有 TCP和UDP可选

real_server 192.168.1.80 3306 { #实际本地ip+3306端口

weight=5 #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大

#当该ip 端口连接异常时,执行该脚本

notify_down /etc/keepalived/shutdown.sh #检查mysql服务down掉后执行的脚本

TCP_CHECK {

#实际物理机ip地址

connect_ip 192.168.1.80

#实际物理机port端口

connect_port 3306

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

}

注:如果你的ip和我不同,需要更改的位置有(master-2同理):

如果网卡和我不同也需要改网卡

3.3.7修改master-2服务器keepalived配置文件

下图和master-1步骤相同

配置文件就和master-1配置不同了,不同的地方为router_id、priority、real_server、connect_ip四个配置

! Configuration File for keepalived

#主要配置故障发生时的通知对象及机器标识

global_defs {

notification_email {

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_from Alexandre.Cassen@firewall.loc

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id MYSQL-2 #主机标识符,唯一即可

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

}

#用来定义对外提供服务的VIP区域及相关属性

vrrp_instance VI_1 {

state BACKUP #表示keepalived角色,都是设成BACKUP则以优先级为主要参考

interface ens33 #指定HA监听的网络接口,刚才ifconfig查看的接口名称

virtual_router_id 151 #虚拟路由标识,取值0-255,master-1和master-2保持一致

priority 40 #优先级,用来选举master,取值范围1-255

advert_int 1 #发VRRP包时间间隔,即多久进行一次master选举

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress { #虚拟出来的地址

192.168.1.82

}

}

#虚拟服务器定义

virtual_server 192.168.1.82 3306 { #虚拟出来的地址加端口

delay_loop 2 #设置运行情况检查时间,单位为秒

lb_algo rr #设置后端调度器算法,rr为轮询算法

lb_kind DR #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选

persistence_timeout 50 #会话保持时间,单位为秒

protocol TCP #指定转发协议,有 TCP和UDP可选

real_server 192.168.1.81 3306 { #实际本地ip+3306端口

weight=5 #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大

#当该ip 端口连接异常时,执行该脚本

notify_down /etc/keepalived/shutdown.sh #检查mysql服务down掉后执行的脚本

TCP_CHECK {

#实际物理机ip地址

connect_ip 192.168.1.81

#实际物理机port端口

connect_port 3306

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

}

3.3.8启动服务 (两个节点步骤相同,下面就写一份)

[root@skymachine keepalived]# systemctl start keepalived

[root@skymachine keepalived]# systemctl status keepalived

systemctl enable keepalived #开机启动,根据需求设置

3.3.9配置虚拟ip登录用户(两个节点步骤相同,下面就写一份)

在两台服务器上新建用户以验证keepalived服务是否配置成功

useradd -m keepalived

passwd keepalived

Qwe135.

3.3.10测试keepalived服务

启动后相当于虚拟出一个vip 192.168.15.100,用ssh工具连接服务器,输入ip和用户名及密码,登录至虚拟ip上

连接进去使用ifconfig,可以看到虚拟vip实际上使用的实体服务器是master-1(192.168.1.80)服务器。

将master-1(192.168.1.80)服务器的keepalived应用停止,vip192.168.1.82服务器会断线,重新连接,再次查看192.168.1.82服务ifconfig,可以看到,192.168.1.82服务器自动将实体机ip漂移到了master-2(192.168.1.81)服务器上

master-1

[root@centos7 keepalived]# systemctl stop keepalived

开启master-1的keepalived vip自动飘过来了

3.4mysql双主双活+keepalived高可用整体测试

3.4.1启动服务

将master-1、master-2两台服务器mysql、keepalived应用全部启动,然后新建一个用户,配置权限可以外网访问

sql 复制代码
mysql> CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8mb4 COLLATE utf8m                                                                                 b4_general_ci;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.01 sec)

mysql> create user 'user01'@'%' identified by 'Mysql12#$';
Query OK, 0 rows affected (0.03 sec)

mysql> grant all privileges on 'mydb'.* to 'user01'@'%';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that                                                                                  corresponds to your MySQL server version for the right syntax to use near ''my                                                                                 db'.* to 'user01'@'%'' at line 1
mysql> grant all privileges on `mydb`.* to 'user01'@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| test             | %         |
| user01           | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
6 rows in set (0.01 sec)

3.4.2连接keepalived虚拟服务器

用mysql连接工具连接keepalived虚拟出来的192.168.1.82服务器

3.4.3建立测试数据

3.4.4查看master-1、master-2同步情况

3.4.5查看192.168.1.82服务器实际物理机ip

使用ifconfig命令查看实际使用的物理机为192.168.1.80,所以master-1(192.168.1.80)服务器mysql为主数据库。

3.4.6停止物理机mysql服务

此时手动将master-1服务器mysql停止,keepalived检测到192.168.1.80服务3306端口连接失败,会执行/etc/keepalived/shutdown.sh脚本,将192.168.1.80服务器keepalived应用结束

sql 复制代码
mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
[mysql@centos7 ~]$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/3306/data/mysql.sock' (2)

3.4.7查看漂移ip执行情况

此时再连接192.168.1.82服务下,ifconfig查看,发现已经实际将物理机由master-1(192.168.1.80)到master-2(192.168.1.81)服务器上

3.4.8在新的主服务器插入数据进行测试

再使用mysql连接工具连接192.168.1.82的mysql,插入一条数据,测试是否将数据存入master-2(192.168.1.81)服务器mysql中

3.4.9查看新主服务器数据

查看master-2服务器mysql数据,数据已同步,说明keepalived搭建高可用成功,当master-1服务器mysql出现问题后keepalived自动漂移IP到实体机master-2服务器上,从而使master-2服务器mysql作为主数据库。

3.4.10重启master-1服务,查看数据同步情况(重启之后,vip会自动飘到master-1节点)

java 复制代码
[mysql@centos7 ~]$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/3306/data/mysql.sock' (2)
[mysql@centos7 ~]$ mysqld_safe --defaults-file=/etc/my.cnf &
[2] 11910
[1]   Exit 127                mysql_safe --defaults-file=/etc/my.cnf
[mysql@centos7 ~]$ 2024-05-22T05:19:42.269350Z mysqld_safe Logging to '/data/mysql/3306/data/mysqld.err'.
2024-05-22T05:19:42.427430Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/3306/data
^C
[mysql@centos7 ~]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.25 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select 1+2 from dual;
+-----+
| 1+2 |
+-----+
|   3 |
+-----+
1 row in set (0.00 sec)

查看master-1数据库test2表数据,数据已同步成功。

至此,双主双活+keepalived高可用部署并测试完成。

四、总结

1、 采用keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下相互抢占导致两个节点内写入相同的数据而引发冲突;

2、 把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(字增起始值)设置成不同值,其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原master上冲突,因此一开始就错开;

3、 Slave节点服务器配置不要太差,否则更容易导致复制延迟,作为热备节点的slave服务器,硬件配置不能低于master节点;

如果对延迟很敏感的话,可考虑使用MariaDB分支版本,利用多线程复制的方式可以很大降低复制延迟。

参考文章

Mysql8高可用之双主+keepalived_mysql keepalived-CSDN博客

相关推荐
程序员大金11 分钟前
基于SpringBoot+Vue+MySQL的在线学习交流平台
java·vue.js·spring boot·后端·学习·mysql·intellij-idea
栀夏61314 分钟前
MongoDB 索引
数据库
米饭是菜qy20 分钟前
MySql 事务
数据库·mysql
qq_2518364571 小时前
基于springboot vue3 在线考试系统设计与实现 源码数据库 文档
数据库·spring boot·后端
lllsure1 小时前
MySQL总结
数据库·mysql
weixin_531804242 小时前
SQL优化技巧(如查询优化、索引优化)。分布式系统的基本概念及挑战(如数据一致性、服务发现、负载均衡)
数据库·sql·服务发现
一 乐2 小时前
考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
java·数据库·学习·考研·微信·小程序·源码
一 乐2 小时前
租拼车平台|小区租拼车管理|基于java的小区租拼车管理信息系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·微信·notepad++·拼车
BillDev3 小时前
Oracle创建用户报错-ORA-65096: invalid common user or role name
数据库·oracle