MySQL高可用之双主+Keepalived,轻松实现单点故障VIP转移

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL高可用之双主+Keepalived,轻松实现单点故障VIP转移

前言


keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障,本次是基于Docker容器部署MySQL高可用双主+Keepalived。


🚀 1.Keepalived简介


keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。

Keepalived高可用故障切换,是通过VRRP虚拟路由器冗余协议来实现的

86373693244f43fb86cacb6b3aa635b8.png


一般中小型公司都使用这种架构,搭建比较方便简单;可以采用主从或者主主模式,

在 master 节点发生故障后,利用keepalived 高可用机制实现快速切换到 slave 节点。

原来的从库变成新的主库。

使用 Keepalived 的 HA 功能,实现 MySQL 主从复制的自动故障切换。

它的工作原理是:初始将 MySQL 的主从两个主机赋予不同的优先级别,

当 Keepalived 启动时,会将 VIP 绑定到高优先级的主库上。

在 Keepalived 中调用自定义脚本 check_run,每分钟检查一次本机 MySQL 的服务器状态,

如果 MySQL 不可用,则杀掉本机的 keepalived 进程。

Keepalived 每秒钟会检查一次本机的 keepalived 进程,如果进程不存在,则将 VIP 绑定到另一台机器上,

如果这台机器原来是从库,则同时调用master.sh 脚本执行从库切换为主库的操作。


🚩 与主从复制相比,双主复制需要注意以下三个参数的设置:


1.log_slave_updates:要设置为 true,将复制事件写入本机 binlog。

一台服务器既做主库又做从库时此选项必须要开启。

2.auto_increment_offset 和 auto_increment_increment:为避免自增列冲突,需要设置这两个参数,例如在双主复制中,可以配置如下:


masterA 自增长 ID

auto_increment_offset=1

auto_increment_increment=2 #奇数 ID

masterB 自增加 ID

auto_increment_offset=2

auto_increment_increment=2 #偶数 ID


🚀 2.双主部署

785990dcd2ba47a48b269cc111128352.png



🌈 2.1 容器部署


🚩 Master1


docker run -d --name MMK-JEM-Master1-ip31

-h MMK-JEM-Master1-ip31

–network mhajem --ip 192.168.68.31 --privileged=true

-p 33461:3306 -p 2241:22

centos:8.2 init


🚩 Master2


docker run -d --name MMK-JEM-Master2-ip32

-h MMK-JEM-Master2-ip32

–network mhajem --ip 192.168.68.32 --privileged=true

-p 33462:3306 -p 2242:22

centos:8.2 init


🚩 网络创建


docker network create --subnet=192.168.68.0/16 mhajem

docker network inspect mhajem

docker network connect bridge MMK-JEM-Master1-ip31

docker network connect bridge MMK-JEM-Master2-ip32


🌈 2.2 部署MySQL


mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz

📢📢拷贝安装包到容器

docker cp mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz MMK-JEM-Master1-ip31:/

docker cp mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz MMK-JEM-Master2-ip32:/

📢📢进入容器

docker exec -it MMK-JEM-Master1-ip31 /bin/bash

docker exec -it MMK-JEM-Master2-ip32 /bin/bash

📢📢组及用户创建

groupadd mysql

useradd -r -g mysql mysql

📢📢压缩及创建快捷方式

tar -xf mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz -C /usr/local/

ln -s /usr/local/mysql-8.0.19-linux-glibc2.12-x86_64 /usr/local/mysql

ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog

ln -s /usr/local/mysql/mysql /usr/bin/mysql

📢📢环境变量及初始化

echo “export PATH=$PATH:/usr/local/mysql/bin” >> /etc/bashrc

source /etc/bashrc

chown -R mysql.mysql /usr/local/mysql-8.0.19-linux-glibc2.12-x86_64

📢📢初始化MySQL

/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

📢📢yum安装依赖包

yum install -y net-tools

yum install -y libtinfo*

yum -y install numactl

yum -y install libaio*

yum -y install perl perl-devel

yum -y install autoconf

yum -y install numactl.x86_64


🌈 2.3 参数文件


🚩 Master1参数文件


cat>/etc/my.cnf<<“EOF”

#M1

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

user=mysql

port=3306

character_set_server=utf8mb4

secure_file_priv=

server-id=330631

log-bin=

binlog_format=STATEMENT

binlog-ignore-db=mysql

binlog-ignore-db=information_schema

binlog-ignore-db=performance_schema

binlog-ignore-db=sys

replicate_ignore_db=information_schema

replicate_ignore_db=performance_schema

replicate_ignore_db=mysql

replicate_ignore_db=sys

log-slave-updates

auto-increment-increment=2

auto-increment-offset=1

skip_name_resolve

log_timestamps=SYSTEM

default-time-zone=’+8:00’

gtid-mode=ON

enforce-gtid-consistency=on

EOF


🚩 Master2参数文件


cat>/etc/my.cnf<<“EOF”

#M2

[mysqld]

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

