Docker搭建MySQL主主模式+Keepalived实现高可用集群

news2024/11/18 8:49:50

1.环境准备:

系统版本 Centos7

IP:10.10.11.79 master
IP:10.10.11.80 backup

虚拟ip:10.10.11.82

Docker环境:

centos7离线安装docker,docker-compose

keepalived安装包:

https://www.keepalived.org/software/keepalived-1.4.2.tar.gz

2.配置两台 MySQL 主主同步

制作Mysql容器

使用dokcer快速启动mysql容器,注意端口号有没有被占用,两台服务器都要启动,两台服务器端口号要一致,防火墙也看一下,对外能不能访问端口。

docker run -p 3308:3306 --privileged=true --name keepalivedMysql -v /home/mysql/conf:/etc/mysql/mysql.conf.d -v /home/mysql/logs:/var/log/mysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d nanlist/mysql5.7:v1.1

配置MySQL

编辑mysqld.cnf,可以挂载目录,或者从容器中cp出来,编辑好以后再cp进容器内部.

把配置文件拷贝出来

docker cp keepalivedMysql:/etc/mysql/mysql.conf.d/mysqld.cnf /home/keepalivedMysql/mysqld.cnf

编辑完成再拷贝进去

docker cp /home/keepalivedMysql/mysqld.cnf  keepalivedMysql:/etc/mysql/mysql.conf.d/mysqld.cnf

MASTER:

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
lower_case_table_names = 1
log-bin=/var/lib/mysql/mysql-bin
server-id=1     #backup这台设置2
binlog-ignore-db = mysql,information_schema       #忽略写入binlog日志的库
auto-increment-increment = 2             #字段变化增量值
auto-increment-offset = 1              #初始字段ID为1
slave-skip-errors = all                       #忽略所有复制产生的错误 
#log-error	= /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

BACKUP:

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
lower_case_table_names = 1
log-bin=/var/lib/mysql/mysql-bin
server-id=2      #backup这台设置2
binlog-ignore-db = mysql,information_schema       #忽略写入binlog日志的库
auto-increment-increment = 2             #字段变化增量值
auto-increment-offset = 2              #初始字段ID为2
slave-skip-errors = all                       #忽略所有复制产生的错误 
#log-error	= /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

注:master和backup只有server-id不同和 auto-increment-offset不同。

修改好以后,重启mysql容器

docker restart keepalivedMysql

查看下log bin日志和pos值位置

进入mysql docker容器内部,登录mysql环境:

mysql> show master status;

在这里插入图片描述

配置主从

主主模式就是配置两个主从,先配置10.10.11.79(主1)->10.10.11.80(主2)的主从,然后再反过来配置10.10.11.80(主2)->10.10.11.79(主1)的主从,这样主主的模式就配置好了。

配置 master:

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'10.10.11.%' IDENTIFIED BY 'replication';
mysql> flush privileges;
mysql> change master to master_host='10.10.11.80',master_port=3308,  master_user='replication',  master_password='replication',master_log_file='mysql-bin.000004',  master_log_pos=615; #对端状态显示的值
mysql> start slave; #启动同步

在这里插入图片描述
在这里插入图片描述

master_log_file='mysql-bin.000004'
master_log_pos=154;

这两个参数根据自己的服务器填对应的值,不要填错了。

配置 backup:

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'10.10.11.%' IDENTIFIED BY 'replication';
mysql> flush privileges;
mysql> change master to  master_host='10.10.11.79',master_port=3308,  master_user='replication',  master_password='replication',  master_log_file='mysql-bin.000004',  master_log_pos=615;
mysql> start slave;

3.测试主主同步

主主同步配置完毕,查看同步状态mysql> show slave status\G
在这里插入图片描述
Slave_IO和Slave_SQL是YES说明主主同步成功。

可以使用工具链接一下试试,这一步略过。
建一张表,两个数据库里面分别插入数据,看看是否同步。
在这里插入图片描述

4.安装 keepalived

在两台宿主机器上分别安装 keepalived (注意:keepalived安装在实体机上,不是安装到Docker容器中)

1.联网下载到/usr/local目录下并解压有可能会提示连接不成功,加上它提示的命令再下载就好了
如果下载不下来用浏览器下载下来再传到服务上面也可以
两台服务器分别执行下:

主:

[root@Master html]# cd /usr/local
[root@Master local]# wget https://www.keepalived.org/software/keepalived-1.4.2.tar.gz
[root@Master local]# tar -zxvf keepalived-1.4.2.tar.gz

备:

[root@Slave html]# cd /usr/local
[root@Slave local]# wget https://www.keepalived.org/software/keepalived-1.4.2.tar.gz
[root@Slave local]# tar -zxvf keepalived-1.4.2.tar.gz

