一、背景介绍
自从阿里于2010年发动了IOE运动,2013年因美国一起安全事件,将去IOE重要性重新推上另一个高度。政府部门、银行、电信行业、制造业等各类企业纷纷进行各自的去IOE试点。近些年国内数据库软件越来越成熟,数据库国产化成了热门话题。企业都开始选择成熟国产数据库软件来国产化,让自己的业务数据库不再对现有的数据库软件有更强的依赖性。
本次某省移动信息技术部门挑选了一个业务系统做国产化数据库试点上线,最终选用了高度兼容Oracle的阿里云Polardb-O数据库。此次国产化试点上线本人有幸重度参与项目其中。接下来的分享会为各位读者精心挑选阿里云Polardb-O数据库运维场景并续集的形式来介绍, 高可用部署、软件版本升级、功能维护性测试、高可用测试、日常巡检、性能监控、应急演练、应急保障、备库与恢复、备份策略、Polardb常见问题等常见场景。
二、数据库系统规划
本方案高可用部署采用阿里云Poardb-O 11.2版本部署搭建1主1备高可用集群。主备节点之间采用流复制将pg_wal日志文件进行主备数据库实时同步,确保主从节点数据一致性。同时通过 Cluster Mangaer集群管控软件来管理主从数据库节点,实现主备库之间能自动与手动切换,确保主备数据库切换数据不丢失情况,还能提供数据库高可用服务。
2.1 主机信息
2.2 网卡配置需求
考虑到备份、高可用方面的需要,建议万兆网及以上。
2.3 架构图
2.4 安装部署规划
三、 基础软件部署
3.1 环境准备
1 关闭OS透明大页
# 通过参数关闭大页 echo never > /sys/kernel/mm/transparent_hugepage/enabled echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local # 验证是否关闭了透明大页 grep HugePages_Total /proc/meminfo cat /proc/sys/vm/nr_hugepages |
2 内核参数调优
修改内核参数谁的 /etc/sysctl.conf ,增加以下内容后,执行 sudo sysctl -p 生效。
vm.dirty_expire_centisecs=3000 net.ipv4.tcp_synack_retries=2 net.core.rmem_default=262144 vm.dirty_background_bytes=409600000 net.core.wmem_default=262144 vm.mmap_min_addr=65536 vm.overcommit_ratio=90 kernel.shmmni=819200 net.core.rmem_max=4194304 vm.dirty_writeback_centisecs=100 fs.file-max=76724600 net.core.somaxcnotallow=4096 fs.aio-max-nr=1048576 net.ipv4.tcp_max_tw_buckets=262144 vm.swappiness=0 fs.nr_open=20480000 net.ipv4.tcp_fin_timeout=5 net.ipv4.ip_local_port_range=40000 65535 net.ipv4.tcp_keepalive_probes=3 net.ipv4.tcp_mem=8388608 12582912 16777216 kernel.shmmax = 329853488332 kernel.shmall=80530636 kernel.shmmni = 4096 kernel.msgmax = 65536 kernel.msgmni = 2005 kernel.msgmnb = 65536 kernel.sem=4096 2147483647 2147483646 512000 net.ipv4.tcp_keepalive_intvl=20 net.ipv4.tcp_keepalive_time=60 vm.overcommit_memory=0 net.ipv4.tcp_syncookies=1 net.ipv4.tcp_max_syn_backlog=4096 net.ipv4.tcp_timestamps=1 net.ipv4.tcp_rmem=8192 87380 16777216 net.ipv4.tcp_wmem=8192 65536 16777216 net.core.wmem_max=4194304 vm.dirty_ratio=80 net.core.netdev_max_backlog=10000 vm.zone_reclaim_mode=0 net.ipv4.tcp_tw_reuse=1 vm.nr_hugepages=192000 vm.nr_overcommit_hugepages=1000000 vm.overcommit_memory = 2 |
创建 /etc/security/limits.d/polardb_limits.conf ,内容如下:
* soft nofile 655360 * hard nofile 655360 * soft nproc 655360 * hard nproc 655360 * soft memlock unlimited * hard memlock unlimited * soft core unlimited * hard core unlimited |
3 关闭防火墙和selinux
-- 关闭防火墙 systemctl stop firewalld systemctl disable firewalld -- 关闭 selinux vi /etc/selinux/config SELINUX=disabled -- 修改为disabled |
4 创建polardb用户和组
groupadd polardb;useradd -g polardb polardb echo " 密码 " | passwd polardb --stdin |
5 设置polardb用户使用sudo权限
1 先查看系统是否安装sudo,可以使用命令 rpm -qa sudo 查看,若没有安装,可以使用yum安装 yum -y install sudo
#rpm -qa sudo sudo-1.8.6p7-16.el7.x86_64 |
2、把polardb用户加入wheel组,加入此组才有sudo权限
#usermod -aG wheel polardb # id polardb uid=1002(polardb) gid=1005(polardb) groups=1005(polardb),10(wheel) |
3 、把如下 polardb用户加入配置文件/etc/sudoers
polardb ALL=(ALL) NOPASSWD: ALL |
4 、远程sudo ssh 开启( 这一项特别注意不操作会影响后面节点加入 CM )
sudo sed -i 's/Defaults requiretty/#Defaults requiretty/g' /etc/sudoers sudo cat /etc/sudoers | grep requiretty |
3.2 安装polardb软件
这里软件包是用 rpm 二进制方式安装
s udo rpm -ivh t-polarstore-pfsd-san-1.1.41-20200830160257.alios7.x86_64.rpm sudo rpm -ivh PolarDB-O-0200-2.0.0-20200902034114.alios7.x86_64.rpm |
3.3 配置polardb用户环境变量
为 polardb 用户配置环境变量,切换 polardb 用户,在 .bash_profile 文件中添加如下内容,最后使用命令 source .bash_profile 生效环境变量。
3.4 安装与配置PFS软件
PFS 文件系统用于存储 Polardb-O 数据库数据,本方案提供了四块 sd* 裸盘,采集 LVM 磁盘管理方式来管理这 4 块盘,后续磁盘扩容直接使用 LVM 扩容,创建逻辑卷方式用于 PFS 磁盘配置。这里详细描述如何裸盘如何采用 LVM 来创建逻辑卷,详细配置过程请参考方案《 Polardb-O linux LVM 逻辑卷管理配置》。 这里以创建好的逻辑卷 /vda/data 为例来配置 PFS 文件系统。配置安装 PFS 时需要占用名称为 $PFSDISK 的设备。在安装过程中过程中会格式化该设备,如果 /dev/$PFSDISK 已经挂载过了,要 umount 该设备。依次执行以下命令进行初始化:
1. 以 polardb 用户登录,执行以下命令,格式化 $PFSDISK 设备 sudo /usr/local/bin/pfs -C disk mkfs -u 30 -l 1073741824 -f $PFSDISK 2. 等待一段时间,回显输出 pfs mkfs succeeds! 后,执行以下命令,启动 PFS 服务 sudo /usr/local/polarstore/pfsd/bin/start_pfsd.sh -p $PFSDISK 3. 执行以下命令,创建 PFS 的数据库目录 sudo /usr/local/bin/pfs -C disk mkdir $PFSDIR |
3.5 配置polardb数据库
3.5.1 初始化数据库集群
PolarDB-O 在数据库启动之前需要执行初始化数据库集群,请用 polardb 用户登录,执行如下初始化数据库命令:
initdb -D $PGDATA -E UTF8 --locale=C -U polardb |
3.5.2 初始化PFS数据
如下命令请用 polardb 用户操作,下面命令用途是将本地 $PGDATA 下面的数据拷贝到 PFS 磁盘上。后续数据库加载直接读写 PFS 磁盘文件。
sudo /usr/local/polardb_o_current/bin/polar-initdb.sh $PGDATA/ $PFSDIR/ disk |
3.5.3 调整参数文件
初始化数据库集群后,数据库的参数文件 postgresql.conf 文件中都是默认参数,用户可以根据自身需要进行修改,如下以内存 100 规格为例,需要修改的核心配置参数如下:
参数名 | 参数值 | 说明 |
autovacuum_max_workers | 8 | 指定同时运行的 最大的 autovacuum 进程,默认为3 个。 |
autovacuum_work_mem | 8G | 每个worker 可使用的最大内存数 |
effective_cache_size | 220GB | 提供可用于磁盘高速缓存的内存量的估计值 |
maintenance_work_mem | 4GB | 用于维护任务的内存设置。默认值为64MB 。 |
max_connections | 36100 | 数据库最大连接数 |
max_parallel_maintenance_workers | 16 | 支持内建的过程使用并行的方式工作,例如建立索引,默认设置为2 |
max_parallel_workers | 32 | 数据库允许的最大并行进程数 |
max_parallel_workers_per_gather | 24 | 支持并行的查询使用的线程数 |
max_sync_workers_per_subscription | 32 | 每个订阅者的最大同步模式的工作线程数 |
max_wal_size | 128GB | 在自动WAL 检查点使得WAL 增长到最大尺寸。 |
min_wal_size | 64GB | 只要WAL 磁盘使用率低于这个设置,旧的WAL 文件总数被回收,以供将来检查点使用 |
shared_buffers | 220GB | 数据库服务使用的共享内存缓冲区 |
wal_buffers | 16MB | 将其WAL (预写日志)记录写入缓冲区,然后将这些缓冲区刷新到磁盘 |
work_mem | 64MB | 每个进程可以使用的工作内存空间 |
特别注意:
如果在修改 Polardb 数据库参数文件 postgresql.conf 之前启动过数据库,请先确认文件 $PGDATA/polar_node_static.conf 是否存在,若存在请将其 $PGDATA/polar_node_static.conf 文件删除后再启动数据库,否则会影响 Polardb-O 数据库正常启动。
为了实现其他机器对 PolarDB for O 数据库的访问,还需要修改访问控制文件,即 pg_hba.conf ,一般是放开所有的 ipv4 的访问,尾部添加如下配置:
vi $PGDATA/pg_hba.conf host all all 0.0.0.0/0 md5 host replication all 0.0.0.0/0 md5 |
3.5.4 启停数据库软件
在修改完配置文件之后, polardb 用户可以执行命令如下,启动数据库:
pg_ctl start -D $PGDATA pg_ctl stop -D $PGDATA |
3.6 检查数据库安装
3.6.1 数据库检查
数据库启动之后,使用 polardb 用户可以通过 PolarDB-O 内核二进制包中自带的 psql 客户端进行连通测试,执行如下命令:
psql -h$PGDATA -p$PGPOR T -c “select 1” psql -h$PGDATA -p$PGPORT -c"select version()" |
3.6.2 服务进程检查
数据库启动成功之后,会在数据库目录下生成一个 postmaster.pid ,其中第一行是 PolarDB forO 守护进程 pid ,用户可以通过 ps -a|grep 守护进程 pid 检查 PolarDB-O 进程情况,如需要检查 polar-postgres 、logger 、checkpoin ter 、 walwriter 、 autovacuum … 等进程
四、Polardb主备高可用部署安装
4.1 初始化主节点
初化主节点需要进行如下操作:
主库初始化操作需要完成以上第三章节的3.2~3.6章节内容。
4.2 创建主库流复制账号
使用 polardb 用户可以通过 psql 客户端创建流复制用户 。
psql -h$PGDATA -p$PGPORT -c"create user replicator password ' 密码 ' superuser; " |
4.3 备库初始化
初化化备节点需要进行如下操作:
1、对软硬件环境进行安装配置,请完成第3章节,3.1环境准备、3.2polardb-O数据库软件安装、3.3配置用户环境、3.4配置安装PFS。
2、在备份执行pg_basebackup命令,使用主库数据目录和PFS初始化备库数据目录。(注意$PGDATA目录不能提前创建,只创建前缀目录/app)
polar_basebackup -h< 主库 IP> -p5432 -U replicator -D $PGDATA --polardata=$PFSDIR --polar_storage_cluster_name=disk --polar_disk_name=$PFSDISK --polar_host_id=2 -X stream --progress --write-recovery-conf -v |
3、修改备库postgresql.conf文件中的参数 $PFSDISK 替换成 PFS 实际文件目录, $PFSIR 替换成实际的设备盘名称
polar_hostid = 2 polar_disk_name = $PFSDISK polar_datadir = $PFSDIR polar_storage_cluster_name = 'disk' |
4、 启动和检查备库节
点 启动与检查备节点可验证数据库是否连接成功。具体操作如下:
pg_ctl -c start -D $PGDATA psql -h$PGDATA -p$PGPORT |
如果能连通,则证明数据库安装成功,并且启动成功。
4.4 检查主库流复制状态
备节点启动之后,可使用psql 连接主节点,检查流复制状态。在主库使用如下sql 确认流复制建立成功:
psql -h$PGDATA -p$PGPORT -c"select * from pg_stat_replication;" |
如果看到standby1 节点建立的流复制节点,则说明主备搭建成功。
4.5 cluster manager 集群管控部署
4.5.1 CM主机初始化配置
安装 CM 软件前需要对 CM 主机进程操作系统预配置准备,请参考第 三 章节,配置完成 3.1 小节下面的环境准备。
4.5.2 集群节点主机互信关系创建
CM 需要远程管理主备节点,需要打通CM 到主备两台主机之间户型关系。这里统一用polardb 用户来建立户信关系,polardb 用户执行如下命令
ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub polardb 节点 1 ssh-copy-id -i ~/.ssh/id_rsa.pub polardb 节点 2 # 测试互信关系是否配置好,执行如下命令不需要输密码,说明互信已打通。 ssh polardb 节点 1 date;ssh polardb 节点 2 date; |
4.5.3 CM软件安装
在cm 节点上安装cluster_manager ,如下所示:
rpm -ivh polardb_cluster_manager-1.0.0-1.x86_64.rpm |
4.5.4 CM服务配置
1 、配置探针用户
在主库主机上创建aurora 探测用户:
/usr /local/polardb_o_current/bin/createuser -p $PGPORT -h $PGDATA --login aurora -P -s # 这里密码配置为“ 密码 ” |
2 、创建配置文件
在CM 服务器上面,使用polardb 用户创建一个配置目录
mkdir -p /app/polardb_cluster_manager/ /conf #polardb_cluster_manager.conf 文件中添加如下内容: vi /app/polardb_cluster_manager/ conf/polardb_cluster_manager.conf { "work_mode":"PolarPure", "consensus":{ "port":5001 }, "account_info":{ "aurora_user":"aurora", "aurora_password":" 密码 ", "replica_user":"replicator", "replica_password":" 密码 " }, "cluster_info":{ "port":5000 } } |
4.5.5 CM服务管理
1、 启动服务
在CM 主机上使用polardb 用户启动CM 服务
/usr/local/polardb_cluster_manager/bin/polardb_cluster_manager_control.py /app/polardb_cluster_manager star |
2、 停止服务
/usr/local/polardb_cluster_manager/bin/polardb_cluster_manager_control.py /app/polardb_cluster_manager stop |
3、 查看服务
/usr/local/polardb_cluster_manager/bin/polardb_cluster_manager_control.py /app/polardb_cluster_manager status |
4.6 CM集群管理
4.6.1 配置数据库节点信息
在Cluster Manager 节点将主库节点加入CM管控
curl -H "Content-Type:application/json" -X POST --data "{\"user\":\"polardb\",\"dataPath\":\"/app/polardb_data\",\"ip\":\" < 主库 IP>\",\"port\":\"5432\",\"type\":\" Master\",\"storage_type\":\"local_ssd\",\"sync\":\"SYNC\"} " |
在 Cluster Manager 节点将备库节点加入CM管控
curl -H "Content-Type:application/json" -X POST --data "{\"user\":\"polardb\",\"dataPath\":\"/app/polardb_data\",\"ip\":\" < 备 IP>\",\"port\":\"5432\",\"type\":\" Standby \",\"storage_type\":\"local_ssd\",\"sync\":\"SYNC\"}" |
4.6.2 配置HA VIP地址
在高可用方式下,对外提供数据库服务器的主机除了有一个真实 IP 外还有一个虚拟 IP ,使用这两个 IP 都可以连接到该主机,所有项目中数据库链接配置的都是到虚拟 IP ,当服务器发生故障无法对外提供服务时,动态将这个虚 IP 切换到备用主机。
curl -H "Content-Type:application/json" -X POST --data "{\"vip\":\" 地址 >\",\"mask\":\"255.255.255.0\",\"interface\":\"team0\"} " |
4.6.3 集群状态检查
使用如下命令可以检查主备库在活状态,VIP 漂流具体节点。
curl -H "Content-Type:application/json"
4.6.4 手动切换主从关系
在CM 主机上通过如下命令可以完成手动主备切换
curl -H "Content-Type:application/json" -X POST --data "{\"from\":\" < 主库 IP>:5432\",\"to\":\"< 备库 IP>:5432\"}" |
五、总结
经过此次国产化数据库项目实践经验总结,我们在软件功能性测试、业务改造和高可用等功能场景上花了很多时间来研究与测试,测试过程中碰到了很多坑,也积累了很多国产化数据库经验,避免国产化数据库新手踩坑,有兴趣的朋友可以一起来交流与探讨。
curl -H "Content-Type:application/json" -X POST --data "{\"from\":\" < 主库 IP>:5432\",\"to\":\"< 备库 IP>:5432\"}" |