通过 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 centos-release-scl libaio-devel libarchive ncurses-devel bison zlib-devel snappy-devel lz4-devel bzip2-devel cmake3 mysql rpm-build openssl-devel autoconf libstdc++-static
ln -s /usr/bin/cmake3 /usr/bin/cmake

yum install -y devtoolset-10
echo "source /opt/rh/devtoolset-10/enable" | sudo tee -a /etc/profile
source /etc/profile

编译生成 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 修改该配置项。

另外,如果要让 PolarDB-X 的副本启动为 Logger 模式(Logger 会占用更少的资源,推荐让其中一个副本配置为 Logger),需要设置cluster-log-type-node=ON。

# 比如我们把第三个主机,配置为logger模式

/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
cluster-log-type-node=ON \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@3' \
&

体验一(三副本启动)

Paxos三副本在逐台启动时,刚启动第一台时,会因为不满足Paxos多数派,无法产生选主结果,此时数据库无法登录。

> tail -f /home/polarx/polardbx-engine/log/alert.log
......
[ERROR] Server 1 : Paxos state change from FOLL to CAND !!
[ERROR] Server 1 : Start new requestVote: new term(2)
[ERROR] Server 1 : Paxos state change from CAND to CAND !!
[ERROR] Server 1 : Start new requestVote: new term(3)
[ERROR] Server 1 : Paxos state change from CAND to CAND !!
[ERROR] Server 1 : Start new requestVote: new term(4)
[ERROR] Server 1 : Paxos state change from CAND to CAND !!
[ERROR] Server 1 : Start new requestVote: new term(5)
...... 
# 阻塞直到第二个节点加入,并成功选主
[ERROR] EasyNet::onConnected server 2
[ERROR] Server 1 : Paxos state change from CAND to CAND !!
[ERROR] Server 1 : Start new requestVote: new term(6)
[ERROR] Server 1 : server 2 (term:6) vote me to became leader.
[ERROR] Server 1 : Paxos state change from CAND to LEDR !!
[ERROR] Server 1 : become Leader (currentTerm 6, lli:1, llt:6)!!

数据库启动完成后,我们登录数据库,验证一下集群的状态。

# 分别登录每个数据库副本,执行下面的命令,可以看到每个副本的角色(Leader,Follower,Logger)。
MySQL [(none)]> SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_LOCAL \G
*************************** 1. row ***************************
          SERVER_ID: 1
       CURRENT_TERM: 6
     CURRENT_LEADER: 192.168.6.183:14886
       COMMIT_INDEX: 1
      LAST_LOG_TERM: 6
     LAST_LOG_INDEX: 1
               ROLE: Leader
          VOTED_FOR: 1
   LAST_APPLY_INDEX: 0
SERVER_READY_FOR_RW: Yes
      INSTANCE_TYPE: Normal

# 在 Leader 节点上执行下面的命令,可以看到整个集群的状态。
MySQL [(none)]> SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL;
+-----------+------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
| SERVER_ID | IP_PORT          | MATCH_INDEX | NEXT_INDEX | ROLE     | HAS_VOTED | FORCE_SYNC | ELECTION_WEIGHT | LEARNER_SOURCE | APPLIED_INDEX | PIPELINING | SEND_APPLIED |
+-----------+------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
|         1 | 192.168.6.183:14886 |           1 |          0 | Leader   | Yes       | No         |               5 |              0 |             0 | No         | No           |
|         2 | 192.168.6.184:14886 |           1 |          2 | Follower | Yes       | No         |               5 |              0 |             1 | Yes        | No           |
|         3 | 192.168.6.185:14886 |           1 |          2 | Follower | No        | No         |               5 |              0 |             1 | Yes        | No           |
+-----------+------------------+-------------+------------+----------+-----------+------------+-----------------+----------------+---------------+------------+--------------+
3 rows in set (0.00 sec)

体验二(kill -9切换)

基于Paxos的三副本模式,只有 Leader 节点可以写入数据。我们在 Leader 上建一个库表,写入一些简单的数据:

CREATE DATABASE db1;
USE db1;
CREATE TABLE tb1 (id int);
INSERT INTO tb1 VALUES (0), (1), (2);

然后我们可以在 Leader和Follower 上把数据查出来。

我们也可以在 Leader 上查询集群的状态:

MySQL [db1]> SELECT SERVER_ID,IP_PORT,MATCH_INDEX,ROLE,APPLIED_INDEX FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL ;
+-----------+------------------+-------------+----------+---------------+
| SERVER_ID | IP_PORT          | MATCH_INDEX | ROLE     | APPLIED_INDEX |
+-----------+------------------+-------------+----------+---------------+
|         1 | 192.168.6.183:14886 |           4 | Leader   |             4 |
|         2 | 192.168.6.184:14886 |           4 | Follower |             4 |
|         3 | 192.168.6.185:14886 |           4 | Follower |             4 |
+-----------+------------------+-------------+----------+---------------+
3 rows in set (0.00 sec)

其中 APPLIED_INDEX 都是 4 ,说明数据目前Paxos三节点上的Log Index是完全一致的。

接下来,我们对 Leader 节点(192.168.6.183)进程 kill -9 ,让集群选出新 Leader。

kill -9 $(pgrep -x mysqld)

旧 Leader 被 kill 后,mysqld_safe 会立马重新拉起 mysqld 进程。

随后,我们看到,Leader 变成了 192.168.6.184 节点了。

