PXC集群原理与搭建

1.PXC集群
1.1 简介

Percona XtraDB Cluster(简称PXC )是针对MySQL用户的高可用性和扩展性解决方案,基于Percona Server 。其包括了Write Set REPlication补丁,使用Galera 2.0库,这是一个针对事务性应用程序的同步多主机复制插件。Percona Server是MySQL的改进版本,使用XtraDB存储引擎,在功能和性能上较MySQL有着很显著的提升,提升了在高负载情况下的 InnoDB的性能,为DBA提供了一些非常有用的性能诊断工具,另外有更多的参数和令来控制服务器行为。

优点:

  • 同步复制,事务要么在所有节点提交或不提交。
  • 多主复制,可以在任意节点进行写操作。 由于是多节点写入,所以DB故障切换很容易。完成了真正的多节点读写的集群方案
  • 在从服务器上并行应用事件,真正意义上的并行复制。 改善了主从复制延迟问题,基本上达到了实时同步;
  • 节点自动配置,数据一致性,不再是异步复制。 新加入的节点可以自动部署,无需提交手动备份,维护方便;

PXC最大的优势:强一致性、实现了MySQL集群的高可用性和数据的强一致性;无同步延迟。

缺点:

  • 加入新节点时开销大:添加新节点时,必须从现有节点之一复制完整数据集。

锁冲突的问题:要保证数据的一致性,PXC采用的实时基于存储引擎层来实现同步复制,所以在多节点并发写入时,锁冲突问题比较严重。

  • 写扩大的问题:存在写扩大的问题。所以节点上都会发生写操作,对于写负载过大的场景,不推荐使用PXC。

  • 生成的ID不连续:如果期望连续就需要将ID生成策略提高一级,比如放在数据切分中间件中,如mycat等。或者在程序中执行ID的赋予问题。

  • 脑裂问题:PXC集群数量建议为奇数,防止脑裂。任何命令执行出现unkown command ,表示出现脑裂,集群两节点间4567端口连不通,无法提供对外服务。

  • 并发写:三个节点的自增起始值为1、2、3,步长都为3,解决了insert问题,但update同时对一行操作就会有问题,出现:Error: 1213SQLSTATE: 40001,所以更新和写入在一个节点上操作。

  • pxc结构里面必须有主键:如果没有主建,有可能会造成集中每个节点的Data page里的数据不一样

  • 不支持表级锁

  • 不支持lock /unlock tables

  • 不支持XA事务

  • 性能符合水桶原理:性能由集群中性能最差的节点决定

1.2 组成

(1)Percona Server with XtraDB

  • 同步复制,事务可以在所有节点上提交。
  • 多主机复制,你可以写到任何节点。
  • 从( slave )服务器上的并行应用事件,真正的“并行复制”。
  • 自动节点配置。
  • 数据一致性,不再有未同步的从服务器。

(2)Write Set Replication patches

  • 使用了Galera library,一个通用的用于事务型应用的同步、多主复制插件。
1.3 PXC执行流程
在这里插入图片描述
  • 客户端先发起一个事务先在【本地执行】,当发起对事务的提交操作时,在给用户响应提交成功之前需要将【写请求广播】出去,然后获取到一个【全局的事务ID】,一并传送到其他节点上面。【各节点检查】是否有冲突数据,等各有节点返回OK后事务发起节点commit并返回客户端,否则就需要取消此次事务的操作,事务跟随节点返回无冲突OK后指执行数据合并,但和发起节点有一定的时间差,这里可能会出现延时。
1.4 重要概念与端口

(1)同步方式

  • State Snapshot Transfer(SST) :全量同步。主要包括XtraBackup、mysqldump、rsync三种方式
  • Incremental state Transfer(IST):增量同步,只有XtraBackup

(3)端口及作用

  • 3306:数据库对外服务的端口号

  • 4444:请求SST(全量同步),在新节点加入时起作用

  • 4567:组成员之间进行沟通的一个端口号

  • 4568:传输IST(增量同步),节点下线,重启加入时起作用

状态阶段:状态机在新节点加入集群、节点故障恢复、节点同步时发生

  • OPEN: 节点启动成功,尝试连接到集群,如果失败则根据配置退出或创建新的集群

  • PRIMARY: 节点处于集群PXC中,尝试从集群中选取donor进行数据同步

  • JOINER: 节点处于等待接收/接收数据文件状态,数据传输完成后在本地加载数据

  • JOINED: 节点完成数据同步工作,尝试保持和集群进度一致

  • SYNCED:节点正常提供服务:数据的读写,集群数据的同步,新加入节点的sst请求

  • DONOR(贡献数据者):节点处于为新节点准备或传输集群全量数据状态,对客户端不可用。

    img
