MySQL集群+Keepalived实现高可用部署

Mysql高可用集群-双主双活-myql+keeplived

一、特殊情况

常见案例:当生产环境中,当应用服务使用了mysql-1连接信息,在升级打包过程中或者有高频的数据持续写入【对数据一致性要求比较高的场景】,这种情况下,数据库连接信息基本是固定不变的,而如果数据库mysql-1一旦出现问题,这时必须得人工将应用服务停止掉,再将连接的mysql信息改为mysql-2,再在启动应用服务器,比较繁琐,且中断业务,修复故障时间延长,严重时会造成灾难性的后果。

解决方案

针对这个场景,为了不影响现有业务正常使用情况下,满足负载均衡以及故障转移等特点,即业务系统不需要知道后端服务的数据库的使用状态以及健康状态。
策略:Mysql主从复制功能+keepalived 实现双主双活互备
MySQL双活是指两台MySQL服务器MySQL-1、MySQL-2都为master主节点服务器,同时又是对方的slave从节点,每个数据库都可作为主数据库使用,并将对数据库操作的数据时会同步至另外一台MySQL服务中,MySQL-1和MySQL-2互为主从节点
在这里插入图片描述
说明:Keepalived通过虚拟路由冗余协议(VRRP),创建一个虚拟VIP(MySQL-virtual)并代理MySQL-1,MySQL-2提供数据库服务,实现高可用。在相同集群内发送组播包,master主通过VRRP协议发送组播包,告诉从主的状态。当master停止时,VIP会漂移到到另外一台服务器,完成了MySQL数据库切换。
:当MySQL-virtual实际代理MySQL-1时,MySQL-1服务出现故障后,Keepalived通过自身机制,自动将MySQL-2作为实际代理主服务器,不需要人工干预去修改MySQL配置信息,业务无感知的情况下完成了切换,实现了高可用。

二、实现Keepalived+MySQL高可用

1、实例环境说明

服务器名称IP角色
模拟192.168.0.140IP代理
服务器A192.168.0.146真实IP,主MYSQL数据库
服务器B192.168.0.148真实IP,备MYSQL数据库

2、安装mysql

1.在192.168.0.146、192.168.0.148两台服务器安装MySQL服务
2.修改192.168.0.146服务器/etc/my.cnf配置文件,没有的话可自行创建,配置如下:

[client]
#客户端连接端口
port=3306
#客户端连接sock
socket=/opt/mysql/5.7.36/log/mysql.socka
#客户端编码
default-character-set=utf8

[mysqld]
#mysql服务端口
port=3306
#安装目录
basedir=/opt/mysql/5.7.36/
#数据存放目录
datadir=//opt/mysql/5.7.36/data
#sock文件地址
socket=/opt/mysql/5.7.36/log/mysql.sock
#错误日志存放地址
log-error=/opt/mysql/5.7.36/log/mysql.log
#pid文件地址
pid-file=/opt/mysql/5.7.36/log/mysql.pid

#下面内容为mysq主备时配置,单mysql部署护理下面配置
#server-id 多台服务器时,此表示需要唯一
server-id=1
#主从同步bin-log日志文件名
log-bin=mysql-bin
#主从同步时,需要同步的数据库,多个数据库写多行binlog_do_db配置
binlog_do_db=test_db
#主从同步时,不需要同步的数据库,多个数据库写多行binlog_ignore_db配置
#binlog_ignore_db=mysql
#binlog_ignore_db=information_schema
#binlog_ignore_db=sys
#binlog_ignore_db=performance_schema
#主从同步方式
binlog_format=row
#服务端编码
character-set-server=utf8
!includedir /etc/my.cnf.d

3.修改192.168.0.148服务器/etc/my.cnf配置文件,只有server-id不同,为2配置如下

[client]
#客户端连接端口
port=3306
#客户端连接sock
socket=/opt/mysql/5.7.36/log/mysql.socka
#客户端编码
default-character-set=utf8

[mysqld]
#mysql服务端口
port=3306
#安装目录
basedir=/opt/mysql/5.7.36
#数据存放目录
datadir=/opt/mysql/5.7.36/data
#sock文件地址
socket=/opt/mysql/5.7.36/log/mysql.sock
#错误日志存放地址
log-error=/opt/mysql/5.7.36/log/mysql.log
#pid文件地址
pid-file=/opt/mysql/5.7.36/log/mysql.pid