# 在 192.168.6.184 新Leader上,查询状态
MySQL [(none)]> SELECT SERVER_ID,IP_PORT,MATCH_INDEX,ROLE,APPLIED_INDEX FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL ;
+-----------+------------------+-------------+----------+---------------+
| SERVER_ID | IP_PORT          | MATCH_INDEX | ROLE     | APPLIED_INDEX |
+-----------+------------------+-------------+----------+---------------+
|         1 | 192.168.6.183:14886 |           5 | Follower |             5 |
|         2 | 192.168.6.184:14886 |           5 | Leader   |             4 |
|         3 | 192.168.6.185:14886 |           5 | Follower |             5 |
+-----------+------------------+-------------+----------+---------------+
3 rows in set (0.00 sec)

我们在 192.168.6.183 原 Leader 上,查询状态已经变为 Follower:

MySQL [(none)]> SELECT * FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_LOCAL \G
*************************** 1. row ***************************
          SERVER_ID: 1
       CURRENT_TERM: 7
     CURRENT_LEADER: 192.168.6.183:14886
       COMMIT_INDEX: 5
      LAST_LOG_TERM: 7
     LAST_LOG_INDEX: 5
               ROLE: Follower
          VOTED_FOR: 2
   LAST_APPLY_INDEX: 5
SERVER_READY_FOR_RW: No
      INSTANCE_TYPE: Normal

可以通过不断kill -9多副本,来验证Leader在三个节点中不断迁移和恢复的能力。

通过以上步骤,我们简单验证了基于Paxos三副本自动选主和切换的能力。

体验三(预期切换命令)

PolarDB-X内置提供面向Paxos三副本运维管理的命令,比如当前集群状态:

MySQL [(none)]> SELECT SERVER_ID,IP_PORT,MATCH_INDEX,ROLE,APPLIED_INDEX FROM INFORMATION_SCHEMA.ALISQL_CLUSTER_GLOBAL ;
+-----------+------------------+-------------+----------+---------------+
| SERVER_ID | IP_PORT          | MATCH_INDEX | ROLE     | APPLIED_INDEX |
+-----------+------------------+-------------+----------+---------------+
|         1 | 192.168.6.183:14886 |           9 | Leader   |             8 |
|         2 | 192.168.6.184:14886 |           9 | Follower |             9 |
|         3 | 192.168.6.185:14886 |           9 | Follower |             9 |
+-----------+------------------+-------------+----------+---------------+

指令1:指定IP切换Leader

call dbms_consensus.change_leader("10.0.3.245:14886");

指令2:查询和清理consensus日志

# 查询consensus日志(PolarDB-X基于binlog文件实现paxos consensus日志)
MySQL [(none)]> show consensus logs;
+---------------------+-----------+-----------------+
| Log_name            | File_size | Start_log_index |
+---------------------+-----------+-----------------+
| mysql-binlog.000001 |      1700 |               1 |
+---------------------+-----------+-----------------+
1 row in set (0.00 sec)

# 清理consensus日志,指定logIndex(有保护机制,如果有副本还在消费则不会清理成功)
MySQL [(none)]> call dbms_consensus.purge_log(1);
Query OK, 0 rows affected (0.00 sec)

除此以外,额外支持:动态增删副本、节点角色变更(Learner/Follower)、选举权重设置:

# 加learner
call dbms_consensus.add_learner("127.0.0.1:14886");
# 减learner
call dbms_consensus.drop_learner("127.0.0.1:14886");

# learner转follower,learner日志落后太多会返回失败
call dbms_consensus.upgrade_learner("127.0.0.1:14886");
# follower降级learner
call dbms_consensus.downgrade_follower("127.0.0.1:15700");

# 修改follower节点的选主权重[1-9],默认为5
call dbms_consensus.configure_follower("127.0.0.1:15700", 9);

体验四(模拟离线启动)

PolarDB-X支持多副本的离线启动,比如因为断网或断电需要,期望数据库支持整体关机和离线启动的能力,可以基于本地文件重新离线组建新的三副本。

做一个简单模拟,我们登录三台机器进行整体kil -9:

kill -9 $(pgrep -x mysqld)

原位模拟离线启动,重新组建三副本集群:

# 192.168.6.183 上执行
/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_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_safe --defaults-file=my.cnf \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@3' \
&

如果真实业务中,涉及了机器迁移,拷贝原有数据文件到新机器后,可以在三副本启动时设置--cluster-force-change-meta=ON,强制刷新下集群的元数据。 例子:

# 强制刷新元数据(刷新成功后会退出mysqld和mysqld_safe)
/opt/polardbx_engine/bin/mysqld_safe --defaults-file=my.cnf \
--cluster-force-change-meta=ON \
--cluster-info='192.168.6.183:14886;192.168.6.184:14886;192.168.6.185:14886@1' \
&

# 按照新配置,重新启动
/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' \
&

本文通过从源码编译、RPM安装,全流程验证PolarDB-X的单节点、三副本等启动方式,以及通过kill -9模拟故障,快速体验RPO=0的自动切换。 另外,在面向可运维性上,支持多种运维指令、以及离线重搭启动的方式,很好满足了MySQL生态的运维习惯。

最后,上述过程仅仅是体验和测试,请不要直接用于生产。生产推荐使用 K8S 方式部署。如果确实要用 RPM 方式在生产上部署,业务需要注意自行感知 Leader 的切换,以使用正确的连接串访问数据库,或者使用开源ProxySQL构建PolarDB-X标准版高可用路由服务。同时,还需要仔细配置 my.cnf 的每一项参数(可参考 MySQL 8.0 参数进行配置)。

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
server_id = 2712347953

[mysqld_safe]
pid_file = /home/polarx/polardbx-engine/run/mysql.pid

注意:如果以三副本模式运行,my.cnf 中的 server_id 参数在三个副本节点需要配置为不同的值

从源码编译生成 RPM (针对 V2.3.1 版本及以下)

不同的操作系统,在编译时依赖的环境会略微不同,但编译出来的 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/ 下。

results matching ""

    No results matching ""