PXC operator 杂记

PXC operator 杂记

# docker镜像相关
docker pull docker.jintdev.com/wuyutang/publicimages/percona/percona-xtradb-cluster-operator:1.13.0
docker pull docker.jintdev.com/wuyutang/publicimages/percona/percona-xtradb-cluster-operator:1.13.0-haproxy

docker tag docker.jintdev.com/wuyutang/publicimages/percona/percona-xtradb-cluster-operator:1.13.0 percona/percona-xtradb-cluster-operator:1.13.0
docker tag docker.jintdev.com/wuyutang/publicimages/percona/percona-xtradb-cluster-operator:1.13.0-haproxy percona/percona-xtradb-cluster-operator:1.13.0-haproxy

wget https://home.vimll.com:9999/download/mysql/pxc/pxc-db-1.13.3.tgz
wget https://home.vimll.com:9999/download/mysql/pxc/pxc-operator-1.13.3.tgz

# helm info
1. To get a MySQL prompt inside your new cluster you can run:
    ROOT_PASSWORD=`kubectl -n pxc get secrets pxc-db-secrets -o jsonpath="{.data.root}" | base64 --decode`
    kubectl -n pxc exec -ti \
      pxc-db-pxc-0 -c pxc -- mysql -uroot -p"$ROOT_PASSWORD"

2. To connect an Application running in the same Kubernetes cluster you can connect with:
    ROOT_PASSWORD=`kubectl -n pxc get secrets pxc-db-secrets -o jsonpath="{.data.root}" | base64 --decode`

    kubectl run -i --tty --rm percona-client --image=percona --restart=Never \
  -- mysql -h pxc-db-haproxy.pxc.svc.cluster.local -uroot -p"$ROOT_PASSWORD"

imagePullPolicy: IfNotPresent
disableTLS: true

kubectl  expose svc -n pxc pxc-db-haproxy-replicas --target-port=3306 --port=3306 --name=test  --type=NodePort

# 常用配置
    [mysqld]
    #wsrep_debug=ON
    wsrep_provider_options="gcache.size=2G; gcache.recover=yes"
    lower_case_table_names=1
    max_connections=1000
    max_connect_errors=10000
    max_execution_time=10000
    binlog_expire_logs_seconds=259200
    default-time-zone='+08:00'
    slow_query_log=ON
    max_allowed_packet = 128M
    innodb_buffer_pool_size=6442450944
    innodb_log_file_size=1073741824
    innodb_buffer_pool_instances=4
    innodb_buffer_pool_chunk_size=268435456
    sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

# 设置全局sql_mode
set GLOBAL sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

# 状态简单查询
show full PROCESSLIST
show VARIABLES like "%slow%"
set GLOBAL slow_query_log=ON
show status like 'wsrep%';
show VARIABLES like "wsrep_provider_options"
SET GLOBAL wsrep_provider_options='pc.bootstrap=true';

##### 故障
for i in $(seq 0 $(($(kubectl get pxc -n pxc pxc-db -o jsonpath='{.spec.pxc.size}')-1))); do echo "###############pxc-db-pxc-$i##############"; kubectl logs pxc-db-pxc-$i -n pxc -c pxc | grep '(seqno):' ; done

kubectl exec pxc-db-pxc-0 -n pxc -c pxc -- sh -c 'kill -s USR1 1'

for i in $(seq 0 $(($(kubectl get pxc -n pxc pxc-db -o jsonpath='{.spec.pxc.size}')-1))); do echo "###############pxc-db-pxc-$i##############";kubectl exec -n pxc pxc-db-pxc-$i -c pxc -- cat /var/lib/mysql/grastate.dat; done

# 使用以下命令检查当前的更新策略,以确保智能更新在 恢复:
kubectl get pxc pxc-db -n pxc -o jsonpath='{.spec.updateStrategy}'
# 如果返回的值为 ,请使用以下命令将其更改为:SmartUpdateonDelete
kubectl patch pxc -n pxc pxc-db --type=merge --patch '{"spec": {"updateStrategy": "OnDelete" }}'

# 将群集对象内的正常 PXC 映像更改为调试映像:
kubectl get pxc -n pxc pxc-db -o jsonpath='{.spec.pxc.image}'
kubectl patch pxc -n pxc pxc-db --type="merge" -p '{"spec":{"pxc":{"image":"d.vimll.com:9888/root/plulic/percona-xtradb-cluster:8.0.32-24.2-debug"}}}'