user=mysql

port=3306

character_set_server=utf8mb4

secure_file_priv=

server-id=330632

log-bin=

binlog_format=STATEMENT

binlog-ignore-db=mysql

binlog-ignore-db=information_schema

binlog-ignore-db=performance_schema

binlog-ignore-db=sys

replicate_ignore_db=information_schema

replicate_ignore_db=performance_schema

replicate_ignore_db=mysql

replicate_ignore_db=sys

log-slave-updates

auto-increment-increment=2

auto-increment-offset=2

skip_name_resolve

log_timestamps=SYSTEM

default-time-zone=’+8:00’

gtid-mode=ON

enforce-gtid-consistency=ON

EOF


🌈 2.4 创建用户


##2个主库都创建

mysql> create user repl@’%’ identified with mysql_native_password by ‘root’;

mysql> grant all on . to repl@’%’ with grant option;

mysql> flush privileges;

show master status\G;

--M2
change master to
master_host='192.168.68.31',
master_port=3306,
master_user='repl',
master_password='root',
master_auto_position=1;
start slave;
show slave status\G;
--M1
change masterto
master_host='192.168.68.32',
master_port=3306,
master_user='repl',
master_password='root',
master_auto_position=1;
start slave;
show slave status\G;
测试数据
--主库
create database jemdb;
use jemdb;
create table jemdb.mytb1(id int,name varchar(30));
SET SESSION binlog_format='STATEMENT';
insert into jemdb.mytb1 values(2,@@hostname);
select * from jemdb.mytb1;
create database jemdb2;
use jemdb2;
create table jemdb2.mytb2(id int,name varchar(30));
SET SESSION binlog_format='STATEMENT';
insert into jemdb2.mytb2 values(2,@@hostname);
select * from jemdb2.mytb2;


🚀 3.配置 keepalived


🚩 master1 和 master2 两台机器上同样进行如下操作:

yum install -y keepalived


– M1 和 M2 机器上的 keepalived.conf 配置,如果需要设置不同的优先级,那么需要修改 state 和 priority 的值。

cat > /etc/keepalived/keepalived.conf << “EOF”

! Configuration File for keepalived

global_defs {

router_id MySQL-MM-HA

}

vrrp_script chk_mysql_port { #检测 mysql 服务是否在运行。有很多方式,比如进程,用脚本检测等等

script “/etc/keepalived/chk_mysql.sh” #这里通过脚本监测

interval 2 #脚本执行间隔,每 2s 检测一次

weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非 0)则优先级 -5

fall 2 #检测连续 2 次失败才算确定是真失败,会用 weight 减少优先级(1-255 之间)

rise 1 #检测 1 次成功就算成功。但不修改优先级

}

vrrp_instance VI_1 {

state BACKUP #建议设置为 BACKUP

interface eth1 #指定虚拟 ip 的网卡接口

virtual_router_id 51 #路由器标识,MASTER 和 BACKUP 必须是一致的才能保证是同一套系统

priority 100 #定义优先级,数字越大,优先级越高,在同一个 vrrp_instance 下,MASTER 的优先级必须大于 BACKUP 的优先级。这样 MASTER 故障恢复后,就可以

将 VIP 资源再次抢回来

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.68.36

}

track_script {

chk_mysql_port

}

}

EOF


🚩 配置参数文件


cat > /etc/keepalived/chk_mysql.sh << "EOF"
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl stop keepalived
fi
EOF
chmod 755 /etc/keepalived/chk_mysql.sh
systemctl start keepalived
systemctl enable keepalived


🚩 数据校验


mysql -uroot -proot -h192.168.68.36 -P3306

select @@server_id,@@hostname;

create database jemdb3;

use jemdb3;

create table jemdb3.mytb1(id int,name varchar(30));

SET session binlog_format = ‘STATEMENT’;

insert into jemdb3.mytb1 values(1,@@hostname);

select * from jemdb3.mytb1;

9ef673684ffe4b4ba807a7f73ac59b3f.png


此时如果主库挂了,另外一个主库会继续工作

36ab4a9a36b6481fb7c2b92c2d21408a.png


MySQL从入门到精通

https://blog.csdn.net/weixin_41645135/category_11595820.html


6a7b45dcd4ca41a98a8212d3efc48a1d.png

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
14小时前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
20 3
Mysql高可用架构方案
|
3月前
|
SQL 关系型数据库 MySQL
orchestrator搭建mysql高可用
orchestrator搭建mysql高可用
38 0
|
3月前
|
缓存 关系型数据库 MySQL
如何实现mysql高可用集群
如何实现mysql高可用集群
32 0
|
23天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
96 6
|
20天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
55 3
Mysql(4)—数据库索引
|
23天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
58 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
6天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
38 2
|
9天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
39 4
|
14天前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?
|
18天前
|
SQL Oracle 关系型数据库
安装最新 MySQL 8.0 数据库(教学用)
安装最新 MySQL 8.0 数据库(教学用)
86 4