0%

PMM数据库监控工具调研

PMM数据库性能监控工具调研

介绍

Percona Monitoring and Management (PMM)是一款开源的用于管理和监控MySQL和MongoDB性能的开源平台,通过PMM客户端收集到的DB监控数据用第三方软件Grafana画图展示出来。

PMM提供了对MyISAM、InnoDB、TokuDB和PXC/Glarera的监控,另外也提供了Query Analytics的功能,可以检视执行了哪些SQL指令,并对执行效能较差的语法进行优化。另外在新版本还支持了MySQL复制拓扑图结构构造。Demo官网:http://pmmdemo.percona.com

PMM针对操作系统的部份也提供了硬盘、网络、CPU和RAM的监控,特别的是它提供了Context switches、Processes和interrupts的监控,Context Switches可以看到CPU上下切换文的状况,Processes可以方便了解系统有多少程序在等待I/O。

架构解析

img

Server组件

Query Analytics(QAN)是用来搜集指令并作性能分析的,其组件分别说明如下:

  • QAN API:作为percona-qan-agent后端储存和读取Query资料用。

  • QAN APP:提供图形化分析介面。

Metrics Monitor(MM)组件提供了MySQL和MongoDB历史监控信息,其组件分别说明如下:

  • Prometheus:一个开源的服务监控系统和时间序列数据库,它连接到PMM Client上的exporter聚集DB的监控数据。

  • Consul:提供API让PMM Client可以远端替Prometheus新增、移除hosts,同时它也储存了监控的metadata。

  • Grafana:这是一个第三方Dashboard和图形构建器,用于可视化Prometheus中聚合的数据,以Web呈现。

  • Percona Dashboards:是由Percona开发的一组用于Grafana的仪表板。

上述的2个Web页面都能从PMM Landing Page(就是PMM首页)直接连结。

Client组件

安装

安装准备

PMM Server需要docker环境,所以必须先安装docker,以下以CentOS 7为例,安装Docker CE

CentOS 7(使用 yum 进行安装)

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ee.repo
# 将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

待以上操作完成后需要如下配置:

[root@localhost ~]# mkdir /docker

[root@localhost ~]# sed -i 's/ExecStart\=\/usr\/bin\/dockerd -H unix:\/\//ExecStart\=\/usr\/bin\/dockerd -H unix:\/\/ --data-root=\/docker --log-level=warn/g' /usr/lib/systemd/system/docker.service

说明:由于docker默认使用的日志等级为info、默认的镜像及其相关信息生成在/var/lib/docker下,所以用以上两条命令将日志等级改为warn、将镜像及其相关信息生成的路径指定到/docker下

[root@localhost ~]# mkdir /etc/docker

[root@localhost ~]# cat>/etc/docker/daemon.json<<EOF
{
"registry-mirrors": ["https://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"]
}
EOF

说明:由于docker参数–config-file的默认值为/etc/docker/docker-daemon.json,所以我们直接创建并修改registry-mirrors为国内加速站点,并且将最大并发下载数由5提高20

[root@localhost ~]# yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

[root@localhost ~]# modprobe br_netfilter

[root@localhost ~]# modprobe ip_vs

下载相关依赖包并加载br_netfilter和ip_vs模块

[root@localhost ~]# cat>>/etc/sysctl.d/99-sysctl.conf<<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
net.ipv6.conf.all.disable_ipv6=1
EOF

[root@localhost ~]# sysctl -p

修改相应内核参数,并使之生效

[root@localhost ~]# iptables -P FORWARD ACCEPT

[root@localhost ~]# echo '/sbin/iptables -P FORWARD ACCEPT'>>/etc/rc.local

由于Docker默认将iptables的Chain FORWARD设置为drop,我们将其改为accept,允许其转发

[root@localhost ~]# systemctl daemon-reload && systemctl enable docker && systemctl restart docker

[root@localhost ~]# systemctl status docker

启动并查看Docker服务是否正常

[root@localhost ~]# journalctl -u docker

查看docker日志,会有一些关于文件系统的告警,由于centos7下使用的是overlay2存储驱动,其他存储的驱动的告警可以忽略

