构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

:2024年12月31日 青菜浪人
分享到:

通过Keepalived配置,实现MySQL集群高可用性。在主机之间免密管理,通过Ansible批量操作。安装MySQL使用rpm包,通过yum命令直装。通过Ansible配置MySQL服务组,进行批量操作。

需求描述

为了防止MySQL集群在双主模式下可能出现的单点故障风险,利用Keepalived进行配置,从而实现MySQL集群的高可用性。

环境准备

主机
IP
Master-1
192.168.100.101/24
Master-2
192.168.100.102/24
Slave-1
192.168.100.103/24
Slave-2
192.168.100.104/24

配置主机之间免密

1.使用ssh-keygen在Master-1上生成秘钥

ssh-keygen

修改hosts文件,添加主机名映射(将Master-1作为控制节点)

vim /etc/hosts

拷贝秘钥,实现Master-1免密管理其他三台主机

for i in {102..104}; do ssh-copy-id root@192.168.100.$i; done

安装Ansible

利用Ansible批量管理,Master-1作为控制节点对其他三台主机做批量操作。

1.安装Ansible

dnf install ansible-core

2.添加服务组

#在文件末尾添加如下参数

vim /etc/ansible/hosts

[mysql]

Master-2

Slave-1

Slave-2

3.ping测试,全绿表示免密成功,且主机之间通讯没有问题。

ansible mysql -m ping

image-20241230151818273

安装mysql

我这里采用rpm包进行安装,在4台虚拟机上进行安装

#mysql下载地址

https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-1.el9.x86_64.rpm-bundle.tar

这里已经配置好本地yum仓库,使用yum命令直装

#Master-1节点执行

dnf localinstall *.rpm

ansible mysql -m shell -a "dnf localinstall *.rpm -y"

启动并修改mysql密码

systemctl start mysqld

#获取默认密码

cat /var/log/mysqld.log |grep password|awk '{print $NF}'

修改密码

mysql --connect-expired-password -uroot -p"pM8t>RW:TtB>" -e "alter user 'root'@'localhost' identified by 'Qclr@123';flush privileges;"

使用ansible启动其他三台主机的mysql服务

#启动mysql

ansible mysql -m shell -a "systemctl start mysqld"

获取默认密码

ansible mysql -m shell -a "cat /var/log/mysqld.log |grep password|awk '{print \$NF}'"

修改密码,这里为了方便操作,将密码进行统一

ansible mysql -m script -a "/root/reset_mysqpasswd.sh"

#批量脚本内容

#!/usr/bin/env bash

list=(

"+.c43u!;A2T1"

":.CrA,4Ow+SP"

"RuL&YfF6aggB"

)

for i in${list[@]}

do

name=$(hostname)

if [[ $name == "Master-2" ]];then

mysql --connect-expired-password -uroot -p"$i" -e "alter user 'root'@'localhost' identified by 'Qclr@123';flush privileges;"

elif [[ $name == "Slave-1" ]];then

mysql --connect-expired-password -uroot -p"$i" -e "alter user 'root'@'localhost' identified by 'Qclr@123';flush privileges;"

elif [[ $name == "Slave-2" ]];then

mysql --connect-expired-password -uroot -p"$i" -e "alter user 'root'@'localhost' identified by 'Qclr@123';flush privileges;"

else

echo"bey~"

exit 1

fi

done

安装keepalived

通过配置Keepalived在MYSQL双主模式下实现VIP(虚拟IP)的动态漂移,以确保MYSQL数据库的高可用性。

1.在Master-1和Master-2上安装keepalived

dnf install keepalived -y

ssh Master-2 dnf install keepalived -y

修改配置文件,确定主备关系

! Configuration File for keepalived

global_defs {

router_id 1

script_user root

enable_script_security

}

vrrp_script check_mysql {

script "/etc/keepalived/check_mysql.sh"

interval 3

weight -50

fall 2

rise 1

}

vrrp_instance VI_1{

state MASTER

interface ens160

mcast_src_ip 192.168.100.101

virtual_router_id 51

priority 101

advert_int 2

authentication{

auth_type PASS

auth_pass 123

}

virtual_ipaddress{

192.168.100.254/24

}

track_script{

check_mysql

}

}

编写检测脚本,当发现mysql进程不存在时,关闭keepalived实现VIP切换

#!/usr/bin/env bash

if pgrep mysqld 1>/dev/null ;then

true

else

systemctl stop keepalived.service

exit 1

fi

将配置文件拷贝至Master-2

