基于Docker的mysql mha 的集群环境构建实践

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

12月2日,云计算高级工程师王佩老师,在【DBA+社群】中间件用户组进行了一次主题为“基于Docker的mysql mha 的集群环境构建实践”的线上分享。小编特别整理出其中精华内容,供大家学习交流。同时,也非常感谢王佩老师对DBA+社群给予的大力支持。

 

 

嘉宾简介
 
 

  • 云计算高级工程师

  • 目前主要研究docker 相关的云计算技术

 

演讲实录
 

关于docker 想必前面的各位大牛分享的演讲讲的非常多了,今天主要跟大家分享基于docker快速构建 mysql mha 的一个实战案例分享,在分享的过程中主要讲解一下我的思路和如何利用docker本身的一些特性进行一些自动化的工作,整个过程如果有错误或者不足之处还请大家指正。


1
 
为什么想到基于docker 构建 mysql
 

这是我们dba给我列出来的,传统mysql mha 安装方式粗略流程 


\


整个安装过程,会受到网络不可控影响,正常情况下dba一般在2~3个小时左右部署完成,从这个安装过程我们可以看到其实很多工作需要在最少3个服务器节点上重复操作。


在我们接触docker过程中,应该对他最熟悉的就是一次编译生成镜像,push到仓库后,可以在任意docker节点上运行,所以我们在构建mysql mha 时候就利用docker的一些特性来快速构建我们的mysql mha 集群。


我将构建MHA 的过程,拆分为2个版本,在2个不同版本我们将看到docker与mysql MHA集群的构建结合过程中 ,带来了哪些优势, 同时产生了哪些不同的问题。


2
 
第一版 mysql 容器
 

在第一版中我们只使用docker 快速构建mysql能力,构建mysql容器,与宿主机配合组成mysql mha,在这种方式下最容易让dba理解,同时让整个集群的环境具备docker的一些优秀特性。


2.1
 
容器MYSQL构建步骤简述:
 

1. pull mysql 容器


可以使用私有仓库(如果有)或公有仓库进行pull,这里我直接从私有仓库中下载percona。


2. 定义目录与my.cnf 文件


在宿主机创建my.cnf 配置文件存放目录,创建mysql 数据存放目录,由于容器本身的存储系统不太适合mysql 数据存放使用,所以我们后面将使用-v 来挂载容器卷,使用宿主机的文件系统目录提供使用。

 

mkdir -p /home/docker/mount/mysql/mhadb

mkdir -p /home/docker/conf/mysql/master.cnf

 

在定义my.cnf 文件时候,需要注意几个参数的定义


>端口最好不要使用默认3306,避免可能的端口冲突

>相关目录定义需要与前面创建目录一致,主要涉及如下参数定义路径


\

3. run 容器


然后我们使用 docker run 命令启动容器,注意网络我们必须以 --net=host方式,docker网络有4种方式,详细的大家可以官方doc 了解,同时我们将宿主机的/etc/localtime 挂载到容器,避免宿主机时间和容器时间不对问题。


\

这里 启动容器我们还有几个可选配置项,大家可以根据实际情况进行配置,建议将自动oom进行关闭。


> --oom-kill-disable=false  --考虑是否禁用oom kill

> --memory-swap=""   ---是否禁用swap

>相关资源限制指令,是否进行内存/cpu/io资源限制


4. 其他节点重复以下配置

  • 创建目录

  • 复制my.cnf文件到其他节点,注意修改一些与主从相关的配置参

  • 使用同样的命令 run mysql容器


5. 配置数据库主从同步


这里我们选举一个为主服务器,配置其他其他两个节点与主数据库进行主从同步,这里的主从配置与传统db安装后配置无异,所以我们这里省略。


6. mha配置工作


mysql mha 安装配置安装工作在第一版中都是在宿主机上完成由于时间关系就不在这里展开,很简单,相信大家都知道配置,如果大家有兴趣,我可以再后面讲解整个完整配置过程,至此我们3个节点的主从数据库通过容器构建完成了。


7. 第一版中基于docker 构建mysql mha 集群的优缺点分析


1) 优点

  • 提升5%~10 效率,并且在db从节点增加的情况下,基本不增加部署时间开销。

  • 利用docker image分层特性,与mysql mha 高可用 实现了mysql 分钟级甚至更短时间内 滚动平滑版本升级与回退(请先确保你在新的MySQL版本中彻底测试了所有的应用功能。这对重要版本之间的升级尤为重要,对重要版本之间的跨越升级也很重要)。

  • 基于容器构建的db, 只要宿主机资源充足,我们可以快速重复构建N个db数据库,传统安装方式下,多个db实例安装在同一个宿主机上,会很麻烦。

2) 缺点


  • 如果在单一实例部署情况下,整个mysql mha 部署安装的效率并没有带来大的提升。

  • 由于mha 相关安装包还是需要在宿主机上安装,所以我们整个mysql mha 集群的构建还是依赖于宿主机操作系统类型与版本。

  • 相对于传统数据库安装,使用容器技术会占用更多目录空间。


我们来看一下使用docker进行mysql升级步骤,整个版本升级过程基本在秒级完成。


(请先确保你在新的MySQL版本中彻底测试了所有的应用功能。这对重要版本之间的升级尤为重要,对重要版本之间的跨越升级也很重要)


\

3
 
第二版 容器即一切
 

接下来,我们再构建我们基于 docker 化的mysql mha 集群第二版,我们第二版的目的是尽量提供部署效率,并具备一定通用性,在第二版将使用更多docker命令与特性,同时我们在后面也会分析使用第二版构建存在哪些问题。