#下面内容为mysq主备时配置,单mysql部署护理下面配置
#server-id 多台服务器时,此表示需要唯一
server-id=2
#主从同步bin-log日志文件名
log-bin=mysql-bin
#主从同步时,需要同步的数据库,多个数据库写多行binlog_do_db配置
binlog_do_db=test_db
#主从同步时,不需要同步的数据库,多个数据库写多行binlog_ignore_db配置
#binlog_ignore_db=mysql
#binlog_ignore_db=information_schema
#binlog_ignore_db=sys
#binlog_ignore_db=performance_schema
#主从同步方式
binlog_format=row
#服务端编码
character-set-server=utf8
!includedir /etc/my.cnf.d

4.重启192.168.0.146,192.168.0.148的mysql服务

[root@128 mysql5.7]# systemctl stop mysqld
[root@128 mysql5.7]# systemctl start mysqld

3、mysql数据库双主双从配置

1.连接192.168.0.146服务器mysql,并创建主从同步账户slavebak,并查看master状态,记录下file、psition值,配置192.168.0.148的mysql从库时使用

[root@128 ~]# /opt/mysql/5.7.36/bin/mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
......
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> grant replication slave on *.* to slavebak@'%' identified by 'slavebak';
mysql> flush privileges;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |     1287 | test_db      |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)
mysql>

2.连接192.168.0.148服务器,使用slavebak用户远程登录192.168.0.146的MySQL,测试连接是否正常。

[root@129 ~]# /opt/mysql/bin/mysql -h192.168.0.146 -uslavebak -pslavebak
mysql: [Warning] Using a password on the command line interface can be insecure.
......
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit;

3.在192.168.0.148服务器用root连接本服务器mysql,并配置192.168.0.146的主库信息

[root@129 ~]# /opt/mysql/bin/mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
......
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> change master to 
    -> master_host='192.168.0.146',            #146服务器mysql ip
    -> master_port=3306,                         #146服务器mysql端口
    -> master_user='slavebak',                   #146服务器mysql从库同步用户
    -> master_password='slavebak',               #146服务器mysql从库同步用户密码
    -> master_log_file='mysql-bin.000002',       #前面记录的146服务mysql file值
    -> master_log_pos=1287;                      #前面记录的146服务mysql psition值
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;            #启动从库配置

4.查看192.168.0.148从库配置是否成功Slave_IO_Running、Slave_SQL_Running都为yes则成功

mysql> show slave status;
mysql> show slave status \G;
*************************** 1. row ***************************
            ......
            Slave_IO_Running:  Yes                    #此值为yes配置成功
            Slave_SQL_Running: Yes                    #此值为yes配置i成功
            ......
1 row in set (0.01 sec)

5.在192.168.0.148服务器mysql创建主从同步账户slavebak,查看master状态,记录下file、psition值

mysql> grant replication slave on *.* to slavebak@'%' identified by 'slavebak';
mysql> flush privileges;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |     848  | test_db      |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

6.连接192.168.0.146服务器并使用root用户连接本服务器mysql,配置192.168.0.148的主库信息

[root@128 ~]# /opt/mysql/bin/mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
......
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> change master to 
    -> master_host='192.168.0.148',            #148服务器mysql ip
    -> master_port=3306,                         #148服务器mysql端口
    -> master_user='slavebak',                   #148服务器mysql从库同步用户
    -> master_password='slavebak',               #148服务器mysql从库同步用户密码
    -> master_log_file='mysql-bin.000002',       #前面记录的148服务mysql file值
    -> master_log_pos=848;                       #前面记录的148服务mysql psition值
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;            #启动从库配置

7.查看192.168.0.146从库配置是否成功Slave_IO_Running、Slave_SQL_Running都为yes则成功

mysql> show slave status;
mysql> show slave status \G;
*************************** 1. row ***************************
            ......
            Slave_IO_Running:  Yes                    #此值为yes配置成功
            Slave_SQL_Running: Yes                    #此值为yes配置i成功
            ......
