docker 方式安装mysql 主从方式keepalived实现高可用

news2024/10/6 10:38:21

一、环境介绍

在这里插入图片描述

二、MySQL安装

在两台服务器上都安装mysql
1、拉取镜像

docker pull mysql:8.0.27

2、创建挂载目录

mkdir -p /data/mysql/

3、运行容器

  • 主节点
docker run \
    --restart=always \
    --name master_mysql -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 -d \
    -v /data/mysql/:/var/lib/mysql mysql:8.0.27 \
    --lower_case_table_names=1 \
    --default_authentication_plugin=mysql_native_password
  • 从节点
docker run \
    --restart=always \
    --name slave_mysql -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 -d \
    -v /data/mysql/:/var/lib/mysql mysql:8.0.27 \
    --lower_case_table_names=1 \
    --default_authentication_plugin=mysql_native_password

MYSQL_ROOT_PASSWORD :设置的mysql root用户的密码
lower_case_table_names: 是否大小写敏感,1表示不区分大小写

三、配置MySQL主从同步

两个数据库如果有数据,先把两个数据库的数据导成一样的

1、同步方式

replication
GTID
双向同步

2、设置master 同步到slave

master开启binlog

#将mysql容器中的my.cnf配置文件拷贝到宿主机来修改
docker cp master_mysql:/etc/mysql/my.cnf ./

在my.cnf 中添加

[mysqld]
log-bin=mysql-bin    # 开启二进制日志
server-id=1          # 设置server-id。master和每一个slave的server-id都不能一样,用于唯一标识节点
sync_binlog=1
#主从同步跳过错误
slave-skip-errors=1062,1053,1146,1007,1008,1050,1051
#从库的中继日志,主库日志写到中继日志,中继日志再重做到从库
# relay-log=myslql-relay-bin

# binlog保留时间7天
expire_logs_days=7

# binlog 文件的大小
max_binlog_size=1G
# 设置不要赋值的数据
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#将修改后的文件复制到容器内
docker cp my.cnf master_mysql:/etc/mysql/

注意:需要重启master_mysql容器

master创建用于同步的用户

mysql 客户端进入控制台,执行下面命令创建用户
先进入docker 容器

docker exec -it master_mysql /bin/bash

在进入mysql 控制台:

mysql -u root -p

进入mysql控制台后,执行下面的语句:

# 创建用户,用于从机复制数据
CREATE USER 'repl'@'%' IDENTIFIED BY '123456';

# 分配权限
#注意:此处 *.* 不允许更改,因为 replication slave 权限是一个全局权限,不可以指定在某一个库上
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

# 刷新权限
flush privileges;

master锁定

依然在控制台执行

FLUSH TABLE WITH READ LOCK;

master查看状态

同样还在控制台

SHOW MASTER STATUS;

记录二进制文件名和位置,例如:mysql-bin.000001、767

master解锁

同样在控制台执行

unlock tables;

slave指定同步点

slave指定从master的哪个位置开始进行同步
进入slave_mysql的容器,再进入mysql的控制台,执行下面语句:

CHANGE MASTER TO
    MASTER_HOST='192.168.5.136',          # master ip
    MASTER_PORT=3306,                       # master port
    MASTER_USER='repl',                     # 上文 master 上创建的同步用户名
    MASTER_PASSWORD='123456',               # 同步用户密码
    MASTER_LOG_FILE='mysql-bin.000001',     # 使用上面的 mysql-bin.000001
    MASTER_LOG_POS=767;                     # 使用上面的 767

slave设置server-id

#将mysql容器中的my.cnf配置文件拷贝到宿主机来修改
docker cp slave_mysql:/etc/mysql/my.cnf ./

在my.cnf 中添加:

[mysqld]
server-id=2         # 设置server-id。master和每一个slave的server-id都不能一样,用于唯一标识节点
sync_binlog=1

将my.cnf 复制到容器

docker cp my.cnf slave_mysql:/etc/mysql/

注意:重启容器

slave开启复制

在slave_mysql 容器的mysql 控制台执行

start slave;

slave查看状态

