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

一、环境介绍

在这里插入图片描述

二、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 TOMASTER_HOST='192.168.5.136',          # master ipMASTER_PORT=3306,                       # master portMASTER_USER='repl',                     # 上文 master 上创建的同步用户名MASTER_PASSWORD='123456',               # 同步用户密码MASTER_LOG_FILE='mysql-bin.000001',     # 使用上面的 mysql-bin.000001MASTER_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 keepalivedglobal_defs {router_id LVS_DEVEL       #同一个小组要不一样
}
vrrp_script chk_mysql {script "/etc/keepalived/check_mysql.sh"      #检查脚本interval 5weight -5fall 2rise 1
}
vrrp_instance VI_1 {state MASTERinterface ens192       #网卡名称unicast_src_ip 192.168.5.136unicast_peer {192.168.5.137}virtual_router_id 51       #这个同一个分组要一样priority 100advert_int 2authentication {auth_type PASSauth_pass mysql}virtual_ipaddress {192.168.5.189      #vip地址}track_script {chk_mysql
} }EOF
  • slave节点
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalivedglobal_defs {router_id LVS_DEVEL2
}
vrrp_script chk_mysql {script "/etc/keepalived/check_mysql.sh"interval 5weight -5fall 2rise 1
}
vrrp_instance VI_1 {state BACKUPinterface ens192unicast_src_ip 192.168.5.137unicast_peer {192.168.5.136}virtual_router_id 51priority 80nopreemptadvert_int 2authentication {auth_type PASSauth_pass mysql}virtual_ipaddress {192.168.5.189}track_script {chk_mysql
} }EOF
  • 健康检查脚本
    两个服务器的一样
cat >  /etc/keepalived/check_mysql.sh << EOF
#!/bin/basherr=0
for k in $(seq 1 3)
docheck_code=$(pgrep mysql)if [[ $check_code == "" ]]; thenerr=$(expr $err + 1)sleep 1continueelseerr=0breakfi
doneif [[ $err != "0" ]]; thenecho "systemctl stop keepalived"/usr/bin/systemctl stop keepalivedexit 1
elseexit 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
elseexit -1
fiEOF

给脚本权限

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.rhkb.cn/news/131242.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA开发

https://www.enclustra.com.cn/?bd_vid11435475462206745180 https://www.monolithicpower.cn/design-tools/design-tools/llc-design-tool.html https://www.elecfans.com/article/88/143/2012/20120718280641_2.html

HTTP协议初识·下篇

介绍 承接上篇&#xff1a;HTTP协议初识中篇_清风玉骨的博客-CSDN博客 本篇内容&#xff1a; 长链接 网络病毒 cookie使用&session介绍 基本工具介绍 postman 模拟客户端请求 fiddler 本地抓包的软件 https介绍 https协议原理 为什么加密 怎么加密 CA证书介绍 数字签名介绍…

阿里后端开发:抽象建模经典案例【文末送书】

文章目录 写作前面1.抽象思维2.软件世界中的抽象3. 经典抽象案例4. 抽象并非一蹴而就&#xff01;需要不断假设、验证、完善5. 推荐一本书 写作末尾 写作前面 在互联网行业&#xff0c;软件工程师面对的产品需求大都是以具象的现实世界事物概念来描述的&#xff0c;遵循的是人…

Tomcat多实例部署和动静分离

一、多实例部署&#xff1a; 多实例&#xff1a;多实例就是在一台服务器上同时开启多个不同的服务端口&#xff0c;同时运行多个服务进程&#xff0c;这些服务进程通过不同的socket监听不同的服务端口来提供服务。 1.前期准备&#xff1a; 1.关闭防火墙&#xff1a;systemctl …

Docker部署Canal监听MySQL binlog

文章目录 概念简述binlogCanal MySQL配置Canal配置创建挂载目录设置权限创建MySQl的Canal账户拉取镜像运行容器简单运行配置文件复制到宿主机修改配置文件删除之前运行的canal容器正式运行Canal容器 查看运行状态排查问题 概念简述 binlog MySQL的二进制日志binlog可以说是My…

揭秘跑腿小程序开发中的5个关键技巧,让你的应用一炮而红

作为专注于跑腿小程序开发多年的领域专家&#xff0c;我深知在如今激烈的市场竞争中&#xff0c;如何打造一个引人注目且成功的跑腿小程序是至关重要的。在本文中&#xff0c;我将为大家揭秘跑腿小程序开发中的5个关键技巧&#xff0c;助你的应用一炮而红。无论你是一个初学者还…

