欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

简单易行:使用双主和Keepalived实现MySQL的高可用性,从容应对单点故障并自动切换VIP

最编程 2024-08-02 18:40:19
...

前言


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


???? 1.Keepalived简介


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

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

网络异常,图片无法展示
|


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

在 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.双主部署

网络异常,图片无法展示
|



???? 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.****.net/weixin_41645135/category_11595820.html


6a7b45dcd4ca41a98a8212d3efc48a1d.png