错误处理

  1. Docker 启动报错: Error starting daemon: Error initializing network controller: list bridge addresses failed: no available network

    看到这样一句话:

    failed to start daemon: Error initializing network controller: list bridge addresses failed: PredefinedLocalScopeDefaultNetworks List: [172.17.0.0/16 172.18.0.0/16 172.19.0.0/16 172.20.0.0/16 172.21.0.0/16 172.22.0.0/16 172.23.0.0/16 172.24.0 May 19 17:21:44 game143 systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE

    查看本地网络:

`[root@game143 export]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether d4:ae:52:ae:fc:57 brd ff:ff:ff:ff:ff:ff
6: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d4:ae:52:ae:fc:58 brd ff:ff:ff:ff:ff:ff
inet 124.244.251.11/25 brd 124.244.251.255 scope global br1
valid_lft forever preferred_lft forever
7: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d4:ae:52:ae:fc:59 brd ff:ff:ff:ff:ff:ff
inet 10.154.21.143/24 brd 10.154.21.255 scope global br0
valid_lft forever preferred_lft forever
8: br2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether d4:ae:52:ae:fc:5a brd ff:ff:ff:ff:ff:ff`

没有 docker0 的桥接网络, 手动加一个即可

ip link add name docker0 type bridge
ip addr add dev docker0 172.17.0.1/16

此时多了一个docker0:

9: docker0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether ee:9a:89:b1:b5:05 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever

重启docker即可

安装PMM Server

PMM安装有三种方式:docker、虚拟机和AWS marketplace,推荐使用docker方式安装。pmm server容器镜像发布在https://hub.docker.com/r/percona/pmm-server/tags/,docker版本必须高于1.12.6。

注意事项:对于每个受监视的数据库节点将数据保留时间设置为一周,PMM大约需要1GB的存储空间。每添加 一个受监视的数据库节点需要的最小内存为2 GB,但是当您添加更多节点时它不是线性增加的。 例如,应使用16 GB轻松处理来自20个节点的数据。

PMM Server部署范围三步:获取镜像,创建持久化的pmm data镜像以及创建启动pmm server镜像。

  1. 拉取PMM Server的Docker镜像

    从docker hub拉取最新的镜像版本

    docker pull percona/pmm-server:latest

    注意:由于某些原因导致速度缓慢,可以修改docker源到国内镜像加速
    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s [http://396e823a.m.daocloud.io](http://396e823a.m.daocloud.io/)

  2. 创建持久化的pmm-data镜像

    docker create -v /opt/prometheus/data -v /opt/consul-data -v /var/lib/mysql -v /var/lib/grafana --name pmm-data percona/pmm-server:latest /bin/true

    参数说明:

    docker create:该命令指示Docker守护程序从映像创建容器。
    -v:该选项初始化数据卷的容器。
    --name:该选项为你可以用于引用Docker网络中的容器的容器分配一个自定义名称。
    percona/pmm-server:latest :是导出容器的镜像名称和版本标签。
    /bin/true :是容器运行的命令。
    注:该镜像不启动,只为了保证pmm server的数据持久化以用于版本升级等场景。注意不要移动或者重新创建该镜像,除非确保数据不再需要。
    注:确保镜像-v的数据卷存在,并最好是单独绑定挂载。
  3. 创建并启动PMM-Server容器

docker run -d -p 80:80 --volumes-from pmm-data --name pmm-server --restart always percona/pmm-server:latest

此容器不运行,它只是存在,以确保您在升级到较新的pmm-server时保留所有PMM数据。不要删除或重新创建此容器,除非您打算清除所有PMM数据并重新开始。

下面解释一下docker参数的具体意义:

docker run:该命令指示守护程序从镜像运行容器。
-d:该选项在分离模式(即后台)中启动容器。
-p:该选项映射用于访问PMM服务器 Web UI的端口。例如-p 8080:80,如果端口80不可用,则可以使用登陆页面映射到端口8080
--volumes-from:该选项从pmm-date容器中装入卷。
--name:该选项为你可以用于引用Docker网络中的容器分配一个自定义名称。
--restart:该选项定义容器的重新启动策略,设置它以always确保Docker守护程序在启动时启动容器,并在容器退出时重新启动它。

其他参数说明:
通过docker run的-e参数可以增加pmm-server启动的额外功能

启用Orchestrator复制拓扑:
docker run ... -e ORCHESTRATOR_ENABLED=true ... percona/pmm-server:latest
关闭telemetry(pmm server数据每24小时会上报percona.com,包括pmm server ID、pmm version、操作系统、数据库版本、perl版本等):
docker run ... -e DISABLE_TELEMETRY=true ... percona/pmm-server:latest
关闭更新,可以通过web界面关闭,也可以通过命令行关闭:
docker run ... -e DISABLE_UPDATES=true ... percona/pmm-server:latest

露个脸:

image-20200406150905561

image-20200406150943887

安装PMM Client

PMM Client支持yum安装或者源码安装,方便起见推荐CentOS系统使用yum添加repository安装:

  1. 下载安装对应源的rpm包(巨慢,建议翻墙或者上官网直接下RPM包)

    yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

    notes: 如果您以前启用过实验性或测试性Percona存储库,请不要忘记禁用它们并启用原始存储库的发布组件,如下所示:

    sudo percona-release disable all
    sudo percona-release enable original release
  2. 安装pmm2-client

    yum install pmm2-client
  3. 一旦PMM Client安装完成后,使用pmm-admin config命令设置你的PMM Sercer IP来把你的client节点注册到对应的PMM Server上

pmm-admin config --server-insecure-tls --server-url=https://admin:admin@<IP Address>:443

安装PMM Client后的配置

  • 安装好MySQL后修改监听地址:

    将bind改为:
    bind-address = 0.0.0.0
  • 开启慢查询

    slow_query_log=1
    long_query_time=1
    slow_query_log_file=/var/lib/mysql/mysql-slow.log
  • 对root用户做授权,允许远程访问

    mysql> grant all PRIVILEGES on *.* to root@'%' identified by 'root';
    mysql> flush privileges;
  • 使用pmm-admin config –server命令添加客户端

    参数说明:

    Usage:
    pmm-admin config [flags]

    Examples:
    pmm-admin config --server 192.168.56.100
    pmm-admin config --server 192.168.56.100:8000
    pmm-admin config --server 192.168.56.100 --server-password abc123

    Flags:
    --bind-address string bind address, also local/private address that is mapped from client address via NAT/port forwarding (defaults to the client address)
    --client-address string client address, also remote/public address for this system (if omitted it will be automatically detected by asking server)
    --client-name string client name (defaults to the system hostname)
    --force force to set client name on initial setup after uninstall with unreachable server
    -h, --help help for config
    --server string PMM server address, optionally following with the :port (default port 80 or 443 if using SSL)
    --server-insecure-ssl enable insecure SSL (self-signed certificate) to communicate with PMM Server
    --server-password string define HTTP password configured on PMM Server
    --server-ssl enable SSL to communicate with PMM Server
    --server-user string define HTTP user configured on PMM Server (default "pmm")

    Global Flags:
    -c, --config-file string PMM config file (default "/usr/local/percona/pmm-client/pmm.yml")
    --skip-root skip UID check (experimental)
    --timeout duration timeout (default 5s)
    --verbose verbose output

    看到以下输出说明正确连接

    image-20200326134530370

使用

配置PMM Client

在未添加任何监控的状态下,pmm-admin list应有如下输出:

image-20200326135222587

添加监控实例到PMM

可以在PMM Client端使用命令

pmm-admin add mysql --query-source=slowlog --username=root --password=PASSWORD sl-mysql 127.0.0.1:3306

image-20200326143341547

此时pmm-admin list输出:

image-20200326143433685

查看dashboard, 可以看到对应client已经添加到PMM Server

image-20200326144006820

image-20200326143955972

添加远程MongoDB实例到PMM

客户端配置

pmm-admin config --server SERVERIP --server-user SERVERUSER --server-password PASSWORD --client-name HOSTNAME

mongo服务器配置

pmm-admin add mongodb --cluster cluster1 --uri mongodb://root:passwd@localhost:27017/admin

对访问容器IP做限制

查看Docker对应chain的规则

[root@test sysconfig]# iptables -L DOCKER -n --line-number
Chain DOCKER (1 references)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:443
2 ACCEPT tcp -- 1.1.1.1/26 0.0.0.0/0 tcp dpt:80
3 ACCEPT tcp -- 2.2.2.2 0.0.0.0/0 tcp dpt:80

默认情况下Docker对应容器是对公网开的,为了安全考虑可以对访问IP做限制,限制不能直接在iptables的INPUT链里面加,需要在对应Docker的chain中做限制

输入iptables -R DOCKER N(N为规则num)可以修改对应规则

[root@test sysconfig]# iptables -R DOCKER 1 -p tcp -s 1.1.1.1/26 --dport 443 -j ACCEPT

,同理iptables -I DOCKER xxx添加规则。

附件

从文件导入导出镜像

保存镜像为文件

docker save -o 要保存的文件名  要保存的镜像
[root@iZbp16cdvzk4rhl0vn1gedZ ~]# ls
aaa.cap install.sh mobile-1.0.0-SNAPSHOT.jar sa_recovery.log
[root@iZbp16cdvzk4rhl0vn1gedZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bb v1.0 3b8d26737bcb 10 minutes ago 202MB
centos latest 9f38484d220f 3 weeks ago 202MB
java latest d23bdf5b1b1b 2 years ago 643MB
[root@iZbp16cdvzk4rhl0vn1gedZ ~]# docker save -o cc.tar bb:v1.0
[root@iZbp16cdvzk4rhl0vn1gedZ ~]# ls
aaa.cap cc.tar install.sh mobile-1.0.0-SNAPSHOT.jar sa_recovery.log

导入文件为镜像

docker load --input 文件
或者
docker load < 文件名

给镜像打标签

使用docker tag命令:

[2020/6/1 16:30:47] [root@game143 export]# docker image ls
[2020/6/1 16:30:47] REPOSITORY TAG IMAGE ID CREATED SIZE
[2020/6/1 16:30:47] <none> <none> d48b8d6edded 2 months ago 1.49GB
[2020/6/1 16:31:06] [root@game143 export]# docker tag d48b percona/pmm-server:2
[2020/6/1 16:31:06] You have new mail in /var/spool/mail/root
[2020/6/1 16:31:08] [root@game143 export]# docker image ls
[2020/6/1 16:31:08] REPOSITORY TAG IMAGE ID CREATED SIZE
[2020/6/1 16:31:08] percona/pmm-server 2 d48b8d6edded 2 months ago 1.49GB

欢迎关注我的其它发布渠道