同样在slave的mysql控制台

# 查看slave状态
show slave status\G;

查看结果类似如下:
在这里插入图片描述
主要关注红框的两个值,都为Yes表示成功,主从同步配置完成

设置salve 同步到master

将上面的操作反过来重复操作一遍

测试

分别在master 和slave 上创建数据库,创建表,插入数据,删除数据,看两个库是否会同步,注意必须执行sql,只有执行的是sql 语句才会同步。

四、keepalived 安装

安装keepalived

两台服务器都安装keepalived

yum -y install keepalived 

配置keepalived

  • master 节点
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL       #同一个小组要不一样
}
vrrp_script chk_mysql {
    script "/etc/keepalived/check_mysql.sh"      #检查脚本
    interval 5
    weight -5
    fall 2
    rise 1
}
vrrp_instance VI_1 {
    state MASTER
    interface ens192       #网卡名称
    unicast_src_ip 192.168.5.136
    unicast_peer {
    192.168.5.137
    }
    virtual_router_id 51       #这个同一个分组要一样
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass mysql
    }
    virtual_ipaddress {
        192.168.5.189      #vip地址
    }
    track_script {
      chk_mysql
} }

EOF
  • slave节点
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL2
}
vrrp_script chk_mysql {
    script "/etc/keepalived/check_mysql.sh"
    interval 5
    weight -5
    fall 2
    rise 1
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens192
    unicast_src_ip 192.168.5.137
    unicast_peer {
    192.168.5.136
    }
    virtual_router_id 51
    priority 80
    nopreempt
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass mysql
    }
    virtual_ipaddress {
        192.168.5.189
    }
    track_script {
      chk_mysql
} }

EOF
  • 健康检查脚本
    两个服务器的一样
cat >  /etc/keepalived/check_mysql.sh << EOF
#!/bin/bash

err=0
for k in $(seq 1 3)
do
    check_code=$(pgrep mysql)
    if [[ $check_code == "" ]]; then
        err=$(expr $err + 1)
        sleep 1
        continue
    else
        err=0
        break
    fi
done

if [[ $err != "0" ]]; then
    echo "systemctl stop keepalived"
    /usr/bin/systemctl stop keepalived
    exit 1
else
    exit 0
fi
EOF
chmod +x /etc/keepalived/check_mysql.sh
  • 启动keepalived
systemctl daemon-reload
systemctl enable --now keepalived
  • 查看keepalived状态, 如果是active 就表示正常
systemctl status keepalived

配置启动keepalived 的定时任务

如果当master 节点挂掉了后 ,排除故障之后,master节点的mysql 容器会被启动,启动后从节点的数据就会同步到master ,这个时候不能立即启动keepalived ,因为我们配置的是抢占式, 只要主节点的keepalived 恢复了就会抢回VIP, 这个时候可能数据还没有同步完,会造成数据库数据不同步,所以这里隔两分钟在去启动keepalived .
两个服务器都需要

mkdir -p /data/crontabsh

启动keepalived脚本

cat > /data/crontabsh/check_keepalived.sh << EOF
#!/bin/bash
check_mysql=$(pgrep mysql)
check_keepalived=$(pgrep keepalived)
if [[ $check_mysql != "" ]] && [[ $check_keepalived == "" ]]; then   
    echo "keepalived未启动,即将执行启动命令"
    systemctl start keepalived
else
    exit -1
fi

EOF

给脚本权限

chmod +x /data/crontabsh/check_keepalived.sh

加定时任务

 [root@localhost crontabsh]# crontab -e
 */2 * * * * /bin/bash /data/crontabsh/check_keepalived.sh
 [root@localhost crontabsh]# crontab -l
*/2 * * * * /bin/bash /data/crontabsh/check_keepalived.sh

检查VIP是否漂移

通过 ip addr 查看VIP是否在该节点上
开始VIP应是在 master 上的, 停止master 上的mysql 容器 ,看VIP是否能漂移到slave 节点
当VIP在slave 节点, 启动master 上的mysql ,隔两分钟再看VIP 是否能回到master 上来。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