2.安装相关依赖,有不用下载了
主:

[root@Master local]# yum install -y gcc openssl-devel popt-devel

备:

[root@Slave local]# yum install -y gcc openssl-devel popt-devel

3.编译安装:
主:

[root@Master local]# cd keepalived-1.4.2
[root@Master keepalived-1.4.2]# ./configure --prefix=/usr/local/keepalived
[root@Master keepalived-1.4.2]# make
[root@Master keepalived-1.4.2]# make install

备:

[root@Slave local]# cd keepalived-1.4.2
[root@Slave keepalived-1.4.2]# ./configure --prefix=/usr/local/keepalived
[root@Slave keepalived-1.4.2]# make
[root@Slave keepalived-1.4.2]# make install

4.相关配置,按命令执行
主:

[root@Master keepalived-1.4.2]# pwd
/usr/local/keepalived-1.4.2
You have new mail in /var/spool/mail/root
[root@Master keepalived-1.4.2]# cp /usr/local/keepalived-1.4.2/keepalived/etc/init.d/keepalived /etc/init.d/
[root@Master keepalived-1.4.2]# mkdir /etc/keepalived
[root@Master keepalived-1.4.2]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@Master keepalived-1.4.2]# cp /usr/local/keepalived-1.4.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@Master keepalived-1.4.2]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

备:

[root@Slave keepalived-1.4.2]# pwd
/usr/local/keepalived-1.4.2
You have new mail in /var/spool/mail/root
[root@Slave keepalived-1.4.2]# cp /usr/local/keepalived-1.4.2/keepalived/etc/init.d/keepalived /etc/init.d/
[root@Slave keepalived-1.4.2]# mkdir /etc/keepalived
[root@Slave keepalived-1.4.2]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@Slave keepalived-1.4.2]# cp /usr/local/keepalived-1.4.2/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@Slave keepalived-1.4.2]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@Slave keepalived-1.4.2]#

安装之后,在 /etc/keepalived目录下有个 keepalived.conf 配置文件:

编辑master服务器上的keepalived.conf:

! Configuration File forkeepalived
global_defs {
	notification_email {
	test@sina.com
	}
	notification_email_from  admin@test.com
	smtp_server 127.0.0.1
	smtp_connect_timeout 30
	router_id MYSQL_HA      #标识,双主相同
}

vrrp_instance VI_1 {
	 state BACKUP           #两台都设置BACKUP
	 interface ens192         # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
	 virtual_router_id 51   #主备相同
	 priority 100           #优先级,backup设置90
	 advert_int 1
	 nopreempt              #不主动抢占资源,只在master这台优先级高的设置,backup不设置
	 authentication {
		 auth_type PASS
		 auth_pass 1111
	 }
	 virtual_ipaddress {    # 指定VIP地址
		10.10.11.82
	 }
}

virtual_server 10.10.11.82 3308 {  #配置virtual_server  ip为上面配置的虚拟vip地址  端口为mysql的端口
	 delay_loop 2
	 #lb_algo rr              #LVS算法,用不到,我们就关闭了
	 #lb_kind DR              #LVS模式,如果不关闭,备用服务器不能通过VIP连接主MySQL
	 persistence_timeout 50   #同一IP的连接60秒内被分配到同一台真实服务器
	 protocol TCP
	 real_server 10.10.11.79 3308 {   #检测本地mysql,backup也要写检测本地mysql
		 weight 3
		 notify_down /etc/keepalived/chk_mysql.sh    #当mysq服down时,执行此脚本,杀死keepalived实现切换
		 TCP_CHECK {
			 connect_timeout 3    #连接超时
			 nb_get_retry 3       #重试次数
			 delay_before_retry 3 #重试间隔时间
		  }
	}
}

编辑backup服务器上的keepalived.conf:

! Configuration File forkeepalived
global_defs {
	notification_email {
	test@sina.com
	}
	notification_email_from  admin@test.com
	smtp_server 127.0.0.1
	smtp_connect_timeout 30
	router_id MYSQL_HA      #标识,双主相同
}

vrrp_instance VI_1 {
	 state BACKUP           #两台都设置BACKUP
	 interface ens192         # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
	 virtual_router_id 51   #主备相同
	 priority 90           #优先级,backup设置90
	 advert_int 1
	 nopreempt              #不主动抢占资源,只在master这台优先级高的设置,backup不设置
	 authentication {
		 auth_type PASS
		 auth_pass 1111
	 }
	 virtual_ipaddress {    # 指定VIP地址
		10.10.11.82
	 }
}

