PostgreSQL码农集散地

数据库扩容预算被砍半,扛不住压力,大神们给支个招吧,谢谢啦

参考文档点击文末阅读原文打开; 推荐《最好的PostgreSQL学习镜像》;


数据库采购预算被砍半,年终奖都发不出,还想加只读实例?可是不加业务扛不住啊,咋办哦

系列请戳: 🏆《穷鬼玩PolarDB RAC系列》🏆

别慌,告诉领导,都2025了,增加只读实例不需要加存储!预算砍一半没关系,买计算节点服务器就可以,多个计算服务共用一份数据,不用再购买存储。

本篇文章介绍一下如何把“本地存储单机实例”转换为“共享存储集群实例”? 实验环境依赖《在Docker容器中用loop设备模拟共享存储》, 如果没有环境, 请自行参考以上文章搭建环境.

本文还依赖如下文章:

  • 《如何搭建PolarDB容灾(Standby)节点》
  • 《激活容灾(Standby)节点》
  • 《将“共享存储实例”转换为“本地存储实例”》

DEMO

在pb3容器进行演示. 假设你已完成《将“共享存储实例”转换为“本地存储实例”》的操作. 现在pb3上的实例为本地盘实例, 共享数据放在本地盘中.

预览当前目录结构:

# 共享数据放在本地盘中    
postgres@a8d5e5dc6b96:~/standby$ cd /data/standby/shared_data/  
postgres@a8d5e5dc6b96:/data/standby/shared_data$ ll  
total 0  
drwx------ 13 postgres postgres  416 Dec 24 15:58 ./  
drwxr-xr-x  3 postgres postgres   96 Dec 24 15:48 ../  
drwxr-xr-x  6 postgres postgres  192 Dec 24 15:55 base/  
drwxr-xr-x 63 postgres postgres 2016 Dec 24 15:55 global/  
drwxr-xr-x  2 postgres postgres   64 Dec 24 15:55 pg_commit_ts/  
drwxr-xr-x  3 postgres postgres   96 Dec 24 15:55 pg_logindex/  
drwxr-xr-x  4 postgres postgres  128 Dec 24 15:55 pg_multixact/  
drwxr-xr-x  2 postgres postgres   64 Dec 24 15:55 pg_replslot/  
drwxr-xr-x  2 postgres postgres   64 Dec 24 15:55 pg_tblspc/  
drwxr-xr-x  2 postgres postgres   64 Dec 24 15:55 pg_twophase/  
drwxr-xr-x  8 postgres postgres  256 Dec 24 15:55 pg_wal/  
drwxr-xr-x  3 postgres postgres   96 Dec 24 15:55 pg_xact/  
drwxr-xr-x  6 postgres postgres  192 Dec 24 15:55 polar_fullpage/  

# 本地实例放在本地目录中    
$ ls ~/standby    
backup_label.old  current_logfiles  pg_dynshmem    pg_log       pg_multixact  pg_serial     pg_stat_tmp  PG_VERSION         polar_fullpage        polar_shmem_stat_file  postmaster.opts    
backup_manifest   global            pg_hba.conf    pg_logical   pg_notify     pg_snapshots  pg_subtrans  pg_xact            polar_rel_size_cache  postgresql.auto.conf   postmaster.pid    
base              pg_commit_ts      pg_ident.conf  pg_logindex  pg_replslot   pg_stat       pg_tblspc    polar_cache_trash  polar_settings.conf   postgresql.conf    

设计目标目录结构

# 共享数据放在pfs /nvme2n1/shared_data 目录中    

# 本地实例还是放在本地 ~/standby 目录中    

1、准备工作

  • 在pb3容器内准备PFS二进制. 已完成
  • 在宿主机挂载目录中dd共享盘/data/VirtualDisk_standby.img. 已完成
  • 使用loop将该文件模拟为块设备 . 已完成
  • 软链到/dev/nvme2n1. 已完成

以上步骤不知道如何操作的话可以参考《如何搭建PolarDB容灾(Standby)节点》

2、把/dev/nvme2n1格式化为pfs文件系统

sudo pfs -C disk mkfs -f nvme2n1      

现在这个共享盘里什么都没了:

$ pfs ls /nvme2n1/  
  File  1     4194304           Tue Dec 24 16:27:16 2024  .pfs-paxos  
  File  1     1073741824        Tue Dec 24 16:27:18 2024  .pfs-journal  
