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. 配置 v1.0.5/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_name 與 DatabaseIdentifier 對應的目錄層級必須正確,否則會在重啟 metadb 時出現 source path 錯誤。
v1.0.8 寫入內容大小寫不敏感
Issue:User 發現所有寫入內容大小寫不敏感(例如表名與欄位值在比較時不區分大小寫)。
觀察:目前實例查到 lower_case_table_names = 1。
/u01/mysql80_20251209/bin/mysql -uroot -h127.0.0.1 -P<database-port> -p -e "SHOW VARIABLES LIKE 'lower_case_table_names';"
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 1 |
+------------------------+-------+
解決方法:只能重裝。
lower_case_table_names 是初始化參數。資料庫初始化完成並產生資料後,不能直接修改此參數切換大小寫敏感性,否則可能導致資料庫無法啟動或找不到表。
重新部署步驟
# 1) 進入之前部署所在目錄
cd /polarflex-1.0.8-202601210803/polarflex
# 2) 刪除 DB cluster(可重複執行,直到刪除完成)
pdbcli delete cluster
# 3) 卸載 metadb 元資料庫
pdbcli uninstall metadb
# 4) 修改lower_case_table_names參數(2個檔案都要修改)
vim assets/roles/create-db-cluster/templates/my_8.0.cnf.j2
vim assets/roles/create-db-cluster/templates/my_8.0_default.cnf.j2
# lower_case_table_names=0 #改成需要的預設值
# 5) 重新部署(依既有部署流程重新安裝)
# 例如:pdbcli install cluster && pdbcli init metadb && pdbcli create cluster
# 6) 驗證
/u01/mysql80_20251209/bin/mysql -uroot -h127.0.0.1 -P<database-port> -p -e "SHOW VARIABLES LIKE 'lower_case_table_names';"
部署前必做:先編輯 my_8.0.cnf.j2 和 my_8.0_default.cnf.j2,把 lower_case_table_names 改成需要的預設值,再執行重新部署。
Audit Log
問題:Audit Log 在哪裡?
日誌初始儲存位置如下,可透過 rds_audit_log_dir 變量控制:
/home/mysql/data{port}/tmp
在資料庫內查看相關變量:
show global variables like '%audit%';
日誌相關配置:
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
root 帳戶訪問說明(如需特殊操作)
root 帳戶只能在本機訪問,請使用以下 command:
/u01/mysql57_20241121/bin/mysql -uroot -h127.0.0.1 -P<database-port> -p
新增用戶 SQL 示例
CREATE USER 'user_test'@'%' IDENTIFIED BY 'polardb_123';
GRANT ALL PRIVILEGES ON *.* TO 'user_test'@'%';
FLUSH PRIVILEGES;
留言
張貼留言