通过 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/ 下。