通过 RPM 部署

通过 RPM 部署 PolarDB-X 标准版(集中式形态),需要首先获取相应的 RPM 包,您可以手动编译生成该 RPM 包,也可以自行下载(请根据实际情况下载 x86 或 arm 对应的 RPM)。 通过 RPM 部署集群,推荐使用 4C16G 以上机器。

下面先给出编译生成 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 中,推荐确认一下该目录已经包含 mysqld 文件。

启动 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

# 准备一份 my.cnf 文件,可以参考本文末尾的模板,放置于当前目录
vi my.cnf

# 初始化,如果 my.cnf 不在当前目录,请将下述命令的 my.cnf 改成绝对路径
/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 登录数据库。 (需要预先在机器上安装 mysql 客户端,centos 系统可以使用 yum install mysql 安装。)

体验高可用部署

如果一切顺利,到这里,您已经掌握了部署 PolarDB-X engine 的方式。接下来,让我们在 3 台机器上,部署一个完整的集中式集群,并验证高可用切换的能力。

假设我们的 3 台机器 IP 分别为:

192.168.6.183
192.168.6.184
192.168.6.185

我们在 3 台机器上,按前述步骤,安装 RPM 后,准备好 my.cnf 和目录 (如果有任何步骤失败,请完全清理 log mysql run data tmp 等目录,重新创建。)。 然后在 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 修改该配置项。

稍等片刻,我们登录每个数据库,(如果直接使用本文的 my.cnf 模板,则在每个机器上,都可以使用 mysql -h127.0.0.1 -P4886 -uroot 登录数据库)。登入数据库后,执行以下命令验证一下集群的状态:

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

results matching ""

    No results matching ""