PolarFlex MySQL

單節點部署範例

前置條件

1. 初始化

# 解壓安裝包
tar -xf polarflex-{version}-{build-date}.tar.gz
cd polarflex-{version}-{build-date}/polarflex

# Python 環境初始化(需 root 權限)
./install.sh

# 確認安裝成功
pdbcli version

2. 本機 SSH 免密

# 生成 RSA key
ssh-keygen -t rsa

# 在 host00 寫入公鑰
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.22.22.199

/polarflex/assets/ansible.cfg 中新增:

[defaults]
remote_port = 22
private_key_file = ~/.ssh/id_rsa

3. 配置 config.yaml

## file: config.yaml
all:
  # 提供所有主机列表,确保 `root` 用户 SSH 免密码打通,部署后不要改动
  hosts:
    # 主机按照 hostNN 来命名,提供 ansible_host 指定主机 IP
    host00:
      ansible_host: 172.22.22.199    # 填上主機的內網IP
  vars:
    ## cluster setup 

    # WARNING: don't change after DB cluster created.
    cluster_id: mycluster
    # 部署实例版本,默认支持部署版本为8.0
    db_version: '8.0'

    # 参数模板 可选值为default async performance
    param_template: default

    # db 实例结构,basic 模式下仅支持 1 DB 主节点, cluster 支持一主多备
    category: basic
    # metadb 主节点所在主机,如果未提供会用 all.children.metadb[0] 主机
    primary_metadb_host: host00

    # DB 主节点所在的主机,如果未提供会用 all.children.db[0] 主机
    primary_db_host: host00

    # proxy params
     # PolarDB Proxy 工作并发 (default: 2)
    polardb_proxy_concurrency: 2
     # RW_TYPE为1时有效。主节点是否参与读请求的负载均衡。如果设置为false,则读请求不发往主库 (default: true)
    polardb_proxy_master_accept_ready: true
     # 是否开启事务拆分。设置为false时,事务所有请求路由到主库。如果设置为true,则事务中写之前的读请求可以路由到只读库。写之后的读还是路由到主库 (default: true)
    polardb_proxy_trx_split: true
     # 是否开启会话一致性。设置为false时,不保证会话内读写一致性。设置为true时,保证会话一致性。效果为同一个连接内,读请求一定能读到这个连接之前写入的数据 (default: true)
    polardb_proxy_casual_reads: true
     # 是否开启读写分离。设置为false时,所有请求路由到主库
    polardb_proxy_rw_split: true
    
    # [INTERNAL] - DON'T CHANGE FOLLOWING
    ## ansible vars
    # ansible_user:
    # ansible_password:
    ansible_group_priority: 99
    ansible_python_interpreter: /usr/bin/python3
    # --

  # 应用角色划分、配置
  children:

    # 以下为应用分组映射主机: 
    #   - metadb - 元数据库 host
    #   - ha - HA 服务 hosts
    #   - dashboard - UI  [可选]
    metadb:
      hosts:
        host00:
          metadb_port: 3400
      var:
    ha:
      hosts:
        host00:
      var:
    dashboard:
      hosts:
        host00:
          port: 8080

    #   - db - DB 服务 hosts
    db:
      hosts:
        host00:
          # [REQUIRED] polardb_polar_hostid, host unique index
          polardb_polar_hostid: 1
          polardb_port: 3006
          polardb_classMemory: 8192  # 示例值,单位为MB
          polardb_classCPU: 4        # 示例值
      vars:

補充:1.0.8 版 config.yaml 差異重點

# 1) metadb 需要在 vars 中指定規格(新增)
metadb:
  hosts:
    host00:
      metadb_port: 3400
    host01:
      metadb_port: 3401
  vars:
    polardb_metadb_cpus:
    polardb_metadb_memory:

# 2) db 規格欄位改名(舊欄位 polardb_classCPU / polardb_classMemory)
db:
  vars:
    polardb_db_cpus:
    polardb_db_memory:

備註:若沿用舊版欄位(例如 polardb_classCPU / polardb_classMemory),在 1.0.8 可能不會生效,建議改成上述新欄位。