scp -r /etc/keepalived/* Master-2:/etc/keepalived/

修改Master-2配置文件,将其设置为备份主机

启动服务,可以看到此时的vip在Master-1上

systemctl start keepalived

配置mysql主从复制

配置Master-1

修改Master-1服务器的mysql配置文件

vim /etc/my.cnf

#添加以下内容↓↓↓

server_id=101

binlog-ignore-db=mysql

log-bin=mall-mysql-bin

binlog_cache_size=1M

binlog_format=mixed

expire_logs_days=7

slave_skip_errors=1062

#开启GTID

gtid_mode=ON

enforce_gtid_consistency=ON

添加完毕后重启mysql服务,使配置生效

systemctl restart mysqld

创建数据库同步用户,并赋予权限

mysql -uroot -p"Qclr@123" <<EOF

create user 'qclr'@'%' identified by 'Qclr@123';

grant replication slave,replication client on *.* to 'qclr'@'%';

flush privileges;

EOF

配置Master-2

修改Master-2服务器的mysql配置文件

vi /etc/my.cnf

#添加以下内容↓↓↓

server_id=102

binlog-ignore-db=mysql

log-bin=mall-mysql-bin

binlog_cache_size=1M

binlog_format=mixed

expire_logs_days=7

slave_skip_errors=1062

#开启GTID

gtid_mode=ON

enforce_gtid_consistency=ON

添加完毕后重启mysql服务,使配置生效

systemctl restart mysqld

与Master-1一样,创建一个数据库同步用户,并赋予权限

mysql -uroot -p"Qclr@123" <<EOF

create user 'qclr'@'%' identified by 'Qclr@123';

grant replication slave,replication client on *.* to 'qclr'@'%';

flush privileges;

EOF

配置slave-1

修改mysql配置文件,添加如下内容

vim /etc/my.cnf

## 设置 server_id,同一局域网中需要唯一

server_id=103

binlog-ignore-db=mysql

log-bin=mall-mysql-slave1-bin

binlog_cache_size=1M

binlog_format=mixed

expire_logs_days=7

slave_skip_errors=1062

relay_log=mall-mysql-relay-bin

read_only=1

#开启GTID

gtid_mode=ON

enforce_gtid_consistency=ON

重启mysql服务使配置文件生效

systemctl restart mysqld

配置主从同步

登录slave节点,指定Master数据库信息

mysql -uroot -p"Qclr@123"<<EOF

change replication source to source_host='192.168.100.254',source_port=3306,source_user='qclr',source_password='Qclr@123',source_auto_position=1;

start slave;

flush privileges;

EOF

#开启主从同步

mysql> start slave;

#查看从数据库是否开启同步

mysql> show slave status \G;

#如配置出错,则需要先停止再重置

stop slave

reset slave

reset master

出现下图两个YES,表示配置成功

配置Slave-2

修改mysql配置文件,添加如下内容

vim /etc/my.cnf

## 设置 server_id,同一局域网中需要唯一

server_id=104

binlog-ignore-db=mysql

log-bin=mall-mysql-slave1-bin

binlog_cache_size=1M

binlog_format=mixed

expire_logs_days=7

slave_skip_errors=1062

relay_log=mall-mysql-relay-bin

read_only=1

#开启GTID

gtid_mode=ON

enforce_gtid_consistency=ON

重启mysql服务使配置文件生效

systemctl restart mysqld

登录slave节点,指定Master数据库信息

mysql -uroot -p"Qclr@123"<<EOF

change replication source to source_host='192.168.100.254',source_port=3306,source_user='qclr',source_password='Qclr@123',source_auto_position=1;

start slave;

flush privileges;

EOF

#开启主从同步

mysql> start slave;

#查看从数据库是否开启同步

mysql> show slave status \G;

配置Master之间互为主从关系

注:为了防止双主情况下数据库生成的主键冲突,在MYSQL数据库中设置Master-1和Master-2的自增初始值(auto_increment_offset)分别为1,2,设置增长步长(auto_increment_increment)都为2

#Master-1配置文件末尾添加如下内容

auto_increment_increment=2

auto_increment_offset=1

#Master-2配置文件末尾添加如下内容

auto_increment_increment=2

auto_increment_offset=2

1.配置两个主节点之间互相复制数据

#Master-1

mysql -uroot -p"Qclr@123"<<EOF

change replication source to source_host='192.168.100.102',source_port=3306,source_user='qclr',source_password='Qclr@123',source_auto_position=1;

start slave;

flush privileges;

EOF

#Master-2

mysql -uroot -p"Qclr@123"<<EOF

change replication source to source_host='192.168.100.101',source_port=3306,source_user='qclr',source_password='Qclr@123',source_auto_position=1;

start slave;

flush privileges;

EOF

#开启主从同步

mysql> start slave;

#查看从数据库是否开启同步

mysql> show slave status \G;

Master-1

Master-2

效果测试

在Master-2创建新数据库

在其他三个节点上查看,可以看到数据已被同步

模拟Master-1故障,查看vip是否会切换至Master-2

关闭Master-1的mysql服务

在Master-2查看,可以看到VIP已切换至Master-2

查看slave-1和2的同步状态,可以看到从库不受影响,同步状态正常

再次创建数据库测试,主从同步正常

原文来源:https://mp.weixin.qq.com/s/T7Go5Krw2L_JFlXa0yzBpQ

[我要纠错]
文:王振袢&发表于江苏
关键词: 需求 描述 为了 防止 MySQL

来源:本文内容搜集或转自各大网络平台,并已注明来源、出处,如果转载侵犯您的版权或非授权发布,请联系小编,我们会及时审核处理。
声明:江苏教育黄页对文中观点保持中立,对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,不对文章观点负责,仅作分享之用,文章版权及插图属于原作者。

点个赞
0
踩一脚
0

您在阅读:构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

Copyright©2013-2024 JSedu114 All Rights Reserved. 江苏教育信息综合发布查询平台保留所有权利

苏公网安备32010402000125 苏ICP备14051488号-3技术支持:南京博盛蓝睿网络科技有限公司

南京思必达教育科技有限公司版权所有   百度统计

最热文章
最新文章
  • 阿里云上云钜惠,云产品享最低成本,有需要联系,
  • 卡尔蔡司镜片优惠店,镜片价格低
  • 苹果原装手机壳