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.hqwc.cn/news/107729.html

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

相关文章

用户权限数据转换为用户组列表(3/3) - Excel PY公式

最近Excel圈里的大事情就是微软把PY塞进了Excel单元格&#xff0c;可以作为公式使用&#xff0c;轻松用PY做数据分析。系好安全带&#xff0c;老司机带你玩一把。 实例需求&#xff1a;如下是AD用户的列表,每个用户拥有该应用程序的只读或读写权限&#xff0c;现在需要创建新的…

SpringMVC笔记

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

面试:如何实现分布式锁?看清楚,不是实现分布式事务!!

面试复盘&#xff1a;如何实现分布式锁&#xff1f; 目录 面试复盘&#xff1a;如何实现分布式锁&#xff1f; 1.分布式锁要求 2.实现方案 3.数据库分布式锁 3.1 悲观锁 3.2 乐观锁 4.Zookeeper 分布式锁 4.1 引入 Curator 和 ZooKeeper 4.2 配置 ZooKeeper 连接 4.3 编…

【送书活动】畅销书《Kali Linux高级渗透测试》更新版速速查收~

文章目录 每日一句正能量前言本书概况读者对象赠书活动目录 每日一句正能量 其实&#xff0c;人生很多东西无所谓最好的&#xff0c;只要你认为值得就是最好。 前言 对于企业网络安全建设工作的质量保障&#xff0c;业界普遍遵循PDCA&#xff08;计划&#xff08;Plan&#xf…

SAP HANA 体系结构,LandScape,规模调整:完整教程

目录 一、SAP HANA 体系结构 二、SAP HANA 景观 三、SAP HANA 大小调整 SAP HANA 数据库是以主内存为中心的数据管理平台。 SAP HANA 数据库在 SUSE Linux Enterprises Server 上运行&#xff0c;并基于 C 语言构建。 SAP HANA 数据库可以分发到多台计算机。 SAP HANA 的优…

SpringBoot-可视化监控

一、添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--采集应用的指标信息&#xff0c;prometheus--> <dependency…

docker容器技术实战-2

03docker hub 首先注册上号&#xff1a; https://hub.docker.com/ 上传自己的镜像仓库 创建自己的仓库 webserver 拉取镜像 配置加速器 04搭建私有仓库 上传镜像 在主机1上 在主机2 上 激活内核选项 激活内核选项文件传输过去 配置使用非加密端口 05 docker私有仓库 仓库加…

界面控件DevExpress WPF TreeMap,轻松可视化复杂的分层结构数据!

DevExpress WPF TreeMap控件允许用户使用嵌套的矩形块可视化复杂的平面或分层结构数据。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&a…

fabic如何将绘图原点移到画布中心

情况说明&#xff1a; fabic默认绘图原点为left&#xff1a;0&#xff0c;top&#xff1a;0 后端给我的内容是按照x&#xff0c;y返回的&#xff0c;需要将坐标系移到fabic画布的中心位置&#xff0c;找了下网上合适的砖&#xff0c;想一句命令直接设置&#xff0c;结果没有。…

27.EI文章复现《高比例清洁能源接入下计及需求响应的配电网重构》

下载地址&#xff1a;高比例清洁能源接入下计及需求响应的配电网重构 1主要内容 该程序复现《高比例清洁能源接入下计及需求响应的配电网重构》&#xff0c;以考虑网损成本、弃风弃光成本和开关操作惩罚成本的综合成本最小为目标&#xff0c;针对配电网重构模型的非凸性&…

告别HR管理繁琐,免费低代码平台来帮忙

编者按&#xff1a;本文着重介绍了使用免费且高效的低代码平台实现的HR管理系统在一般日常人力资源管理工作中的关键作用。 关键词&#xff1a;低代码平台、HR管理系统 1.HR管理系统有什么作用&#xff1f; HR管理系统作为一款数字化工具&#xff0c;可为企业提供全方位的人力资…

电脑更换硬盘的时候怎么迁移系统?

为什么需要迁移系统&#xff1f; 在一些关于电脑DIY或Windows相关的论坛社区中&#xff0c;有很多人发帖询问怎么迁移系统。那么这个系统迁移&#xff0c;究竟是何含义呢&#xff1f;通俗易懂地解释一下&#xff0c;就是创建一个完整无缺的操作系统复制品&#xff0c;它与系…