total 2105344 (unit: 512Bytes)  

3、启动pfsd

sudo /usr/local/polarstore/pfsd/bin/start_pfsd.sh -p nvme2n1 -w 1      

4、停库

pg_ctl stop -m fast -D ~/standby    

5、把本地共享数据目录的内容拷贝到pfs内

pfs cp -r /data/standby/shared_data /nvme2n1/   

拷贝成功后, 查看一下pfs内的文件位置

postgres@a8d5e5dc6b96:/data$ pfs ls /nvme2n1/  
  File  1     4194304           Tue Dec 24 16:27:16 2024  .pfs-paxos  
  File  1     1073741824        Tue Dec 24 16:27:18 2024  .pfs-journal  
   Dir  1     1408              Tue Dec 24 16:29:41 2024  shared_data  
total 2105344 (unit: 512Bytes)  
postgres@a8d5e5dc6b96:/data$ pfs ls /nvme2n1/shared_data/  
   Dir  1     256               Tue Dec 24 16:29:25 2024  pg_multixact  
   Dir  1     768               Tue Dec 24 16:29:35 2024  pg_wal  
   Dir  1     0                 Tue Dec 24 16:29:38 2024  pg_commit_ts  
   Dir  1     512               Tue Dec 24 16:29:41 2024  polar_fullpage  
   Dir  1     0                 Tue Dec 24 16:29:41 2024  pg_replslot  
   Dir  1     0                 Tue Dec 24 16:29:41 2024  pg_tblspc  
   Dir  1     0                 Tue Dec 24 16:29:41 2024  pg_twophase  
   Dir  1     128               Tue Dec 24 16:29:41 2024  pg_xact  
   Dir  1     128               Tue Dec 24 16:29:41 2024  pg_logindex  
   Dir  1     7808              Tue Dec 24 16:29:41 2024  global  
   Dir  1     512               Tue Dec 24 16:29:42 2024  base  
total 0 (unit: 512Bytes)  

6、修改~/standby内配置文件

postgresql.conf

echo"    
huge_pages=off    
port=5432    
polar_hostid=3    
polar_enable_shared_storage_mode=on    
polar_disk_name='nvme2n1'  # 改了  
polar_storage_cluster_name='disk'  # 改了   
polar_datadir='/nvme2n1/shared_data/'  # 改了   
polar_vfs.localfs_mode=off  # 改了   
shared_preload_libraries='\$libdir/polar_vfs,\$libdir/polar_worker'    
logging_collector=on    
log_line_prefix='%p\t%r\t%u\t%m\t'    
log_directory='pg_log'    
listen_addresses='0.0.0.0'    
max_connections=200    
# 下面几个参数解决replica不能promote的问题, 因为RO依赖logindex.    
polar_logindex_mem_size=64MB    
polar_xlog_queue_buffers=64MB    
polar_xlog_page_buffers=64MB    
# 使用pfs时可以关掉 full page write 和 polar_has_partial_write     
full_page_writes = off    
polar_has_partial_write = off    # 改了  
"
 >> ~/standby/postgresql.conf      

7、启动实例

pg_ctl start -D ~/standby    

将“本地存储实例”转换为“共享存储实例”完成

$ psql    
psql (PostgreSQL 15.10 (PolarDB 15.10.2.0 build d4f5477d debug) on aarch64-linux-gnu)    
Type "help"forhelp.    

postgres=# show polar_datadir;  
     polar_datadir       
-----------------------  
 /nvme2n1/shared_data/  
(1 row)  

postgres=# \dt  
         List of relations  
 Schema | Name  | Type  |  Owner     
--------+-------+-------+----------  
 public | t     | table | postgres  
 public | t1    | table | postgres  
 public | t2    | table | postgres  
 public | t3    | table | postgres  
 public | t_new | table | postgres  
 public | tbl   | table | postgres  
(6 rows)  

postgres=# create table test(id int);  
CREATE TABLE  
postgres=# insert into test values (1),(2);  
INSERT 0 2  
postgres=# select * from test;  
 id   
----  
  1  
  2  
(2 rows)  

参考

《穷鬼玩PolarDB RAC一写多读集群系列 | 在Docker容器中用loop设备模拟共享存储》

《穷鬼玩PolarDB RAC一写多读集群系列 | 如何搭建PolarDB容灾(Standby)节点》