# 重新启动所有 Pod:
for i in $(seq 0 $(($(kubectl get pxc -n pxc pxc-db -o jsonpath='{.spec.pxc.size}')-1))); do kubectl delete pod -n pxc pxc-db-pxc-$i --force --grace-period=0; done
# 等到 Pod 准备好了,然后执行以下代码(它是 Pod 活期检查需要):0
for i in $(seq 0 $(($(kubectl get pxc -n pxc pxc-db -o jsonpath='{.spec.pxc.size}')-1))); do until [[ $(kubectl get pod  -n pxc pxc-db-pxc-$i  -o jsonpath='{.status.phase}') == 'Running' ]]; do sleep 10; done; kubectl exec  -n pxc pxc-db-pxc-$i -c pxc  -- touch /var/lib/mysql/sst_in_progress; done

# 等待所有 Percona XtraDB 集群 Pod 启动,然后执行以下操作 确保没有 MySQL 进程正在运行的代码:
for i in $(seq 0 $(($(kubectl get pxc -n pxc pxc-db -o jsonpath='{.spec.pxc.size}')-1))); do pid=$(kubectl exec  -n pxc pxc-db-pxc-$i  -c pxc -- ps -C mysqld-ps -o pid=); if [[ -n "$pid" ]]; then kubectl exec  -n pxc pxc-db-pxc-$i -c pxc -- kill -9 $pid; fi;  done

# 等待所有Percona XtraDB集群Pod启动,然后找到Percona 具有最新数据的 XtraDB 集群实例 - 即具有 最高序列号(序列):
for i in $(seq 0 $(($(kubectl get pxc -n pxc pxc-db -o jsonpath='{.spec.pxc.size}')-1))); do echo "###############pxc-db-pxc-$i##############"; kubectl exec  -n pxc pxc-db-pxc-$i -c pxc -- cat /var/lib/mysql/grastate.dat; done
# 现在找到最大的 Pod(它在 以上示例)。seqno pxc-db-pxc-0

# 现在在单独的 shell 中执行以下命令以启动此 实例:
kubectl exec pxc-db-pxc-0 -n pxc -c pxc -- mysqld --wsrep_recover
kubectl exec pxc-db-pxc-0 -n pxc -c pxc -- sed -i 's/safe_to_bootstrap: 0/safe_to_bootstrap: 1/g' /var/lib/mysql/grastate.dat
kubectl exec pxc-db-pxc-0 -n pxc -c pxc -- sed -i 's/wsrep_cluster_address=.*/wsrep_cluster_address=gcomm:\/\//g' /etc/mysql/node.cnf
kubectl exec pxc-db-pxc-0 -n pxc -c pxc -- mysqld
# 该过程将再次初始化数据库,它将 可用于传入连接。mysqld

# 回到上一个 shell 并返回原始的 Percona XtraDB 群集映像,因为不再需要调试映像:
kubectl patch pxc pxc-db -n pxc --type="merge" -p '{"spec":{"pxc":{"image":"d.vimll.com:9888/root/plulic/percona-xtradb-cluster:8.0.32-24.2"}}}'

# 重新启动除 Pod(恢复捐赠者)之外的所有 Pod。pxc-db-pxc-0
for i in $(seq 0 $(($(kubectl get pxc pxc-db -n pxc -o jsonpath='{.spec.pxc.size}')-1))); do until [[ $(kubectl get pod -n pxc pxc-db-pxc-$i -o jsonpath='{.status.phase}') == 'Running' ]]; do sleep 10; done; kubectl exec -n pxc pxc-db-pxc-$i -c pxc -- rm /var/lib/mysql/sst_in_progress; done
kubectl delete pods -n pxc --force --grace-period=0 pxc-db-pxc-2 pxc-db-pxc-1

# 等待在 上一步,最后删除 Pod:pxc-db-pxc-0
kubectl delete pods -n pxc --force --grace-period=0 pxc-db-pxc-0

# 如果您在第 1 步中更改了更新策略,请不要 忘记使用以下命令将其还原为:SmartUpdate
kubectl patch pxc pxc-db -n pxc --type=merge --patch '{"spec": {"updateStrategy": "SmartUpdate" }}'