在阿里云中使用CLup创建和管理Polardb
1. 基础知识
1.1 创建PolarDB的要求
安装要求
- 需要有共享盘:盘的大小需要大于等于20GB
- CLup的高可用需要VIP
- 操作系统:CentOS7.X
- 盘要求有路径:/dev/nvmeXnY
- 虚拟机最好有反亲和性,即分布在不同的物理机上以保证高可用性
虚拟机的要求:
- 1台做CLup管理机器:内存大于2GB 即可
- 3台做数据库节点:内存需要大于4GB
1.2 阿里云上的解决方案
解决方案:
- 需要有共享盘:使用阿里云的高性能Nvme共享盘,Nvme共享盘的详细信息见: https://help.aliyun.com/document_detail/256487.html
- CLup的高可用需要VIP:阿里云目前的VIP功能处于内侧阶段,可以申请使用
- 操作系统:CentOS7.X 可以满足
- 盘要求路径为/dev/nvmeXnY:阿里云的Nvme共享盘的路径已经是这样的格式,无需特殊处理。
2. 安装配置
2.1 创建部署集
为了让虚拟机创建到不同的物理机中,我们需要在阿里云中先创建部署集,
到阿里云控制台中:
点创建部署集,在弹出的框中输入部署集的名称,点确定即完成部署集的创建:
2.2 创建一台虚拟机做CLup管理机器
此台机器内存大于2GB即可,为了在外网能访问CLup的WEB页面,需要有公网的IP,同时在安全组开通8090的端口。
注意因为此台机器需要与后面创建的数据库主机在同一个可以区中,所以可能区只能选择下面的可用区:
- 华东1(杭州)可用区I
- 华东2(上海)可用区B
- 华北2(北京)可用区K
- 华南1(深圳)可用区F。
当然我们用也可以与后续的数据库虚拟机一起创建。
2.3 三台做数据库管理机器
由于这几台机器需要挂载共享Nvme盘,需要把虚拟机创建在以下可用区中:
- 华东1(杭州)可用区I
- 华东2(上海)可用区B
- 华北2(北京)可用区K
- 华南1(深圳)可用区F。
另只有下面这几种规格的虚拟机可以挂载Nvme共享盘:
- g7se
- c7se
- r7se
同时要求创建的虚拟机是按量付费的才可以挂载Nvme共享盘。
另需要注意在创建虚拟机的时候选中的盘都不是共享盘,必须在创建完虚拟机后,在单独创建Nvme共享盘。
下面我们详细讲解虚拟机的创建过程:
到阿里云的控制台中,点创建虚拟机,出现下面的界面:
注意在上面的界面中需要选择按量付费,这是因为共享的Nvme盘只支持挂载到按量服务的虚拟机中,
可用区需要选可以支持Nvme盘的可用区,我们这里选择,杭州可用区I:
虚拟机的类型中做下面的选择:
然后在列表中选择ecs.c7selarge的规格(2核4G):
购买数量中我们选择3台(如果我们让CLup管理机的规格和数据库主机一样,这里可以设置为4台,这样一起创建出来):
为了方便远程连接,这里我们分配公网IP,同时网络流量按量付费(20Mbps带宽):
主机名设置为clup[1,1],这样创建出来的主机为clup1、clup2、clup3:
在下面的界面中选择我们之前创建的部署集:
最后我们选择的虚拟规格的总览如下界面:
点购买即完成了虚拟机的创建
2.4 创建共享云盘
到阿里云的云盘控制台中:
在上图中:是否挂载选择暂时不挂载;云盘的可用区需要与虚拟机在同一个可用区中,这里选择的是 杭州可用区I;云盘的类型需要选择ESSD云盘,云盘的付费方式必须选择为按量付费,这是在云盘后面就会出现“多实例挂载”的选项,将其勾上。注意,如果云盘的可用区、类型、付费方式没有选择正确,这个“多实例挂载”的选项会看不到。
上面的云盘大小我们设置为40GB,注意PolarDB需要的云盘的大小必须是大于等于20GB。
然后点“确定订单”按钮,即完成共享云盘的创建。
回到云盘的控制台,可以看到云盘还没有挂载到云主机中:
我们点这块云盘,到了云盘的详情页中,点操作中的挂载按钮:
点完挂载后出现挂载云盘的界面:
在上面的挂载界面中,选择要挂载的虚拟机clup1,即把这块云盘挂载到虚拟机clup1中了。重复上面的操作,把云盘同时挂载到虚拟机clup2和clup3中。
2.5 创建VIP
到阿里云网络控制台的高可用虚拟IP中,点创建虚拟IP:
出现下面的界面:
注意在上面的界面中,专有网络和交换机一定选择我们之前虚拟机使用的专有网络和交换机。
创建完VIP后,还需要把VIP绑定到那几台虚拟机上,方法是进去虚拟IP的详情页:
点绑定按钮后出现界面:
让后在上面的界面中选择虚拟机clup1,点确定就完成了到虚拟机clup1的绑定功能。重复上面的步骤把虚拟IP绑定到clup2和clup3上,看到的效果如下:
2.6 安装CLup程序
前面我们创建的虚拟机列表如下:
主机名 | IP | 作用 | 数据目录 |
---|---|---|---|
clup0 | 172.16.195.158 | 部署clup-server | N/A |
clup1 | 172.16.195.157 | 数据库机器,部署clup-agent | /data/polardata |
clup2 | 172.16.195.155 | 数据库机器,部署clup-agent | /data/polardata |
clup3 | 172.16.195.156 | 数据库机器,部署clup-agent | /data/polardata |
2.6.1 安装clup-server模块
在clup0机器上:
安装csumdb模块,下载csumdb安装包:
wget https://gitee.com/csudata/clup-community/releases/download/5.0.2/csumdb1.0.0.el7.x86_64.bin
运行:bash csumdb1.0.0.el7.x86_64.bin
:
[root@clup0 ~]# bash csumdb1.0.0.el7.x86_64.bin
==== Installation is starting ...
==== Installation is complete.
安装clup-server模块,下载clup-server安装包:
wget https://gitee.com/csudata/clup-community/releases/download/4.4.6/clup4.0.0.el7.x86_64.bin
运行:bash clup4.4.6.el7.x86_64.bin
:
[root@clup0 ~]# bash clup4.4.6.el7.x86_64.bin
==== Installation is starting ...
==== Your ip is 10.197.163.30/20
==== register systemd service ...
already register systemd service!
==== register systemd service ok.
==== Installation is complete.
我们还需要修改虚拟主机clup0的安全组,允许外部访问CLup的WEB界面。方法如下:
到阿里云ECS的控制台中:
点配置安全组,出现下面界面:
点配置规则,出现下面界面:
点添加按钮,出现下面界面:
在上面的规则中允许访问8090端口,点保存即可。
然后我们在浏览器输入 http://121.41.93.63:8090 ,打开WEB界面:
其中121.41.93.63是clup0的公网地址。
默认的用户名为:admin
默认密码为:cstech
输入后就可以登陆CLup的管理界面了。WEB界面中可以管理的数据库当前都是空的,还需要在数据库主机中安装clup-agent后,才能进一步的操作。
2.6.2 安装clup-agent
在需要部署数据库的主机上安装clup-agent。在本示例是在clup1、clup2、clup3机器上安装clup-agent。
下载clup-agent安装程序:
wget https://gitee.com/csudata/clup-community/releases/download/4.4.6/clup-agent4.4.6.el7.x86_64.bin
运行:bash clup-agent4.4.6.el7.x86_64.bin
:
[root@clup1 ~]# bash clup-agent4.4.6.el7.x86_64.bin
==== Installation is starting ...
==== Your ip is 172.16.195.157/20
Enter Clup Server IP Addr:
输入clup服务端的IP地址:172.16.195.158 然后回车继续:
Enter Clup Server IP Addr: 172.16.195.158
Clup Server ip is 172.16.195.158!
==== register systemd service ...
2022-10-08 11:11:47,287 INFO clup-agent v4.4.6 Copyright (c) 2018-2022 CSUDATA.COM All rights reserved.
already register systemd service!
==== register systemd service ok.
==== Installation is complete.
2.7 安装PolarDB程序
在clup1和clup2和clup3机器上安装PolarDB程序需要的依赖包:
yum install libaio.x86_64 libaio-devel.x86_64
下载中启乘数科技编译好的PolarDB:
wget https://gitee.com/csudata/zqpolardb/releases/download/11.9.2/polardb-11.9.2.20230314.el7.x86_64.tar.xz
解压安装:
tar xf polardb-11.9.2.20230314.el7.x86_64.tar.xz
cd polarAll
./install.sh
实际的安装过程:
[root@clup1 polarAll]# ./install.sh
安装依赖libssl和libcrypto
安装pfs
install pfsd success!
安装polardb
执行结束
我们这个安装包安装的PolarDB数据库软件的目录在/usr/polardb_pfs目录下。需要把/usr/polardb_pfs/bin目录配置到Clup中。
到CLup的WEB管理界面中,到菜单:系统管理->clup参数设置界面中,找到参数pg_bin_path_string,点击修改:
在上面的界面中,原有的配置中添加,/usr/polardb_pfs/bin
,点保存即可。
2.8 初始化PolarDB共享盘上的文件系统
进入到clup1、clup2、clup3任意一台机器中执行下面的操作即可。在本例中我们进入clup1机器中,执行lsblk获得共享磁盘的盘符名称:
[root@clup1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:1 0 40G 0 disk
└─nvme0n1p1 259:2 0 40G 0 part /
nvme1n1 259:0 0 40G 0 disk
从上面的可以看出,总共有两块名称以nvme开头的盘,而nvme0n1是操作系统盘的盘符,所以我们的共享盘就是nvme1n1。
执行:
pfs -C disk mkfs nvme1n1
实际执行上面的命令的情况如下:
[root@clup1 ~]# pfs -C disk mkfs nvme1n1
pfs tool cmd record:mkfs nvme1n1
[PFS_LOG] Oct 13 17:58:43.952074 INF [1491] pfs build version:libpfs_version_("pfsd-build-desc-fb5114f-Thu Aug 18 14:46:30 CST 2022")
[PFS_LOG] Oct 13 17:58:43.952146 INF [1491] pid: 1125, caller: -bash
[PFS_LOG] Oct 13 17:58:43.952183 INF [1491] pid: 1102, caller: sshd: root@pts/0
[PFS_LOG] Oct 13 17:58:43.952205 INF [1491] pid: 1046, caller: /usr/sbin/sshd -D
[PFS_LOG] Oct 13 17:58:43.952229 INF [1491] open device cluster disk, devname nvme1n1, flags 0x13
[PFS_LOG] Oct 13 17:58:43.952242 INF [1491] disk dev path: /dev/nvme1n1
[PFS_LOG] Oct 13 17:58:43.952245 INF [1491] open local disk: open(/dev/nvme1n1, 0x4002)
[PFS_LOG] Oct 13 17:58:43.952254 INF [1491] ioctl status 0
[PFS_LOG] Oct 13 17:58:43.952257 INF [1491] pfs_diskdev_info get pi_pbdno 0, pi_rwtype 1, pi_unitsize 4194304, pi_chunksize 10737418240, pi_disksize 42949672960
[PFS_LOG] Oct 13 17:58:43.952260 INF [1491] pfs_diskdev_info waste size: 0
[PFS_LOG] Oct 13 17:58:43.952262 INF [1491] disk size 0xa00000000, chunk size 0x280000000
[PFS_LOG] Oct 13 17:58:43.952484 ERR [1491] chunk 0 pfs magic mismatch 0 vs 0x5046534348
[PFS_LOG] Oct 13 17:58:43.952489 INF [1491] mkfs PBD nvme1n1 isn't formatted
Init chunk 0
metaset 0/1: sectbda 0x1000, npage 80, objsize 128, nobj 2560, oid range [ 0, a00)
metaset 0/2: sectbda 0x51000, npage 64, objsize 128, nobj 2048, oid range [ 0, 800)
metaset 0/3: sectbda 0x91000, npage 64, objsize 128, nobj 2048, oid range [ 0, 800)
Init chunk 1
metaset 1/1: sectbda 0x280001000, npage 80, objsize 128, nobj 2560, oid range [ 1000, 1a00)
metaset 1/2: sectbda 0x280051000, npage 64, objsize 128, nobj 2048, oid range [ 800, 1000)
metaset 1/3: sectbda 0x280091000, npage 64, objsize 128, nobj 2048, oid range [ 800, 1000)
Init chunk 2
metaset 2/1: sectbda 0x500001000, npage 80, objsize 128, nobj 2560, oid range [ 2000, 2a00)
metaset 2/2: sectbda 0x500051000, npage 64, objsize 128, nobj 2048, oid range [ 1000, 1800)
metaset 2/3: sectbda 0x500091000, npage 64, objsize 128, nobj 2048, oid range [ 1000, 1800)
Init chunk 3
metaset 3/1: sectbda 0x780001000, npage 80, objsize 128, nobj 2560, oid range [ 3000, 3a00)
metaset 3/2: sectbda 0x780051000, npage 64, objsize 128, nobj 2048, oid range [ 1800, 2000)
metaset 3/3: sectbda 0x780091000, npage 64, objsize 128, nobj 2048, oid range [ 1800, 2000)
Inited filesystem(42949672960 bytes), 4 chunks, 2560 blktags, 2048 direntries, 2048 inodes per chunk
making paxos file
init paxos lease
making journal file
pfs mkfs succeeds!
2.9 使用CLup创建PolarDB高可用集群
进入CLup的WEB管理界面中,在菜单中,点击“HA集群->集群定义”:
在上面的界面中点“创建PolarDB共享存储集群”,出现创建PolarDB的集群界面:
在上面的界面中选择clup1机器,操作系统用户名称我们填写postgres(其实也可以填写其它的名称),操作系统用户postgres的UID我们填写701(也可以填写其它值),选择PolarDB软件的安装路径为/usr/polardb_pfs/bin,数据目录我们填写/data/polardata(也可以填写其它的目录),防脑裂命令填写/bin/true,然后点添加
按钮,即把clup1机器添加为PolarDB集群中的可读可写的节点(即主库),与此类似,我们再把clup2旧机器添加进来,clup2机器即做为PolarDB的只读节点,如下图所示:
在上图中点添加
按钮,即把clup2机器添加为PolarDB集群中的只读节点了,如下图所示:
在上图中,点下一步
按钮,进入填写集群信息的界面,如下图:
在上面的界面中,我们输入了如下信息:
- 集群名称:polardb-cluster01,可以输入任何一个名称。当创建多个集群时,方便识别是哪一个。
- 数据库端口:5432,我们输入了默认端口5432,也可以输入1025~65535之间的任意主机上没有被使用的一个端口。
- DB中CLup用户:postgres,我们管理PolarDB数据库使用的一个超级用户的名称,创建数据库实例时会自动创建此超级用户
- DB中CLup密码:上面用户的密码
- 流复制用户:postgres, 与“DB中CLup用户”保持相同即可。
- 集群VIP:172.16.192.201,即我们之前在阿里云控制台中创建的虚拟IP。
- pfs_disk_name: 共享盘的名称,我们输入nvme1n1
- polar_datadir:PolarDB数据库在共享盘种PFS的子目录,保持默认就可以了。
- pfsdaemon_params: -w 2,表示指定PFS文件系统的IO服务线程数,设置的越多PFS的性能可能越高,但是消耗的CPU也越高,如果是有很多核的机器我们可以把此值设置高一些,测试环境还是设置的低一些。
上面的pfs_disk_name我们填的是nvme1n1,这不是乱填的,这个名称是我们前面创建的阿里云Nvme盘的在虚拟机中的盘符,我们可以登陆到虚拟机种,允许lsblk命令获得这个盘符:
[root@clup1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:1 0 40G 0 disk
└─nvme0n1p1 259:2 0 40G 0 part /
nvme1n1 259:0 0 40G 0 disk
从上面的可以看出,总共有两块名称以nvme开头的盘,而nvme0n1是操作系统盘的盘符,所以我们的共享盘就是nvme1n1。
点检测
按钮,会自动检测主机上是否有nvme1n1的盘,如果没有会报错。如果之前没有用pfs -C disk mkfs nvme1n1
格式化此盘,也会报错。如果没有错误,就进入了下一步:
上面的配置中,保持默认,点下一步即可:
上面的配置中,保持默认,点提交
按钮就可以创建PolarDB高可用集群了:
如果上面的信息中没有报错,PolarDB集群就创建成功了。
我们到CLup的数据库列表界面中,选中PolarDB集群中的主库:
点psql
按钮,就在web界面用psql登陆的此主库:
在上面界面中我们输入select * from pg_stat_replication
检查流复制是否正常。
如果正常说明搭建的PolarDB高可用集群没有问题
到WEB界面中的HA管理
界面中,点上线
,让高可用集群进入正常的工作状态:
集群上线后,当虚拟机故障后,会自动切换主库。
到主库的机器clup1上运行命令ip a
看虚拟VIP是否挂载过来了:
[root@clup1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:17:2d:7c brd ff:ff:ff:ff:ff:ff
inet 172.16.195.157/20 brd 172.16.207.255 scope global dynamic eth0
valid_lft 315348643sec preferred_lft 315348643sec
inet 172.16.192.201/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe17:2d7c/64 scope link
valid_lft forever preferred_lft forever
可以看到虚拟IP地址172.16.192.201挂载到这台机器上了。
3. 使用测试
3.1 手工切换测试
当前主库是在clup1上,只读节点是在clup2上,我们可以把主库切换到clup2上,让clup1变成只读节点,方法如下:
在WEB管理界面中:HA集群->HA管理,选中要操作的集群,点详情
:
进入集群的详情页中:
点上面界面中的切换,弹出是否切换对话框:
点确定后就把开始切换的动作:
等切换完成,主库切换到clup2机器上了,我们到clup2机器上,可以看到虚拟IP也切换到此机器了:
[root@clup2 polarAll]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:0c:cc:8e brd ff:ff:ff:ff:ff:ff
inet 172.16.195.155/20 brd 172.16.207.255 scope global dynamic eth0
valid_lft 315347507sec preferred_lft 315347507sec
inet 172.16.192.201/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe0c:cc8e/64 scope link
valid_lft forever preferred_lft forever