glTF和GLB有什么区别?

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 自1960年代末开始以来&#xff0c;3D扫描突飞猛进&#xff0c;彻底改变了我们创建真实世界物体和环境的数字模型的方式。虽然很容易考虑它在建筑、工程和游戏等领域的使用&#xff0c;但实际应用要广泛得多。2023年&…

Fiddler实现android手机抓包

目录 一、fiddler的简介二、安装fiddler三、fiddler设置1.设置HTTPS2.设置允许远程连接3. 重启fillder&#xff0c;使得配置生效4. 查看端口监听 四、android端设置1、首先查看电脑的 IP 地址&#xff0c;确保手机和电脑在同一个局域网内2、设置代理 五、抓包测试 原文链接 一、…

Verilog零基础入门(边看边练与测试仿真)-时序逻辑-笔记(4-6讲)

文章目录 第四讲第五讲第六讲 第四讲 1、计数器 代码&#xff1a; //计数器 timescale 1ns/10ps module counter(clk,res,y); input clk; input res; output[7:0] y;reg[7:0] y; wire[7:0] sum;//1运算的结果&#xff08;1&#xff0…

平安大视野解读宏观经济:看好中国经济长期潜力,资产配置价值凸显

“资产配置多元化是投资中唯一的免费午餐。” 1990年&#xff0c;哈里马科维茨因为他提出的“资产组合选择理论”获得了诺贝尔经济学奖。 如何看待当前国内外宏观经济&#xff0c;如何通过资产配置提升家庭财富健康度&#xff1f;9月4日&#xff0c;平安银行联合《21世纪经济报…

Revit SDK 介绍:CurtainWallGrid 幕墙网格

前言 这个例子介绍如何创建幕墙&#xff0c;以及如何通过 API 编辑幕墙。 内容 运行效果&#xff1a; 创建幕墙 幕墙在 Revit 体系里面属于墙的一种&#xff0c;因此&#xff0c;它对应的 API 类型仍然为 Wall&#xff0c;只是类型有差异。 // WallGeometry::CreateCurt…

机器学习笔记 - 从数学表示的角度看待监督学习

一、概述 监督学习的目标是根据数据进行预测。比如电子邮件垃圾邮件过滤,需要将电子邮件(数据实例)分类为垃圾邮件或非垃圾邮件。 按照传统计算机科学的方法,需要编写一个精心设计的程序,遵循一些规则来确定电子邮件是否是垃圾邮件。尽管这样的程序可能在一段时间内运行得…

Apache解析漏洞实验

实验目的 了解Apache解析漏洞原理掌握Apache漏洞的利用方法 实验工具 火狐&#xff1a;Mozilla Firefox&#xff0c;中文俗称“火狐”&#xff08;正式缩写为Fx或fx&#xff0c;非正式缩写为FF&#xff09;&#xff0c;是一个自由及开放源代码网页浏览器&#xff0c;使用Gec…

RPC项目解析(1)

分布式通信框架&#xff1a;让远程方法调用和调用进程内方法一样简单 RPC通信原理 rpc&#xff1a;远程过程调用&#xff08;远程能够调用其他模块的方法&#xff09; 在rpc中需要发送时候&#xff0c;对发送的信息进行序列化&#xff0c;在服务端对接收到的信息进行反序列化…

【C++11新特性】function包装器

文章目录 1. function包装器1.1 function包装器介绍1.2 function包装器对类型的统一1.3 function包装器的意义 1. function包装器 1.1 function包装器介绍 function包装器是一种函数包装器&#xff0c;也叫做适配器。它可以对可调用对象进行包装&#xff0c;C中的function本质…

C++【C++学习笔记_Wang】

时间进度C是什么&#xff1f;多态什么是多态&#xff1f;生活中的多态C中的多态 赋值兼容赋值兼容规则实现安全转换 时间进度 Day101 ok Day804 ok Day805 ok C是什么&#xff1f; C大部分包含C语言。 C完全兼容C语言。 C在C语言的基础上添加&#xff1a;封装、继承、多态…

