Klustron集群弹性扩容
Klustron集群弹性扩容
注意:
如无特别说明,文中的版本号可以使用任何已发布版本的版本号代替。所有已发布版本详见:Release_notes
本文目标:
主要内容是介绍如何在Klustron数据库中创建集群、在集群数据库创建分区表、集群中增加存储shard、将数据库中的分区表部分分区扩容到新增加的shard上、最后在数据库中查看扩容后分区表的所有分区分布情况;以及在集群中扩容计算节点。所有的测试都是通过XPanel控制台和PostgreSQL客户端连接集群完成。
本文使用的服务器都经过了初始化(bootstrap),如果要使用一台全新的没有为Klustron集群做过初始化的服务器,则需要参考bootstrap手册.
XPanel服务安装的服务器IP是192.168.56.112。在能访问192.168.56.112的机器上打开浏览器,输入地址:http://192.168.56.112:18080/KunlunXPanel/#/login?redirect=%2Fdashboard
初次登录用户名和密码是:super_dba/super_dba,初次登陆需要修改super_dba密码。
登录后首页显示如下:
01 创建集群
1.1 点击“集群管理”、“集群列表”,集群列表界面点击“新增”按钮。
1.2 添加集群参数如下图:
1.3 点击“确认”,查看创建集群任务的完成情况。
1.4 所有状态都是“运行中”, 集群创建完成。
02 准备试验数据
2.1 打开一个连向集群kunlundb_cluster(计算节点IP:192.168.56.112)的ssh终端窗口,以kunlun用户身份登陆该主机,然后用PostgreSQL客户端连接集群数据库。
[root@kunlun1 ~]# su - kunlun
[kunlun@kunlun1 ~]$ source /kunlun/env.sh
[kunlun@kunlun1 ~]$ psql -h 192.168.56.112 -p 47001 -U abc postgres
2.2 在数据库中创建测试表,并插入测试数据。
postgres=# create table prod_part (id int primary key, name char(8)) partition by hash(id);
postgres=# create table prod_part_p1 partition of prod_part for values with (modulus 6, remainder 0);
postgres=# create table prod_part_p2 partition of prod_part for values with (modulus 6, remainder 1);
postgres=# create table prod_part_p3 partition of prod_part for values with (modulus 6, remainder 2);
postgres=# create table prod_part_p4 partition of prod_part for values with (modulus 6, remainder 3);
postgres=# create table prod_part_p5 partition of prod_part for values with (modulus 6, remainder 4);
postgres=# create table prod_part_p6 partition of prod_part for values with (modulus 6, remainder 5);
postgres=# insert into prod_part select i,'text'||i from generate_series(1,300) i;
2.3 查看数据的分布情况。
postgres=# analyze prod_part;
postgres=# select relname table_name ,reltuples num_rows, name shard_name from pg_class t1,pg_shard t2 where t1.relshardid = t2.id and t1.reltype<>0 and t1.relname like 'prod_part%';
从上面可以看到分区表prod_part中,prod_part_p1、prod_part_p2、prod_part_p3、prod_part_p4、prod_part_p5和prod_part_p6所有的分区都存放在存储节点shard_1上。
03 集群扩容存储shard节点
3.1 增加存储 shard 节点
3.1.1 在集群列表信息,对需要增加存储shard节点的集群点击“设置”或“+”按钮。
3.1.2 在“集群设置”中点击“shard列表”,然后点击“添加shard”按钮。
3.1.3 添加shard节点参数如下图。
3.1.4 点击“确认”,查看添加shard节点任务的完成情况。
3.1.5 检查存储shard节点shard_2已添加到集群。
3.2 扩容存储 shard 节点
本节用于模拟在扩容运行期间,被搬迁的表仍然在被写入的情况下,Klustron仍然可以正确的搬迁这些表,并且把搬迁期间的数据更新也同步到目的地shard的表中。用户实际做扩容时不需要做本节的操作。
3.2.1准备一个python脚本pyprod.py,在集群做存储shard节点扩容的同时对集群数据库持续操作,pyprod.py脚本内容如下:
import psycopg2.extras
from psycopg2 import DatabaseError
import time
import datetime
conn = psycopg2.connect(database='postgres',user='abc',
password='abc',host='192.168.56.112',port='47001')
select_sql = ''' select * from prod_part where id=%s; '''
i = 1
try:
while (i <= 1000) :
cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
cursor.execute(select_sql,[i])
res = cursor.fetchall()
print(dict(res[0]))
current_datetime = datetime.datetime.now()
print("当前日期和时间:", current_datetime)
if (i == 1000) :
i = 1
else :
i = i+1
cursor.close()
conn.commit()
time.sleep(1)
except (Exception, DatabaseError) as e:
print(e)
input('Press any key and Enter to continue ~!')
conn = psycopg2.connect(database='postgres', user='abc',
password='abc', host='192.168.56.112', port='47001')
select_sql = ''' select * from prod_part where id=%s; '''
while (i <= 1000):
cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
cursor.execute(select_sql, [i])
res = cursor.fetchall()
print(dict(res[0]))
current_datetime = datetime.datetime.now()
print("当前日期和时间:", current_datetime)
if (i == 1000):
i = 1
else:
i = i + 1
cursor.close()
conn.commit()
time.sleep(1)
finally:
conn.close()
3.2.2运行pyprod.py脚本,持续对数据库进行操作
[kunlun@kunlun1 scripts]$ python pyprod.py
3.2.3 在集群列表信息栏,对需要做shard之间表分区转移的集群,点击“扩容”按钮。
3.2.4 在集群扩容“选择数据库”的下拉列表选择需要扩容的数据库,然后点击 “确定”按钮。例如本示例“postgres”数据库。
3.2.5 选择要从shard_1要移动到shard_2上的表,这里选择了prod_part_p4、prod_part_p5、prod_part_p6三张分区表;在是否保留原表选择“否”,目标shard选择“shard_2”,然后点击“提交”。
3.2.6 在集群扩容确认信息界面点击“确认”按钮,开始进行集群扩容。
3.2.7 扩容成功。
3.2.7在扩容的过程中,当移动的表是应用程序正在操作的表,会报被操作的表不存在,会有一个短暂的时间不可访问,当移动完成后,应用程序可以继续访问操作这些表。
3.3 扩容后数据校验
3.3.1 打开一个连向集群kunlundb_cluster(计算节点IP:192.168.56.112)的ssh终端窗口,以kunlun用户身份登陆该主机,然后用PostgreSQL客户端连接集群,执行数据查询指令。
[root@kunlun1 ~]# su - kunlun
[kunlun@kunlun1 ~]$ source /kunlun/env.sh
[kunlun@kunlun1 ~]$ psql -h 192.168.56.112 -p 47001 -U abc postgres
3.3.2 查看数据的分布情况。
postgres=# analyze prod_part;
postgres=# select relname table_name ,reltuples num_rows, name shard_name from pg_class t1,pg_shard t2 where t1.relshardid = t2.id and t1.reltype<>0 and t1.relname like 'prod_part%';
从上面可以看到分区表prod_part中,prod_part_p1、prod_part_p2和prod_part_p3分区存放在存储节点shard_1上,而prod_part_p4、prod_part_p5和prod_part_p6分区已扩容存放到存储节点shard_2上。
完成集群存储shard节点的扩容。
04 集群扩容计算节点
4.1 在集群列表信息,对需要增加计算节点的集群点击“设置”按钮。
4.2 在“集群设置”中点击“计算节点列表”,然后点击“添加计算节点”按钮。
4.3 添加计算节点参数如下图。
4.4 点击“确认”,查看添加计算节点任务的完成情况。
4.5 检查计算节点列表,新的计算节点已添加到集群。
4.6打开一个连向集群kunlundb_cluster(计算节点IP:192.168.56.113)的ssh终端窗口,以kunlun用户身份登陆该主机,然后用PostgreSQL客户端连接集群数据库(通过新添加的计算节点(192.168.56.113)访问数据库)。
[root@kunlun2 ~]# su - kunlun
[kunlun@kunlun2 ~]$ source /kunlun/env.sh
[kunlun@kunlun2 ~]$ psql -h 192.168.56.113 -p 47001 -U abc postgres
postgres=# select relname table_name ,reltuples num_rows, name shard_name from pg_class t1,pg_shard t2 where t1.relshardid = t2.id and t1.reltype<>0 and t1.relname like 'prod_part%';
完成集群计算节点的扩容。