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

news/2024/9/23 7:21:33/

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配置信息,业务无感知的情况下完成了切换,实现了高可用。

KeepalivedMySQL_11">二、实现Keepalived+MySQL高可用

1、实例环境说明

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

mysql_19">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

mysql_110">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服务器双主双从配置完成。

KeepalivedA_218">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

KeepalivedB_315">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:是否正常启动
在这里插入图片描述

Keepalived_410">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高可用部署并测试完成。


http://www.ppmy.cn/news/1514776.html

相关文章

单片机驱动彩屏最简方案:单片机_RA8889最小开发板驱动控制TFT彩屏介绍(二)硬件电路设计

本文介绍使用单片机RA8889来驱动和控制彩屏的最小方案。文章从RA8889的架构功能、硬件电路设计及软件设计三个方面来说明。 小编已发布多篇文章介绍了单片机RA8889来驱动控制彩屏,但是仍有不少单片机玩家可能对驱动彩屏还不算熟悉,在此加推一个短篇介绍…

C++设计模式1:单例模式(懒汉模式和饿汉模式,以及多线程问题处理)

饿汉单例模式 程序还没有主动获取实例对象&#xff0c;该对象就产生了&#xff0c;也就是程序刚开始运行&#xff0c;这个对象就已经初始化了。 class Singleton { public:~Singleton(){std::cout << "~Singleton()" << std::endl;}static Singleton* …

设计模式 - 行为型模式(第六章)

目录 6、行为型模式 6.1 模板方法模式 6.1.1 概述 6.1.2 结构 6.1.3 案例实现 6.1.3 优缺点 6.1.4 适用场景 6.1.5 JDK源码解析 6.2 策略模式 6.2.1 概述 6.2.2 结构 6.2.3 案例实现 6.2.4 优缺点 6.2.5 使用场景 6.2.6 JDK源码解析 6.3 命令模式 6.3.1 概述 …

非关系型数据库MongoDB(文档型数据库)介绍与使用实例

MongoDB介绍 MongoDB是一种开源的文档型数据库管理系统&#xff0c;它使用类似于JSON的BSON格式&#xff08;Binary JSON&#xff09;来存储数据。与传统关系型数据库不同&#xff0c;MongoDB不使用表和行的结构&#xff0c;而是采用集合&#xff08;Collection&#xff09;(My…

鸿蒙内核源码分析(特殊进程篇)

三个进程 鸿蒙有三个特殊的进程&#xff0c;创建顺序如下: 2号进程&#xff0c;KProcess&#xff0c;为内核态根进程.启动过程中创建.0号进程&#xff0c;KIdle为内核态第二个进程&#xff0c;它是通过KProcess fork 而来的.这有点难理解.1号进程&#xff0c;init&#xff0c…

产品经理-​​实习中的自我迭代(41)

实习中的自我迭代,优秀实习生必备素质 跟大家认识了之后&#xff0c;就要开始做事情了&#xff0c;那我们怎么做一个优秀的实习生呢&#xff1f;以下几点作为参考。 1. 目标明确 知道自己的工作为什么要做&#xff0c;要做到什么程度&#xff0c;目前存在什么问题&#xff0c;该…

k8s上部署rancher

一、什么事rancher Rancher 是一个 Kubernetes 管理工具&#xff0c;让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托管服务提供商的集群&#xff0c;创建节点并安装 Kubernetes&#xff0c;或者导入在任何地方运行的现有 Kubernetes 集…

Python中常见数据结构

文章目录 1. 列表&#xff08;List&#xff09;2. 元组&#xff08;Tuple&#xff09;3. 字典&#xff08;Dictionary&#xff09;4. 集合&#xff08;Set&#xff09;5. 数组&#xff08;Array&#xff09;6. 栈&#xff08;Stack&#xff09;7. 队列&#xff08;Queue&#x…