virtual_server 10.10.11.82 3308 {  #配置virtual_server  ip为上面配置的虚拟vip地址  端口为mysql的端口
	 delay_loop 2
	 #lb_algo rr              #LVS算法,用不到,我们就关闭了
	 #lb_kind DR              #LVS模式,如果不关闭,备用服务器不能通过VIP连接主MySQL
	 persistence_timeout 50   #同一IP的连接60秒内被分配到同一台真实服务器
	 protocol TCP
	 real_server 10.10.11.80 3308 {   #检测本地mysql,backup也要写检测本地mysql
		 weight 3
		 notify_down /etc/keepalived/chk_mysql.sh    #当mysq服down时,执行此脚本,杀死keepalived实现切换
		 TCP_CHECK {
			 connect_timeout 3    #连接超时
			 nb_get_retry 3       #重试次数
			 delay_before_retry 3 #重试间隔时间
		  }
	}
}

backup服务器只修改priority为90、nopreempt不设置、real_server设置本地IP。

5.编写检测服务down后所要执行的脚本

vim /etc/keepalived/chk_mysql.sh
跟keepalived.conf配置文件放同一个目录下面
内容如下:

#!/bin/bash
#version 0.0.1
#当mysql进程不存在时,会自动重启mysql容器;
A=`ps -ef|grep mysqld|grep -v grep|grep -v bash|wc -l`
if [ $A -eq 0 ];then
     docker restart keepalivedMysql     #重启mysql容器
     sleep 2
     if [ `ps -ef|grep mysqld|grep -v grep|grep -v bash|wc -l` -eq 0 ];then
        systemctl stop keepalived  #停掉keepalived服务
     fi 
fi

chk_mysql.sh脚本:目的是检测mysqld进程是否存活,如果mysql进程挂掉了,就杀掉keepalived服务,从而实现了MySQL故障自动转移。

查看脚本是否有运行的权限

如果你是root登陆的话(不是的话,切换到root用户,对*.sh 赋可执行的权限)

两台服务器这一步授权一定要执行不然脚本会失效:

cd /etc/keepalived

chmod +x  chk_mysql.sh

脚本上传以后重启keepalived。

6.keepalived常用命令

#启动:

service keepalived start

#停止:

service keepalived stop

#查看状态:

service keepalived status

重启以后用那个虚拟ip链接一下,试试:
在这里插入图片描述

7.验证

1:如果验证主从是否可以自动切换实现热备效果可以把其中一台机器的keepalived服务stop掉,然后观察虚拟ip看是否实现了故障转移。

2:如果验证健康脚本是否生效,可以把mysql容器stop掉,过两秒再次查看一下mysql容器是否会自动启动。

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

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

相关文章

设计模式之原型模式与建造者模式详解和应用

目录1 原型模式1.1 原型模式定义1.2 原型模式的应用场景1.3 原型模式的通用写法(浅拷贝)1.4 使用序列化实现深度克隆1.5 克隆破坏单例模式1.6 原型模式在源码中的应用1.7 原型模式的优缺点1.8 总结2 建造者模式2.1 建造者模式定义2.2 建造者模式的应用场…

自动化测试基础概念

前端自动化测试相关概念(单元测试、集成测试、E2E 测试、快照测试、测试覆盖率、TDD 以及 BDD 等内容),以及测试框架 Jest 的讲解,Vue.js 应用测试,React 应用测试,E2E 测试,Node.js 应用测试等…

操作系统(三):内存管理,分页地址映射,页面置换算法LRU,NRU,FIFO,第二次机会算法和时钟算法

文章目录一、虚拟内存二、分页系统地址映射三、页面置换算法最佳置换算法LRU 最近最久未使用算法NRU 最近未使用FIFO 先进先出第二次机会算法时钟算法四、内存分段五、段页式六、分页和分段的比较一、虚拟内存 虚拟内存的目的是为了让无力内存扩充成更大的逻辑内存&#xff0c…

手工测试怎样找到第一份自动化测试的工作?

你会手工测试了,那么准备再找自动化测试的工作,相对于什么都不懂的小白来说优势很大。要找自动化测试的工作,首先你要会自动化测试,你要会编程,能写自动化测试脚本的语言有很多,你可以自己选择一门&#xf…

求职笔记记录

求职笔记记录目录概述需求:设计思路实现思路分析1.面试过程参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.…

tofu:一款功能强大的模块化Windows文件系统安全测试工具

关于tofu tofu是一款功能强大的针对Windows文件系统安全的模块化工具,该工具可以使用离线方法对目标Windows文件系统进行渗透测试,并通过绕过Windows系统登录界面来帮助广大研究人员测试Windows主机的安全性。除此之外,该工具还可以执行哈希…

Python学习笔记 --- 初识Python

编译器和解释器 概念: 可以把编译器和解释器理解成是人与计算机之间的 “翻译”,将代码翻译成计算机能够识别的指令。 编译器:全文翻译,拿到代码会将其编译成一个计算机能够识别的临时文件,再把文件交给操作系统读取…

