docker上部署 PolarDB-X v2.4.2数据库

2025年09月开源PolarDB-X正式发布v2.4.2版本,重点完善周边生态能力,包含:新增客户端驱动(PolarDB-X Connector)、新开源polardbx-proxy组件,同时面向数据库运维和稳定性优化,提供在千亿大表场景下的实践验证,包含DDL在线变更、数据库扩缩容、数据TTL等的多项问题修复。PolarDB分布式版(简称“PolarDB-X”)是阿里云自主研发的云原生集中式和分布式一体化数据库产品,整体采用了基于存储计算分离的Shared-Nothing系统架构,支持水平扩展、分布式事务、混合负载等能力,具备金融级高可用、高吞吐、大存储、低延时、易扩展、高度兼容MySQL系统及生态等特点。

PolarDB具备多种产品输出形态:公共云、专有云、DBStack、轻量版(纯软输出)。不同产品输出形态采用同一套内核版本,充分发挥公有云产品管理和迭代优势,保障客户云上云下业务兼容,降低数据库管理成本。
2021年10月,阿里云宣布对外开源云原生分布式数据库PolarDB-X,采用全内核开源的模式,开源内容包含计算引擎、存储引擎、日志引擎、列存引擎等,
通过docker镜像,可以一键拉起 polardbx-proxy
wget https://raw.githubusercontent.com/polardb/polardbx-proxy/refs/heads/main/polardbx-proxy/quick_start.shquick_start.sh -e backend_address=127.0.0.1:3306 -e backend_username=appuser -e backend_password=appuser -e memory=4294967296
backend_address: 数据库地址(格式:ip:port,leader或者follower的地址);
backend_username: 数据库用户名;
backend_password: 数据库密码(必须有密码,必须使用 mysql_native_password);
memory: Proxy使用内存(单位B,请正确配置,否则可能会导致OOM,推荐 16GB,最少 4GB);
无需过多配置,可以直接访问,默认为3307端口。
mysql -Ac -h127.1 -P3307 -uappuser -pappuser
整体的效果和直连PolarDB-X标准版体验基本一致,可以无缝适配数据库的用户名和schema等,polardbx-proxy仅支持对接一个polardbx 实例(多个副本),不支持挂载不同的polardbx实例。
比较实用的管理指令:
- show cluster (查询PolarDB-X后端Paxos集群信息)
 - show rw / show ro (查询proxy的链接池情况)
 - show properties(查询proxy配置参数)
 
Java
https://repo1.maven.org/maven2/com/alibaba/polardbx/polardbx-connector-java
GO
https://github.com/polardb/polardbx-connector-go
C++
https://github.com/polardb/polardbx-connector-cpp
简单maven使用例子:
<dependency><groupId>com.alibaba.polardbx</groupId><artifactId>polardbx-connector-java</artifactId><version>2.2.10</version>
</dependency>
JDBC URL样例:
jdbc:polardbx://111.16.60.147:6991/test
驱动包名:com.alibaba.polardbx.Driver
协议标志头:polardbx
ip端口指定:
标准版三节点其中一个IP:port或者VIP:port,或者多个IP0:port0,IP1:port1(必须为同一集群中的节点,以英文逗号分隔),建连时会被路由到 leader 节点。
企业版其中一个IP:port或者VIP:port,或者多个IP0:port0,IP1:port1(必须为同一集群中的节点,以英文逗号分隔),建连时会负载均衡到集群中随机一个读写节点。
- 直接使用驱动连接PolarDB-X
 
Class.forName("com.alibaba.polardbx.Driver");try (final Connection conn = DriverManager.getConnection("jdbc:polardbx://127.0.0.1:3306/", "root", "*****");final Statement stmt = conn.createStatement()) {try (final ResultSet rs = stmt.executeQuery("select 1")) {for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {System.out.print(rs.getMetaData().getColumnName(i + 1) + "\t");}System.out.println();while (rs.next()) {for (int i = 0; i < rs.getMetaData().getColumnCount(); ++i) {System.out.print(rs.getObject(i + 1) + "\t");}System.out.println();}}
}
- 使用Druid连接池
 
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><property name="driverClassName" value="com.alibaba.polardbx.Driver" /><!-- 基本属性 URL、user、password --><property name="url" value="jdbc:polardbx://ip:port/db?autoReconnect=true&rewriteBatchedStatements=true&socketTimeout=30000&connectTimeout=3000" /><property name="username" value="root" /><property name="password" value="123456" /><!-- 配置初始化大小、最小、最大 --><property name="maxActive" value="20" /><property name="initialSize" value="3" /><property name="minIdle" value="3" /><!-- maxWait 获取连接等待超时的时间 --><property name="maxWait" value="60000" /><!-- timeBetweenEvictionRunsMillis 间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- minEvictableIdleTimeMillis 一个连接在池中最小空闲的时间,单位是毫秒--><property name="minEvictableIdleTimeMillis" value="300000" /><!-- 检测连接是否可用的 SQL --><property name="validationQuery" value="select 'z' from dual" /><!-- 是否开启空闲连接检查 --><property name="testWhileIdle" value="true" /><!-- 是否在获取连接前检查连接状态 --><property name="testOnBorrow" value="false" /><!-- 是否在归还连接时检查连接状态 --><property name="testOnReturn" value="false" /><!-- 是否在固定时间关闭连接。增加此参数可以均衡后端服务节点参数 --><property name="phyTimeoutMillis" value="600000" /><!-- 是否在固定SQL使用次数之后关闭连接,增加此参数可以均衡后端服务节点参数--><property name="phyMaxUseCount" value="10000" /></bean>
Go驱动
polardbx-connector-go安装
go get github.com/polardb/polardbx-connector-go
使用例子:
import (_ "github.com/polardb/polardbx-connector-go"
)
db, err := sql.Open("polardbx", "user:password@tcp(ip:port)/dbname")
if err != nil {panic(err)
}db.SetConnMaxLifetime(time.Minute * 3)
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(10)
需要 “一键执行”部署(可选)可创建 run_polardbx.sh 文件,内容如下
#!/bin/bash
# 一键启动 polardbx-proxy(自动适配 Linux/macOS)# 1. 获取本地IP
if [ "$(uname)" = "Darwin" ]; thenLOCALHOST=$(echo "show State:/Network/Global/IPv4" | scutil | grep PrimaryInterface | awk '{print $3}' | xargs ifconfig | grep inet | grep -v inet6 | awk '{print $2}')PORTS="-p 3307:3307 -p 8083:8083"NET_MODE=""
elseLOCALHOST=$(ip route get 1 | awk '/src/ {for(i=1;i<=NF;i++) if($i=="src") print $(i+1)}')PORTS=""NET_MODE="--net=host"
fi# 2. 检查端口(可选,避免占用)
for PORT in 3307 8083; doif [ -n "$PORTS" ] && (nc -z -w 1 127.0.0.1 $PORT || telnet -z 127.0.0.1 $PORT); thenecho "Error: Port $PORT is occupied!"exit 1fi
done# 3. 启动容器
docker run -d -it \-h $LOCALHOST \-e node_ip=$LOCALHOST \-e backend_address=127.0.0.1:3306 \-e backend_username=appuser \-e backend_password=appuser \-e memory=4294967296 \--name=polardbx-proxy \$NET_MODE \$PORTS \polardbx-opensource-registry.cn-beijing.cr.aliyuncs.com/polardbx/polardbx-proxyecho "Container 'polardbx-proxy' started! Local IP: $LOCALHOST"
保存后赋予执行权限并运行:
chmod +x run_polardbx.sh
./run_polardbx.sh

