Docker的mysql集群节点可以正常创建,但无法正常连接到宿主机的mysql应该如何解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker的mysql集群节点可以正常创建,但无法正常连接到宿主机的mysql应该如何解决?相关的知识,希望对你有一定的参考价值。

1. 创建网段docker network create --subnet=172.18.0.0/16 net12. 创建数据卷docker volume create --name v13. 创建备份数据卷(用于热备份数据)docker volume create --name backup4. 创建第1个mysql节点docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc使用docker容器连接宿主机我的思路是这样的,创建数据卷和网段,通过端口映射到宿主机的mysql存储文件从而达到docker读取宿主机mysql数据,并做mysql集群的功能,但是现在遇到这样的一个问题,第四步的节点创建成功了但是Navigcat却无法正常连接到宿主机的mysql请问是什么原因呢?我在其他网站上看到,这时候创建mysql节点需要等待两分钟以上,但是我已等待超过2个钟可结果还是连接不成功,想请教一下各位前辈,应该怎么解决这样的问题,我的宿主机mysql外界ip是可以正常允许访问的



Ambari是Apache的开源项目,它帮助用户在GUI页面上简单的部署、管理、监控Hadoop集群环境。Ambari支持的Hadoop组件包括HDFS、Hive、HBase、Spark、Yarn等,HortonWorks官方也是采用Ambari来完成自家HDP套件的安装、管理及监控的。除了预置的组件之外,Ambari还支持自定义组件的安装,同时,支持RESTful的API,继而可以通过命令行等方式调用Ambari来完成一些自动化的任务。

本文共分为两部分,第一部分介绍如何在Docker虚拟化环境中部署Ambari;第二部分介绍如何基于Ambari来部署和管理Hadoop集群。

### 环境信息
* Docker发行版:Docker for Mac
* Docker版本:17.06.2-ce
* Docker容器OS:Ubuntu 14.04
* Ambari版本:2.5.2.0