4-8. 安裝與初始化

# 4. rpm 包安裝部署
pdbcli install cluster

# 5. metadb 安裝
pdbcli init metadb

# 6. ha 組件安裝
pdbcli init ha

# 7. 創建 DB 集群
pdbcli create cluster

# 8. 創建 dashboard(可選)
pdbcli init dashboard

License 匯入錯誤與 metadb 啟動失敗

Issue:正常匯入 License 流程可完成。但在 pdbcli restart <metadb-xxx> 階段如果License檔案沒有放到正確位置就執行,就出現 License 檔案路徑錯誤,導致 metadb 啟動失敗。

正常匯入流程

1. 取得實例資訊並提交給阿里團隊,申請 license.tar.gz

pdbcli license info

ok: [localhost] =>
  msg: |-
    ins_name: metadb-xxxxxxxx-20260430153147
        DatabaseIdentifier:763445162xxxxxxxxxx,MacAddress:<>
    ins_name: pm-xxxxxxxx
        DatabaseIdentifier:763445343xxxxxxxxxx,MacAddress:<>

2. 解壓 license.tar.gz,並將檔案放到 license/ 目錄。

3. 重啟 metadb:

pdbcli restart <metadb-xxx>

TASK [Print license verification status] *******************************************************
ok: [10.0.0.1] =>
  msg: 'License verification status: ... [Server] verify license success'

4. 重啟 HA 服務:

systemctl stop polardb_ha.service
systemctl start polardb_ha.service
systemctl status polardb_ha.service

5. 重啟 DB:

pdbcli restart <pm-xxxx>

TASK [Print license verification status] ********************************************************
ok: [10.0.0.1] =>
  msg: 'License verification status: ... [Server] verify license success'

異常現象(metadb 認證 License 失敗)

pdbcli restart <metadb-xxx>

TASK [fail source path] ************************************************************************
fatal: [172.16.1.22]: FAILED! => changed=false
  msg: 'Source path is: ../license/metadb-xxxxxxxx-20260430153920/763445353xxxxxxxxxx/license.lic'

影響:metadb 服務啟動失敗。

修復步驟

1. 先手動啟動 metadb:

/u01/mysql80_20251209/bin/mysqld_safe --defaults-file=/etc/my3400.cnf &

2. 確認並補齊正確的 License 目錄結構,再重新執行上述正常流程(從 metadb 重啟開始):

license/
├── metadb-xxxxxxxx-20260430153147
│   └── 763445162xxxxxxxxxx
│       └── license.lic
├── pm-xxxxxxxx
│   └── 763445343xxxxxxxxxx
│       └── license.lic
└── README.md

重點:ins_nameDatabaseIdentifier 對應的目錄層級必須正確,否則會在重啟 metadb 時出現 source path 錯誤。


Audit Log

問題:Audit Log 在哪裡?

日誌初始儲存位置如下,可透過 rds_audit_log_dir 變量控制:

/home/mysql/data{port}/tmp

在資料庫內查看相關變量:

show global variables like '%audit%';

日誌相關配置(需使用 root 登入資料庫):

set global rds_audit_log_row_limit = 2000000;
set global rds_audit_log_buffer_size = 167772160;
set global rds_audit_log_enabled = ON;

Web Dashboard

問題:使用 iptables 對流量進行限制,放行 8080 Port 後訪問 Web Dashboard 時無法顯示監控資訊。



原因:

放通8080Port時Web服務是沒有問題的。沒有出現監控資訊的原因是因為iptables沒有放通Polar其他核心服務。例如metadb和DNS服務

解決方法:
# 對單機部署,放通所有 loopback 流量
sudo iptables -I INPUT 1 -i lo -j ACCEPT
# 對多機部署,放通對應的 metadb 流量與 DNS 流量
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT -s {source_ip}
sudo iptables -A INPUT -p tcp --dport {metadb-port} -j ACCEPT -s {source_ip}




附錄

查看 License 資料

cat /home/mysql/data<port>/dbs/license.lic

留言