【SpringMVC】JSR 303与interceptor拦截器快速入门

目录 一、JSR303 1、什么是JSR 303&#xff1f; 2、为什么要使用JSR 303&#xff1f; 3、JSR 303常用注解 3.1、常用的JSR 303注解 3.2、Validated与Valid区别 3.2.1、Validated 3.2.2、Valid 3.2.3、区别 4、使用案例 4.1、导入依赖 4.2、配置校验规则 4.3、编写…

vue基础知识九:动态给vue的data添加一个新的属性时会发生什么?怎样解决?

一、直接添加属性的问题 我们从一个例子开始 定义一个p标签&#xff0c;通过v-for指令进行遍历 然后给botton标签绑定点击事件&#xff0c;我们预期点击按钮时&#xff0c;数据新增一个属性&#xff0c;界面也 新增一行 <p v-for"(value,key) in item" :key&q…

QQ 逻辑漏洞可执行文件 漏洞复现

本文由掌控安全学院- wax 投稿 首先拿到QQ的版本&#xff0c;目前可测试版本包括QQ最新版本&#xff0c;TIM最新版本 新创建一个bat文件&#xff08;这个可以随意&#xff0c;上马的也可以&#xff0c;exe也可以&#xff09; &#xff0c;本次测试内容如下首先向你的手机端发一…

一文告诉你什么是 TCP 数据粘包,该如何解决!

粘包问题概述 描述背景 采用TCP协议进行网络数据传送的软件设计中&#xff0c;普遍存在粘包问题。这主要是由于现代操作系统的网络传输机制所产生的。 我们知道&#xff0c;网络通信采用的套接字(socket)技术&#xff0c;其实现实际是由系统内核提供一片连续缓存&#xff08…

如何实现高效客户服务自助?

随着科技的不断发展&#xff0c;越来越多的企业开始意识到提供良好的客户服务对于企业的重要性。而在满足客户需求的同时&#xff0c;高效实现客户服务自助也成为了许多企业关注的焦点。客户服务自助可以帮助企业降低成本、提高效率&#xff0c;同时也能给客户带来更好的体验。…

[每周一更]-(第60期):15种MySQL索引失效场景

背景 工作中都会踩到Mysql数据库不走索引的坑。常见的现象就是&#xff1a;明明在字段上添加了索引&#xff0c;但却并未生效。 另外&#xff0c;无论是面试或是日常&#xff0c;Mysql索引失效的通常情况都应该了解和学习。 为了方便学习和记忆&#xff0c;这篇文件将常见的15种…

人大女王金融硕士项目——当你觉得迷茫的时候,就去学习来充实自己

不要总以为自己的努力会付之东流&#xff0c;不要因为现在的生活或工作还是依旧没有起色&#xff0c;而想太多。继续努力就好&#xff0c;哪怕明天没有惊喜&#xff0c;但最终的你&#xff0c;却在慢慢的变好。对于从业多年的在职人员来说&#xff0c;职业瓶颈期是非常普遍的。…

JDK多版本切换

为什么切换 因为可能不同项目要求JDK的版本不同&#xff0c;比如你上次装的jdk1.8&#xff0c;现在的项目要求JDK9&#xff0c;这时候卸载8再换9有点费劲&#xff0c;而且操作不当可能遇到非常离奇的bug&#xff0c;影响开发进度。如果我们能灵活切换各种jdk版本&#xff0c;将…

揭秘策划行业就业前景怎么样?

策划这个行业总的来说就是&#xff1a;门槛低&#xff0c;上限高&#xff01;&#xff01; 咱们一般说的策划也分很多类型&#xff0c;这里选取身边朋友做的最多的4种类型简单说说。 1、前端品牌策划&#xff0c;转型容易出路广 品牌策划以品牌思维为核心去分析公司的经营发…

蓝桥杯官网练习题(五星填数)

类似题目&#xff1a;https://blog.csdn.net/s44Sc21/article/details/132758982?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132758982%22%2C%22source%22%3A%22s44Sc21%22%7Dhttps://blog.csdn.net/s44Sc21/article/detail…