我们在第二版本中使用完整的os层上附加mysql,mha 编译成image,但与虚拟机克隆不同的是我们包含容器镜像分层,同时我们分离出2个镜像分别是,node,manager节点。


我们来把第二版中Dockerfile build一层层解析,看我们在第二版做了哪些工作(基于manager 节点)。


1、引用了centos 作为base image*

     FROM centos:6.7


2、将安装mha之前需要安装的依赖包安装,并安装mysql 数据库


\


3、将下载的mha 添加到os中,并编译安装


\


4、将配置文件copy 到容器中


配置文件设置有2种方式,一种是编写好的配置文件放入容器,另外一种是在容器run时候替换参数值,这我们使用run 时候参数传递。


\


5、COPY容器RUN时执行shell*


\


6、我们编译打包完image,使用docker run 启动(manager节点)


\


7、我们继续构建mha node节点


在dockerfile 中,我们只需要剔除与manager 相关的内容,同时我们在mysql-entrypoint.sh 脚本中剔除一些无用的参数替换sh,node 启动配置:


\

8、配置主从

  • 获取主节点信息

    docker exec -it 容器id mysql -uroot -pxxx -e 'show master status'

  • 配置从库

    我们可以使用 docker exec -it 容器id  命令进行配置,也可以使用传统方式登录数据库中进行配置  


9、配置节点互信


这里我们必须是在容器当中进行节点互信配置,而不是在宿主机上进行配置,我们需要登录到容器当中进行节点互信配置,相关的命令与在宿主机上配置互信相同,这里就不在重复。


10、mha 监控启动


\

11、第二版中基于docker 构建mysql mha 集群的优缺点分析*


1) 优点:

  • 整个mha install & config 过程大部分自动化完成,这让我们在分钟级搭建mysql mha平台成为可能。

  • 做到了整个mha 构建与平台无关性,基于docker,使我们mha集群可以运行在任意宿主系统上。

  • 直接在构建 image 层级时候进行一些os配置优化工作。

  • 监控部署直接在使用Dockerfile 构建image层部署(可选)。


2) 缺点

  • 基于的是完整os层构建,镜像占用的空间相对更大。

  • mha 也附加到os image层后, 容器启动必须以--net=host  --privileged=true 启动,但这会降低安全性,同时可能会存在端口冲突。

  • 需要安装完整的ssh server,容器间需要配置ssh互信而不是在宿主机层。

  • 整个构建过程相对复杂,需要自己编写配置dockerfile文件构建,以及编写脚本进行配置,但好在只需要构建一次,后面可以重复运行在其他服务器上。

  • 整个的过程有点类似于虚拟机克隆功能,但不同的是它包含很多docker特性,如运行是执行脚本,镜像分层。


12、mysql-entrypoint.sh 解析


由于mysql-entrypoint.sh 包含太多重复内容,就不全部展开了,里面的脚本也很简单,对传递的变量执行一些操作,这些操作包含:删除test用户,参数值替换,用户创建,不太了解的朋友可以看一下官方doc中ENTRYPOINT 解释部分,自己编写一下。


这是其中一段参数值替换与复制用户创建


\

4
 
总结
 

在第一版中我们只使用docker 构建 mysql ,我们利用的是docker 快速构建容器, 镜像分层技术使mysql搭建与升级能够快速平滑,但我们需要在宿主机上面做大量工作,并需要系统依赖。


在第二版中我们用docker 构建一个完整的os,并包含已经安装好的mysql数据库和mha,同时我们还能利用docker 本身的一些特性,实现一些自动化工作,但由于docker天生隔离性,安全性相对较低,这会导致一些额外的问题。

本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2015-12-04
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
54 3
|
2月前
|
消息中间件 分布式计算 关系型数据库
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
56 0
|
28天前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
2月前
|
关系型数据库 MySQL Linux
Docker安装Mysql5.7,解决无法访问DockerHub问题
当 Docker Hub 无法访问时,可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的问题。本文介绍了如何在 CentOS 上一键配置国内镜像加速,并成功拉取 MySQL 5.7 镜像。
543 2
Docker安装Mysql5.7,解决无法访问DockerHub问题
|
1月前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
134 1
|
弹性计算 应用服务中间件 Linux
基于ECS快速搭建Docker环境
本教程介绍如何快速搭建Docker环境,并使用Docker部署一个Nginx服务。
基于ECS快速搭建Docker环境
|
弹性计算 应用服务中间件 Linux
Day2 基于ECS快速搭建Docker环境
简介: 容器技术 容器是一个允许我们在资源隔离的过程中,运行应用程序和其依赖项的 、轻量的 、操作系统级别的虚拟化技术, 运行应用程序所需的所有必要组件都打包为单个镜像,这个镜像是可以重复使用的。当镜像运行时,它是运行在独立的环境中,并不会和其他的应用共享主机操作系统的内存、CPU或磁盘。这保证了容器内的进程不会影响到容器外的任何进程。 Docker:类似于虚拟机 但是比虚拟机运行小切简单 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不
369 0
|
弹性计算 应用服务中间件 nginx
|
弹性计算 应用服务中间件 Linux
基于ECS快速搭建Docker环境(进阶班-Day2)
安装Docker总结下来只需要4步: 1、安装Docker-CE 2、配置加速镜像(国内网络原因导致) 3、使用Docker安装Nginx服务 4、测试Nginx
1712 0
基于ECS快速搭建Docker环境(进阶班-Day2)
|
弹性计算 应用服务中间件 Linux
基于ECS快速搭建Docker环境
1. 创建资源 2. 连接ECS服务器 3. 安装Docker CE 4. 配置阿里云镜像仓库(镜像加速) 5. 使用Docker安装Nginx服务
基于ECS快速搭建Docker环境