1 row in set (0.01 sec)

到这里,192.168.0.146服务器,192.168.0.148服务器双主双从配置完成。

4、Keepalived服务器A安装部署详细步骤

mysql安装包
版本:mysql-5.7.36-el7-x86_64.tar.gz

下载地址:https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.36-el7-x86_64.tar.gz

keepalived安装包
版本:keepalived-2.2.7.tar.gz

下载地址:https://www.keepalived.org/software/keepalived-2.2.7.tar.gz

步骤3:配置keepalived配置文件

vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {
    state MASTER
    #同一网段中同一组virtual_router_id值相同。不同组virtual_router_id值唯一。
    #如server-1、server-2为一组,virtual_router_id=51
    #server-3、server-4为一组,则virtual_router_id不能为51
     
    
    #interface为查到的本机网卡名称                                                                                   
    interface enp0s3
    virtual_router_id 51
    
    #字数越大,优先级越高,master必须大于backup
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        #该ip为虚拟出来的vip地址

        192.168.0.140
    }
}

#配置virtual_server  ip为上面配置的虚拟vip地址  端口为mysql的端口
virtual_server 192.168.0.140 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    #real_server 该配置为实际物理机ip地址 以及实际物理机mysql端口
    real_server 192.168.0.146 3306 {
        weight 3
        #当该ip 端口连接异常时,执行该脚本
        notify_down /etc/keepalived/restartKeepalived.sh
        TCP_CHECK {
            #实际物理机ip地址
            connect_ip 192.168.0.146
            #实际物理机port端口
            connect_port 3306
            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }
    }
}
}

步骤4:补充一个脚本执行文件

cd /etc/keepalived
touch restartKeepalived.sh
vi restartKeepalived.sh
#!/bin/bash
systemctl restart keepalived
chmod 777 restartKeepalived.sh

步骤5:执行启动命令

systemctl start keepalived

步骤6:是否正常启动

ip addr list

5、Keepalived服务器B安装部署详细步骤

mysql安装包
版本:mysql-5.7.36-el7-x86_64.tar.gz

下载地址:https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.36-el7-x86_64.tar.gz

keepalived安装包
版本:keepalived-2.2.7.tar.gz

下载地址:https://www.keepalived.org/software/keepalived-2.2.7.tar.gz

步骤3:配置keepalived配置文件

vi /etc/keepalived/keepalived.conf

内容如下:

! Configuration File for keepalived

global_defs {

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {
    state BACKUP
    #interface为查到的本机网卡名称
    interface enp0s3
    #同一网段中同一组virtual_router_id值相同。不同组virtual_router_id值唯一。
    #如server-1、server-2为一组,virtual_router_id=51
    #server-3、server-4为一组,则virtual_router_id不能为51
    
    virtual_router_id 51
    #字数越大,优先级越高,master必须大于backup
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        #该ip为虚拟出来的vip地址
        192.168.0.140
    }
}

#配置virtual_server  ip为上面配置的虚拟vip地址  端口为mysql的端口
virtual_server 192.168.0.140 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    #real_server 该配置为实际物理机ip地址 以及实际物理机mysql端口
    real_server 192.168.0.148 3306 {
        weight 3
        #当该ip 端口连接异常时,执行该脚本
        notify_down /etc/keepalived/restartKeepalived.sh
        TCP_CHECK {
            #实际物理机ip地址
            connect_ip 192.168.0.148
            #实际物理机port端口
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3

        }
    }
}
}

步骤4:补充一个脚本执行文件

cd /etc/keepalived
touch restartKeepalived.sh
vi restartKeepalived.sh
#!/bin/bash
systemctl restart keepalived
chmod 777 restartKeepalived.sh

步骤5:执行启动命令

systemctl start keepalived

步骤6:是否正常启动
在这里插入图片描述

6、模拟故障演示Keepalived漂移

1、将192.168.1.146、192.168.1.148服务器keepalived加入开机自启,并启动服务

[root@128 keepalived-2.2.7]# systemctl enable keepalived
[root@128 keepalived-2.2.7]# systemctl start keepalived

2、启动后keepalived状态为:active(running)则正常