《穷鬼玩PolarDB RAC一写多读集群系列 | 共享存储在线扩容》

《穷鬼玩PolarDB RAC一写多读集群系列 | 计算节点 Switchover》

《穷鬼玩PolarDB RAC一写多读集群系列 | 在线备份》

《穷鬼玩PolarDB RAC一写多读集群系列 | 在线归档》

《穷鬼玩PolarDB RAC一写多读集群系列 | 实时归档》

《穷鬼玩PolarDB RAC一写多读集群系列 | 时间点恢复(PITR)》

《穷鬼玩PolarDB RAC一写多读集群系列 | 读写分离》

《穷鬼玩PolarDB RAC一写多读集群系列 | 主机全毁, 只剩共享存储的PolarDB还有救吗?》

《穷鬼玩PolarDB RAC一写多读集群系列 | 激活容灾(Standby)节点》

《穷鬼玩PolarDB RAC一写多读集群系列 | 将“共享存储实例”转换为“本地存储实例”》

文末彩蛋:国产数据库周边生态

当然一款数据库要流行起来, 除了自己要强大, 还离不开生态. 用好周边生态工具, 管理水平战胜90%老司机!!! 下面简单介绍一下国产数据库周边生态.

1、管控软件

鸣嵩(前阿里云数据库总经理 / 研究员)等大佬们创业创办的云猿生, 核心产品是KubeBlocks. 他们的理念是让管理数据库和搭积木一样简单, 如果你要管理很多套并且种类(OLTP\OLAP\NoSQL\KV\TS\MQ等)很多的数据库产品, 推荐首选.

  • https://github.com/apecloud/kubeblocks

PG中文社区核心委员唐成老师的公司乘数开源的Clup, 专用管理PostgreSQL和PolarDB的集群管理软件, 如果你要管理很多套数据库, 推荐选择. 并且Clup还提供了企业版、自研的连接池、分布式存储、一体机、备份平台等, 是企业用户推荐之选.

  • https://www.csudata.com/

若航老司机开源的pigsty, 集成了300多个PG插件的PG集群和PolarDB集群管理软件, 如果你要管理很多套PG或PolarDB数据库, 且对插件有特别多的需求, 推荐选择.

  • https://pigsty.cc/zh/

2、审计监控诊断优化

翟总(曾经是我背后的男人)到海信聚好看后研发的 DBdoctor, 采用ebpf技术, 在对数据库几乎没有影响的情况下实时监控数据库和服务器的各项指标, 发现和诊断问题根因非常方便.

  • https://www.dbdoctor.cn/

天舟老哥的核心产品Bytebase 是位于您和数据库之间的中间件。它是数据库 DevOps 的 GitLab/GitHub,专为开发人员、DBA 和平台工程师打造。

  • https://bytebase.cc/docs/introduction/what-is-bytebase/

PawSQL, SQL优化和诊断产品.  

D-Smart, Oracle老前辈白老大出品, 专注企业级市场, 将业界顶级DBA经验的产品化作品, 产品功能包括数据库监控、诊断、优化等.

  • https://www.modb.pro/db/567140

3、国产数据库IDE

IDE是开发者的必备工具,例如社区有pgAdmin, 国产IDE则可以看看老程序猿达刚老师的DeskUI:

  • https://www.deskui.com

4、数据同步&迁移&备份恢复

NineData, 老领导出去创业做的产品, 产品涵盖了数据同步、迁移、备份、比对、devops、chatDBA等.

  • https://www.ninedata.cloud/home

DSG, 非常老牌的数据库同步迁移企业级产品, 支持各种数据库的异构和同构迁移, 用他们的话说, 没有dsg搞不定的迁移, 比goldengate还牛.

  • https://www.dsgdata.com/

公开课

如果你对PolarDB学习感兴趣可以阅读这个公开课系列:

除了PolarDB还非常值得关注的几款PG栈国产数据库:

  • HaloDB(基于PG兼容PostgreSQL、Oracle、MySQL. http://www.halodbtech.com/ )、
  • IvorySQL(基于开源PG兼容PG、Oracle. https://www.ivorysql.org/zh-cn/ )、
  • ProtonBase(云原生分布式数仓. https://protonbase.com/ )、
  • 成都文武数据库(https://ww-it.cn)

参考文档点击阅读原文获得


感谢关注我的github (https://github.com/digoal/blog) 及视频号:

Image