热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在多主机Docker网络中运行XtraDBCluster

译者前言Percona所维护的XtraDB是mysql的一个分支,使用了性能比innodb更加出色的xtrodb驱动,XtraDB-Cluster产品,是其集群化的方案,方案内容,

译者前言

Percona 所维护的XtraDB 是mysql的一个分支,使用了性能比innodb更加出色的xtrodb驱动,XtraDB-Cluster产品,是其集群化的方案,方案内容,请自行google。最近XtraDB-Cluster的5.7版本的推出,跟上了mysql主分支的脚步,更加吸引mysql爱好者转移到Percona上来。

《在多主机Docker网络中运行XtraDB Cluster》

正文

以下,我将阐述一下,怎么样在多主机Docker网络中运行Percona XtraDB Cluster。

随着我们的Pecrona XtraDB Cluster 5.7 beta版本的发布,我们亦决定提供Pecrona XtraDB Cluster 5.6 和 Pecrona XtraDB Cluster 5.7 的镜像文件。

启动一个单点的Percona XtraDB Cluster 是很方便的,基本和Percona Server的镜像相同。唯一的不同就是需要指定CLUSTER_NAME环境变量. 启动容器的命令如下

docker run -d -p 3306:3306
-e MYSQL_ROOT_PASSWORD= Theistareyk
-e CLUSTER_NAME= Theistareykjarbunga
-e XTRABACKUP_PASSWORD=Theistare
percona/percona-xtradb-cluster

你应该会注意到我们提供了可选的参数 XTRABACKUP_PASSWORD,这个参数是用户xtradbbackup@localhost 执行xtrabackup-SST 同步的用户密码。

运行单点的Percona XtraDB Cluster 需要迎合Cluster启动所需要的 CLUSTER_NAME 参数,单点其实也无所谓这个。在我们提供的镜像中,需要解决以下任务:

1.运行在多主机的环境(多主机环境上一般跑Docker Swarm 和Kubernetes)
2.如我们所需的,在某个Cluster中启动多个节点
3.在服务发现的服务端口上,注册所有的节点,这样,所有的客户端就能知道有多少个节点以及他们运行的状态
4.集成 ProxySQL

让我们一个一个看。

随着Docker网络协议的完善,可以使用多主机环境部署Percona XtraDB了。 最近的Docker 版本带来了网络overlay驱动,我们将使用这个特性建立一个虚拟网络。安装和启动Docker 的overlay 网络超出了本问的范围,这里给出个链接,感兴趣的人可以看下这个非常好的介绍资料了解下这个虚拟网络是如何运行的。

好了,等你overlay网络驱动装好,我们要在这上创建一个虚拟网络:

docker network create -d overlay cluster1_net

然后我们可以这样启动容器:

docker run -d -p 3306 --net=cluster1_net
-e MYSQL_ROOT_PASSWORD=Theistareyk
-e CLUSTER_NAME=cluster1
...
-e XTRABACKUP_PASSWORD=Theistare
percona/percona-xtradb-cluster

这玩意儿很cool,cool点在于,你随便在哪台服务器启动这个节点,只要是基于同一个网络的相同的 CLUSTER_NAME,他们都会自动的进行通信。

如果你处在单一Docker主机的环境中,譬如做个测试什么的,你还可以创建一个网桥网络,在一个单主机的环境中使用他。

好吧,以上这个脚本,怎么说呢,基本可以执行。问题在于每个新加入的节点需要知道运行的cluster的地址。

为了让实例知道这个地址,我们可以使用 CLUSTER_JOIN 这个变量,这个变量的值为某一个运行中的节点的ip地址,(如果是一个新的群,那么就是空)

在本例中,这个脚本应该像这样:

docker run -d -p 3306 --net=cluster1_net
-e MYSQL_ROOT_PASSWORD=Theistareyk
-e CLUSTER_NAME=cluster1
-e CLUSTER_JOIN=10.0.5.5
-e XTRABACKUP_PASSWORD=Theistare
percona/percona-xtradb-cluster

手动追踪一个ip地址在我看来完全是一个额外的工作,尤其是要在一个动态的环境中起停一个节点的时候,真是有够麻烦的。所以我们决定使用一个发现服务。现在我们使用的是Etcd发现服务,当然,使用其他的发现服务也没啥问题,譬如Consul。

举个例子,当你在主机 10.20.2.4:2379上运行发现服务的时候,你可以这样启动节点:

docker run -d -p 3306 --net=cluster1_net
-e MYSQL_ROOT_PASSWORD=Theistareyk
-e CLUSTER_NAME=cluster1
-e DISCOVERY_SERVICE=10.20.2.4:2379
-e XTRABACKUP_PASSWORD=Theistare
percona/percona-xtradb-cluster

这个节点就会自己把自己注册到发现服务中去,并且加入名为$CLUSTER_NAME的集群中。

下面是显示 CLUSTER_NAME 为 $CLUSTER_NAME 集群的一个简单的方法:

curl http://$ETCD_HOST/v2/keys/pxc-cluster/$CLUSTER_NAME/?recursive=true | jq
{
"action": "get",
"node": {
"key": "/pxc-cluster/cluster4",
"dir": true,
"nodes": [
{
"key": "/pxc-cluster/cluster4/10.0.5.2",
"dir": true,
"nodes": [
{
"key": "/pxc-cluster/cluster4/10.0.5.2/ipaddr",
"value": "10.0.5.2",
"modifiedIndex": 19600,
"createdIndex": 19600
},
{
"key": "/pxc-cluster/cluster4/10.0.5.2/hostname",
"value": "2af0a75ce0cb",
"modifiedIndex": 19601,
"createdIndex": 19601
}
],
"modifiedIndex": 19600,
"createdIndex": 19600
},
{
"key": "/pxc-cluster/cluster4/10.0.5.3",
"dir": true,
"nodes": [
{
"key": "/pxc-cluster/cluster4/10.0.5.3/ipaddr",
"value": "10.0.5.3",
"modifiedIndex": 26420,
"createdIndex": 26420
},
{
"key": "/pxc-cluster/cluster4/10.0.5.3/hostname",
"value": "cfb29833f1d6",
"modifiedIndex": 26421,
"createdIndex": 26421
}
],
"modifiedIndex": 26420,
"createdIndex": 26420
}
],
"modifiedIndex": 19600,
"createdIndex": 19600
}
}

用这个方法,你就可以在任意个Docker主机上启动任意多个数据库节点了。现在我们可以在数据库集群前端放置SQL Proxy了,这个下回再讨论了。

译者附

我在实施该XtraDB Cluster的时候,发现脚本有问题,同时发现该文的后方,亦有人发现相同的问题,现贴出该bug并给出解决办法:

发言人为Roma Cherepanov

他在启动节点的时候发现了一些error,我也发现了这些问题,导致容器一直启动不起来,之后经过调试,解决该问题,并在下放给出了答复

kevin:

在跑这个镜像的时候,我有相同的问题。

pxc-entry.sh脚本有些问题

line 125: (应该是125,之前数错了,帖子上面写的也错了☹)

i=$(curl http://$DISCOVERY_SERVICE/v2/keys/pxc-cluster/queue/$CLUSTER_NAME | jq -r '.node.nodes[].value')

应该是

i=(curl http://$DISCOVERY_SERVICE/v2/keys/pxc-cluster/queue/$CLUSTER_NAME | jq -r '.node.nodes[].value')

line 139:

i=$(curl http://$DISCOVERY_SERVICE/v2/keys/pxc-cluster/$CLUSTER_NAME/?quorum=true | jq -r '.node.nodes[]?.key' | awk -F'/' '{print $(NF)}')

应该是

i=(curl http://$DISCOVERY_SERVICE/v2/keys/pxc-cluster/$CLUSTER_NAME/?quorum=true | jq -r '.node.nodes[]?.key' | awk -F'/' '{print $(NF)}')

脚本要给i 赋值一个数组,那么shell的数组赋值形式应该是i=(a b c d) ,而不是i=$(a b c d) 不知道作者的脚本解释语言是啥,反正在我这里应该是这样的,改了之后就OK啦!

作者信息
原文作者: Vadim Tkachenko
原文链接:https://www.percona.com/blog/…
翻译自Maxleap团队_Service&Infra:Kevin
首发地址:https://blog.maxleap.cn/archi…

作者往期佳作
快速部署Test-Driven Development/Debug环境
Amazon和Mysql之间的那点事儿

欢迎关注微信公众号:MaxLeap_yidongyanfa
《在多主机Docker网络中运行XtraDB Cluster》


推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 使用Spring AOP实现切面编程的步骤和注意事项
    本文介绍了使用Spring AOP实现切面编程的步骤和注意事项。首先解释了@EnableAspectJAutoProxy、@Aspect、@Pointcut等注解的作用,并介绍了实现AOP功能的方法。然后详细介绍了创建切面、编写测试代码的过程,并展示了测试结果。接着讲解了关于环绕通知的使用方法,并修改了FirstTangent类以添加环绕通知方法。最后介绍了利用AOP拦截注解的方法,只需修改全局切入点即可实现。使用Spring AOP进行切面编程可以方便地实现对代码的增强和拦截。 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • 进入配置文件目录:[rootlinuxidcresin-4.0.]#cdusrlocalresinconf查看都有哪些配置文件:[rootlinuxid ... [详细]
  • docker安装到基本使用
    记录docker概念,安装及入门日常使用Docker安装查看官方文档,在"Debian上安装Docker",其他平台在"这里查 ... [详细]
  • 开发笔记:线性回归读取txt
    txt中部分数据如下:1.0000000.067732 ... [详细]
  • linux下编译安装lnmp
    2019独角兽企业重金招聘Python工程师标准#######################安装依赖#####################安装必要的包:y ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有