SpringMVC(3)

通过上面的学习我们知道,默认情况下无论是Spring MVC还是SpringBoot返回的都是现在都是前后端分离的,后端只需要进行返回数据给前端数据即可 1)向浏览器返回一个HTML界面 请求参数的数据类型Contnt-Type:text/html;charsetutf-8 RequestMapp…

Linux centos、麒麟V10 安装redis

目录 1、下载redis安装包 2、将下载后的.tar.gz压缩包上传到到服务器自定义文件夹下 3、 解压文件 4、安装redis 5、配置redis.conf 6、启动redis 1、下载redis安装包 Redis各版本下载:https://download.redis.io/releases/ 2、将下载后的.tar.gz压缩包上传到…

用主动游泳的三维水母模型量化美杜莎的(medusan)机械空间的性能(二)(2017)

文章目录用主动游泳的三维水母模型量化美杜莎的(medusan)机械空间的性能(二)(2017)原文链接:https://doi.org/10.1017/jfm.2017.3结果3.1 参考案例的游泳动力学3.2 改变钟的主动和被动材料属性3.2.1 改变施加的张力3.2…

【并发编程】【1】概览

并发编程 1. 概览 1.1 这门课讲什么 这门课中的【并发】一词涵盖了在Java平台上的 进程线程并发并行 以及Java并发工具,并发问题以及解决方案,同时也会包含一些其他领域的开发 1.2 为什么学这么课程 我工作中用不到并发啊? 1.3 课程特…

qemu的snapshot快照功能的详细使用介绍

快照功能还是蛮有趣的,就是资料比较少,这边万能菜道人特意整理了一下。参考内容:QEMU checkpoint(snapshot) 使用-pudn.comKVM&QEMU学习笔记(二)-蒲公英云 (dandelioncloud.cn)在线迁移存储 - 爱码网 (likecs.com)…

SpringMVC DispatcherServlet源码(4) HandlerMapping和HandlerAdapter等组件说明

本文介绍一下与DispacherServlet相关的几个重要组件: HandlerMapping - 管理请求与处理器映射关系HandlerAdapter - 请求处理器HandlerMethodArgumentResolver - 处理器方法参数解析器HandlerMethodReturnValueHandler - 处理器方法返回值处理器HttpMessageConvert…

LeetCode(剑指offer) DAY2

1.题目 从尾到头打印链表 解法一:先统计链表有多少节点,然后创建数组,再次遍历链表将值存储至数组,然后反转数组。这种解法思路简单,但是时间复杂度较高。 class Solution {int a 0,b0;public int[] reversePrint(Li…

Routability-Driven Macro Placement with Embedded CNN-Based Prediction Model

Routability-Driven Macro Placement with Embedded CNN-Based Prediction Model 2019 Design, Automation & Test in Europe Conference & Exhibition (DATE) DOI: 10.23919/DATE.2019.8715126 目录Abstract一、Introduction二、PROBLEM FORMULATION AND PRELIMINARIE…

java分析插入排序

首先查看一张经典的插入排序的图片 有图片可知,插入排序其字面的意思找到小的插入到前面就行 插入排序的基本思想就是分治:将数组分为两个区域,分别是已排序区和没有排序的区域 已排序区:假定一边的数组是都排序好的 wei排序区&…

软件测试选Python还是Java?

目录 前言 1、先从一门语言开始 2、两个语言的区别 3、两个语言的测试栈技术 4、如何选择两种语言? 总结 前言 对于工作多年的从业者来说,同时掌握java和Python两门语言再好不过,可以大大增加找工作时的选择范围。但是对于转行的人或者…

Vue2之Vue-cli应用及组件基础认识

Vue2之Vue-cli应用及组件基础认识一、Vue-cli1、单页面应用程序2、vue-cli介绍3、安装和使用4、创建项目4.1 输入创建项目4.2 选择第三项,进行自主配置,按回车键即可4.3 选择自己需要的库4.4 选择Vue的版本4.5 选择CSS选择器4.6 选择Babel、ESLint、etc等…

Sitara™处理器的产品开发路线图

Sitara™处理器的产品开发路线图概述Evaluation Phase(评估阶段)Board Development Phase(硬件发展阶段,硬件设计人员应重点关注这个阶段)Software Development Phase(软件发展阶段)Product Phase/SW Lifecycle概述 一般情况下,会存在四个主要的发展阶段…

从0到1一步一步玩转openEuler--15 openEuler使用DNF管理软件包

文章目录15.1 搜索软件包15.2 列出软件包清单15.3 显示RPM包信息15.4 安装RPM包15.5 下载软件包15.6 删除软件包DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸…