Docker部署Mysql集群的实现
单节点数据库的弊病
- 大型互联网程序用户群体庞大,所以架构必须要特殊设计
- 单节点的数据库无法满足性能上的要求
- 单节点的数据库没有冗余设计,无法满足高可用
单节点mysql的性能瓶领颈
2016年春节微信红包巨大业务量,数据库承受巨大负载
常见mysql集群方案
mysql 集群方案介绍,建议使用pxc,因为弱一致性会有问题,比如说a节点数据库显示我购买成功,b 节点数据库显示没有成功,这就麻烦了,pxc 方案是在全部节点都写入成功之后才会告诉你成功,是可读可写双向同步的,但是replication是单向的,不同节点的数据库之间都会开放端口进行通讯,如果从防火墙的这个端口关闭,pxc就不会同步成功,也不会返给你成功了。
replication
- 速度快,但仅能保证弱一致性,适用于保存价值不高的数据,比如日志、帖子、新闻等。
- 采用master-slave结构,在master写入会同步到slave,能从slave读出;但在slave写入无法同步到master。
- 采用异步复制,master写入成功就向客户端返回成功,但是同步slave可能失败,会造成无法从slave读出的结果。
pxc (percona xtradb cluster)
- 速度慢,但能保证强一致性,适用于保存价值较高的数据,比如订单、客户、支付等。
- 数据同步是双向的,在任一节点写入数据,都会同步到其他所有节点,在任何节点上都能同时读写。
- 采用同步复制,向任一节点写入数据,只有所有节点都同步成功后,才会向客户端返回成功。事务在所有节点要么同时提交,要么不提交。
建议pxc使用perconaserver (mysql改进版,性能提升很大)
pxc的数据强一致性
同步复制,事务在所有集群节点要么同时提交,要么不提交 replication采用异步复制,无法保证数据的一致性
pxc集群安装介绍
在docker中安装pxc集群,使用docker仓库中的pxc官方镜像:
1、从docker官方仓库中拉下pxc镜像:
或者本地安装
安装完成:
2、重命名镜像:(名称太长,重命名一下)
然后原来的镜像就可以删除掉了
3、出于安全考虑,给pxc集群创建docker内部网络
4、创建docker卷:
使用docker时,业务数据应保存在宿主机中,采用目录映射,这样可以使数据与容器独立。但是容器中的pxc无法直接使用映射目录,解决办法是采用docker卷来映射
查看数据卷
结果:
删除数据卷
创建5个数据卷
5、创建5个pxc容器:
查看:
数据库负载均衡的必要性
虽然搭建了集群,但是不使用数据库负载均衡,单节点处理所有请求,负载高,性能差
将请求均匀地发送给集群中的每一个节点。
- 所有请求发送给单一节点,其负载过高,性能很低,而其他节点却很空闲。
- 使用haproxy做负载均衡,可以将请求均匀地发送给每个节点,单节点负载低,性能好
负载均衡中间件对比
负载均衡首先是数据库的集群,加入5个集群,每次请求都是第一个的话,有可能第一个数据库就挂掉了,所以更优的方案是对不同的节点都进行请求,这就需要有中间件进行转发,比较好的中间件有nginx,haproxy等,因nginx 支持插件,但是刚刚支持了tcp/ip 协议,haproxy 是一个老牌的中间转发件。如果要用haproxy的话,可以从官方下载镜像,然后呢对镜像进行配置(自己写好配置文件,因为这个镜像是没有配置文件的,配置好之后再运行镜像的时候进行文件夹的映射,配置文件开放3306(数据库请求,然后根据check心跳检测访问不同的数据库,8888 对数据库集群进行监控))。配置文件里面设置用户(用户在数据库进行心跳检测,判断哪个数据库节点是空闲的,然后对空闲的进行访问),还有各种算法(比如轮训),最大连接数,时间等,还有对集群的监控。配置文件写好以后运行这个镜像,镜像运行成功后进入容器启动配置文件 。其实haprocy返回的也是一个数据库实例(但是并不存储任何的数据,只是转发请求),这个实例用来check其他节点。
安装haproxy
1、从docker仓库拉取haproxy镜像:
2、创建haproxy配置文件。供haproxy容器使用(docker中未生成配置文件,我们需要在宿主机中自己创建配置文件)
配置文件详情参考:
haproxy.cfg
3、在数据库集群中创建空密码、无权限用户haproxy,来供haproxy对mysql数据库进行心跳检测
4、创建haproxy容器(name=h1的原因是为了高可用)
5、进入容器
6、在容器bash中启动haproxy
接下来便可以在浏览器中打开haproxy监控界面,端口4001,在配置文件中定义有用户名admin,密码abc123456。
我这边访问的是http://192.168.63.144:4001/dbs,并且要使用用户名密码进行登录(小插曲,使用的是basic登录,我的chrome不知为何被屏蔽了,我最后用的火狐)
这时候我们手动挂掉一个docker节点,看一下变化(我们会发现已经显示挂掉了)
8、haproxy不存储数据,只转发数据。可以在数据库中建立haproxy的连接,端口4002,用户名和密码为数据库集群的用户名和密码
为什么要采用双机热备
单节点haproxy不具备高可用,必须要有冗余设计
双机就是两个请求处理程序,比如两个haproxy,当一个挂掉的时候,另外 一个可以顶上。热备我理解就是keepalive。在haproxy 容器中安装keepalive。
虚拟ip地址
linux系统可以在一个网卡中定义多个ip地址,把这些地址分配给多个应用程序,这些地址就是虚拟ip,haproxy的双机热备方案最关键的技术就是虚拟ip。
关键就是虚拟ip,定义一个虚拟ip,然后比如两个haproxy分别安装keepalive镜像,因为haproxy是ubuntu系统的,所以安装用apt-get,keepalive是作用是抢占虚拟ip,抢到的就是主服务器,没有抢到的就是备用服务器,然后两个keepalive进行心跳检测(就是创建一个用户到对方那里试探,看是否还活着,mysql的集群之间也是心跳检测),如果 挂掉抢占ip。所以在启动keepalive 之前首先要编辑好他的配置文件,怎么抢占,权重是什么,虚拟ip是什么,创建的用户交什么。配置完启动完以后可以ping一下看是否正确,然后将虚拟ip映射到局域网的ip
利用keepalived实现双机热备
- 定义虚拟ip
- 在docker中启动两个haproxy容器,每个容器中还需要安装keepalived程序(以下简称ka)
- 两个ka会争抢虚拟ip,一个抢到后,另一个没抢到就会等待,抢到的作为主服务器,没抢到的作为备用服务器
- 两个ka之间会进行心跳检测,如果备用服务器没有受到主服务器的心跳响应,说明主服务器发生故障,那么备用服务器就可以争抢虚拟ip,继续工作
- 我们向虚拟ip发送数据库请求,一个haproxy挂掉,可以有另一个接替工作
нaproxy双机热备方案
docker中创建两个haproxy,并通过keepalived抢占docker内地虚拟ip
docker内的虚拟ip不能被外网,所以需要借助宿主机keepalived映射成外网可以访问地虚拟ip
安装keepalived
1、进入haproxy容器,安装keepalived:
2、keepalived配置文件(keepalived.conf):
keepalived的配置文件是/etc/keepalived/keepalived.conf
3、启动keepalived
启动成功后,通过ip a可以查看网卡中虚拟ip是否成功,另外可以在宿主机中ping成功虚拟ip172.18.0.201
4、可以按照以上步骤,再另外创建一个haproxy容器,注意映射的宿主机端口不能重复,haproxy配置一样。然后在容器中安装keepalived,配置也基本一样(可以修改优先权重)。这样便基本实现了haproxy双机热备方案
命令如下:
创建haproxy容器(name=h2的原因是为了高可用)
进入容器
在容器bash中启动haproxy
接下来便可以在浏览器中打开haproxy监控界面,端口4003,在配置文件中定义有用户名admin,密码abc123456。
我这边访问的是http://192.168.63.144:4003/dbs,并且要使用用户名密码进行登录(小插曲,使用的是basic登录,我的chrome不知为何被屏蔽了,我最后用的火狐)
安装keepalived:
keepalived配置文件(keepalived.conf):
keepalived的配置文件是/etc/keepalived/keepalived.conf
启动keepalived
启动成功后,通过ip a可以查看网卡中虚拟ip是否成功,另外可以在宿主机中ping成功虚拟ip172.18.0.201
实现外网访问虚拟ip
查看当前局域网ip分配情况:
在宿主机中安装keepalived
宿主机keepalived配置如下(/etc/keepalived/keepalived.conf):
启动keepalived服务
之后其他电脑便可以通过虚拟ip192.168.63.160的8888和3306端口来访问宿主机docker中的172.18.0.201的相应端口。
暂停pxc集群的办法
然后把虚拟机挂起
热备份数据
冷备份
- 冷备份是关闭数据库时候的备份方式,通常做法是拷贝数据文件
- 是简单安全的一种备份方式,不能在数据库运行时备份。
- 大型网站无法做到关闭业务备份数据,所以冷备份不是最佳选择
热备份
热备份是在系统运行状态下备份数据
mysql常见的热备份有lvm和xtrabackup两种方案
- lvm:linux的分区备份命令,可以备份任何数据库;但是会对数据库加锁,只能读取;而且命令复杂
- xtrabackup:不需要锁表,而且免费
xtrabackup
xtrabackup是一款基于innodb的在线热备工具,具有开源免费,支持在线热备,占用磁盘空间小,能够非常快速地备份与恢复mysql数据库
- 备份过程中不锁表,快速可靠
- 备份过程中不会打断正在执行地事务
- 备份数据经过压缩,占用磁盘空间小
全量备份和增量备份
- 全量备份:备份全部数据。备份过程时间长,占用空间大。第一次备份要使用全量备份
- 增量备份: 只备份变化的那部分数据。备份的时间短,占用空间小。第二次以后使用增量备份
pxc全量备份
备份要在某个pxc节点的容器内进行,但应该把备份数据保存到宿主机内。所以采用目录映射技术。先新建docker卷:
挑选一个pxc节点node1,将其容器停止并删除,然后重新创建一个增加了backup目录映射的node1容器
在node1容器中安装percona-xtrabackup-24
之后便可以执行如下命令进行全量备份,备份后的数据会保存在/data/backup/full
目录下:
官方文档已经不推荐使用innobackupex
,而推荐使用xtrabackup
命令
pxc全量还原
数据库可以热备份,但是不能热还原,否则会造成业务数据和还原数据的冲突。
对于pxc集群为了避免还原过程中各节点数据同步冲突的问题,我们要先解散原来的集群,删除节点。然后新建节点空白数据库,执行还原,最后再建立起其他集群节点。
还原前还要将热备份保存的未提交的事务回滚,还原之后重启mysql
停止并删除pxc集群所有节点
按照之前的步骤重新创建node1容器,并进入容器,执行冷还原
到此这篇关于docker部署mysql集群的实现的文章就介绍到这了,更多相关docker部署mysql集群内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
下一篇: js实现特别简单的钟表效果