Docker环境准备

    拉取Docker镜像:在宿主机上执行命令docker pull ubuntu:14.04从远端仓库中获取Ubuntu的镜像,也可以获取其他OS的镜像,本文以Ubuntu为例

    启动Docker容器:执行如下命令,以ubuntu:14.04镜像为基础启动容器:
    docker run -itd --name ambari_new -p 8080:8080 -p 3306:3306 -v /Users/yuxiaolei/Workspace/dockerShared:/dockerShared ubuntu:14.04 /bin/bash

    由于Ambari启动Web程序的时候占用8080端口,因此要从Docker宿主机上访问Ambari页面,需要通过参数 -p 来制定端口映射;
    作为新手,笔者在容器内部署好Ambari之后,才发现Web页面的8080端口和MySQL的3306端口(可选)没有暴露给Docker宿主机,也就没法从宿主机上通过浏览器来登陆Ambari,因此必须想办法在已有容器上开放端口。

    有两个方法:
    1)如果宿主机为Linux系统,则修改iptables防火墙来指定端口映射规则;
    2)如果是非Linux系统,可以将已装Ambari的容器commit为新的镜像,再基于该镜像创建新的容器。此时,就可以在docker run命令中添加参数 -p 来指定端口映射了。

    还有一个问题,Ambari将其数据存储在数据库中,支持MySQL、PostgreSQL等数据库;容器内安装MySQL之后,基于上一步创建的新容器里,会发现MySQL启动不起来,执行命令/etc/init.d/mysql restart启动失败,在/var/log/mysql/error.log日志文件中打印有170802 14:02:59 [ERROR] Fatal error: Can't open and lock privilege tables: Got error 140 from storage engine的错误,经过网上查资料,需要在创建容器的时候添加参数-v /var/lib/mysql将MySQL数据存储路径声明为数据卷,即可解决问题。
    启动容器之后,执行命令docker exec -it ambari /bin/bash进入容器内部。

    Ambari安装

    配置Ubuntu的软件仓库源:
    国内建议采用阿里云的软件源,在root账号下用vim打开/etc/apt/sources.list文件,删除文件所有内容,粘贴如下内容:

    deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

    执行命令apt-get update完成软件列表更新

    安装Ambari所依赖的软件

    apt-get install software-properties-common
    sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get update
    sudo apt-get install oracle-java8-installer
    sudo apt-get install oracle-java8-set-default
    完成安装之后,在 ~/.bashrc 文件末尾添加命令 `export JAVA_HOME=/usr/lib/jvm/java-8-oracle ` 以配置JAVA\\_HOME 环境变量。
    create database ambari;use ambari;GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root_password' WITH GRANT OPTION;FLUSH PRIVILEGES;exit;
    由于Ambari的数据存储在MySQL数据库中,这里为Ambari单独创建了database,并为其赋了完全控制权限;说明:假设MySQL数据库root用户的密码为:root\\_password
    修改 `/etc/mysql/my.conf`,将`skip-external-locking`注释掉,并确保 `bind-address = 0.0.0.0` 配置,以使MySQL可被远程主机访问。
    执行命令`/etc/init.d/mysql restart`重启MySQL 服务。

    时间同步服务器ntp:执行命令apt-get install ntp安装ntp时间同步服务器,以便于集群环境中各节点的时钟一致;执行命令sudo service ntp restart重启ntp服务。

    MySQL:执行命令apt-get install mysql-server安装MySQL服务器,安装完成后执行命令mysql -uroot -proot进入MySQL客户端,执行如下SQL代码:

    Oracle JDK:逐条执行如下命令,以添加WebUpd8团队(https://launchpad.net/~webupd8team/+archive/ubuntu/java)提供的Oracle JDK仓库源,并从该仓库安装JDK:

    下载Ambari仓库文件

    进入cd /etc/apt/sources.list.d目录,执行命令wget http://public-repo-1.hortonworks.com/ambari/ubuntu14/2.x/updates/2.5.2.0/ambari.list从HortonWorks仓库中下载Ambari源文件,下载后切勿修改list文件名;

    执行命令apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD以信任远端仓库的GPG签名

    执行命令apt-get update更新Ambari软件源

    执行命令apt-get install ambari安装Ambari套件,由于软件包较大(700多MB),这里情耐心等待,不过apt-get支持断点下载,网络终端后重新执行命令时不会从零开始下载

    配置Ambari:

    执行命令mysql -uroot -proot进入MySQL客户端,执行命令source ambari进入ambari的数据库,并执行命令source /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql来完成Ambari的数据库表初始化操作;

    执行命令ambari-server setup启动Ambari的引导式配置操作,根据指导做配置即可。需要注意的是,JDK不要选择由Ambari从网络下载,应该选择自定义路径,然后输入/usr/lib/jvm/java-8-oracle即可;

    启动Ambari:执行命令ambari-server start,启动日志存储路径为/var/log/ambari-server/ambari-server.log

    启动之后,由于我们之前做了Docker容器的端口映射,因此可以在宿主机上打开浏览器输入http://localhost:8080即可访问Ambari登陆页面

    登陆用户名和密码均为admin,登陆之后就可以看到Ambari的首页了,如下图:
    % asset_img

参考技术A 1、用docker ps查看一下node1是否正常运行了;
2、如果运行,进入容器 docker exec -it node1 bash,运行mysql -uroot -p
试试刚才的密码是否正确
3、进入mysql后,查看是否允许远程连接mysql
如果有问题,再提。

运维之我的docker-compose快速创建zookeeper集群

    很多时候大家不同的容器想要不用启动参数这个时候不妨使用脚本封装来实现,官方也很推荐这个做法,这里介绍下如何使用脚本传参快速启动一个zookeeper集群。

    zookeeper集群大家知道有部分通用配置,和一些动态配置如果用一个简单的zookeeper实例无法正常启动集群,所以我们的节点列表和节点ID是需要动态传入的所以下面的脚本的${ZK_ID}和${ZK_LIST}是需要你使用compose的配置传入的。


zookeeper启动脚本

https://code.aliyun.com/nginxs/docker/blob/master/pkg/zookeeper/docker-entrypoint.sh

[[email protected] pkg]# cat zookeeper/docker-entrypoint.sh
#!/bin/bash
#######################################################
#       author : baishaohua                           #
#       mail  : [email protected]                      
#
#       blog  : new.nginxs.net                      
#
#       msg   : startup zookeeper cluster for docker #
#######################################################
 
#Shell Base Env
ZK_HOME="/usr/local/zookeeper"
ZK_CONF="${ZK_HOME}/conf/zoo.cfg"
ZK_DATA="/var/lib/zookeeper"
ZK_CONF_TXT="tickTime=2000\ninitLimit=10\nsyncLimit=5\ndataDir=${ZK_DATA}\nclientPort=2181"

echo "zookeeper is start"
#init config
echo -e ${ZK_CONF_TXT} >${ZK_CONF}
 
#ZK_NODE_LIST from docker argv

for i in
${ZK_NODE_LIST}
do
echo "$i" >>${ZK_CONF}
done
echo "${ZK_ID}" >${ZK_DATA}/myid
 
 
#this shell main function
${ZK_HOME}/bin/zkServer.sh start-foreground



Dockerfile文件配置

[[email protected] pkg]# cat zookeeper/Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/forker/centos7:last
MAINTAINER baishaohua <[email protected]>
 
#start up configure 下面自动把zookeeper安装包安装到/usr/local/zookeeper目录
ADD zookeeper-3.5.1-alpha.tar.gz /usr/local/       
RUN mv /usr/local/zookeeper-3.5.1-alpha /usr/local/zookeeper && mkdir -p /var/lib/zookeeper/
RUN yum -y install make gcc libgcc gcc-c++ glibc-devel java-1.8.0-openjdk
COPY docker-entrypoint.sh /usr/bin/
 
#ENV and CMD 配置容器默认启动脚本和开放2181端口
CMD ["/usr/bin/docker-entrypoint.sh"]
EXPOSE 2181



重点来了我们要从docker-compose.yml传参到启动脚本

下面通过environment定义环境变量把参数传递到容器的启动脚本,完成自定义部分内容

https://code.aliyun.com/nginxs/docker/blob/master/pkg/zk_cluster/docker-compose.yml

[[email protected] pkg]# cat zk_cluster/docker-compose.yml
version: ‘3‘
services:
  zk1:
    image: registry.cn-hangzhou.aliyuncs.com/forker/zookeeper
    restart: always
    container_name: zk1
    ports:
      - "2181:2181"
    environment:
      ZK_ID: 1
      ZK_NODE_LIST: server.1=zk1:3181:4181 server.2=zk2:3181:4181 server.3=zk3:3181:4181
 
  zk2:
    image: registry.cn-hangzhou.aliyuncs.com/forker/zookeeper
    restart: always
    container_name: zk2
    ports:
      - "2182:2181"
    environment:
      ZK_ID: 2
      ZK_NODE_LIST: server.1=zk1:3181:4181 server.2=zk2:3181:4181 server.3=zk3:3181:4181
 
  zk3:
    image: registry.cn-hangzhou.aliyuncs.com/forker/zookeeper
    restart: always
    container_name: zk3
    ports:
      - "2183:2181"
    environment:
      ZK_ID: 3
      ZK_NODE_LIST: server.1=zk1:3181:4181 server.2=zk2:3181:4181 server.3=zk3:3181:4181



启动我的compose服务

这里可以看到其实zk1,zk2,zk3每个都是一个service,而且compose会为这个应用创建一个默认的桥接网络

[[email protected] zk_cluster]# docker-compose up -d
WARNING: The Docker Engine you‘re using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Creating network "zkcluster_default" with the default driver
Creating zk3
Creating zk1
Creating zk2


测试zookeeper集群

[[email protected] zk_cluster]# echo  "conf"|nc localhost 2181
clientPort=2181
secureClientPort=-1
dataDir=/var/lib/zookeeper/version-2
dataDirSize=67109393
dataLogDir=/var/lib/zookeeper/version-2
dataLogSize=67109393
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=1
initLimit=10
syncLimit=5
electionAlg=3
electionPort=4181
quorumPort=3181
peerType=0
membership:
server.1=zk1:3181:4181:participant
server.2=zk2:3181:4181:participant
server.3=zk3:3181:4181:participant
version=100000000


本文出自 “运维之我的历程” 博客,请务必保留此出处http://nginxs.blog.51cto.com/4676810/1908591

以上是关于Docker的mysql集群节点可以正常创建,但无法正常连接到宿主机的mysql应该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

利用docker镜像配置mysql集群+nextcloud集群+haproxy负载均衡

在多台服务器上使用 mysql-server docker 容器创建 MySQL 集群

Docker搭建mysql集群

Mysql数据库 | 基于Docker搭建Mysql-8.0以上版本主从实例实战

运维之我的docker-compose快速创建zookeeper集群

当kafka集群其中一台宕机后,会怎么样?