1.4 高可用集群方案
2.Docker部署
2.1 环境准备
CentOS版本: CentOS Linux release 7.9.2009 (Core)
PXC 版本 : percona/percona-xtradb-cluster 5.7

(1)三台虚拟虚拟机

虚拟机ip端口容器数据卷角色
192.168.80.2219001pn1pnv1Docker Swarm 管理节点,Master 节点
192.168.80.2229001pn2pnv2worker 节点
192.168.80.2239001pn3pnv3worker 节点

(2)开启PXC涉及端口

端口用途
3306MySQL实例端口
4567PXC Cluser相互通信端口
4444用于SST全量传输
4568用于IST增量传输

(3)关闭相关服务

  • 关闭Selinux
"vi /etc/selinux/config" 把 "SELINUX" 属性值设置成 disabled,然后 reboot 重启
  • 关闭MySQL服务
service mysqld stop
  • 配置 ntp 服务同步时间
$ yum -y install ntp ntpdate
ntpdate 0.asia.pool.ntp.org
$ hwclock --systohc
$ date ##查看时间

(3)创建Docker Swarm集群

  • 前提:需开启端口( 若防火墙已关闭可忽略该步骤)

2377: 用于集群管理通信的TCP端口

4789: 用于容器覆盖网络

7946: 用于容器网络发现

systemctl status firewalld # 查看防火墙
systemctl stop firewalld # 停止防火墙
systemctl disable firewalld # 永久关闭

firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=4789/tcp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --reload

service iptables status 
service iptables stop
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 2375 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p tcp --dport 4789 -j ACCEPT
service iptables save
  • 选取管理主机,初始化swarm
#主机单个IP时,无需指定IP创建
[root@localhost /]# docker swarm init 
#当主机有多个IP时,需要指定IP创建
[root@localhost /]# docker swarm init --advertise-addr [IP]  

Swarm initialized: current node (g706owlgszx493xhpsb44k9t0) is now a manager.
To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-4ea65xsm8xsyhrmn42qg125b10dxtcmt80gnuijnnskddces2n-6fok68mg86nf5lkah1wnnj6ra \
    192.168.80.221:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  • 在其他两个虚拟机中,执行加入swarm
[root@localhost /]#docker swarm join \
    --token SWMTKN-1-4ea65xsm8xsyhrmn42qg125b10dxtcmt80gnuijnnskddces2n-6fok68mg86nf5lkah1wnnj6ra \
    192.168.80.221:2377
    
This node joined a swarm as a work.    
  • 在管理主机 查看swarm集群
#只能在管理主机下查看swarm集群
[root@localhost /]# docker node ls

删除swarm节点: docker node rm -f [节点ID]

解散swarm集群: 先在manager node上删除所有woker 节点,再强制删除自己 docker swarm leave -f,最后再到各work node上分别执行 docker swarm leave

(4)创建docker虚拟网络

出于安全考虑,给 PXC 集群创建 Docker 内部虚拟网络,用于 PXC 集群独立使用
此处自定义的虚拟网络名称为:swarm_mysql

$ docker network create -d overlay --attachable swarm_mysql
# 或者
$ docker network create --scope=swarm --attachable -d overlay swarm_mysql
2.2 搭建PXC集群

(1)下载镜像

#拉取镜像
$ docker pull percona/percona-xtradb-cluster:5.7.32
#重命名镜像名称
$ docker tag percona/percona-xtradb-cluster pxc

(2)创建分布式容器

  • 创建主节点

注意: 第一个启动的 PXC节点是【主节点】,它要初始化 PXC 集群

PXC集群中存在两个节点以上之后就没有主节点的概念了。集群中最后一个退出的节点就会为主节点,在 /var/lib/mysql/grastate.dat 文件中属性 safe_to_bootstrap 的值 会从 0 被设置为 1 表示该节点是主节点。

注意:在这一步之前,要把 MySQL 数据库停止服务 !

docker run -d --name=pn1 \
--net=swarm_mysql \
-p 9001:3306 \
-v pnv1:/var/lib/mysql \
--privileged \
-e MYSQL_ROOT_PASSWORD=mT123456 \
-e CLUSTER_NAME=PXC1 \
-e XTRABACKUP_PASSWORD=mT123456 pxc

在这里插入图片描述

#查看虚拟网络的Peers参数里是否加入该容器Name与IP
docker network inspect swarm_mysql
#主节点创建后稍等会访问MySQL
mysql -h[主机IP] -P9001 -uroot -pmT123456