[root@128 keepalived-2.2.7]# systemctl status keepalived

在这里插入图片描述
3.启动后相当于虚拟出一个vip 192.168.0.140,可使用远程连接工具,连接该服务器,连接进去后使用ifconfig查看该虚拟vip实际上使用的实体服务器是146服务器。
4.将146服务器的keepalived应用停止,再次查看140服务ifconfig,可以看到,140服务器自动将实体机ip漂移到了148服务器上, 在148上面运行hostname -I

[root@128 keepalived-2.2.7]# hostname -I
192.168.0.140 192.168.0.148

如果漂移失败,可能是virtual_router_id在同网段内重复导致。可执行命令查看是否有其他ip使用

[root@128 keepalived-2.2.7]# tcpdump -i 网卡名 vrrp -n |grep virtual_router_id值

例如:

[root@128 keepalived-2.2.7]# tcpdump -i eno16777736 vrrp -n |grep 51

mysql双主双活+keepalived高可用部署并测试完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/870729.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot 整合 Swagger3(springdoc-openapi)

使用springdoc-openapi这个库来生成swagger的api文档 官方Github仓库: https://github.com/springdoc/springdoc-openapi 官网地址:https://springdoc.org 目录题 1. 引入依赖2. 拦截器设置3. 访问接口页面3.1 添加配置项,使得访问路径变短…

贪吃蛇(C语言详解)

贪吃蛇游戏运行画面-CSDN直播 目录 贪吃蛇游戏运行画面-CSDN直播 1. 实验目标 2. Win32 API介绍 2.1 Win32 API 2.2 控制台程序(Console) 2.3 控制台屏幕上的坐标COORD 2.4 GetStdHandle 2.5 GetConsoleCursorlnfo 2.5.1 CONSOLE_CURSOR_INFO …

开源通用验证码识别OCR —— DdddOcr 源码赏析(一)

文章目录 [toc] 前言DdddOcr环境准备安装DdddOcr使用示例 源码分析实例化DdddOcr实例化过程 分类识别分类识别过程 未完待续 前言 DdddOcr 源码赏析 DdddOcr DdddOcr是开源的通用验证码识别OCR 官方传送门 环境准备 安装DdddOcr pip install ddddocr使用示例 示例图片如…

Wyn商业智能助力零售行业数字化决策高效驱动

最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 项目背景及痛点 百利商业的业务覆盖赛格、 SKP、奥莱、王府井等多地区具有代表性的商场,并创立了多个自有品牌。随着新零售模式的兴起,百利商业紧跟时代步伐&am…

培训学校课程管理系统-计算机毕设Java|springboot实战项目

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

web开发,过滤器,前后端交互

目录 web开发概述 web开发环境搭建 Servlet概述 Servlet的作用: Servlet创建和使用 Servlet生命周期 http请求 过滤器 过滤器的使用场景: 通过Filter接口来实现: 前后端项目之间的交互: 1、同步请求 2、异步请求 优化…

Mysql(三)---增删查改(基础)

文章目录 前言1.补充1.修改表名1.2.修改列名1.3.修改列类型1.4.增加新列1.5.删除指定列 2.CRUD3.新增(Create)3.1.单行插入3.2.指定列插入3.3.多行插入 4.数据库的约束4.1.约束的分类4.2.NULL约束4.3.Unique约束4.4.Default 默认值约束4.5.PRIMARY KEY:主键约束4.6.…

Facebook与区块链:社交网络如何融入去中心化技术

随着区块链技术的飞速发展,去中心化理念逐渐渗透到各个领域,社交网络也不例外。作为全球领先的社交平台,Facebook在这一趋势下开始积极探索区块链技术的潜力,希望利用这一前沿技术来提升平台的安全性、透明度和用户控制权。本文将…

景联文科技:一文详解如何构建高质量SFT数据

在图像处理和计算机视觉领域中,将一张图像转化为可用于训练机器学习模型的数据是一项复杂而重要的任务。SFT(Supervised Fine-Tuning,监督微调)是一种常见的深度学习策略,在这一过程中发挥着核心作用。 SFT是指在一个预…

alibabacloud学习笔记14

