采集 PolarDB-X SQL 日志到 ElasticSearch

作者: Ju4t

环境

# docker
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl start docker

# kubelet
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl

# minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
curl -LO https://labfileapp.oss-cn-hangzhou.aliyuncs.com/helm-v3.9.0-linux-amd64.tar.gz
tar -zxvf helm-v3.9.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm

# mysql
yum install mysql -y

使用PolarDB-X Operator安装PolarDB-X

useradd -ms /bin/bash galaxykube
usermod -aG docker galaxykube

su galaxykube

cd 

minikube start --cpus 4 --memory 8192 --nodes=2 --image-mirror-country cn --registry-mirror=https://docker.mirrors.sjtug.sjtu.edu.cn --kubernetes-version 1.23.3

kubectl cluster-info

kubectl create namespace polardbx-operator-system

helm repo add polardbx https://polardbx-charts.oss-cn-beijing.aliyuncs.com
helm install --namespace polardbx-operator-system polardbx-operator polardbx/polardbx-operator --version 1.3.0

kubectl get pods --namespace polardbx-operator-system

vi polardb-x.yaml

apiVersion: polardbx.aliyun.com/v1
kind: PolarDBXCluster
metadata:
  name: polardb-x
spec:
  topology:
    nodes:
      cdc:
        replicas: 1
        template:
          resources:
            limits:
              cpu: "1"
              memory: 1Gi
            requests:
              cpu: 100m
              memory: 500Mi
      cn:
        replicas: 1
        template:
          resources:
            limits:
              cpu: "2"
              memory: 4Gi
            requests:
              cpu: 100m
              memory: 1Gi
      dn:
        replicas: 1
        template:
          engine: galaxy
          resources:
            limits:
              cpu: "2"
              memory: 4Gi
            requests:
              cpu: 100m
              memory: 500Mi
      gms:
        template:
          engine: galaxy
          resources:
            limits:
              cpu: "1"
              memory: 1Gi
            requests:
              cpu: 100m
              memory: 500Mi

kubectl apply -f polardb-x.yaml

kubectl get polardbxCluster polardb-x -o wide -w

安装 PolarDB-X LogCollector

本步骤将指导您安装 PolarDB-X LogCollector 组件,并将 PolarDB-X 日志投递到 Elastic Search中。

  1. 创建一个名为 polardbx-logcollector 的命名空间:
kubectl create namespace polardbx-logcollector
  1. 执行如下命令,安装 PolarDB-X LogCollector:
helm install --namespace polardbx-logcollector polardbx-logcollector polardbx/polardbx-logcollector --version=1.3.0-alpha.1
  1. 执行如下命令,等待 PolarDB-X LogCollector 的组件ready:
kubectl get pods -n polardbx-logcollector
  1. PolarDB-X 日志采集功能是默认关闭的,执行如下命令,为第三步创建的 PolarDB-X 集群开启日志采集功能。
kubectl patch pxc polardb-x --patch '{"spec":{"config":{"cn":{"enableAuditLog":true}}}}' --type merge
  1. 在 LogStash 标准输出查看 PolarDB-X 日志:
    logstash pod name需要替换为 polardbx-logcollector 命名空间下的 logstash pod 名称。
kubectl logs -n polardbx-logcollector {logstash pod name} -f

本步骤将指导您如何在 K8s 上部署一个 Elastic Search 集群。

  1. 创建 ECK 的CRD:
kubectl create -f https://download.elastic.co/downloads/eck/2.4.0/crds.yaml
  1. 安装 ECK Operator
kubectl apply -f https://download.elastic.co/downloads/eck/2.4.0/operator.yaml
  1. 执行如下命令,查看 ECK Operator 的 POD 状态,等待所有的 POD 都变成 Running 状态
kubectl get pods -n elastic-system
  1. 执行如下命令,创建es.yaml。
vim es.yaml

b.按i键进入编辑模式,将如下代码复制到文件中,然后按ECS退出编辑模式,输入:wq后按下Enter键保存并退出。

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 8.4.3
  image: elasticsearch:8.4.3
  nodeSets:
  - name: default
    count: 1
    config:
      node.store.allow_mmap: false
  1. 执行如下命令,创建Elastic Search集群。
kubectl apply -f es.yaml
  • 执行如下命令,查看Elastic Search集群创建状态。
kubectl get elasticsearch
  • 返回结果如下,请您耐心等待几分钟,当PHASE显示为Ready时,表示Elastic Search 集群已经部署完成。
  1. 执行如下命令,创建kibana.yaml。
vim kibana.yaml

按i键进入编辑模式,将如下代码复制到文件中,然后按ECS退出编辑模式,输入:wq后按下Enter键保存并退出。

apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 8.4.3
  image: kibana:8.4.3
  count: 1
  elasticsearchRef:
    name: quickstart
  1. 执行如下命令,创建 Kinana 实例。
kubectl apply -f kibana.yaml

执行如下命令,查看Kibana创建状态。

kubectl get kibana
  1. 获取Elastic Search 集群的访问信息
    - 执行如下信息,获取 Elastic Search的 密码:
kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}' | xargs echo "PASSWORD: "

PolarDB-X 日志采集功能开启后,默认会投递日志到 logstash 的标准输出。您可以修改 logstash 的 output 配置,将日志投递到其它系统中。本步骤将指导您将 PolarDB-X 日志投递到 Elastic Search中,并在 Kibana 上访问日志信息。

  1. Elastic Search 8以上默认要求HTTPS访问,因此需要为 logstash 配置访问 Elastic Search 的证书。执行如下命令获取 Elastic Search的访问证书,并配置到 logstash的 secret中
