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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
1月前
|
运维 监控 关系型数据库
MySQL高可用方案:MHA与Galera Cluster对比
本文深入对比了MySQL高可用方案MHA与Galera Cluster的架构原理及适用场景。MHA适用于读写分离、集中写入的场景,具备高效写性能与简单运维优势;而Galera Cluster提供强一致性与多主写入能力,适合对数据一致性要求严格的业务。通过架构对比、性能分析及运维复杂度评估,帮助读者根据自身业务需求选择最合适的高可用方案。
|
1月前
|
SQL 监控 关系型数据库
MySQL主从复制:构建高可用架构
本文深入解析MySQL主从复制原理与实战配置,涵盖复制架构、监控管理、高可用设计及性能优化,助你构建企业级数据库高可用方案。
|
11月前
|
存储 SQL 关系型数据库
Mysql高可用架构方案
本文阐述了Mysql高可用架构方案,介绍了 主从模式,MHA模式,MMM模式,MGR模式 方案的实现方式,没有哪个方案是完美的,开发人员在选择何种方案应用到项目中也没有标准答案,合适的才是最好的。
845 3
Mysql高可用架构方案
|
8月前
|
监控 关系型数据库 MySQL
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
|
1月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
79 3
|
1月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
2月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。
|
1月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
1月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
1月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。

推荐镜像

更多