【Fiddler】mac m1 机器上使用 fiddler 抓取接口

mac m1 机器上使用 fiddler 抓取接口&#xff08;非虚拟机模式&#xff09; author: jwensh date:2023.09.12 文章目录 mac m1 机器上使用 fiddler 抓取接口&#xff08;非虚拟机模式&#xff09;1. 环境准备2. 进行配置3. 使用情况 1. 环境准备 想要抓取 mac 上浏览器的接口&a…

快速傅里叶变换

引言 目标 傅里叶变化&#xff08;Fourier transform&#xff09;是一种信号处理技术&#xff0c;它可以将时间信号转换为频率信号&#xff0c;即将一组具有相同数量频率的正弦波叠加在一起&#xff0c;形成一组新的正弦波。如果我们把时间信号从频域转换到时域&#xff0c;那么…

酷开科技打造更好体验服务用户

智能电视以其海量资源、智慧大屏、高清画质等特点在国内快速普及。然而&#xff0c;随着用户量的增加、用户群体的需求多元化&#xff0c;导致消费者对智能电视的应用要求越来越高&#xff0c;不仅希望智能电视内容丰富&#xff0c;最好还能拥有“多合一”的功能。 好在&#…

【unity3D】TimeLine(详细图解)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇关于unity的TimeLine TimeLine 介绍打开TimeLine面板的方式创建TimeLine创建Track的两种方式Track的详解TimeLine的Track的分类Activation…

【送书活动】借助ChatGPT和Python,轻松实现办公自动化✨

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

tkintter四大按钮:Button,Checkbutton, Radiobutton, Menubutton

文章目录 四大按钮Button连击MenubuttonCheckbuttonRadiobutton tkinter系列&#xff1a; GUI初步&#x1f48e;布局&#x1f48e;绑定变量&#x1f48e;绑定事件&#x1f48e;消息框&#x1f48e;文件对话框控件样式扫雷小游戏&#x1f48e;强行表白神器 四大按钮 tkinter中…

总结987

考研倒计时102天 时间记录&#xff1a; 6:20起床 7:00~7:40早读&#xff0c;13年tex2 7:50~8:20实验室 8:30~8:34列日计划 8:40~11:18进步本回顾&#xff0c;记录 11&#xff1a;20~12:20计算机网络网课 2:10~3:05计网20道选择题 3:07~4:42政治1000题25道选择题纠错 …

第8章_freeRTOS入门与工程实践之内存管理

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id724601559592 配套资料获取&#xff1a;https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…

Redis优化 RDB AOF持久化

---------------------- Redis 高可用 ---------------------------------------- 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境…

Navicat连接openGauss数据库报错

错误信息&#xff1a;fe_sendauth:invalid authentication request from server:AUTH_REQ_SASL_CONT without AUTH_REQ_SASL 解决步骤&#xff1a; 1&#xff09;关闭防火墙&#xff1a; 切换root用户执行&#xff1a;su - root 输入密码 systemctl status firewalld 查…

Ngnix封禁IP与ip段

Ngnix IP封禁以及实现自动封禁IP 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.创建文件&#xff08;被封禁的ip写里面&#xff09; 在ngnix的conf目录下创建一个blockip.conf文件&#xff0c;里面放需要封禁的IP与ip段&#xff0c;格式如下&#xff08;deny是禁用…

微信小程序手写时间间隔组件,可设置间隔时间一分钟,半小时,一小时的间隔

纯手写时间间隔组件 需求&#xff1a;小程序中可以根据时间段进行选择开始时间和结束时间&#xff0c;如&#xff1a;当前时间是09&#xff1a;00&#xff0c; 则我可以从9点开始选择时间&#xff0c;每半个小时为间隔&#xff0c;那么下一个时间就算9&#xff1a;30&#xff…

【RocketMQ】消息的存储

当Broker收到生产者的消息发送请求时&#xff0c;会对请求进行处理&#xff0c;从请求中解析发送的消息数据&#xff0c;接下来以单个消息的接收为例&#xff0c;看一下消息的接收过程。 数据校验 封装消息 首先Broker会创建一个MessageExtBrokerInner对象封装从请求中解析到…

社区版IDEA导入Eclipse项目注意事项

经过正常导入教程之后。。。 有些jar包没有依赖导入&#xff0c;我这里直接把tomcat的lib全导入