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

需求描述

为了防止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
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

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

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

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

for i in {102..104}; do ssh-copy-id root@192.168.100.$idone
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

安装Ansible

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

1.安装Ansible

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

2.添加服务组

#在文件末尾添加如下参数
vim /etc/ansible/hosts

[mysql]
Master-2
Slave-1
Slave-2
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

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

ansible mysql -m ping
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换
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集群:利用Keepalived实现无缝故障切换

启动并修改mysql密码

systemctl start mysqld
#获取默认密码
cat /var/log/mysqld.log |grep password|awk '{print $NF}'
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

修改密码

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"
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

获取默认密码

ansible mysql -m shell -a "cat /var/log/mysqld.log |grep password|awk '{print $NF}'"
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

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

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
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

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

! 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/
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

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

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

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

systemctl start keepalived
构建高可用性MySQL集群:利用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
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

配置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
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

配置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,表示配置成功

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

配置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;
构建高可用性MySQL集群:利用Keepalived实现无缝故障切换

配置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

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

Master-2

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

效果测试

在Master-2创建新数据库

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

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

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

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

关闭Master-1的mysql服务

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

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

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

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

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

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

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

▽往期推荐△











原文始发于微信公众号(青菜浪人):

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/308105.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!