基于keepalived搭建mysql双主高可用

2024-04-30 12:58

本文主要是介绍基于keepalived搭建mysql双主高可用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 概述
  • 环境准备
  • keepalived搭建
  • mysql搭建
  • mysql双主搭建
  • mysql双主高可用搭建

概述

    传统(不借助中间件)的数据库主从搭建,如果主节点挂掉了,从节点只能读取无法写入,只能把人肉去恢复故障,既不想引用中间件也不想人肉恢复故障,可以折中选择双主方案,本文将介绍通过keepalived搭建mysql双主方案。

    本例中vip为:172.16.0.169,  两台mysql实例服务器ip分别为:172.16.0.1和172.16.0.2

转帖请注明来源: https://my.oschina.net/u/2342969/blog/2963153

环境准备

  1. 最小化安装centos7
  2. mysql-5.7.23
  3. keepalived 1.4.5
  4. 虚拟ip(下文简称vip):172.16.0.169

keepalived搭建

    点击查看keepalived搭建教程,博主亲自操作过来的,如有疑问欢迎随时私信或者评论

mysql单机搭建

    点击查看mysql搭建教程,博主亲自操作过来的,如有疑问欢迎随时私信或者评论

双主搭建

    本方案仅限两台均是全新安装的mysql,如果是旧mysql实例和新mysql实例改为双主,在新mysql实例中记得导入旧mysql实例的数据,另外可能同步复制还会报异常,自行解决一下。

环境安装检查

  1. 两台mysql实例均可以访问
  2. keepalived可以正常漂移

数据库配置更改

#vim /etc/my.cnf

    进入mysql配置修改一下配置:

  1. server-id 两台mysql要不一样,一般是ip最后一位。注意命名规范不要加下划线/中横线/点等特殊符号
  2. #skip_slave_start = 1  注释掉这个配置

创建复制账号

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'172.16.0.%' identified by 'repl_password';
mysql> flush privileges;
mysql> select @@server_id;

两台mysql分别执行以上语句,语句解析:

  1. 创建mysql复制账号
  2. repl_user: 复制权限账号的用户名,可自行更改
  3. 172.16.0.%: 此处使用的通配符,也可以写固定ip,可同步的mysql实例ip
  4. repl_password: 复制权限账号的密码,自行更改
  5. select @@server_id; 查询出的结果一定要不一样

配置互为主备   

mysql> CHANGE MASTER TO MASTER_HOST="对方ip", MASTER_USER="repl_user", MASTER_PASSWORD="repl_password", MASTER_PORT=3316, MASTER_AUTO_POSITION = 1;
mysql> start slave;
mysql> show slave status\G;

两台mysql分别执行以上sql,语句解析:

  1. 互相设置对方为主节点,自己为备节点
  2. MASTER_HOST:对方ip
  3. MASTER_USER:对方复制权限账号用户名,即上一步设置的用户名
  4. MASTER_PASSWORD:对方复制权限账号密码,即上一步设置的密码
  5. MASTER_PORT:对方mysql实例的端口, 如果开了防火墙一定要记得打开端口
  6. show slave status\G; 注意查看Slave_IO_Running 和 Slave_SQL_Running 状态如果有一个为no 就代表配置失败

检查点:

  1. Master_Host: 是否是对方ip
  2. Master_User: 是否是对方的复制账号的用户名
  3. Master_Port: 是否是对方mysql实例的端口号
  4. Last_SQL_Errno:最近sql错误条数,正常情况为0
  5. Last_SQL_Error:最新sql错误详细信息,正常情况为空

如果有异常,根据异常信息解决掉问题后,执行一下命令

mysql> stop slave;
mysql> reset master;

两台mysql分别执行以上命令,再执行一下上一步的配置。

验证

  1. 在任意一台mysql创建数据库,另一台也会同步到
  2. 在任意一台mysql创建表,另一台也会同步到
  3. 在任意一台mysql表中插入数据,另一台也会同步到

双主高可用

修改keepalived配置

# vim /etc/keepalived/keepalived.conf

配置内容如下:

! Configuration File for keepalived
global_defs {
router_id MYSQL-1 ## 名称自定义,两台机器需要不一样
}vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 60
priority 100    # 两台机器需要一个大一个小,数值大的先启动,哪台先启动vip会先在哪台机器
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.16.0.169    # 填写自己的vip
}
}virtual_server 172.16.0.169 3316 {  # 填写自己的vip 和mysql端口
delay_loop 2
#lb_algo rr
#lb_kind DR
persistence_timeout 60
protocol TCP
real_server 172.16.0.1 3316 { # 填写mysql服务器真实ip 和mysql端口
weight 3
notify_down /etc/keepalived/checkmysql.sh  # 检查mysql是否存活脚本,根据脚本位置自行填写
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3316  # mysql的端口号
}
}
}

注意: 上面配置注释的部分,两台机器根据实际情况修改,配置文件中的注释一定要去掉,以免出现奇怪问题

编写mysql监测脚本

#vim  /etc/keepalived/checkmysql.sh

脚本内容如下:

#!/bin/sh
datetime=`date +20\%y\%m\%d_\%H\%M\%S`
isok=$(/usr/local/mysql/bin/mysql -h localhost -u数据库账号 -p数据库密码 -P数据库端口 -S /tmp/mysql3316.sock 2>/dev/null  -e 'select 1' |sed -n '2p')
function error_query(){
systemctl stop keepalived
echo $datetime  >> /etc/keepalived/keepalived.log
echo "mysql down, keepalived 切换" >> /etc/keepalived/keepalived.log
}
echo "isok: $isok"  >> /etc/keepalived/keepalived.log
if [ "$isok" != "1" ]
then
error_query
fi

注意:根据实际情况调整脚本中的中文部分

给脚本赋权限:

# chmod +x /etc/keepalived/*.sh

这篇关于基于keepalived搭建mysql双主高可用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948932

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu