Docker+PXC+Haproxy搭建高可用强一致性的MySQL集群

1.MySQL集群介绍

常见 MYSQL 集群方案

        

 PXC原理

Percona XtraDB Cluster提供了MySQL高可用数据高一致性的一种实现方法。PXC集群以节点组成(推荐至少3节点,便于故障恢复,后面会讨论两节点的情况),每个节点都是基于常规的 MySQL/Percona Server,意味着你可以从集群中分离出某节点单独使用。集群中每个节点都包含完整的数据。

 Replication原理

Replication的思想是将数据在集群的多个节点同步备份,以提高集群数据的可用性(HA);Mysql使用Replication架构来实现上述目的,同时可以提升了集群整体的并发能力。5.6版本作为一个里程碑,对replication做了不少的优化调整,提高了集群数据的一致性、同步的性能以及数据自动恢复(recovery)的能力。

Replication架构通常由一个master和一个或者多个slaves构成,master接收应用的writes操作(事务中的read、write操作均有master处理),slaves接收read操作。在master上发生的数据变更,都将会复制给slaves,从直观而言,replication架构解决了)数据多点备份,提高数据可用性)读写分流,提高集群的并发能力。(并非是负载均衡))让一些非实时的数据操作,转移到slaves上进行

PXC 方案与 Replication 方案的对比

 PXC 的数据强一致性

  • 同步复制,事务在所有集群节点要么同时提交,要么不提交 Replication
  • 采用异步复制,无法保证数据的一致性

ReplicationPXC
数据同步是单向的,master负责写,然后异步复制给slave;如果slave写入数据,不会复制给master。数据同步时双向的,任何一个mysql节点写入数据,都会同步到集群中其它的节点。
异步复制,从和主无法保证数据的一致性同步复制,事务在所有集群节点要么同时提交,要么同时不提交

2.创建 MySql 集群

2.1 拉取PXC镜像

#拉取5.7.20版本的PXC镜像
docker pull percona/percona-xtradb-cluster:5.7.20
#拉取下来的镜像名字太长了,改一下名字
docker tag percona/percona-xtradb-cluster:5.7.20 pxc5720:5.7.20

2.2创建内部网络

  出于安全考虑,需要给 PXC 集群实例创建 Docker 内部网络

#创建网段,假设创建网段172.18.0.0(默认:172.17.0.0),子网掩码是24位

docker network create --subnet=172.18.0.0/24 net1

#查看网段

docker network inspect net1

# 删除网段,这里不需要删除

docker network inspect net1

2.3创建docker数据卷

Docker 卷是容器中的 PXC 节点映射数据目录的解決办法

  • 一旦创建出docker容器,尽量不要把业务数据存在容器内,因为出问题的话数据可能就找不到了。
  • 可以把业务数据保存在宿主机内,通过映射技术将宿主机上的目录映射到容器内。在运行容器的时候,把业务数据保存在映射目录里,也就是存储到宿主机上面。如果容器出什么问题,可以在创建一个容器,再将目录映射给该容器,则业务数据就导入了
#创建数据卷
docker volume create v1 
#查看数据卷,我们也可以去docker安装目录中volumes目录中查看数据卷是否创建成功
docker inspect v1 
# 删除volume,不需要删除
docker volume rm v1
#我们需要五个
docker volume create v2
docker volume create v3 
docker volume create v4
docker volume create v5

2.4创建PXC容器

#容器的3306,映射到宿主机的3310
docker run -d -p 3310:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc5720:5.7.20

命令详解

命令说明
-d代表创建的容器在后台运行
-p端口映射 宿主机端口:容器端口
-v路径映射
-e MYSQL_ROOT_PASSWORD=abc123456指定mysql的root账号密码为abc123456
-e CLUSTER_NAME=PXC执行名称为PXC
-e XTRABACKUP_PASSWORD=abc123456指定mysql数据同步时用的密码为abc123456
–privileged给最高的权限
–name=node1节点名称node1
–net=net1使用的内部网段
–ip 172.18.0.2分发的ip地址
percona-xtradb-cluster:5.7.20镜像名称

切记因第一个节点初始化比较耗时一定要等第一个容器创建成功可以使用MySQL客户端连接了才能创建第二个,或者会报错创建不了下面的容器!

创建其他节点

以此类推 IP不一样 端口不一样 数据卷不一样  加入的PXC节点前一个就行

docker run -d -p 3311:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc5720:5.7.20

docker run -d -p 3312:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc5720:5.7.20

docker run -d -p 3313:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc5720:5.7.20

docker run -d -p 3314:3306 -v v5:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc5720:5.7.20

3.haproxy负载均衡

haproxy简介

haproxy提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。

3.1拉取haproxy镜像

docker pull haproxy:2.2.1

  3.2在运行的PXC容器中创建一个用户Mysql创建用户  下面运行haproxy要用到

create user 'haproxy'@'%' identified by '';

  3.3创建haproxy的配置文件

# haproxy.cfg
global
    #工作目录
    chroot /usr/local/etc/haproxy
    #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
    log 127.0.0.1 local5 info
    #守护进程运行
    daemon
 
defaults
    log    global
    mode    http
    #日志格式
    option    httplog
    #日志中不记录负载均衡的心跳检测记录
    option    dontlognull
    #连接超时(毫秒)
    timeout connect 5000
    #客户端超时(毫秒)
    timeout client  50000
    #服务器超时(毫秒)
    timeout server  50000
 
#监控界面    
listen  admin_stats
    #监控界面的访问的IP和端口
    bind  0.0.0.0:8888
    #访问协议
    mode        http
    #URI相对地址
    stats uri   /dbs
    #统计报告格式
    stats realm     Global\ statistics
    #登陆帐户信息
    stats auth  admin:123456
#数据库负载均衡
listen  proxy-mysql
    #访问的IP和端口
    bind  0.0.0.0:3306  
    #网络协议
    mode  tcp
    #负载均衡算法(轮询算法)
    #轮询算法:roundrobin
    #权重算法:static-rr
    #最少连接算法:leastconn
    #请求源IP算法:source 
    balance  roundrobin
    #日志格式
    option  tcplog
    #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
    #我们主要是修改这里的配置
    option  mysql-check user haproxy
    server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
    server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
    server  MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
    server  MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
    #使用keepalive检测死链
    option  tcpka

 3.4运行haproxy容器

docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/docker/pxc:/usr/local/etc/haproxy --name  haprox --net=net1 --ip 172.18.0.10 --privileged haproxy:2.2.1

4001端口是我们可以访问的一个端口

4002是MySQL的端口,我们通过Navicat连接时用的

-v挂载的是配置文件的目录,/home/docker/pxc是我们放haproxy配置的目录

3.5访问haproxy

http://主机IP地址:4001/dbs

  注:在我们框架中连接haproxy的运行的MySQL就行了

-----整个流程到这里就结束了,感谢观众老爷们的阅读!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Docker和Kubernetes是目前非常流行的容器化技术,可以帮助开发人员更好的构建、管理和部署应用程序。下面将介绍如何在一台主机上搭建Docker和Kubernetes集群环境,并部署分布式应用程序。 第一步是安装Docker和Kubernetes,安装方式根据不同的操作系统会略有不同。安装完成后,需要对Docker进行一些配置,让它可以将Docker镜像推送和拉取到Kubernetes集群中。这一步可以通过配置Docker的daemon.json文件来完成。 接下来,需要搭建Kubernetes集群。首先需要安装etcd,它是Kubernetes的数据存储后端。然后安装kubectl命令行工具,用于管理Kubernetes集群。 部署Kubernetes集群后,需要将应用程序打包成Docker镜像,并推送到Docker镜像仓库中。然后,通过编写Kubernetes的YAML文件来定义应用程序的部署方式、服务、副本等信息。最后,使用kubectl apply命令来将YAML文件应用到Kubernetes集群中,实现应用程序的部署和运行。 如果需要对应用程序进行扩容,可以通过kubectl scale命令来水平扩展副本数。如果需要对应用程序进行升级,可以通过修改YAML文件并使用kubectl apply命令来实现。 总之,通过搭建Docker和Kubernetes集群环境,我们可以更轻松、高效的构建、管理和部署分布式应用程序。 ### 回答2: Docker 和 Kubernetes 都是一些颇为流行的容器技术。Docker 以其轻量级和易于部署的特点受到许多人的青睐,而 Kubernetes 则是以其在容器编排和自动化部署上的能力而闻名。本文将介绍如何搭建 Docker 和 Kubernetes 集群环境,并演示如何在分布式应用程序上部署这些技术。 Docker 集群环境: 要搭建 Docker 集群环境,我们需要一个主节点和多个工作节点。可以在机器上安装 DockerDocker Compose。使用 Docker Compose,我们可以轻松创建、启动和停止应用程序,同时便于管理容器。 当我们有多个 Docker 容器的时候,可以将它们放在不同的宿主机上,从而构建一个 Docker 集群。整个集群可以共享一个网络,这样我们就可以在不同的容器间通信。集群中每个节点都可以运行一个容器。这使得我们可以轻易地扩大我们的应用程序,并将它们部署到不同的机器上。 Kubernetes 集群环境: 要搭建 Kubernetes 集群环境,我们首先需要一个主节点和多个工作节点。要安装 Kubernetes 集群,我们可以使用 kubeadm 安装工具。Kubeadm 是一个命令行工具,它可以管理 Kubernetes 集群中的所有节点和服务。 在 Kubernetes 中,我们定义一组容器和服务,并将其称为一个应用程序,这个应用程序可以轻松地在 Kubernetes 集群中部署。Kubernetes 集群还提供了各种管理工具,可以监视应用程序的运行状态并处理故障。 分布式应用部署: 在分布式应用中,Docker 和 Kubernetes 都能够提供大的支持。使用 Docker,我们可以打包我们的应用程序并将其部署到多个容器中。这样我们就可以轻松地扩大我们的应用程序,并将它们部署到不同的机器上。 使用 Kubernetes,我们可以轻松部署和管理分布式应用程序,同时可以自动地监视、管理和扩展我们的容器。我们可以定义一个 Kubernetes 应用程序对象,该对象将包含我们的容器化应用程序所需的所有配置和信息。 总的来说,Docker 和 Kubernetes 都是非常流行的容器技术,它们能够提供大的支持,以便我们轻松地部署和管理我们的应用程序。无论你是在单个容器中运行应用程序,还是在整个集群中运行应用程序,这些技术都可以为你节省大量的时间和精力。 ### 回答3: Docker和Kubernetes(简称k8s)是两个广泛应用于容器化解决方案的开源工具。Docker和k8s的联合使用可以提供一个完整的,高度可靠和高度可扩展的容器平台,以便于分布式应用的部署和维护。在本文中,我们将探讨如何在Docker和k8s上搭建集群环境及分布式应用部署方案。 首先我们需要安装和配置好Docker和k8s的环境,确保Docker和k8s能够正常工作。假设我们需要在三台机器上部署应用,我们需要在每台机器上安装Docker和k8s,每个Docker节点都要配置k8s本地存储,以保证数据的持久性和多副本数据备份。然后,我们需要在每个Kubernetes节点上部署一个Pod网络,使不同节点上的容器能够相互通信。 然后,我们需要编写Kubernetes 部署清单文件,并将它们发布到 Kubernetes 集群中。清单文件中应包含有关应用程序的必要配置信息,例如应用程序的容器镜像、环境变量、端口号、挂载点和资源请求/限制。我们可以使用Deployment,StatefulSet和DaemonSet三种资源类型来管理应用程序的部署和维护。使用这些资源类型可以实现高可靠性,自动化和灵活性的分布式应用部署和管理。 最后,我们可以使用Kubernetes的服务发现机制来暴露应用程序的服务,以便其他容器或服务可以访问它。这可以通过创建一个Kubernetes的service对象,并将其与应用程序的Pods关联起来来实现。Service对象可以提供一个常量的IP地址和DNS名称来代表应用程序的服务,并确保在容器出现故障时仍然可用。 综上所述,Docker和k8s组合可以提供一个大的容器化解决方案,以及高度可靠和高度可扩展的平台来部署和维护分布式应用程式。在实践中,通过使用Docker和k8s,我们可以更轻松地部署,运行和管理复杂的应用程序,同时提高生产力和应用程序的可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值