注意:【主节点】配置基本不会有多少问题如果发现无法正常访问,那就查看下节点日志

docker logs [节点名] (注意其中出现的 "ERROR" 信息),一般出现 InnoDB BufferPoll则成功

排查时,先 stop 节点

(2)创建从节点容器

必须主节点可以访问了,才能创建从节点,否则会闪退!

docker run -d \
--name=pn3 \
--net=swarm_mysql \
-p 9001:3306 \
-v pnv3:/var/lib/mysql \
--privileged \
-e MYSQL_ROOT_PASSWORD=mT123456 \
-e CLUSTER_NAME=PXC1 \
-e XTRABACKUP_PASSWORD=mT123456 \
-e CLUSTER_JOIN=pn1 pxc

从第二个节点创建开始,需要增加 "-e CLUSTER_JOIN" 参数,表示与【主节点】容器同步

此外,与创建【主节点】不同的地方,也只有参数 --name(节点名)-v(数据卷),其他可自定义

(3)查看挂载情况

  • 推荐方式

    需进入 【主节点】的mysql,运行查询语句:show status like 'wsrep%';

    mysql -uroot -pmT123456 -h127.0.0.1 -e "show status like 'wsrep_%';"
    
  • 通过查看docker虚拟网络信息,确认挂载情况

    [root@localhost ~]# docker network inspect swarm_mysql
    [
        {
            "Name": "swarm_mysql",
            "Id": "ir06z2hjlfduliphte8chwrop",
            "Created": "2021-01-14T15:46:33.522125189+08:00",
            "Scope": "swarm",
            "Driver": "overlay",
             ......
            "Peers": [
                {
                    "Name": "localhost.localdomain-bedc99cf44f1",
                    "IP": "192.168.80.221"
                },
                {
                    "Name": "localhost.localdomain-986f2f07e8b7",
                    "IP": "192.168.80.222"
                },
                {
                    "Name": "localhost.localdomain-4a1e3925814d",
                    "IP": "192.168.80.223"
                }
            ]
        }
    ]
    
3.问题与解决方案
3.1 宕机重启

(1)重启注意事项

由于 PXC 在退出的时候会给集群中最后退出的那台打上标记,当集群重新启动的时候,需要尽量先启动最后关闭的那台节点机器并且要按照主节点方式启动

(2)从节点操作

前提:如果主节点(如pn1)没有完全启动成功,从节点(如:pn2、pn3)就会闪退

  • 指定的【主节点】正常运行中

    直接运行指令: docker restart [节点名],数据会自行同步

  • 若指定的【主节点】也未启动

    • 方案1:先等【主节点】正常启动后,再执行 :docker restart [节点名]

      如果发现启动后闪退,建议确认下数据卷中 “grastate.dat” 文件的 safe_to_bootstrap 参数为 0
      再以 指定主节点方式 启动

    cat /var/lib/docker/volumes/pnv*/_data/grastate.dat 
    
    • 方案2:考虑以作为【主节点】的形式进行启动

    注意:毕竟之前它的启动参数是以指定主节点方式来启动的,所以,此时要修改数据卷中 “grastate.dat” 文件的 safe_to_bootstrap 参数为 1,再以 主节点方式 启动

(3)主节点操作

  • 若所有节点均未启动

    若能确定,原来作为【主节点】的机器是最后一个离开集群的,可直接运行:docker restart [节点名]

    首先,可以确认一下:数据卷中 “grastate.dat” 文件的 safe_to_bootstrap 参数为 1

    然后,执行启动命令:docker start [节点名] 或者 docker restart [节点名]
    等待查看第一个节点成功启动后,再按顺序,依次启动其他从节点:docker restart [节点名]

  • 若其他节点还在运行

    此时,要考虑使用指定主节点方式进行启动

    此时,可以删除自身容器 : docker stop [节点名]、docker rm [节点名]
    原来的数据卷无需删(继续使用,避免数据丢失)
    然后,确认一下:数据卷中 “grastate.dat” 文件的 safe_to_bootstrap 参数为 0
    接着,再以从节点方式创建容器,加入集群(注意参数 “-e CLUSTER_JOIN” 的指定)

  • 最坏情况:节点再创建一遍

    记不清之前的退出操作了,也懒得排查了,先要保证不去删除数据卷(避免数据丢失)
    然后,试着将所有的节点都 docker stop [节点名]、docker rm [节点名] 操作
    再从创建节点步骤开始,执行一遍!

