通过 RPM 部署
通过 RPM 部署 PolarDB-X 标准版(集中式形态),需要首先获取相应的 RPM 包,您可以手动编译生成该 RPM 包,也可以自行下载(请根据实际情况下载 x86 或 arm 对应的 RPM)。
下面先给出编译生成 RPM 的步骤,如果您已经下载好 RPM 包,则可以跳过这一步,直接安装 RPM。
从源码编译生成 RPM
不同的操作系统,在编译时依赖的环境会略微不同,但编译出来的 RPM 包是通用的。
安装编译依赖
For Centos 7
# 安装必要依赖
yum remove -y cmake
yum install -y git make bison libarchive ncurses-devel libaio-devel cmake3 mysql rpm-build zlib-devel openssl-devel centos-release-scl
ln -s /usr/bin/cmake3 /usr/bin/cmake
yum install -y devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils
echo "source /opt/rh/devtoolset-7/enable" | sudo tee -a /etc/profile
source /etc/profile
For Centos 8
# 安装必要依赖
yum install -y git make bison libarchive ncurses-devel libaio-devel cmake3 mysql rpm-build zlib-devel
yum install -y libtirpc-devel dnf-plugins-core
yum config-manager --set-enabled PowerTools
yum groupinstall -y "Development Tools"
yum install -y gcc gcc-c++
编译生成 RPM
# 拉取代码
git clone https://github.com/polardb/polardbx-engine.git --depth 1
# 编译生成 rpm
cd polardbx-engine/rpm && rpmbuild -bb t-polardbx-engine.spec
编译生成的 RPM 默认在 /root/rpmbuild/RPMS/x86_64/ 下。
安装 RPM
yum install -y <您下载或编译的rpm>
安装后的二进制文件,会出现在 /opt/polardbx-engine/bin 中。
启动 DN
创建 polarx 用户(您也可以使用其他非 root 用户),准备一份 my.cnf(参考模板)和数据目录(如果改了 my.cnf,则下面的目录也要相应修改),就可以准备启动了。
# 创建并切换到 polarx 用户
useradd -ms /bin/bash polarx
echo "polarx:polarx" | chpasswd
echo "polarx ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
su - polarx
# 创建必要目录
mkdir polardbx-engine
cd polardbx-engine && mkdir log mysql run data tmp
# 初始化
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf --initialize-insecure
# 启动
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf &
稍等片刻,即可登录数据库。如果直接使用本文的 my.cnf 模板,可以用mysql -h127.0.0.1 -P4886 -uroot
登录数据库。
体验高可用部署
如果一切顺利,到这里,您已经掌握了部署 PolarDB-X engine 的方式。接下来,让我们在 3 台机器上,部署一个完整的集中式集群,并验证高可用切换的能力。
假设我们的 3 台机器 IP 分别为:
192.168.6.183
192.168.6.184
192.168.6.185
我们在 3 台机器上,按前述步骤,安装 RPM 后,准备好 my.cnf 和目录(如果有任何步骤失败,请完全清理这些目录,重新创建)。然后在 3 个机器上,分别按如下方式启动:
# 192.168.6.183 上执行
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@1' \
--initialize-insecure
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@1' \
&
# 192.168.6.184 上执行
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@2' \
--initialize-insecure
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@2' \
&
# 192.168.6.185 上执行
/opt/polardbx_engine/bin/mysqld --defaults-file=my.cnf \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@3' \
--initialize-insecure
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@3' \
&
注意到,我们在启动时修改了 cluster-info
的配置项,其中的格式为 [host1]:[port1];[host2]:[port2];[host3]:[port3]@[idx]
,不同的机器,只有 [idx]
不同,[idx]
也反映了该机器是第几个 [host][port]
。请根据实际机器的 ip 修改该配置项。
稍等片刻,我们登录每个数据库,验证一下集群的状态,执行
SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_LOCAL
我们会看到有一个机器是 Leader:
SERVER_ID: 1
CURRENT_TERM: 20
CURRENT_LEADER: 192.168.6.183:14886
COMMIT_INDEX: 1
LAST_LOG_TERM: 20
LAST_LOG_INDEX: 1
ROLE: Leader
VOTED_FOR: 1
LAST_APPLY_INDEX: 0
SERVER_READY_FOR_RW: Yes
INSTANCE_TYPE: Normal
另外两个机器是 Follower:
SERVER_ID: 2
CURRENT_TERM: 20
CURRENT_LEADER: 192.168.6.183:14886
COMMIT_INDEX: 1
LAST_LOG_TERM: 20
LAST_LOG_INDEX: 1
ROLE: Follower
VOTED_FOR: 1
LAST_APPLY_INDEX: 1
SERVER_READY_FOR_RW: No
INSTANCE_TYPE: Normal
三节的 PolarDB-X engine 只有 Leader 节点可以写入数据。我们在 Leader 上建一个库表,写入一些简单的数据:
CREATE DATABASE db1;
USE db1;
CREATE TABLE tb1 (id int);
INSERT INTO tb1 VALUES (0), (1), (2);
然后我们可以在 Follower 上把数据查出来。
我们也可以在 Leader 上查询集群的状态:
SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL;
结果形如:
***************** 1. row *****************
SERVER_ID: 1
IP_PORT: 192.168.6.183:14886
MATCH_INDEX: 4
NEXT_INDEX: 0
ROLE: Leader
HAS_VOTED: Yes
FORCE_SYNC: No
ELECTION_WEIGHT: 5
LEARNER_SOURCE: 0
APPLIED_INDEX: 4
PIPELINING: No
SEND_APPLIED: No
***************** 2. row *****************
SERVER_ID: 2
IP_PORT: 192.168.6.184:14886
MATCH_INDEX: 4
NEXT_INDEX: 5
ROLE: Follower
HAS_VOTED: Yes
FORCE_SYNC: No
ELECTION_WEIGHT: 5
LEARNER_SOURCE: 0
APPLIED_INDEX: 4
PIPELINING: Yes
SEND_APPLIED: No
**************** 3. row *****************
SERVER_ID: 3
IP_PORT: 192.168.6.185:14886
MATCH_INDEX: 4
NEXT_INDEX: 5
ROLE: Follower
HAS_VOTED: No
FORCE_SYNC: No
ELECTION_WEIGHT: 5
LEARNER_SOURCE: 0
APPLIED_INDEX: 4
PIPELINING: Yes
SEND_APPLIED: No
APPLIED_INDEX
都是 4 ,说明数据目前在三节点上是完全一致的。
接下来,我们对 Leader 节点(192.168.6.183)进程 kill -9 ,让集群选出新 Leader。
kill -9 $(pgrep -x mysqld)
旧 Leader 被 kill 后,mysqld_safe 会立马重新拉起 mysqld 进程。
随后,我们看到,Leader 变成了 192.168.6.185 节点了
SERVER_ID: 3
CURRENT_TERM: 21
CURRENT_LEADER: 192.168.6.185:14886
COMMIT_INDEX: 5
LAST_LOG_TERM: 21
LAST_LOG_INDEX: 5
ROLE: Leader
VOTED_FOR: 3
LAST_APPLY_INDEX: 4
SERVER_READY_FOR_RW: Yes
INSTANCE_TYPE: Normal
通过以上步骤,我们在 3 个机器上部署了三节点的 PolarDB-X engine,并进行了简单的验证。您也可以在一个机器上部署三节点,但要保证使用不同的 my.cnf,且其中的 port、数据目录等参数不同,同时 cluster-info 的端口也要不同。
最后,上述过程仅仅是体验和测试,请不要直接用于生产。生产推荐使用 K8S 方式部署。如果确实要用 RPM 方式在生产上部署,业务需要注意自行感知 Leader 的切换,以使用正确的连接串访问数据库。
my.cnf 参考模板
请根据实际情况修改参数,仅验证功能和测试,更多参数可参考完整参数模板。
[mysqld]
basedir = /opt/polardbx-engine
log_error_verbosity = 2
default_authentication_plugin = mysql_native_password
gtid_mode = ON
enforce_gtid_consistency = ON
log_bin = mysql-binlog
binlog_format = row
binlog_row_image = FULL
master_info_repository = TABLE
relay_log_info_repository = TABLE
# change me if needed
datadir = /home/polarx/polardbx-engine/data
tmpdir = /home/polarx/polardbx-engine/tmp
socket = /home/polarx/polardbx-engine/tmp.mysql.sock
log_error = /home/polarx/polardbx-engine/log/alert.log
port = 4886
cluster_id = 1234
cluster_info = 127.0.0.1:14886@1
[mysqld_safe]
pid_file = /home/polarx/polardbx-engine/run/mysql.pid