CRT=$(kubectl get secret quickstart-es-http-certs-public -o jsonpath={.data})
kubectl patch secret elastic-certs-public  -p "{\"data\": ${CRT}}" -n polardbx-logcollector
  1. 配置 Logstash 的 output, 将日志输出到 ES。
    - 获取 ES 的访问密码(注:请提前复制密码,后续的配置文件中需要填入)
kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}' | xargs echo "PASSWORD: "
  • 执行如下命令,创建 logstash-pipeline-patch.yaml
vim logstash-pipeline-patch.yaml
  • 按i键进入编辑模式,将如下代码复制到文件中,并修改output中的password 字段为上面获取到的ES密码,然后按ESC退出编辑模式,输入:wq后按下Enter键保存并退出

注意:需要修改 output中的password字段,才能正确投递

data:
  logstash.conf: |-
    input {
      beats {
        port => 5044
      }
    }

    filter {

        if [fields][log_type] in ["cn_sql_log","cn_slow_log"] {

            polardbx {
            }
            date{
              match => ["timestamp", "UNIX_MS","ISO8601"]
              timezone => "Asia/Shanghai"
            }

            mutate{
              remove_field => ["event", "timestamp","[message][begin_time]","[message][timestamp]"]
              add_field => { "[@metadata][target_index]" => "%{[fields][log_type]}-%{+YYYY.MM.dd}" }
            }

         } else if [fields][log_type] == "cn_tddl_log" {

            grok{
              match =>  { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{DATA:thread}\] %{LOGLEVEL:loglevel} %{DATA:logger} - %{JAVALOGMESSAGE:messagetmp}" }
            }

            date{
              match => ["timestamp","ISO8601"]
              timezone => "Asia/Shanghai"
            }

            mutate{
                remove_field => ["event","timestamp"]
                rename => {"messagetmp" => "message"}
                add_field => { "[@metadata][target_index]" => "%{[fields][log_type]}-%{+YYYY.MM.dd}" }
            }

         } else {

            mutate{
                 add_field => { "[@metadata][target_index]" => "other_log-%{+YYYY.MM.dd}" }
            }

         }

    }

    output {
      elasticsearch {
        hosts => ["https://quickstart-es-http.default:9200"]
        user => elastic
        password => "{ES 的密码}"
        ssl => true
        cacert => "/usr/share/logstash/config/certs/ca.crt"
        index => "%{[@metadata][target_index]}"
       }

    }
  • 通过如下命令更新 Logstash 的output 配置,将上面的配置项填入 output中。
kubectl patch configmap logstash-pipeline -n polardbx-logcollector --patch-file logstash-pipeline-patch.yaml
  • 执行如下命令,等待 logstash pod重建完成。
kubectl get pods -n polardbx-logcollector -w

执行业务 SQL

本步骤将指导您如何连接通过K8s部署的PolarDB-X集群,并执行相关SQL

  1. 执行如下命令,查看PolarDB-X集群登录密码。
kubectl get secret polardb-x -o jsonpath="{.data['polardbx_root']}" | base64 -d - | xargs echo "Password: "

返回结果如下,您可以查看到PolarDB-X集群登录密码
2. 执行如下命令,将PolarDB-X集群端口转发到3306端口。
使用MySQL Client方式登录通过k8s部署的PolarDB-X集群前,您需要进行获取PolarDB-X集群登录密码和端口转发。

kubectl port-forward svc/polardb-x 3306
  1. 创建新的终端二。
  2. 执行如下命令,连接PolarDB-X集群。
    您需要将替换为实际获取到的PolarDB-X集群登录密码。
    如遇到mysql: [Warning] Using a password on the command line interfacecan be insecure.ERROR 2013 (HY000): Lost connection to MySQL server at 'readinginitial communication packet', system error: 0 报错,请您稍等一分钟,重新转发端口并连接PolarDB-X集群即可。
mysql -h127.0.0.1 -P3306 -upolardbx_root -p<PolarDB-X集群登录密码>
  1. 执行如下的SQL语句,验证PolarDB-X是否正常:
# 检查GMS 
select * from information_schema.schemata;

# 创建分区表
create database polarx_example partition_mode='partitioning';

use polarx_example;

create table example (
  `id` bigint(11) auto_increment NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `score` bigint(11) DEFAULT NULL,
  primary key (`id`)
) engine=InnoDB default charset=utf8 
partition by hash(id) 
partitions 8;

insert into example values(null,'lily',375),(null,'lisa',400),(null,'ljh',500);

select * from example;

select sleep(2);
select sleep(3);

show topology from example;

查看 SQL 审计日志

本步骤将指导您登录 Kibana,查看 PolarDB-X 的SQL日志。

  1. 回到终端一,输入CRTL+C终止之前的命令。
  2. 执行如下命令,将 Kibana 的service 转发到本地:
kubectl port-forward service/quickstart-kb-http 5601 --address=0.0.0.0
  1. 在本地电脑上通过浏览器访问URL: https://{实验ECS公网ip}:5601
  2. 输入用户名密码
用户名:elastic
密码:上面获取的ES访问密码
  1. 登录后创建如下三个 Index patthen:
    | 日志类型 | Index Pattern |
    | -------- | ------------- |
    | SQL日志 | cn_sql_log- |
    | 慢日志 | cn_slow_log-
    |
    | 错误日志 | cn_tddl_log-* |
    img
    img
  2. 在输入框中输入相关关键字,即可搜索 PolarDB-X 相关日志。
    例:搜索包含 select 关键字的 SQL:
message.sql: "create"