3.2 报错排查
  • 服务器间的时间不同步导致错误

    “transport: x509: certificate has expired or is not yet valid”

     [root@localhost ~]# yum -y install ntp ntpdate
     [root@localhost ~]# ntpdate 0.asia.pool.ntp.org
     [root@localhost ~]# hwclock --systohc
     [root@localhost ~]# date
     2023年 02月 08日 星期五 09:54:23 CST
    
3.3 附录
3.3.1 创建节点参数
参数说明
-d创建的容器在后台运行
–name=pn1容器名称,自定义
–net=swarm_mysql加入到名为 swarm_mysql的虚拟网络
-p 9000:3306端口映射—— 宿主机端口:容器端口
-v pnv1:/var/lib/mysql数据卷挂载在 "pnv1" 数据卷
可以理解为虚拟的磁盘,容器在保存数据时往 "/var/lib/mysql" 路径存数据,其实是把数据包存在数据卷上
如果在这之前没有数据卷 pnv1,会自动创建一个进行挂载
–privileged表示有读写权限
-e MYSQL_ROOT_PASSWORD=mT123456Mysql 的 root 密码 (跟原来数据库设定的 root 密码没关系)
-e CLUSTER_NAME=PXC1PXC 集群名称 (注意不要命为关键词:"PXC")
-e XTRABACKUP_PASSWORD=mT123456PXC 集群之间数据同步的密码
-e CLUSTER_JOIN=pn1表示与 pn1节点同步 (第一个节点是没有该参数的!
pxc来自哪个镜像创建
3.3.2 dokcer操作
命令说明
docker stop 节点名停止节点
docker restart 节点名重启节点
docker ps查看节点
docker rm 节点名删除节点
docker logs 节点名(建议用来排查错误)查看日志
3.3.3 数据卷操作
命令说明
docker volume ls数据卷类列表
docker volume 数据卷名创建数据卷
docker volume rm 数据卷名删除数据卷
docker volume prune清除未挂载的数据卷
docker volumw inspect 节点名查看该容器数据卷情况
3.3.4 swarm集群操作
  • swarm相关
命令说明
docker swarm init --advertise-addr IP地址
docker swarm init
swarm初始化(多IP时需要指定IP)
docker swarm join --token token密钥 IP地址:2377加入到该swarm集群
docker swarm leave <–force>work节点退出当前swarm集群
manager节点解散swarm集群(添加–force选项)
docker swarm join-token [ manager | work ] <–quiet>查看如何将新的节点以Manager或Worker身份加入集群
  • node相关
命令说明
docker node ls查看swarm集群内节点
docker node rm <–force> 节点名删除swarm集群的对应节点(管理节点执行)
docker node promote 节点名将该节点升级为manager
docker node demote 节点名将该节点降级为worker
docker node update [OPTIONS] 节点名更新关于节点的元数据(标签、可用性、角色等)
  • service相关
命令说明
docker service create部署服务
docker service inspect 服务名查看服务详情
docker service logs 服务名产看某个服务日志
docker service ls查看所有服务详情
docker service rm <-f>删除某个服务(-f强制删除)
docker service scale设置某个服务个数
docker service update更新某个服务
3.3.5 network操作
命令说明
docker network create -d overlay --attachable 网络名称自定义网络
docker network ls查看所有网络
docker network inspect 网络名称查看该网络详细
docker network [ connect | disconnect ] 网络名称 容器名称连接/断开 该网络与容器的连接
docker network rm 网络名称删除该网络
docker network prune清除无用网络
  • docker原生网络:主要负责单机的多容器之间网络通信

    类型说明通信原理
    桥接模式(bridge)容器默认网络通信模式,docker0为当前主机所有容器的网关,容器地址在默认分配上是单调递增的容器通过虚拟网络对桥接到docker0上,docker0通过eth0(打开内核路由功能 ipv4=1)来发送外网
    共享主机模式(host)在创建容器时需要指定--network host参数host不会生成虚拟网卡,直接使用宿主机的网络就有公有ip了,外网可以访问容器,但是需要避免端口冲突
    none禁用网络模式,不给容器ip地址,只有lo口,使用时创建容器需指定 --network none有些容器保存比较机密的东西如密码散列,不需要网络
  • docker自定义网络:主要负责跨主机容器的网络通信

    类型说明
    自定义桥接(bridge)默认自定义网络,bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,可以使用–subnet和 --gateway指定网段和网关
    overlay用于创建跨主机网络,互联网常用
    maclan用于创建跨主机网络,运营商常用
3.3.6pxc集群状态
#查看pxc是否脑裂
$ /usr/bin/mysql -uroot -p123456 -h127.0.0.1 -e "show status like 'wsrep_cluster_status';" | grep -v Variable_name | awk '{print $NF}' | sed s/[[:space:]]//g
#查看所有信息
$ /usr/bin/mysql -uroot -p123456 -h127.0.0.1 -e "show status like 'wsrep_%';"

主要参数说明

wsrep_incoming_addresses 值是集群容器的IP地址,若该集群原来是三节点,一节点从集群移出后,显示为两个节点.

wsrep_cluster_status 在所在正常的节点中都显示为Primary ,显示为其他值时表示节点有异常;当显示为Disconnected则表示该节点已经不在集群中.

wsrep_flow_control_paused 表示复制停止了多少秒.

监控状态说明

  • 集群完整性检查:
属性含义
wsrep_cluster_state_uuid在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群.
wsrep_cluster_conf_id正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时”分区”了.当节点之间网络连接恢复 的时候应该会恢复一样的值.
wsrep_cluster_size如果这个值跟预期的节点数一致,则所有的集群节点已经连接.
wsrep_cluster_status集群组成的状态.如果不为”Primary”,说明出现”分区”或是”split-brain”脑裂状况.
  • 节点状态检查:
属性含义
wsrep_ready该值为 ON,则说明可以接受 SQL 负载.如果为 Off,则该节点可能发生脑裂或网络问题导致,需要检查 wsrep_connected
wsrep_connected如果该值为 Off,且 wsrep_ready 的值也为 Off,则说明该节点没有连接到集群.(可能是 wsrep_cluster_address 或 wsrep_cluster_name 等配置错造成的.具体错误需要查看错误日志)
wsrep_local_state_comment如果 wsrep_connected 为 On,但 wsrep_ready 为 OFF,则可以从该项查看原因
  • 复制健康检查:
属性含义
wsrep_flow_control_paused表示复制停止了多长时间.即表明集群因为 Slave 延迟而慢的程度.值为 0~1,越靠近 0 越好,值为 1 表示 复制完全停止.可优化 wsrep_slave_threads 的值来改善
wsrep_cert_deps_distance有多少事务可以并行应用处理.wsrep_slave_threads 设置的值不应该高出该值太多
wsrep_flow_control_sent表示该节点已经停止复制了多少次
*wsrep_local_recv_queue_avg表示 slave 事务队列的平均长度.slave 瓶颈的预兆. 最慢的节点的 wsrep_flow_control_sent 和 wsrep_local_recv_queue_avg 这两个值最高.这两个值较低的话,相对更好
  • 检测慢网络问题:
属性含义
wsrep_local_send_queue_avg网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶颈
  • 冲突或死锁的数目:
属性含义
wsrep_last_committed最后提交的事务数目
wsrep_local_cert_failures 和 wsrep_local_bf_aborts回滚,检测到的冲突数目
3.3.7 docker日志
#查看所有日志
$ journalctl -u docker --no-pager
#查看最近200条日志【分页】
$ journalctl -u docker -n 200
#查看最近200条日志【不分页】
$ journalctl -u docker -n 200 --no-pager
4.问题
4.1 docker未启动

问题描述

【docker】Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

最近发现 Docker 容器运行异常了。 运行docker version,出现

Client: Docker Engine - Community
 Version:           20.10.9
 API version:       1.41
 Go version:        go1.16.8
 Git commit:        c2ea9bc
 Built:             Mon Oct  4 16:08:14 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

解决过程

首先怀疑是 /etc/docker/daemon.json 的格式问题。看起来格式没错。

$ cat /etc/docker/daemon.json
{
        "registry-mirrors": ["https://registry.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn/"]
}

然后执行sudo tail -100 /var/log/messages,发现以下信息:

Oct  9 17:05:14 argus systemd: docker.service: main process exited, code=exited, status=1/FAILURE
Oct  9 17:05:14 argus systemd: Failed to start Docker Application Container Engine.
Oct  9 17:05:14 argus systemd: Unit docker.service entered failed state.
Oct  9 17:05:14 argus systemd: docker.service failed.
Oct  9 17:05:16 argus systemd: docker.service holdoff time over, scheduling restart.
Oct  9 17:05:16 argus systemd: Stopped Docker Application Container Engine.
Oct  9 17:05:16 argus systemd: Starting Docker Application Container Engine...
Oct  9 17:05:16 argus dockerd: time="2021-10-09T17:05:16.333345074+08:00" level=info msg="Starting up"
Oct  9 17:05:16 argus dockerd: time="2021-10-09T17:05:16.333959115+08:00" level=warning msg="Binding to IP address without --tlsverify is insecure and gives root access on this machine to everyone who has access to your network." host="tcp://0.0.0.0:2375"
Oct  9 17:05:16 argus dockerd: time="2021-10-09T17:05:16.333979904+08:00" level=warning msg="Binding to an IP address, even on localhost, can also give access to scripts run in a browser. Be safe out there!" host="tcp://0.0.0.0:2375"
Oct  9 17:05:17 argus dockerd: time="2021-10-09T17:05:17.334058821+08:00" level=warning msg="Binding to an IP address without --tlsverify is deprecated. Startup is intentionally being slowed down to show this message" host="tcp://0.0.0.0:2375"
Oct  9 17:05:17 argus dockerd: time="2021-10-09T17:05:17.334100630+08:00" level=warning msg="Please consider generating tls certificates with client validation to prevent exposing unauthenticated root access to your network" host="tcp://0.0.0.0:2375"
Oct  9 17:05:17 argus dockerd: time="2021-10-09T17:05:17.334115027+08:00" level=warning msg="You can override this by explicitly specifying '--tls=false' or '--tlsverify=false'" host="tcp://0.0.0.0:2375"
Oct  9 17:05:17 argus dockerd: time="2021-10-09T17:05:17.334126498+08:00" level=warning msg="Support for listening on TCP without authentication or explicit intent to run without authentication will be removed in the next release" host="tcp://0.0.0.0:2375"
Oct  9 17:05:32 argus dockerd: time="2021-10-09T17:05:32.342810539+08:00" level=info msg="parsed scheme: \"unix\"" module=grpc
Oct  9 17:05:32 argus dockerd: time="2021-10-09T17:05:32.343110722+08:00" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
Oct  9 17:05:32 argus dockerd: time="2021-10-09T17:05:32.343161327+08:00" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock  <nil> 0 <nil>}] <nil> <nil>}" module=grpc
Oct  9 17:05:32 argus dockerd: time="2021-10-09T17:05:32.343178970+08:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
Oct  9 17:05:32 argus dockerd: time="2021-10-09T17:05:32.344570079+08:00" level=info msg="parsed scheme: \"unix\"" module=grpc
Oct  9 17:05:32 argus dockerd: time="2021-10-09T17:05:32.344584115+08:00" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
Oct  9 17:05:32 argus dockerd: time="2021-10-09T17:05:32.344598783+08:00" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock  <nil> 0 <nil>}] <nil> <nil>}" module=grpc
Oct  9 17:05:32 argus dockerd: time="2021-10-09T17:05:32.344608932+08:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
Oct  9 17:05:32 argus dockerd: time="2021-10-09T17:05:32.365514254+08:00" level=info msg="[graphdriver] using prior storage driver: overlay2"
Oct  9 17:05:33 argus dockerd: failed to start daemon: error while opening volume store metadata database: timeout
Oct  9 17:05:33 argus dockerd: time="2021-10-09T17:05:33.319533268+08:00" level=info msg="stopping event stream following graceful shutdown" error="context canceled" module=libcontainerd namespace=plugins.moby
Oct  9 17:05:33 argus systemd: docker.service: main process exited, code=exited, status=1/FAILURE
Oct  9 17:05:33 argus systemd: Failed to start Docker Application Container Engine.
Oct  9 17:05:33 argus systemd: Unit docker.service entered failed state.
Oct  9 17:05:33 argus systemd: docker.service failed.
Oct  9 17:05:35 argus systemd: docker.service holdoff time over, scheduling restart.
Oct  9 17:05:35 argus systemd: Stopped Docker Application Container Engine.
Oct  9 17:05:35 argus systemd: start request repeated too quickly for docker.service
Oct  9 17:05:35 argus systemd: Failed to start Docker Application Container Engine.
Oct  9 17:05:35 argus systemd: Unit docker.service entered failed state.
Oct  9 17:05:35 argus systemd: docker.service failed.
Oct  9 17:08:02 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT -m addrtype --dst-type LOCAL -j DOCKER' failed: iptables: No chain/target/match by that name.
Oct  9 17:08:02 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D PREROUTING' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:08:02 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:08:02 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER' failed: iptables: Too many links.
Oct  9 17:08:02 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION-STAGE-1' failed: iptables: Too many links.
Oct  9 17:08:02 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
Oct  9 17:08:02 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
Oct  9 17:08:02 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:08:02 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:08:19 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT -m addrtype --dst-type LOCAL -j DOCKER' failed: iptables: No chain/target/match by that name.
Oct  9 17:08:19 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D PREROUTING' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:08:19 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:08:19 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER' failed: iptables: Too many links.
Oct  9 17:08:19 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION-STAGE-1' failed: iptables: Too many links.
Oct  9 17:08:19 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
Oct  9 17:08:19 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
Oct  9 17:08:19 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:08:20 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:09:30 argus NetworkManager[2147]: <info>  [1633770570.5751] device (wlp74s0): set-hw-addr: set MAC address to A2:BF:36:ED:CF:52 (scanning)
Oct  9 17:09:30 argus kernel: IPv6: ADDRCONF(NETDEV_UP): wlp74s0: link is not ready
Oct  9 17:09:30 argus NetworkManager[2147]: <info>  [1633770570.5912] device (wlp74s0): supplicant interface state: inactive -> disconnected
Oct  9 17:09:30 argus NetworkManager[2147]: <info>  [1633770570.5912] device (p2p-dev-wlp74s0): supplicant management interface state: inactive -> disconnected
Oct  9 17:09:30 argus NetworkManager[2147]: <info>  [1633770570.5967] device (wlp74s0): supplicant interface state: disconnected -> inactive
Oct  9 17:09:30 argus NetworkManager[2147]: <info>  [1633770570.5968] device (p2p-dev-wlp74s0): supplicant management interface state: disconnected -> inactive
Oct  9 17:09:54 argus systemd: Starting Docker Application Container Engine...
Oct  9 17:09:54 argus dockerd: time="2021-10-09T17:09:54.803883590+08:00" level=info msg="Starting up"
Oct  9 17:09:54 argus dockerd: time="2021-10-09T17:09:54.804939390+08:00" level=warning msg="Binding to IP address without --tlsverify is insecure and gives root access on this machine to everyone who has access to your network." host="tcp://0.0.0.0:2375"
Oct  9 17:09:54 argus dockerd: time="2021-10-09T17:09:54.804964938+08:00" level=warning msg="Binding to an IP address, even on localhost, can also give access to scripts run in a browser. Be safe out there!" host="tcp://0.0.0.0:2375"
Oct  9 17:09:55 argus dockerd: time="2021-10-09T17:09:55.805050688+08:00" level=warning msg="Binding to an IP address without --tlsverify is deprecated. Startup is intentionally being slowed down to show this message" host="tcp://0.0.0.0:2375"
Oct  9 17:09:55 argus dockerd: time="2021-10-09T17:09:55.805093829+08:00" level=warning msg="Please consider generating tls certificates with client validation to prevent exposing unauthenticated root access to your network" host="tcp://0.0.0.0:2375"
Oct  9 17:09:55 argus dockerd: time="2021-10-09T17:09:55.805108336+08:00" level=warning msg="You can override this by explicitly specifying '--tls=false' or '--tlsverify=false'" host="tcp://0.0.0.0:2375"
Oct  9 17:09:55 argus dockerd: time="2021-10-09T17:09:55.805119236+08:00" level=warning msg="Support for listening on TCP without authentication or explicit intent to run without authentication will be removed in the next release" host="tcp://0.0.0.0:2375"
Oct  9 17:10:01 argus systemd: Created slice User Slice of root.
Oct  9 17:10:01 argus systemd: Started Session 10775 of user root.
Oct  9 17:10:01 argus systemd: Removed slice User Slice of root.
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.814404906+08:00" level=info msg="parsed scheme: \"unix\"" module=grpc
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.814677267+08:00" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.814707734+08:00" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock  <nil> 0 <nil>}] <nil> <nil>}" module=grpc
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.814724035+08:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.815978757+08:00" level=info msg="parsed scheme: \"unix\"" module=grpc
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.815995960+08:00" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.816016408+08:00" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock  <nil> 0 <nil>}] <nil> <nil>}" module=grpc
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.816034732+08:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.841523991+08:00" level=info msg="[graphdriver] using prior storage driver: overlay2"
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.846588298+08:00" level=info msg="Loading containers: start."
Oct  9 17:10:10 argus dockerd: time="2021-10-09T17:10:10.856093582+08:00" level=info msg="Firewalld: docker zone already exists, returning"
Oct  9 17:10:10 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT -m addrtype --dst-type LOCAL -j DOCKER' failed: iptables: No chain/target/match by that name.
Oct  9 17:10:10 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D PREROUTING' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:10:10 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:10:10 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER' failed: iptables: Too many links.
Oct  9 17:10:10 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION-STAGE-1' failed: iptables: Too many links.
Oct  9 17:10:10 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
Oct  9 17:10:10 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION' failed: iptables: No chain/target/match by that name.
Oct  9 17:10:11 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:10:11 argus dockerd: time="2021-10-09T17:10:11.039279039+08:00" level=info msg="Firewalld: interface docker0 already part of docker zone, returning"
Oct  9 17:10:11 argus dockerd: time="2021-10-09T17:10:11.062120823+08:00" level=info msg="Firewalld: interface docker0 already part of docker zone, returning"
Oct  9 17:10:11 argus dockerd: time="2021-10-09T17:10:11.245623234+08:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
Oct  9 17:10:11 argus firewalld[48274]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed: iptables: Bad rule (does a matching rule exist in that chain?).
Oct  9 17:10:11 argus dockerd: time="2021-10-09T17:10:11.329345413+08:00" level=info msg="Firewalld: interface docker0 already part of docker zone, returning"
Oct  9 17:10:11 argus dockerd: time="2021-10-09T17:10:11.422929896+08:00" level=info msg="Loading containers: done."
Oct  9 17:10:11 argus dockerd: time="2021-10-09T17:10:11.450417171+08:00" level=info msg="Docker daemon" commit=79ea9d3 graphdriver(s)=overlay2 version=20.10.9
Oct  9 17:10:11 argus dockerd: time="2021-10-09T17:10:11.450480350+08:00" level=info msg="Daemon has completed initialization"
Oct  9 17:10:11 argus systemd: Started Docker Application Container Engine.
Oct  9 17:10:11 argus dockerd: time="2021-10-09T17:10:11.471178323+08:00" level=info msg="API listen on /var/run/docker.sock"
Oct  9 17:10:11 argus dockerd: time="2021-10-09T17:10:11.480313344+08:00" level=info msg="API listen on [::]:2375"