阿里云ECS服务器Docker部署Nacos docker拉取镜像 查看容器: 启动docker: 查看启动日志: 阿里云ECSDocker部署Sentinel实战 docker拉取镜像 启动镜像: 查看日志: 记得网络安全组开放端口。 阿里云ECSDocker部署Zipkin实…

tekton什么情况下在Dockerfile中需要用copy

kaniko配置如下 如果docker中的workDir跟tekton中的workDir不一致需要copy。也可以通过mv,cp达到类似效果

vue前端可以完整的显示编辑子级部门,用户管理可以为用户分配角色和部门?

用户和角色是一对多的关系用户和部门是多对多得关系<template><div class="s"><!-- 操作按钮 --><div class="shang"><el-input v-model="searchText" placeholder="请输入搜索关键词" style="width:…

效果炫酷的3D翻转书特效WordPress主题模板MagicBook主题v1.19

正文&#xff1a; MagicBook是一款支持3D翻书特效的书籍WordPress主题。支持可视化页面搭建&#xff0c;3D菜单&#xff0c;完全自适应设计,WPML多语言支持。 这款主题一定会让你爱不释手。虽然他是英文的&#xff0c;但不可不承认的是&#xff0c;它优雅的设计会让你愿意花时…

如何在桌面同时展示多个窗口

一、实现2分屏显示 win箭头 二、实现3分屏显示 1. 在实现2分屏显示的基础上&#xff0c;再次点击箭头图标&#xff0c;这次选择屏幕的上方或下方。 2. 点击后&#xff0c;第三个窗口将会出现在你选择的区域。现在&#xff0c;你可以在三个窗口之间自由切换&#xff0c;提高工…

数值计算引擎:搭建远程容器开发环境

Build VS Code Remote Docker Development Environment 大型CAE软件开发技术栈通常依赖多个第三方库&#xff0c;因此从零开始配置开发、编译、运行等环境通常较为繁琐。但随着公司的发展壮大&#xff0c;却经常需要为新加入的成员配备相应的开发环境&#xff1b;另外&#xf…

手把手教你安装Jupyter Notebook(保姆级教程)

Jupyter Notebook介绍 什么是Jupyter Notebook Jupyter Notebook 是一个基于 Web 的交互式计算环境&#xff0c;支持多种编程语言&#xff0c;包括 Python、R、Julia 等。它的主要功能是将代码、文本、数学方程式、可视化和其他相关元素组合在一起&#xff0c;创建一个动态文…

数字化转型底座-盘古信息IMS OS,可支撑构建MES/WMS/QCS/IoT等工业软件

在当今这个数字化浪潮汹涌的时代&#xff0c;众多企业纷纷踏上数字化转型之路。对于部分想自研工业软件的企业来说&#xff0c;一个强大、灵活且可扩展的数字化底座显得尤为重要。盘古信息IMS OS&#xff0c;&#xff0c;正是这样一款能够支撑构建MES&#xff08;制造执行系统&…

ubuntu server 扩容

环境&#xff1a;VirtualBox、Ubuntu-server 调整虚拟磁盘大小 在 VirtualBox 主界面 工具 -- 介质 中选择你要操作的虚拟磁盘&#xff0c;点击属性&#xff0c;更改大小即可&#xff0c;保存后启动虚拟机 查看磁盘状态 lsblk 可以看到 sda 已经是 128G 了。ubuntu--vg-ubun…

【前端】VUE动态引入组件 通过字符串动态渲染模板 动态生成组件

【前端】VUE动态引入组件 通过字符串动态渲染模板 应用场景&#xff1a; js增强 动态代码 扩展一类的 可以配合低代码平台等 灵活配置在线表单 在线列表等 适合灵活性 扩展性比较强的组件 VUE2 <template><div><textarea v-model"templateString"…

开源版最新LoveCardsV2表白墙源码下载

源码亮点 模板系统&#xff0c;给你无限可能 卡片不限字数&#xff0c;支持多图片上传 支持评论&#xff0c;点赞&#xff0c;让互动性拉满 管理后台可添加多个管理员 卡片一键分享至多平台 卡片浏览次数统计 发行版开箱即用 部署教程 1. 环境&#xff08;参考开发环境&…