当前位置: 首页 > news >正文

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 keepalivedglobal_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 enp0s3virtual_router_id 51#字数越大,优先级越高,master必须大于backuppriority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {#该ip为虚拟出来的vip地址192.168.0.140}
}#配置virtual_server  ip为上面配置的虚拟vip地址  端口为mysql的端口
virtual_server 192.168.0.140 3306 {delay_loop 6lb_algo rrlb_kind NATpersistence_timeout 50protocol TCP#real_server 该配置为实际物理机ip地址 以及实际物理机mysql端口real_server 192.168.0.146 3306 {weight 3#当该ip 端口连接异常时,执行该脚本notify_down /etc/keepalived/restartKeepalived.shTCP_CHECK {#实际物理机ip地址connect_ip 192.168.0.146#实际物理机port端口connect_port 3306connect_timeout 3nb_get_retry 3delay_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 keepalivedglobal_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不能为51virtual_router_id 51#字数越大,优先级越高,master必须大于backuppriority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {#该ip为虚拟出来的vip地址192.168.0.140}
}#配置virtual_server  ip为上面配置的虚拟vip地址  端口为mysql的端口
virtual_server 192.168.0.140 3306 {delay_loop 6lb_algo rrlb_kind NATpersistence_timeout 50protocol TCP#real_server 该配置为实际物理机ip地址 以及实际物理机mysql端口real_server 192.168.0.148 3306 {weight 3#当该ip 端口连接异常时,执行该脚本notify_down /etc/keepalived/restartKeepalived.shTCP_CHECK {#实际物理机ip地址connect_ip 192.168.0.148#实际物理机port端口connect_port 3306connect_timeout 3nb_get_retry 3delay_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高可用部署并测试完成。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Hooks 「 useImperativeHandle 」子组件向父组件暴露方法
  • Dockerfile常用指令详解
  • 在NVIDIA jetson中使用jetson-ffmpeg调用硬件编解码加速处理
  • TCP的连接建立及报文段首部格式
  • ESP32-IDF 在 Ubuntu 下的配置
  • 【xilinx】Vivado 成功运行Ubuntu需要哪些 文件?
  • 微软RDL远程代码执行超高危漏洞(CVE-2024-38077)漏洞检测排查方式
  • JavaSE基础(12)——文件、递归、IO流
  • 未知单播泛洪原因
  • 日志审计Graylog 使用教程-kafka收取消息
  • 【数据结构】一篇讲清楚什么是堆? 带图食用超详细~
  • go-zero接入skywalking链路追踪
  • C语言高手参考手册:函数进阶技巧
  • C++基础面试题 | C++中值传递和引用传递的区别?
  • 基于Kotlin Multiplatform的鸿蒙跨平台开发实践
  • ----------
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • DOM的那些事
  • input的行数自动增减
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java小白进阶笔记(3)-初级面向对象
  • JS字符串转数字方法总结
  • k8s 面向应用开发者的基础命令
  • MySQL数据库运维之数据恢复
  • NSTimer学习笔记
  • REST架构的思考
  • select2 取值 遍历 设置默认值
  • 阿里云应用高可用服务公测发布
  • 程序员该如何有效的找工作?
  • 好的网址,关于.net 4.0 ,vs 2010
  • 后端_MYSQL
  • 深入浏览器事件循环的本质
  • 以太坊客户端Geth命令参数详解
  • 第二十章:异步和文件I/O.(二十三)
  • # dbt source dbt source freshness命令详解
  • (附源码)计算机毕业设计高校学生选课系统
  • (南京观海微电子)——I3C协议介绍
  • (十三)MipMap
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (源码分析)springsecurity认证授权
  • (转)【Hibernate总结系列】使用举例
  • (自适应手机端)行业协会机构网站模板
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .gitignore文件_Git:.gitignore
  • .htaccess 强制https 单独排除某个目录
  • .net core 6 redis操作类
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net分布式压力测试工具(Beetle.DT)
  • .net后端程序发布到nignx上,通过nginx访问
  • /etc/skel 目录作用