删除 /var/run/docker.pid 文件。问题依旧

运行如下命令

ps axf | grep docker | grep -v grep | awk '{print "kill -9 " $1}' | sudo sh

修改docker.service

vi /lib/systemd/system/docker.service
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --graph /mgt/docker -H tcp://0.0.0.0:2375
 -H fd:// --containerd=/run/containerd/containerd.sock  
# ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 # 原始代码
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

修改后请执行systemctl daemon-reload && systemctl restart docker,如果配置未生效,请执行systemctl status docker查看服务状态。

4.2 重装docker
  • yum安装
#配置网络
$ vi /etc/resolv.conf  
	nameserver 8.8.8.8
	nameserver 114.114.114.114
#查看本docker版本
$ docker --version
#卸载之前版本
$yum list installed|grep docker
$yum remove docker-ce docker-ce-cli containerd.io -y
#安装对应版本
$yum -y install docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io
$yum -y install docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io

[Errno 14] curl#6 - “Could not resolve host: yum.dockerproject.org; Unknown error”

安装docker时,Could not resolve host: yum.dockerproject.org; Unknown error,导致yum也用不了
解决: 删除/etc/yum.repos.d下的有关docker文件

#拷贝/修改docker.service文件至此路径 /usr/lib/systemd/system/docker.service 
$aaa="ExecStart=/usr/bin/dockerd --graph /mgt/docker -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock"
$sed -i "/ExecStart/c${aaa}" /usr/lib/systemd/system/docker.service
#加载启动docker
$systemctl daemon-reload
$systemctl restart docker
#启动ps_write、node_exporter容器
docker start ps_write
docker start node_exporter
docker start redis
  • 离线安装
#卸载之前版本
$yum list installed|grep docker
$yum remove docker-ce docker-ce-cli containerd.io -y
$yum remove docker-scan-plugin

tar -zxvf docker-18.09.0.tgz
cp -rf /usr/lib/systemd/system/docker.service /home #备份配置
cp ./docker/* /usr/bin #最新文件拷贝
5.mysql连接异常
show global variables like '%timeout%'; 查看mysql数据库服务连接最大超时时间,默认是28800S也就是8小时
show variables like '%max_connections%'; 查看mysql数据库允许的最大的连接数
show status like  'Threads%'; 查看mysql连接数
show variables like 'max_allowed_packet'; 
show status like 'Aborted_%'; Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。Aborted_connects 尝试已经失败的MySQL服务器的连接的次数

TCP建立连接的时间
netstat -nap | grep 3306
lsof -i:3306 根据端口号找到此连接对应的fd在进程空间中的值和进程pid
ls -l /proc/[pid]/fd/4  根据fd值和进程pid查看TCP连接建立时间

备节点恢复
在这里插入图片描述
在这里插入图片描述

6、某节点一次退出swarm集群

Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