-
openGauss支持哪些数据库复制模式?
-
openGauss的核心架构特点是什么?
-
openGauss主要针对哪些行业或应用场景设计?
-
openGauss是基于哪个开源数据库项目开发的?
-
背景:因异常断电后opengauss 5.0.0版本,一主两备集群启动失败:报错不是主机,由于当时没有截图,查看日志后发现报错是:尝 试用另外两台机器启动,每台机器都报错自己不是主机,像极了唐僧被妖怪抓走后互相帅锅的猴子哥仨。于是向opengauss交流群里的大佬求助,@半夏提供了一个手动启动的命令: gs_ctl start -D /opt/huawei/install/data/dn -M primary执行的时候提示已经有服务在,建议用restart,于是改为用restart执行。gs_ctl restart -D /opt/huawei/install/data/dn -M primary同时在两台备机上面执行手动启动,模式为standbygs_ctl restart -D /opt/huawei/install/data/dn -M standby 继续:执行完后查看集群状态,仍然是不可用,但是尝试本地连接数据库,是可以连接上了:于 是第一时间用gs_dump命令把数据先导出来了一份,这样最差的情况也可以卸载重装来恢复。但是虽然本地能连上,却不能创建表,是个只读事务(read-only transaction),业务还是不可用,期间还想着把业务代码改成单机版的数据库连接先应付应用,因为只读作罢。业务代码及datastudio工具也都连接不上。起初我还以为是配置文件的问题,检查和确认了postgres.conf及pg_hba.conf的配置。期间还执行过gs_install,以及gs_preinstall,但是install过程提示集群已安装(因未截图所以无法得到确切的提示,大意是已安装)。周一和大佬@半夏连线,检查了互信,互信正常,篇幅起见截图就只截一个服务器的。自动切换失败:cm_ctl switchover -a因为不可读,于是把123服务器的数据库又执行了一次强制升主:cm_ctl set --cmsPromoteMode=PRIMARY_F -I 1执 行后确实改为了Primary,但仍然是不可读,远程也无法连接。后来求助cm的大佬恩哥,恩哥提供了如下断电后需要执行的操作:1. kill掉cm和om的相关进程:gs_ssh -c "pkill -9 om_monitor -U omm; pkill -9 cm_agent -U omm; pkill -9 cm_server -U omm; touch $GAUSSHOME/bin/cluster_manual_start"2. rm掉cmserver下的gstor, dcf_data和bin下面的配置文件:cd $GAUSSLOGcd /opt/huawei/data/cmserver/cm_servergs_ssh -c "rm /opt/huawei/data/cmserver/gstor /opt/huawei/data/cmserver/dcf_data $GAUSSHOME/bin/cluster_dynamic_config -rf"rm掉bin下的集群手动启动:3. gs_ssh -c "rm $GAUSSHOME/bin/cluster_manual_start"周二连线:执行切换启动模式为AUTO:cm_ctl set --cmsPromoteMode=AUTO -I 10. 查看集群状态仍然不可用:于是直接拉恩哥上线:1. 查看dcc日志:cd $GAUSSLOG/cm/dccvim debug/dcc.dlog命令截图:日志截图:看到这个日志后,我提出怀疑是防火墙导致的连接建立失败。于是在三台服务器上都执行了关防火墙的操作(生产环境不建议这样操作,因是测试环境验证问题,所以关掉防火墙,生产环境开放端口白名单)。systemctl stop firewalldsystemctl disable firewalld查询防火墙状态:systemctl status firewalld再查询集群状态,状态即为正常:cm_ctl query -Cvidp紧张焦虑的两天半,问题终于在两位大佬的帮助下得到了解决,趁热打铁流水账先记录下过程,供各位专家同仁指导参考,再次感谢@半夏和恩哥(音)。总 结:影响集群启动的主要有两个因素:1防火墙是否关闭(或者是否打开端口白名单),2删除进程和文件的3步命令,至于手动启动,并不是必须的步骤。3 断电前预先stop集群。附:一些Linux命令总结:gs_ssh -c "ps x"echo $GAUSSHOMEcm_ctl startcm_ctl stopcm_ctl query -Cvidpcd $GAUSSLOGsource .bashrc –加载用户的bash配置文件ps ux
-
opengauss一主一备,使用gs_om -t start启动,主库报错,备库正常,手动执行命令source /home/omm/.bashrc; python3 '/opt/huawei/install/om/script/local/StopInstance.py' -U omm -R /opt/huawei/install/app -t 300 -m fast能正常启动2024-05-02 14:45:06.968159][161375][status][DEBUG]:Successfully obtained the cluster status. [2024-05-02 14:49:26.639321][193027][stop][DEBUG]:Instance information of cluster: ClusterName=dbCluster,AppPath=/opt/huawei/install/app,LogPath=/var/log/omm,ClusterType=single-inst HostName=node1_hostname,backIps=['192.168.111.129'] InstanceId=10001,MirrorId=-3,Host=node1_hostname,Port=0,DataDir=/cm_agent,XlogDir=,SsdDir=,InstanceType=-1,Role=5,ListenIps=['192.168.111.129'],HaIps=[] InstanceId=6001,MirrorId=1,Host=node1_hostname,Port=15400,DataDir=/opt/huawei/install/data/dn,XlogDir=,SsdDir=,InstanceType=0,Role=4,ListenIps=['192.168.111.129'],HaIps=['192.168.111.129'],azName=AZ1 HostName=node2_hostname,backIps=['192.168.111.130'] InstanceId=10002,MirrorId=-3,Host=node2_hostname,Port=0,DataDir=/cm_agent,XlogDir=,SsdDir=,InstanceType=-1,Role=5,ListenIps=['192.168.111.130'],HaIps=[] InstanceId=6002,MirrorId=1,Host=node2_hostname,Port=15400,DataDir=/opt/huawei/install/data/dn,XlogDir=,SsdDir=,InstanceType=1,Role=4,ListenIps=['192.168.111.130'],HaIps=['192.168.111.130'],azName=AZ1. [2024-05-02 14:49:28.878184][193027][stop][DEBUG]:Operating: Stopping. [2024-05-02 14:49:28.878684][193027][stop][DEBUG]:Operating: Stopping. [2024-05-02 14:49:28.878834][193027][stop][LOG]:Stopping cluster. [2024-05-02 14:49:28.879173][193027][stop][LOG]:========================================= [2024-05-02 14:49:49.792435][193027][stop][ERROR]:[GAUSS-53606]: Can not stop the database, the cmd is source /home/omm/.bashrc; python3 '/opt/huawei/install/om/script/local/StopInstance.py' -U omm -R /opt/huawei/install/app -t 300 -m fast, Error: [GAUSS-51400] : Failed to execute the command: source /home/omm/.bashrc; python3 '/opt/huawei/install/om/script/local/StopInstance.py' -U omm -R /opt/huawei/install/app -t 300 -m fast. Error: [FAILURE] node1_hostname: [SUCCESS] node2_hostname:
-
Kettle最早是一个开源的ETL工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。Pentaho Data Integration以Java开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道;可对接包括传统数据库、文件、大数据平台、接口、流数据等数据源;支持ETL数据管道加入机器学习算法。openGuass 5.0.0 的安装openGauss 5.0.0 安装 《基于openEuler 22.03LTS 安装 单机openGauss 5.0.0企业版数据库》2、openGauss 3.1.0 安装《手把手教你安装openGauss 3.1.0》:cid:link_4kettle的安装下载 下载pdi-ce-9.4.0.0-343.zip社区版下载地址:cid:link_0官方文档地址:cid:link_1安装kettle 操作系统:centos7.9(1)先决条件需要64位 Java SE 版本 jave SE 11到18都可以对于 Linux/Ubuntu 安装,还需要安装 libwebkitgtk-1.0-0 才能使 PDI 正常运行。安装一些依赖包yum -y install epel-release yum -y install webkitgtk yum -y install redhat-lsb 下载安装xulrunner:cid:link_3mkdir /root/xulrunner tar jxvf xulrunner-1.9.2.28pre.en-US.linux-x86_64.tar.bz2 cd xulrunner ./xulrunner -register-global (2)解压安装包创建目录并解压mkdir /root/kettle unzip pdi-ce-9.4.0.0-343.zip -d /root/kettle 查看文件启动kettle到图形化界面下执行cd /root/kettle/data-integration ./kitchen.sh ./spoon.sh & 启动过程启动完成配置连接下载jar包 openGauss jar包下载地址:cid:link_2把openGauss-5.0.0-JDBC.tar.gz解压到data-integration/lib下面添加配置 在data-integration/simple-jndi/jdbc.properties加入以下内容##openGauss postgres/type=javax.sql.DataSource postgres/driver=org.opengauss.Driver postgres/url=jdbc:opengauss://192.168.10.10:15400/postgres postgres/user=qmttest postgres/password=qoqoqooq 3. 在图形化中配置 点击connect点击Repository Manager点击 Add点击 Database Repository填写display name点击 Create填写下面内容点击测试连接成功后面依次点击确认和save连接openGauss数据库 点击 connect 、然后选择刚才创建的名称输入默认用户密码:admin/admin点赞2
-
在当今互联网时代,数据成为企业和组织的重要资产。为了更好地管理和分析数据,数据库管理工具起到至关重要的作用。openGauss是一款开源关系型数据库管理系统,提供了高性能、高可用性和可扩展性,它还具有安全性和数据保护的特性,包括数据加密、访问控制和审计等功能,已广泛应用于各个行业。Navicat是一款广泛使用的数据库管理工具,具有直观友好的界面和丰富的功能,可以方便地连接、管理和操作各种类型的数据库。Navicat支持主流的数据库系统,如MySQL、PostgreSQL等。它提供了一个集成的环境,用于管理和操作多个数据库,可以执行数据导入导出、数据同步、查询和报表等功能。Navicat具有直观易用的用户界面和强大的功能,适用于数据库开发人员、管理员和分析师等各种角色。环境准备 openGauss_5.0.0 企业版Navicat 16.0.11openEuler-22.03-LTS-SP2MobaXterm 22.1服务器名称:node0,IP地址:192.168.192.129openGauss服务设置查看数据库启动状态 (1)切换至omm用户[root@node0 ~]# su ommWelcome to 5.10.0-153.12.0.92.oe2203sp2.x86_64System information as of time: Sat Jul 22 04:10:52 PM CST 2023System load: 0.01 Processes: 170 Memory used: 5.5% Swap used: 0% Usage On: 7% IP address: 192.168.192.129 Users online: 1 To run a command as administrator(user "root"),use "sudo ". [omm@node0 root]$(2)查看数据库启动状态[omm@node0 root]$ gs_om -t status --detail [ Cluster State ]cluster_state : Unavailable redistributing : No current_az : AZ_ALL[ Datanode State ]node node_ip port instance state1 node0 192.168.192.129 15400 6001 /opt/huawei/install/data/dn P Primary Manually stopped(3)启动openGauss[omm@node0 root]$ gs_om -t start Starting cluster. ========================================= [SUCCESS] node0 2023-07-22 16:21:31.942 64bb918b.1 [unknown] 139874136903616 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets 2023-07-22 16:21:31.942 64bb918b.1 [unknown] 139874136903616 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets 2023-07-22 16:21:31.945 64bb918b.1 [unknown] 139874136903616 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: Failed to initialize the memory protect for g_instance.attr.attr_storage.cstore_buffers (1024 Mbytes) or shared memory (3301 Mbytes) is larger. ========================================= Successfully started.停止openGaussgs_om -t stop修改pg_hba.conf文件 企业版所在目录:/opt/huawei/install/data/dn[omm@node0 dn]$ pwd /opt/huawei/install/data/dn [omm@node0 dn]$ [omm@node0 dn]$ ll total 5044 drwx------ 6 omm dbgrp 4096 Jul 20 23:49 base -rw------- 1 omm dbgrp 4399 Jul 20 23:48 cacert.pem -rw------- 1 omm dbgrp 72 Jul 22 16:21 gaussdb.state drwx------ 3 omm dbgrp 4096 Jul 22 16:21 global -rw------- 1 omm dbgrp 354 Jul 20 23:49 gs_gazelle.conf -rw------- 1 omm dbgrp 4915200 Jul 20 23:49 gswlm_userinfo.cfg -rw------- 1 omm dbgrp 21016 Jul 20 23:49 mot.conf drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_clog drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_csnlog -rw------- 1 omm dbgrp 0 Jul 22 16:21 pg_ctl.lock drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_errorinfo -rw------- 1 omm dbgrp 4611 Jul 21 23:05 pg_hba.conf -rw------- 1 omm dbgrp 4587 Jul 20 23:49 pg_hba.conf.bak -rw------- 1 omm dbgrp 1024 Jul 20 23:49 pg_hba.conf.lock -rw------- 1 omm dbgrp 1636 Jul 20 23:49 pg_ident.conf drwx------ 4 omm dbgrp 4096 Jul 20 23:49 pg_llog drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_location drwx------ 2 omm dbgrp 4096 Jul 22 16:24 pg_logical drwx------ 4 omm dbgrp 4096 Jul 20 23:49 pg_multixact drwx------ 2 omm dbgrp 4096 Jul 22 16:21 pg_notify drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_replslot drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_serial drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_snapshots drwx------ 2 omm dbgrp 4096 Jul 22 16:25 pg_stat_tmp drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_tblspc drwx------ 2 omm dbgrp 4096 Jul 20 23:49 pg_twophase -rw------- 1 omm dbgrp 4 Jul 20 23:49 PG_VERSION drwx------ 3 omm dbgrp 4096 Jul 20 23:49 pg_xlog -rw------- 1 omm dbgrp 36058 Jul 21 23:07 postgresql.conf -rw------- 1 omm dbgrp 36083 Jul 20 23:49 postgresql.conf.guc.bak -rw------- 1 omm dbgrp 1024 Jul 20 23:49 postgresql.conf.lock -rw------- 1 omm dbgrp 71 Jul 22 16:21 postmaster.opts -rw------- 1 omm dbgrp 88 Jul 22 16:21 postmaster.pid -rw------- 1 omm dbgrp 0 Jul 20 23:49 postmaster.pid.lock -rw------- 1 omm dbgrp 4402 Jul 20 23:48 server.crt -rw------- 1 omm dbgrp 1766 Jul 20 23:48 server.key -rw------- 1 omm dbgrp 56 Jul 20 23:48 server.key.cipher -rw------- 1 omm dbgrp 24 Jul 20 23:48 server.key.rand drwx------ 5 omm dbgrp 4096 Jul 20 23:49 undo [omm@node0 dn]$[omm@node0 dn]$ vi pg_hba.conf 增加需要访问计算机的IP地址对所有IP地址进行开放:0.0.0.0/0修改trust替换成md5加密方式PostgreSQL Client Authentication Configuration File===================================================Refer to the "Client Authentication" section in the PostgreSQLdocumentation for a complete description of this file. A shortsynopsis follows.......TYPE DATABASE USER ADDRESS METHOD"local" is for Unix domain socket connections onlylocal all all trust host all omm 192.168.192.129/32 trustIPv4 local connections:host all all 127.0.0.1/32 trust host all all 192.168.192.129/32 md5 host all all 0.0.0.0/0 md5IPv6 local connections:host all all ::1/128 trust...... 输入 :wq! 退出修改postgresql.conf文件 (1)修改监听地址和加密方式[omm@node0 dn]$ vi postgresql.conf-----------------------------------------------------------------------------postgresql_single.conf.sampleConfiguration file for centralized environmentPortions Copyright (c) 1996-2012, PostgreSQL Global Development Group......listen_addresses = '*' # what IP address(es) to listen on;comma-separated list of addresses;defaults to 'localhost'; use '*' for all(change requires restart)local_bind_address = '192.168.192.129' port = 15400 # (change requires restart) max_connections = 5000 # (change requires restart)......#failed_login_attempts = 10 #Enter the wrong password reached failed_login_attempts times, the current account will be locked password_encryption_type = 0 #Password storage type, 0 is md5 for PG, 1 is sha256 + md5, 2 is sha256 only #password_min_length = 8 #The minimal password length(6-999) #password_max_length = 32 #The maximal password length(6-999) #password_min_uppercase = 0 #The minimal upper character number in password(0-999) #password_min_lowercase = 0 #The minimal lower character number in password(0-999) #password_min_digital = 0 #The minimal digital character number in password(0-999) #password_min_special = 0 #The minimal special character number in password(0-999) #password_effect_time = 90d #The password effect time(0-999) #password_notify_time = 7d #The password notify time(0-999)......重启服务 [omm@node0 dn]$ gs_om -t stop Stopping cluster. ========================================= Successfully stopped cluster. ========================================= End stop cluster. [omm@node0 dn]$ [omm@node0 dn]$ gs_om -t start Starting cluster. ========================================= [SUCCESS] node0 2023-07-22 16:55:05.897 64bb9969.1 [unknown] 140297425711040 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets 2023-07-22 16:55:05.897 64bb9969.1 [unknown] 140297425711040 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets 2023-07-22 16:55:05.901 64bb9969.1 [unknown] 140297425711040 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: Failed to initialize the memory protect for g_instance.attr.attr_storage.cstore_buffers (1024 Mbytes) or shared memory (3301 Mbytes) is larger. ========================================= Successfully started.创建远程连接角色 [omm@node0 dn]$ gsql -d postgres -p 15400 gsql ((openGauss 5.0.0 build a07d57c3) compiled at 2023-03-29 03:37:13 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help.openGauss=# create user testuser password 'openGauss!666'; NOTICE: The encrypted password contains MD5 ciphertext, which is not secure. CREATE ROLE防火墙开放端口 防火墙为未启动状态,略过此步骤;查看firewalld状态systemctl status firewalld把端口加入防火墙firewall-cmd --zone=public --add-port=15400/tcp --permanent重新加载防火墙systemctl reload firewalldNavicat连接 打开Navicat,新建PostgreSQL连接方式;在“新建连接(PostgreSQL)”窗口中,输入连接名、主机IP地址、端口号、用户名、密码等参数端口号默认为5432,根据实际情况动态调整;点击“测试连接”按钮,提示连接成功,完成Navicat连接openGauss数据库;问题 fatal:forbid remote connection with initial user在连接openGauss数据库时,提示:Forbid remote connection with initial user,意思是禁止用初始用户进行远程连接,即不要使用数据库默认的omm用户访问。总结 本文就使用Navicat连接openGauss数据库的实践方法做了说明,在实际应用中,应根据实际情况进行调整和优化。使用Navicat连接openGauss数据库,可以方便地进行数据管理和维护操作。可以轻松地执行数据导入导出、数据备份和恢复等任务。此外,Navicat还提供了强大的数据编辑功能,方便对数据库中的数据进行修改和更新。附录 记录在openEuler-22.03中安装openGauss_5.0.0企业版在VMware 17.0.2虚拟机中安装openEuler-22.03-LTS-SP2:cid:link_0
-
什么是CM CM(Cluster Manager)是一款数据库管理模块。支持自定义资源监控,提供了数据库主备的状态监控、网络通信故障监控、文件系统故障监控、故障自动主备切换等能力。提供了丰富的数据库管理能力,如节点、实例级的启停,数据库实例状态查询、主备切换、日志管理等。提供了通过REST接口远程查询和接收集群状态的能力。 CM 特点 从5.0开始CM支持2节点部署,CM集群和数据库集群都能实现高可用,RPO=0CM集群高可用 基于网关IP实现:备实例基于与网关IP的连通性判定自身是否升主,主实例基于与其与网关IP的连通性判定自身是否降备。目前支持自动故障切换和手工故障切换。数据库集群高可用 备实例是否failover的判定除去基于流复制状态,额外增加对数据库集群VIP(选配参数)的连通性的探测,以此降低主实例故障的误判概率,进而降低脑裂故障概率。为了确保脑裂故障时数据库集群的数据一致性,提供可配参数支持自动故障恢复和手工故障恢复。手工故障恢复需要按照特定文档及工具执行差异数据合并。CM两节点部署的XML root@k8s-node1 cm_server]# vi /home/omm/cluster_config.xmlcm日常运维命令 --cm命令查看集群状态[omm@k8s-master ~]$ cm_ctl query -Cvdi [ CMServer State ]node node_ip instance state1 k8s-master 192.168.10.2 1 /dbms/huawei/opengauss/install/cm/cm_server Primary 2 k8s-node1 192.168.10.3 2 /dbms/huawei/opengauss/install/cm/cm_server Standby[ Cluster State ]cluster_state : Normal redistributing : No balanced : No current_az : AZ_ALL[ Datanode State ]node node_ip instance state | node node_ip instance state1 k8s-master 192.168.10.2 6001 /dbms/huawei/opengauss/install/data/dn P Standby Normal | 2 k8s-node1 192.168.10.3 6002 /dbms/huawei/opengauss/install/data/dn S Primary Normalcm切换primary库命令 [omm@k8s-master ~]$ cm_ctl switchover -n 1 -D /dbms/huawei/opengauss/install/data/dn .... cm_ctl: switchover successfully. [omm@k8s-master ~]$ cm_ctl query -Cvdi [ CMServer State ]node node_ip instance state1 k8s-master 192.168.10.2 1 /dbms/huawei/opengauss/install/cm/cm_server Primary 2 k8s-node1 192.168.10.3 2 /dbms/huawei/opengauss/install/cm/cm_server Standby[ Cluster State ]cluster_state : Normal redistributing : No balanced : Yes current_az : AZ_ALL[ Datanode State ]node node_ip instance state | node node_ip instance state1 k8s-master 192.168.10.2 6001 /dbms/huawei/opengauss/install/data/dn P Primary Normal | 2 k8s-node1 192.168.10.3 6002 /dbms/huawei/opengauss/install/data/dn S Standby Normal--停止集群 [omm@k8s-master ~]$ cm_ctl stop cm_ctl: stop cluster. cm_ctl: stop nodeid: 1 cm_ctl: stop nodeid: 2 ......... cm_ctl: stop cluster successfully. [omm@k8s-master ~]$ cm_ctl query -Cvdi [ CMServer State ]node node_ip instance state1 k8s-master 192.168.10.2 1 /dbms/huawei/opengauss/install/cm/cm_server Down 2 k8s-node1 192.168.10.3 2 /dbms/huawei/opengauss/install/cm/cm_server Down--启动集群 [omm@k8s-master ~]$ cm_ctl start cm_ctl: checking cluster status. cm_ctl: checking cluster status. cm_ctl: checking finished in 366 ms. cm_ctl: start cluster. cm_ctl: start nodeid: 1 cm_ctl: start nodeid: 2 ............ cm_ctl: start cluster successfully. [omm@k8s-master ~]$ cm_ctl query -Cvdi [ CMServer State ]node node_ip instance state1 k8s-master 192.168.10.2 1 /dbms/huawei/opengauss/install/cm/cm_server Primary 2 k8s-node1 192.168.10.3 2 /dbms/huawei/opengauss/install/cm/cm_server Standby[ Cluster State ]cluster_state : Normal redistributing : No balanced : Yes current_az : AZ_ALL[ Datanode State ]node node_ip instance state | node node_ip instance state1 k8s-master 192.168.10.2 6001 /dbms/huawei/opengauss/install/data/dn P Primary Normal | 2 k8s-node1 192.168.10.3 6002 /dbms/huawei/opengauss/install/data/dn S Standby Normal CM两节点特性-配置前提条件 --cm集群故障自动切换配置前提条件 third_party_gateway_ip = 192.168.10.1 cms_enable_failover_on2nodes = true cms_network_isolation_timeout = 20--cm集群故障手工切换配置前提条件 third_party_gateway_ip = 192.168.10.1 cms_enable_failover_on2nodes = false cms_network_isolation_timeout = 20--数据库集群故障自动切换配置前提条件 third_party_gateway_ip = 192.168.10.1 cms_enable_failover_on2nodes = true cms_enable_db_crash_recovery = on--数据库集群故障手工切换配置前提条件 third_party_gateway_ip = 192.168.10.1 cms_enable_failover_on2nodes = true cms_enable_db_crash_recovery = off CM 在openGauss5.0 新增的特性高可用:CM支持VIP管理 通过VIP可以直接找到主机,连接重连更准更快(毫秒级别);支持主机故障,CM选出新主时,VIP漂移到新的主上;当出现双主时,依然可以通过VIP访问到唯一一个主机,降低了双主丢数据的风险。高可用:CM支持两节点部署 通过引入第三方网关IP,有效解决CM集群两节点部署模式下自仲裁问题,支持CMS和DN均为2节点的部署;同时支持动态配置CM集群故障切换策略和数据库集群脑裂故障恢复策略,从而能够尽可能确保集群数据的完整性和一致性。高可用:CM磁盘只读检测能力增强 只读状态从数据库获取,保证准确性;只读仲裁只仲裁当前超过阈值的实例,其他节点不受影响;主机只读保护后自动主备切换,选可用备机升主保证集群能正常提供工作。高可用:CM易用性提升 支持一键式关闭CM集群服务;支持和内核的安装部署解耦;支持按事件调用用户自定义脚本;支持CM组件单独升级,增强数据库集群可靠性;CM根据配置信息,支持用户自定义组件的监控和管理
-
随着 AI 技术发展,向量指令在微处理器上逐渐显现出它的重要性,例如自动驾驶、图像识别,这些技术都需要使用矩阵和向量进行运算。相较于标量单时钟周期内只能一次计算,矢量处理能够对多组数据进行成批计算,意味着矢量毫无疑问成为未来的发展方向。RISC-V 属于一种基于既定精简指令集计算机(RISC)原理的开放标准指令集架构,始于2010年加州大学伯克利分校。在众多的指令架构中,RISC-V 由于他的开放性和可扩展性吸引了一大批编译器开发者,其中矢量指令集 RISC-V Vector 指令集由此诞生。与传统 Arm 的 SIMD 指令不同,RISC-V Vector 指令更加灵活,且对开发工程师更加友好。RISC-V 常见扩展有:• M. Integer multiplication and division (mul, div, rem, …)• A. Atomic instructions(load reserve + store conditional, atomic read-modify-write)• F. Single-Precision Floating-Point (IEEE 754 Binary32)• D. Double-Precision Floating-Point (IEEE 754 Binary64)• C. Compressed Instructions (16-bit encodings for common I/F/D instructions)• Zb*. RISC-V Bit-Manipulation ISA-extensions• Zfh*. "Zfh" and "Zfhmin" Standard Extensions for Half-Precision Floating-Point完整详见cid:link_0RISC-V Vector 基本介绍 RISC-V Vector 拥有其他架构矢量指令没有的两大优点:硬件维护方便与指令长度可变。对于某一个矢量操作,即使硬件中的寄存器长度变化,代码也不需要作更改,相反的,在同一硬件中,即使指令长度作相应改变,代码也不需要更改。这意味着任何 RISC-V 兼容处理器编写的代码在其余 RISC-V 处理器上依然适用,这对于用户来说,简易性直线上升。此两大优点得益于 RISC-V Vector 的 vset(i)vl(i) 指令机制,在面对不同的寄存器大小以及数据长度的时候,vset(i)vl(i) 指令会设置其中的 vl 以及 vtype 来面对不同情况。其中 RISC-V Vector 通过7个 CSR 寄存器来共同处理指令的多样性,分别为 vstart、vxsat、vxrm、vcsr、vl、vtype、vlenb。vstart:开始位置的索引vxsat:定点饱和标志vxrm:定点数舍入模式vcsr:矢量状态控制寄存器vl:矢量长度寄存器vtype:矢量数据属性寄存器vlenb:矢量寄存器长度其中,vl 以及 vtype 是用户涉及最多的寄存器,vl 通过 vset(i)vl(i) 来计算指令向量长度,vtype 则是包含 vill、vma、vta、vlmul、vsew 几个字段来表示各指令中元素属性,例如:vill 是非法标志符,如果值为1,则其他几个字段失效;vma 掩码位;vmul 段代表向量寄存器分组,可以是分数可以是整数,整数n代表n个寄存器为一组进行计算,分数1/n代表1个寄存器拆分成n个寄存器进行计算;vsew 代表元素宽度。vtype 中 vlmul 和 vsew 主要影响 vlmax 的值,而 vlmax 影响每次处理元素的数量,vl = min (vlmax, AVL)。其中 AVL 全称 Application Vector Length,表示应用程序指定要处理的元素总数。vset(i)vl(i) 这类指令在使用上一般是 vl 或者 vtype 发生改变时才会去使用。但是实际上 LLVM 在这一块处理并不完善,如果写 instrinsic 测试就会发现,如果指令可能涉及 vl 或者 vtype 变动,它很有可能会在变动前插入一条 vset(i)vl(i) 来保证正确性,即使现已存在 VSRVLI pass 判断 vtype 块前块后是否一致来减少部分 vset(i)vl(i) 插入,但反向推导的过程中可以发现一些 vset(i)vl(i) 是冗余的,所以这块社区还在不断地演进中。对于 RISC-V Vector 指令的应用现有 NX27V 芯片、C906 芯片、SG2042 芯片、siFive Performance 系列芯片等,其中 NX27V 芯片、siFive Performance 系列芯片支持 RISC-V Vector 1.0 版本,但是 C906、SG2042 芯片支持的是 RISC-V Vector SPEC 0.7.1版本,与现在上游编译器 RISC-V Vector SPEC 1.0 版本不兼容。现社区有 RISC-V Vector rollback 脚本,可将 RISC-V Vector Extension v1.0 的汇编代码转换为 v0.7.1,因此上游编译器代码编出的 .s 中的 RVV SPEC v1.0 版本指令可通过此脚本转换成 RISC-V Vector SPEC v0.7.1 标准指令,这样就可以将代码最终执行在 C906、SG2042 芯片上。当然,其他架构也存在矢量指令,例如 Arm 架构的 Neon,虽然 Neon 和 RISC-V Vector 同为矢量指令,但是 Neon 是固定长度的矢量指令,这会存在一个问题,即指令越加越多,复杂度提升,且需要绑定特定的硬件配置,而 RISC-V Vector 相较于 Neon,它有 vsetvli 可以适配宽度和判断循环次数,只需在执行前给予总的数据量即可。例如一段 memory copy 对于 Arm 的代码部分,LDP 和 STP 分别为128位宽的 load 和 store 操作,每次循环操作96个字节。宽度固定,数据变化代码可能就需大改(Arm SVE 解决这个问题)。RISC-V Vector 在 LLVM 社区中演进 从2019年底开始,LLVM 社区开始实现 RISC-V Vector SPEC 功能,从汇编侧开始,从IR向后端,最后延至前端。至 LLVM15 已基本实现 RISC-V Vector 1.0 全部内容。从使用上来看,从 LLVM12 开始支持 RISC-V Vector Intrinsic,前端接口使用 tablegen 进行生成,在 riscv_vector.td 中定义前端指令生成 builtin 接口,此接口头文件会存在工具链的 lib/clang/12.0.1/include/riscv_vector.h,此文件包含 RISC-V Vector 所有的前端 builtin 接口(只是生成所有接口,但部分接口的功能还不能完整支持),直至 LLVM 12.0.1 版本已经能正常支持 RISC-V Vector 0.10版本的大部分指令,此时 v 指令还是处于试验阶段,所以需要加入选项 -menable-experimental-extensions 进行支持,此时半精度浮点 float 16 支持是存在一定的问题。但由于此文件将所有类型全部写在头文件中,导致头文件巨大。对于一些无返回值的接口,即使使用变量接收返回值也是不会报错的只会报 warning,到 LLVM15 时 return-type 已设置成 error 了,所以当遇到此错误时,需要把返回类型改成 void 或者加上 -Wno-return-type。升级至 LLVM15 后,RISC-V Vector 采用 OpenCL 动态检验接口方式,原先的 riscv_vector.h 接口只有类型没有完整的静态接口,只是因为 RISC-V Vector 现在根据 tablegen 生成的 clang/Basic/riscv_vector_builtin_sema.inc 文件去读取指令前缀,然后在运行时通过 clang/lib/Sema/SemaRISCVVectorLookup.cpp 文件中 InitRVVIntrinsic 函数进行拼接加入到 map 中以此生成 RISC-V Vector 接口表,此函数会自动为接口添加 builtin_rvv ,所以在使用时不能再添加,否则会重复添加导致找不到接口,例如 vrgather_vv_i8mf8(op1, index, vl),而不是 _builtin_rvv_vrgather_vv_i8mf8(op1, index, vl),和以前的接口使用是有差异的,此时文件很小,这个优化方式不仅减小了最后的编译器工具链大小,也加快了运行时编译速度。此时,已实现 RISC-V Vector 1.0 版本,半精度浮点和矢量中的半精度浮点,分别需要开启 zfh 和 zvfh0P1,因为 zvfh 还在试验性阶段所以需要加 -menable-experimental-extensions,具体可参考 clang/test/CodeGen/RISCV/rvv-intrinsics/vfclass.c 测试用例,用到了 zvfh。另外,一部分指令也根据 SPEC 演进做了相应的更改,例如:vmandot 和 vmornot 已更改为 vmandn 和 vmorn 等。自动矢量化 虽然 LLVM15 版本已经支持了 RISC-V Vector Intrinsic,但是对于大工程来说,将代码转换成 RISC-V Vector Intrinsic 接口使用是一件非常繁杂的事情,这时候支持自动向量化是一件非常有意义的事情。相关选项 选项说明-fno-vectorize循环矢量化开关,默认开启--riscv-v-vector-bits-min指定 zvl 最小的 VLEN,不能低于配置的最大 zvl 数(因为 v 自动开启 zvl128b,所以没指定具体 v 扩展时此选项需要开启128以上)-force-vector-width向量化宽度(VF)-force-vector-interleave向量化展开因子(UF)-Rpass=loop-vectorize开启将提示能矢量化的循环-Rpass-analysis=loop-vectorize开启将提示各种错过矢量化机会的原因-Rpass-missed=loop-vectorize开启将提示不能矢量化的循环自动矢量化要求 LLVM15 以后开始支持 RISC-V 自动矢量化,其中需要3个条件:(1)开启自动矢量化需要开启 -O1 以上选项(2)添加 -mllvm --riscv-v-vector-bits-min 配置 VLEN(3)march 选项中加入 v自动矢量化主要是循环向量化居多,所以尽量将循环写法维持在可矢量化状态。调试过程中可以通过 -Rpass=loop-vectorize、-Rpass-analysis=loop-vectorize、-Rpass-missed=loop-vectorize 去查看分析 loop 过程中的矢量化。矢量化代码格式要求 使用简单的循环。避免复杂的循环终止条件——迭代上限在循环中必须是不变的。void test(int *a, int *b, int *c) { for (int i = 0; i <= a[i]; i++) c[i] = b[i]; } 此时使用 -Rpass-analysis=loop-vectorize 可以发现提示:loop not vectorized: could not determine number of loop iterations 迭代上限变化时无法确定迭代次数,如果在循环中加入 break、return,亦是无法向量化的,向量化循环需要单进单出。避免使用分支语句,或者使用大多数函数调用。void test1();void test(int n, int *a, int *b) { for (int i = 0; i <= n; i++) { test1(); a[i] = b[i]; } } 此时使用 -Rpass-analysis=loop-vectorize 可以发现提示:loop not vectorized: call instruction cannot be vectorized 循环中有调用无法进行矢量化。避免循环迭代之间的依赖关系,或者至少避免写后读取依赖关系。void test(int n, int *a) { for (int i = 0; i <= n; i++) { a[i] += a[i - 1]; } } 此时使用 -Rpass-analysis=loop-vectorize 可以发现提示:value that could not be identified as reduction is used outside the loop 这是因为循环中,多次迭代如果同时执行,后序读取数据的迭代可能在前一次写入之前,这可能会导致不正确的结果。自动矢量化流程 首先中端部分用的是公共矢量化分析,这一块 LLVM 有两种类型的自动矢量化实现:SLP 矢量化器和循环矢量化器。SLP Vectorizer 将多个标量指令聚合为一条向量指令,该指令通常在单个基本块上运行。而循环向量化器则扩大循环体内的标量指令以一次执行多个迭代。在这项工作中,我们将自动矢量化算法集成到循环矢量化器中,以通过扫描循环并行化循环。(自动矢量化分析可以参考编译器优化那些事儿(12):LLVM 自动向量化 RISC-V 后端转 RISC-V Vector 通过多种优化组合进行转换,首先依靠插入 vmv 来进行标量矢量转换,然后对于转换后的数据中的 load、store 转化为 vse、vle 来进行矢量存读,当然,其中的 add 指令也转化为 ADD_VL,smin 转化成 SMIN_VL 进行矢量运算。例如:Legalizing: t28: ch = store<(store (s128) into %ir.lsr.iv31, align 2, !tbaa !12, !alias.scope !24, !noalias !26)> t23:1, t78, t2, undef:i32, test.c:7:8 Legalizing store operation Optimizing float store operations Trying custom lowering Creating constant: t83: i32 = TargetConstant<8428> Creating new node: t84: ch = llvm.riscv.vse<(store (s128) into %ir.lsr.iv31, align 2, !tbaa !12, !alias.scope !24, !noalias !26)> t23:1, TargetConstant:i32<8428>, t77, t2, Constant:i32<8>, test.c:7:8 ... replacing: t28: ch = store<(store (s128) into %ir.lsr.iv31, align 2, !tbaa !12, !alias.scope !24, !noalias !26)> t23:1, t78, t2, undef:i32, test.c:7:8 with: t84: ch = llvm.riscv.vse<(store (s128) into %ir.lsr.iv31, align 2, !tbaa !12, !alias.scope !24, !noalias !26)> t23:1, TargetConstant:i32<8428>, t77, t2, Constant:i32<8>, test.c:7:8 最后在 insertVSETVLI pass 中分析在指令中插入 vset(i)vl(i) 来保证结果正确性。RISCV自动矢量化前后对比 以下例子分析矢量化前后差异: void test(int n, int *a, int *b) { for (int i = 0; i <= n; i++) { a[i] = b[i]; } } 以下左边为开启 v 的自动矢量化生成的汇编文件,右边没有开启矢量化左边命令: clang -march=rv32imfdcv -O2 -w -S -mllvm --riscv-v-vector-bits-min=128右边命令: clang -march=rv32imfdc -O2 -w -S可以看出,左边开启自动矢量化时因为向量长度不可知,所以导致还是存在尾部用原指令处理的问题。中间矢量化序列的 vsetivli 中可以看出,因为我们开启的是 vlen=128,用两个寄存器拼接长度为256,元素大小为32,所以相当于一次处理8个数据,而右边一次处理一个数据。从整体看来,codesize 膨胀近3倍,但是可以分析看出来左边 .LBB0_3 块进行循环一次相当于右边 .LBB0_2 块循环8次,只需要总循环为8次以上,左边整体的指令数就能低于右边。RISC-V Vector 优劣分析 RISC-V Vector 优点很多,但是现有的功能方面存在不足,如 predication/mask,向量长度不可知向量化支持不完善导致尾部处理存在问题。RISC-V Vector 有三种主要的循环向量化方法:使用时总是占满整个矢量寄存器组,当固定长度的 SIMD 用,缺点是存在尾循环。此方式可利用 Loop Vectorizer 实现,因此相对简单,不需要特殊的 LLVM IR,但会丢失 RISC-V Vector 的许多特性。(现在LLVM就是使用这种方法)将尾循环合并到向量循环中。(相当于每次使用前用 vsetvl) 这种是通过在每次选代中设置向量长度来实现的。这会在循环的所有向量指令上产生配置指令,需要一些特殊的IR,这里使用 LLVM VP (Vector Predication) intrinsics。一种折中方法就是在向量体中使用整个寄存器,然后设置 vl 执行剩下的。(相当于每次用整个,当用不了整个的时候,设置 vl 执行剩下的)总结 本文简单介绍了 RISC-V Vector 的发展情况以及 LLVM 演进过程,介绍了自动矢量化的大致过程,主要的矢量化还是依靠中端的分析,后端还在不断优化中。总而言之,向量化大势所趋,但优化之路还很漫长。
-
环境检查 1. 检查OS版本 openGauss支持的操作系统: CentOS 7.6(x86_64 架构) openEuler-20.03-LTS(aarch64 架构) openEuler-20.03-LTS(x86_64架构) Kylin-V10(aarch64 架构) Kylin-V10(x86_64 架构) Asianux 7.6(x86_64架构) FusionOS 22 (aarch64 架构) FusionOS 22 (x86 架构) cat /etc/os-release 操作系统为openEuler-20.03-LTS(aarch64 架构) 2. 检查cpu型号 lscpu | grep "Vendor ID" 安装平台Vendor ID:0x70为飞腾CPU 3. 禁用防火墙和selinux 禁用防火墙 systemctl status firewalld systemctl stop firewalld systemctl disable firewalld systemctl is-enabled firewalld 禁用SELINUX /usr/sbin/sestatus -v 如果selinux为enable状态,则修改/etc/selinux/config文件: SELINUX=disabled 或使用下面命令: sed -i '/^SELINUX=.*/ s//SELINUX=disabled/' /etc/selinux/config 并重启服务器 4. 配置yum源并安装依赖包 上传操作系统iso到/tmp目录 配置本地yum源 mkdir /mnt/iso mount -o loop /tmp/openeuler20.03LTS.iso /mnt/iso cd /etc/yum.repos.d vi media.repo [InstallMedia] name=openeuler20.03LTS gpgcheck=0 enabled=1 baseurl=file:///mnt/iso yum clean all yum makecache yum list yum -y install libaio-devel flex bison ncurses-devel glibc-devel patch openeuler-lsb readline-devel unzip dos2unix vim git wget lrzsz net-tools bzip2 gcc tree zlib* 5. 安装Python3 建议安装Python3.6+ yum install python3 python3-pip 软链接python命令为python3.7 ln -s /usr/bin/python3.7 /usr/bin/python python -V 6. 设置字符集参数 vi /etc/profile export LANG=en_US.UTF-8 7. 设置时区和时间 [root@localhost ~] timedatectl set-timezone Asia/Shanghai [root@localhost ~] timedatectl status 下载软件包 cd /soft2/ git clone https://gitee.com/opengauss/openGauss-server.git openGauss-server -b 5.0.0 wget -c https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.0.0/binarylibs/openGauss-third_party_binarylibs_openEuler_arm.tar.gz 脚本编译安装 1. openGauss-server编译 tar -xvf openGauss-third_party_binarylibs_openEuler_arm.tar.gz mv openGauss-third_party_binarylibs_openEuler_arm binarylibs cd openGauss-server/ sh build.sh -m debug -3rd /soft/binarylibs -pkg -m [debug | release | memcheck]表示可选择三种目标版本: release:代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生产环境或性能测试环境。 debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境。 memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。 显示如下内容,表示编译成功。 生成的安装包会存放在./output目录下。 编译和打包日志为:./build/script/makemppdb_pkg.log。 编译后验证 编译结束后,可按以下方式对编译后的openGauss进行验证: 1. 创建用户 groupadd dbgrp useradd omm -g dbgrp passwd omm 2. 使用omm用户,在~/.bashrc中增加以下环境变量 su - omm vi ~/.bashrc 使环境变量生效 source .bashrc 3. 建立数据目录和日志目录 su - root chown -R omm:dbgrp /soft2/openGauss-server su - omm mkdir ~/data mkdir ~/log 4. 数据库初始化 su - omm gs_initdb -D /home/omm/data --nodename=db1 初始化日志如下: The files belonging to this database system will be owned by user “omm”. This user must also own the server process. The database cluster will be initialized with locale “en_US.UTF-8”. The default database encoding has accordingly been set to “UTF8”. The default text search configuration will be set to “english”. fixing permissions on existing directory /home/omm/data … ok creating subdirectories … in ordinary occasionok creating configuration files … ok selecting default max_connections … 100 selecting default shared_buffers … 1024MB Begin init undo subsystem meta. [INIT UNDO] Init undo subsystem meta successfully. creating template1 database in /home/omm/data/base/1 … The core dump path is an invalid directory 2023-07-20 16:10:19.012 [unknown] [unknown] localhost 281468516106256 0[0:0#0] [BACKEND] WARNING: macAddr is 64174/3171074048, sysidentifier is 4205755650/3221270315, randomNum is 96513835ok initializing pg_authid … ok setting password … ok initializing dependencies … ok loading PL/pgSQL server-side language … ok creating system views … ok creating performance views … ok loading system objects’ descriptions … ok creating collations … ok creating conversions … ok creating dictionaries … ok setting privileges on built-in objects … ok initialize global configure for bucketmap length … ok creating information schema … ok loading foreign-data wrapper for distfs access … ok loading foreign-data wrapper for log access … ok loading hstore extension … ok loading foreign-data wrapper for MOT access … ok loading security plugin … ok update system tables … ok creating snapshots catalog … ok vacuuming database template1 … ok copying template1 to template0 … ok copying template1 to postgres … ok freezing database template0 … ok freezing database template1 … ok freezing database postgres … ok WARNING: enabling “trust” authentication for local connections You can change this by editing pg_hba.conf or using the option -A, or –auth-local and --auth-host, the next time you run gs_initdb. Success. You can now start the database server of single node using: gaussdb -D /home/omm/data --single_node or gs_ctl start -D /home/omm/data -Z single_node -l logfile 5. 启动数据库 su - omm gs_ctl start -D /home/omm/data -Z single_node -l /home/omm/log/opengauss.log 启动完毕后可通过 ps -ef | grep gaussdb检查数据库进程情况,或通过 gs_ctl query -D /home/omm/data检查数据库状态,或使用 gsql -d postgres 进入gsql命令行查看数据库的相关信息。 FAQ 编译安装过程中遇到的问题 FAQ 1:python版本需要3.6+以上版本,操作系统自带的python2.7不符合要求,需要安装python3.7,不然编译脚本错误。 解决方案: yum安装Python3.7 yum install python3 python3-pip 软链接python命令为python3.7 ln -s /usr/bin/python3.7 /usr/bin/python FAQ 2:一键式脚本编译build.sh使用 -m release编译release版本的二进制程序,初始化数据库报错。 解决方案: 目前还未解决,绕过方案使用-m debug编译debug版本的二进制程序.可以初始化数据库成功。 sh build.sh -m debug -3rd /soft/binarylibs -pkg -m [debug | release | memcheck]表示可选择三种目标版本: release:代表生成release版本的二进制程序,该版本编译时,配置GCC高级别优化选项,去除内核调试代码,通常用于生产环境或性能测试环境。 debug:代表生成debug版本的二进制程序,该版本编译时,增加内核代码调试功能,通常用于开发自测环境。 memcheck:代表生成memcheck版本的二进制程序,该版本编译时,在debug版本基础上新增ASAN功能,通常用于定位内存问题。
-
应用可观测性可以对企业运营产生的实际数据进行分析,可观测性将成为企业数据驱动决策的最强支撑。云原生时代的基础设施更复杂,也暴露出可观测性存在一些问题,包括基础设施观测能力不足,缺乏应用视角的基础设施观测数据等,这些都为下一代云原生可观测提供了机会与挑战。openEuler社区项目gala-gopher[1] 基于 eBPF 技术完成一系列全栈可观测实践工作。eBPF及其对可观测的意义 eBPF是一个能够在内核运行沙箱程序的技术,提供了一种在内核事件和用户程序事件发生时安全注入代码的机制,使得非内核开发人员也可以对内核进行控制。随着内核的发展,eBPF 逐步从最初的数据包过滤扩展到了网络、内核、安全、跟踪等。原理:eBPF 由事件驱动,通过 Hook 方式在数据流中执行 eBPF 程序。Linux 内核中预定义了一系列常用的 Hook 点(用户态也有 uprobe、USDT 的动静态 Hook 点)。eBPF利用 Just-in-Time (JIT) 技术可以使eBPF代码的运行效率媲美内核原生代码和内核模块;Verification 机制可以保障eBPF 代码安全地运行,不会导致内核崩溃或进入死循环;eBPF Helper机制使 eBPF代码可以访问内核、应用的运行态数据、状态。可观测性:通过Hook内核、用户态程序,由数据流、系统事件等驱动 eBPF 沙箱内观测程序,可以灵活、按需的观测业务、系统状态,同时给可观测带来低负载、高安全、无侵入等技术特点。云原生场景运维带来的变化与挑战 云原生场景运维带来的变化与挑战:变化1:虚拟化单一架构中“一刀切”分层运维(基础设施、应用分层)向云原生场景融合式运维发展,需要提供全栈观测、运维能力;变化2:云原生多技术体系(Linux、CNCF 等)、快速演进等特点,要求可观测性解决方案与其应用/基础设施技术栈解耦,提供非侵入观测能力;变化3:云原生高密度、分布式部署方式,要求具备集群运维视角,从业务集群视角逐层/级定界、定位至具体问题根因。云原生上述技术特征使得可观测能力的构筑,天然应下沉至基础软件之内,而 eBPF 技术在基础软件(尤其是内核)的可观测性方面尤为突出。因为其技术特征天然与云原生可观测要求完美吻合:无侵入:通过 eBPF 字节注入技术可以快速地进行可编程无侵入式观测逻辑注入,轻松应对云原生场景快速迭代的场景特征。可移植&跨平台:通过标准eBPF ISA、CO-RE 等技术可以实现不同 Linux 版本、不同 ISA 架构、不同平台之间兼容相同 eBPF Program,可以轻松应对云原生场景中不同平台、系统混合部署的场景。全栈:通过 eBPF + USDT、eBPF + Tracepoint、eBPF + kprobe 等技术,可以覆盖内核、运行时、基础库等大部分基础软件,轻松应对云原生多语言、多网络协议、厚重软件栈的场景特征。业界洞察 可观测性在 K8S 场景逐渐重要,2023年云原生报告显示[2],云原生集群内辅助类应用工作负载上升至 63%,其中近 80% 的企业部署可观测性方案(同比增长 29%)。下面介绍几款业界较成熟的云原生运维系统:Deepflow 以网络为中心展开云原生场景运维工作,围绕 eBPF 构建可观测技术,在此基础上构建四大能力特性[3]:Universal Map:非侵入方式实时构建集群拓扑,全链路时延观测。Continuous Profiling:在线持续性代码性能剖析能力。Distributed Tracing:非侵入全链路分布式跟踪,覆盖ServiceMesh、数据库、DNS、NIC 等基础设施。无缝集成:数据存储可以无缝与Prometheus、Skywalking 等生态软件对接;数据采集侧可以无缝接入生态采集探针(OLTP等);观测数据携带 K8S、VPC等云平台上下文信息。Pixie Pixie 围绕 Kubernetes应用程序可观测性工具[4],基于 eBPF 技术构建,可以查看K8S集群运行状态(ServiceMap、集群资源、应用流量),还可以深入查看更详细的视图(pod 状态、火焰图、单个应用请求)。主要特性包括:(1)网络监控:K8S集群内网络流量监控,DNS 监控,TCP质量监控(丢包、重传、拥塞等)。(2)基础设施监控:Pod、Node、Namespace 等不同维度的资源(CPU、内存、网络、存储等)监控。(3)Service Performance:K8S Service 拓扑构建,Service 性能(覆盖 HTTP1.X,PGSQL,gRPC,Redis 等)监控,性能包括时延、吞吐量、错误率等。(4)应用性能Profiling:应用性能持续性能剖析,支持多语言栈的性能火焰图分析能力。(5)中间件监控(DB、Kafka 等):提供中间件关键数据流的观测能力,包括 DB 访问过程的观测,Kafka topic 生产/消费过程的观测等。eBPF的局限性及解决方案 在一些有独立运行时的高级语言场景中(尤其是 java),eBPF 的可观测性存在一些局限性,主要表现在:加密流(由JSSE 类库完成加减密)的可观测无法通过 eBPF + uprobe 方式完成观测,导致无法完成加密场景的网络可观测;语言堆栈信息不完整,比如无法有效获取JVM 堆内的软件栈信息,导致在性能Profiling时,堆栈信息不完整,不利于问题定位。解决方案:针对java场景的特殊性,结合java agent + eBPF技术,综合完成非侵入的可观测能力。例如 java 应用性能 Profiling 的解决思路如下:openEuler的实践情况介绍 openEuler社区项目gala-gopher[1]围绕eBPF 技术,并充分考虑多种观测技术的结合,采取探针式架构,通过集成探针快速构建观测能力,其观测全景图如下:关键特性 探针框架:提供 eBPF 探针框架,负责管理探针生命周期,以及探针任务管理、数据上报等工作。性能观测:以火焰图、timeline 图表形式辅助定位应用/系统的内存泄漏、死锁、CPU 调度等疑难故障。应用观测:提供进程粒度全栈性能观测能力,覆盖应用、容器、基础库/中间件、内核等。网络流量观测:提供云原生场景全流程跟踪能力,具备网络流拓扑构建能力(覆盖各种云原生网络场景),提供L4、L7 层流量各种指标采集能力。架构及关键技术特征 扩展性:探针式架构,按需开启采集范围&能力,亦可快速对接第三方探针。非侵入&多语言:应用/容器镜像零修改,无需重启;支持对多语言应用的观测,覆盖C/C++、Go、Java、Python 等主流语言。生态:支持OpenTelemetry生态接口,支持对接多种开源运维软件(Prometheus、ES等)。丰富的上下文:提供自动化标签能力,所有数据数据应用标签(进程信息、容器信息等)、Node 标签(IP、Machine ID等)、K8S 标签(POD 信息、Namespace 信息)等。详细能力可以参考社区文档[5]。相关链接 [1]gala-gopher gitee 源码仓:cid:link_4[2] 2023年云原生报告:cid:link_2[3] Deepflow 介绍:cid:link_1[4] Pixie 介绍:cid:link_3[5]gala-gopher 详细能力介绍:cid:link_0
-
我这边自己创建镜像,但是通过该镜像创建出的容器在运行几秒后就会自动关闭,其产生的错误日志如下:2024-04-25 21:11:52 [2024-04-25 13:11:52.569][176][][gs_ctl]: gs_ctl started,datadir is /var/lib/opengauss/data 2024-04-25 21:11:52 [2024-04-25 13:11:52.591][176][][gs_ctl]: waiting for server to start...2024-04-25 21:11:52 .0 LOG: [Alarm Module]can not read GAUSS_WARNING_TYPE env.2024-04-25 21:11:52 2024-04-25 21:11:52 0 LOG: [Alarm Module]Host Name: ffc7af174a53 2024-04-25 21:11:52 2024-04-25 21:11:52 0 LOG: [Alarm Module]Host IP: ffc7af174a53. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>2024-04-25 21:11:52 2024-04-25 21:11:52 0 LOG: [Alarm Module]Get ENV GS_CLUSTER_NAME failed!2024-04-25 21:11:52 2024-04-25 21:11:52 0 LOG: [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 572024-04-25 21:11:52 2024-04-25 21:11:52 0 WARNING: failed to open feature control file, please check whether it exists: FileName=gaussdb.version, Errno=2, Errmessage=No such file or directory.2024-04-25 21:11:52 0 WARNING: failed to parse feature control file: gaussdb.version.2024-04-25 21:11:52 0 WARNING: Failed to load the product control file, so gaussdb cannot distinguish product version.2024-04-25 21:11:52 The core dump path is an invalid directory2024-04-25 21:11:52 2024-04-25 13:11:52.644 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: when starting as multi_standby mode, we couldn't support data replicaton.2024-04-25 21:11:52 gaussdb.state does not exist, and skipt setting since it is optional.2024-04-25 13:11:52.649 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]can not read GAUSS_WARNING_TYPE env.2024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.649 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Host Name: ffc7af174a53 2024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.649 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Host IP: ffc7af174a53. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>2024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.649 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Get ENV GS_CLUSTER_NAME failed!2024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.649 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 572024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.652 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: loaded library "security_plugin"2024-04-25 21:11:52 2024-04-25 13:11:52.652 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets2024-04-25 21:11:52 2024-04-25 13:11:52.652 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets2024-04-25 21:11:52 2024-04-25 13:11:52.658 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: InitNuma numaNodeNum: 1 numa_distribute_mode: none inheritThreadPool: 0.2024-04-25 21:11:52 2024-04-25 13:11:52.658 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: reserved memory for backend threads is: 220 MB2024-04-25 21:11:52 2024-04-25 13:11:52.658 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: reserved memory for WAL buffers is: 128 MB2024-04-25 21:11:52 2024-04-25 13:11:52.658 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: Set max backend reserve memory is: 348 MB, max dynamic memory is: 8142 MB2024-04-25 21:11:52 2024-04-25 13:11:52.658 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: shared memory 3285 Mbytes, memory context 8490 Mbytes, max process memory 12288 Mbytes2024-04-25 21:11:52 2024-04-25 13:11:52.690 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [CACHE] LOG: set data cache size(402653184)2024-04-25 21:11:52 2024-04-25 13:11:52.712 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [SEGMENT_PAGE] LOG: Segment-page constants: DF_MAP_SIZE: 8156, DF_MAP_BIT_CNT: 65248, DF_MAP_GROUP_EXTENTS: 4175872, IPBLOCK_SIZE: 8168, EXTENTS_PER_IPBLOCK: 1021, IPBLOCK_GROUP_SIZE: 4090, BMT_HEADER_LEVEL0_TOTAL_PAGES: 8323072, BktMapEntryNumberPerBlock: 2038, BktMapBlockNumber: 25, BktBitMaxMapCnt: 5122024-04-25 21:11:52 2024-04-25 13:11:52.726 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: gaussdb: fsync file "/var/lib/opengauss/data/gaussdb.state.temp" success2024-04-25 21:11:52 2024-04-25 13:11:52.726 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: create gaussdb state file success: db state(STARTING_STATE), server mode(Normal), connection index(1)2024-04-25 21:11:52 2024-04-25 13:11:52.884 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: max_safe_fds = 976, usable_fds = 1000, already_open = 142024-04-25 21:11:52 The core dump path is an invalid directory2024-04-25 21:11:52 2024-04-25 13:11:52.886 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: user configure file is not found, it will be created.2024-04-25 21:11:52 2024-04-25 13:11:52.893 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: the configure file /usr/local/opengauss/etc/gscgroup_omm.cfg doesn't exist or the size of configure file has changed. Please create it by root user!2024-04-25 21:11:52 2024-04-25 13:11:52.893 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: Failed to parse cgroup config file.2024-04-25 21:11:52 2024-04-25 13:11:52.906 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [EXECUTOR] WARNING: Failed to obtain environment value $GAUSSLOG!2024-04-25 21:11:52 2024-04-25 13:11:52.906 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [EXECUTOR] DETAIL: N/A2024-04-25 21:11:52 2024-04-25 13:11:52.906 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [EXECUTOR] CAUSE: Incorrect environment value.2024-04-25 21:11:52 2024-04-25 13:11:52.906 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [EXECUTOR] ACTION: Please refer to backend log for more details.2024-04-25 21:11:52 2024-04-25 13:11:52.906 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] FATAL: ERROR: could not create instr log directory "pg_perf": Permission denied2024-04-25 21:11:52 2024-04-25 21:11:52 2024-04-25 13:11:52.920 [unknown] [unknown] localhost 140296755687744 0[0:0#0] 0 [BACKEND] LOG: FiniNuma allocIndex: 0.2024-04-25 21:11:53 [2024-04-25 13:11:53.593][176][][gs_ctl]: waitpid 179 failed, exitstatus is 256, ret is 22024-04-25 21:11:53 2024-04-25 21:11:53 [2024-04-25 13:11:53.594][176][][gs_ctl]: stopped waiting2024-04-25 21:11:53 [2024-04-25 13:11:53.594][176][][gs_ctl]: could not start server但是我直接在CentOS内本地安装却不会产生任何问题,因此这里求助各位大神,这种情况我需要做些什么?
-
我们写了一些函数/存储过程用来展现报表数据,为了存储中间数据用了临时表,并且临时表在运行过程中insert的数据量有时候会很大(百万级),因此在后续对这些临时表引用的时候,需要对这些表做动态采样,否则会导致执行计划有问题。在Oralce中,我们在函数/存储过程中在对临时表做关联查询的时候,采用 SELECT /*+ opt_param('OPTIMIZER_DYNAMIC_SAMPLING',6) */ 这样的hint 来要求做动态采样。在Opengauss中,我们先是尝试在INSERT 临时表数据后,通过ANALYZE tablename;来更新该临时表的统计信息,但是ANALYZE无法在函数/存储过程中执行,否则会报”ANALYZE cannot run inside a transaction block”。请问是否有其它办法可以在函数/存储过程中对临时表做动态采样?
-
1 前言OpenGauss是一款高可靠、高性能、高安全、易运维的开源关系型数据库管理系统,然而其全功能部署对系统要求非常高。本实操教程能够使个人开发者以及高校师生能够以成本最小的方式快速将OpenGauss部署到华为云的ECS上,以便快速进行功能验证以及小规模数据库应用开发。本教程预计实现的目标:开通安装有CentOS 8.2的华为云ECS安装并启动OpenGauss 5.0.0 LTS放通公网访问(本文部署到25432端口)能够使用Navicat等数据库软件以PostgreSQL兼容的方式进行连接本教程仅供实验测试使用,安全性较低,请勿在生产环境按该教程部署2 开通华为云ECS在华为云控制台中搜索弹性云服务器产品并购买相关参数解释说明与推荐区域:服务器所在的区域,不同区域定价差异较大,可以选择成本较低的区域如西南-贵阳一计费模式:若需要长期部署应用(如课程作业开发),推荐选择包月规格:服务器的配置,为了运行OpenGauss,内存必须2GB以上,推荐至少4GB,经测试若配置过低会导致数据库无法安装、运行或中途崩溃。成本较低的可以选择通用计算型s6(s6.medium.4),基础报价约86元每月。镜像:服务器预装的操作系统,OpenGauss只支持OpenEuler和CentOS系列。考虑到一些软件的支持性,本教程采用CentOS 8.2 64bit,尽管官方只说明能够在CentOS7.6上运行,但实测该系统也能够正常运行部署。系统盘:服务器运行的硬盘,若要节省成本可以选择高IO点击下一步(网络配置)网络、子网:保持默认配置即可安全组:为了能够使服务器能够在外网访问数据库端口,我们必须预先放通相关端口,本教程以部署在25432端口为例(修改了默认的端口以降低扫描器发现并爆破密码的几率),此外我们可以顺便放通22、80等常用端口(使用“一键放通常用端口”按钮)IP:为了公网访问,必须购买弹性IP。若服务器应用流量不大,推荐按流量计费,带宽可以选最高的(300M),建议勾选“随实例释放”避免在服务器过期后继续计费。按带宽计费成本非常高,不建议测试使用。点击下一步(高级配置)登录凭证:自行设定云备份:为节省成本可以关闭(不购买)支付:拥有基座课程代金券的同学可以使用代金券连续购买多个月,节省部署成本。(按流量计费的服务器产生的流量可能仍会额外消耗余额)至此,华为云ECS已经创建完成3 安装OpenGauss创建数据库专用账户OpenGauss的安全性设计必须以root以外的用户运行首先用刚才的凭证使用root用户连接到服务器在终端中运行以下命令groupadd dbgroup useradd -g dbgroup omm passwd omm 输入你的omm账户密码这创建了一个omm账户以及一个用户组下载OpenGauss下载、解压并调整相关文件权限curl -o opengauss.tar.gz https://opengauss.obs.cn-south-1.myhuaweicloud.com/5.0.0/x86/openGauss-5.0.0-CentOS-64bit-all.tar.gz mkdir /opt/software/ mkdir /opt/software/openGauss tar -xvf opengauss.tar.gz -C /opt/software/ cd /opt/software/ tar -jxf openGauss-5.0.0-CentOS-64bit.tar.bz2 -C /opt/software/openGauss chown -R omm /opt/software/安装依赖对于本文档中的CentOS 8,由于已经停止支持,我们需要切换yum源,以清华大学源为例minorver=8.5.2111 sudo sed -e "s|^mirrorlist=|#mirrorlist=|g" \ -e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/$minorver|g" \ -i.bak \ /etc/yum.repos.d/CentOS-*.repoCentOS 8安装供CentOS 7.6使用的OpenGauss会遇到一些问题,我们必须安装一些依赖yum install -y readline-devel libaio libnsl compat-openssl10 cd /usr/lib64 ln -s libreadline.so.7 libreadline.so.6安装以下的命令将OpenGauss安装到25432端口,密码请在命令行中“设定的高强度密码”修改su omm cd /opt/software/openGauss/simpleInstall sh install.sh -w 设定的高强度密码 -p 25432 vim ~/.bashrc # *注释*ulimit那行(在行最前加一个#)若没有可以忽略 source ~/.bashrc配置兼容、外网访问众所周知,OpenGauss拥有PostgreSQL兼容的接口,若在此进行相关修改便可以在应用处无需修改使用主流软件的PG驱动连接数据库服务器使用。我们下面来修改默认配置使其兼容PG的连接器。cd /opt/software/openGauss/data/single_node vim postgresql.conf添加/取消注释以下行listen_addresses = '*' local_bind_address = '0.0.0.0' password_encryption_type = 0vim pg_hba.confhost all all 0.0.0.0/0 md5启动或重启数据库(omm用户)gs_ctl restart -D $GAUSSHOME/data/single_node进入数据库命令行(omm用户)创建一个名为postgres的管理用户(因为默认的omm用户无法从外部登录),密码请在命令行中定义gsql -d postgres -p 25432create user postgres password '你的高强度密码'; GRANT ALL PRIVILEGES TO postgres; \q 退出至此,你已经可以使用Navicat等软件连接到数据库了。若提示找不到gs_ctl、gsql等命令,请在/opt/software/openGauss/下找到bin目录,并将其加入Path至此,本教程结束~欢迎各位同学交流学习
上滑加载中
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签