diff --git a/README.md b/README.md
index aa0752998d026958e489784a28b2deb98f5a75ff..c17379ec78bba9889ec70e7b3b5328fd86e81037 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,7 @@
+## 介绍
+
+自 2023 年 07 月起,v2 分支 替代 master,作为 openGauss 官方博客仓库。
+
## 准备
1. 参考 http://git.mydoc.io/?t=179267 注册 Gitee 账号。
diff --git "a/app/zh/blogs/cchen676/openGauss_\344\275\277\347\224\250gs_initdb\346\227\266\344\277\235\347\225\231\346\227\247\351\205\215\347\275\256.md" "b/app/zh/blogs/cchen676/openGauss_\344\275\277\347\224\250gs_initdb\346\227\266\344\277\235\347\225\231\346\227\247\351\205\215\347\275\256.md"
new file mode 100644
index 0000000000000000000000000000000000000000..2485401cdaff86d25895201b3e1f55571ac8a4d5
--- /dev/null
+++ "b/app/zh/blogs/cchen676/openGauss_\344\275\277\347\224\250gs_initdb\346\227\266\344\277\235\347\225\231\346\227\247\351\205\215\347\275\256.md"
@@ -0,0 +1,35 @@
+---
+title: 'openGauss中使用gs_initdb时保留旧配置'
+date: '2021-01-26'
+category: 'blog'
+tags: ['openGauss使用增强']
+archives: '2021-01'
+author: 'cchen676'
+summary: 'openGauss中使用gs_initdb时保留旧配置'
+img: ''
+times: '16:30'
+---
+
+# openGauss 中使用 gs_initdb 时保留旧配置
+
+## 一、使用场景
+
+该需求来源于社区 issue: [重建库脚本](https://gitee.com/opengauss/openGauss-server/issues/I26TPF?from=project-issue)。
+
+> 在开发过程中,可能会修改系统表,或者各种 debug 情况下导致的库坏掉的情况,建议增加一种重建数据库的脚本。
+
+当前可以通过重新安装或 gs_initdb 建一个新库解决该问题,但用户觉得重装比较麻烦,而使用 gs_initdb 的话因为需要指定一个全新的空目录作为新的数据目录,如果原始是用 OM 安装的数据库,默认启用了 SSL,这时用 gs_initdb 新建的库目录下没有 SSL 相关配置,启动就会失败,需要手动把原来的 SSL 相关证书文件再拷贝过来。
+
+为方便有该需求的用户使用,写了一个脚本,可以指定旧的数据目录,调用 gs_initdb 后,自动把旧数据目录下的配置文件拷贝到新目录下面
+
+## 二、脚本说明
+
+使用说明如下:
+
+1. 上传到数据库用户的目录下,比如/home/omm
+2. 添加执行权限 chmod +x gs_initdb_withconf.sh
+3. 执行前导一下环境变量,确保 gs_initdb 可以正常执行,如果是环境变量分离安装的方式,也需要 source 一下,比如 source ~/.bashrc 或自定义的环境变量
+4. 执行方式为 **_./gs_initdb_withconf.sh -o old_data_dir new_data_dir --nodename=example_node_**
+5. 其实在-o old_data_dir 之后的参数即 gs_initdb 的参数,会直接传给 gs_initdb
+
+[脚本链接](./gs_initdb_withconf.sh)
diff --git a/app/zh/blogs/enmo/images/20230428-1a2b4747-834c-443d-8e81-cd7c70b68227.png b/app/zh/blogs/enmo/images/20230428-1a2b4747-834c-443d-8e81-cd7c70b68227.png
new file mode 100644
index 0000000000000000000000000000000000000000..93e10fc38b1ad6f00a842f953269c10ae98f7784
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230428-1a2b4747-834c-443d-8e81-cd7c70b68227.png differ
diff --git a/app/zh/blogs/enmo/images/20230428-4532b572-e99b-4596-96f0-3fb21e43c739.png b/app/zh/blogs/enmo/images/20230428-4532b572-e99b-4596-96f0-3fb21e43c739.png
new file mode 100644
index 0000000000000000000000000000000000000000..454792ee5fcc040de70422fe8a1e1f5d570fe819
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230428-4532b572-e99b-4596-96f0-3fb21e43c739.png differ
diff --git a/app/zh/blogs/enmo/images/20230428-baa17a24-b45d-4b06-887c-a8a8600c4aad.png b/app/zh/blogs/enmo/images/20230428-baa17a24-b45d-4b06-887c-a8a8600c4aad.png
new file mode 100644
index 0000000000000000000000000000000000000000..5358f592d4daec2710311db9f1d612e946b74285
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230428-baa17a24-b45d-4b06-887c-a8a8600c4aad.png differ
diff --git a/app/zh/blogs/enmo/images/20230428-fa930613-9079-41ae-b841-669a0fa2f8aa.png b/app/zh/blogs/enmo/images/20230428-fa930613-9079-41ae-b841-669a0fa2f8aa.png
new file mode 100644
index 0000000000000000000000000000000000000000..d80f6d78184b526cceb397e63dd9264e0d2307b8
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230428-fa930613-9079-41ae-b841-669a0fa2f8aa.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-1b525df4-0243-4850-9a03-45b6fc828caa.png b/app/zh/blogs/enmo/images/20230519-1b525df4-0243-4850-9a03-45b6fc828caa.png
new file mode 100644
index 0000000000000000000000000000000000000000..a74d2fea6fc0ab8a0db0eaf44c6ff744d0b074ce
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-1b525df4-0243-4850-9a03-45b6fc828caa.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-28583a57-5a56-4cf9-84e0-1471986cfc18.png b/app/zh/blogs/enmo/images/20230519-28583a57-5a56-4cf9-84e0-1471986cfc18.png
new file mode 100644
index 0000000000000000000000000000000000000000..d211cd452e2dcc0c84547a251db91a7a3a79d42e
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-28583a57-5a56-4cf9-84e0-1471986cfc18.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-31152568-cf2e-4559-8764-2c5b5ae3417a.png b/app/zh/blogs/enmo/images/20230519-31152568-cf2e-4559-8764-2c5b5ae3417a.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1740462c508756e1513fbb887439881e75a43ae
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-31152568-cf2e-4559-8764-2c5b5ae3417a.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-40041768-487b-438f-a50b-2802e4733789.png b/app/zh/blogs/enmo/images/20230519-40041768-487b-438f-a50b-2802e4733789.png
new file mode 100644
index 0000000000000000000000000000000000000000..72edd84895179f03400ee155598399763c9378da
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-40041768-487b-438f-a50b-2802e4733789.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-5c261440-fd75-4dab-8302-603dea78db86.png b/app/zh/blogs/enmo/images/20230519-5c261440-fd75-4dab-8302-603dea78db86.png
new file mode 100644
index 0000000000000000000000000000000000000000..d39b99aaef69dbb6b990de052869f66e7a1197d5
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-5c261440-fd75-4dab-8302-603dea78db86.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-5e4c3247-e8c1-48a0-950d-053aa1a936ce.png b/app/zh/blogs/enmo/images/20230519-5e4c3247-e8c1-48a0-950d-053aa1a936ce.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4804d2bd2772380eca285d45a1e9f1590c9cf5b
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-5e4c3247-e8c1-48a0-950d-053aa1a936ce.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-8487b27e-3106-4f71-8c4b-afd6ccff757b.png b/app/zh/blogs/enmo/images/20230519-8487b27e-3106-4f71-8c4b-afd6ccff757b.png
new file mode 100644
index 0000000000000000000000000000000000000000..3cecca179ecb68b7b116a89b1770a17ac0bb3b23
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-8487b27e-3106-4f71-8c4b-afd6ccff757b.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-912e5d67-9a42-4c62-a9ae-498eb0eb3978.png b/app/zh/blogs/enmo/images/20230519-912e5d67-9a42-4c62-a9ae-498eb0eb3978.png
new file mode 100644
index 0000000000000000000000000000000000000000..b46dcdc3d0da28762706d584dad5e308068a0a4e
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-912e5d67-9a42-4c62-a9ae-498eb0eb3978.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-9761be95-6f5b-46f4-87f1-6740571fcd1f.png b/app/zh/blogs/enmo/images/20230519-9761be95-6f5b-46f4-87f1-6740571fcd1f.png
new file mode 100644
index 0000000000000000000000000000000000000000..496d7d7bb1e3eba70b2d2e5a679982bb0b364f53
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-9761be95-6f5b-46f4-87f1-6740571fcd1f.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-a56788a9-3bd8-4506-963c-93be7ee16218.png b/app/zh/blogs/enmo/images/20230519-a56788a9-3bd8-4506-963c-93be7ee16218.png
new file mode 100644
index 0000000000000000000000000000000000000000..06bbfe352af6a42fb7660726f82553cb4971ca5e
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-a56788a9-3bd8-4506-963c-93be7ee16218.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-ac9227d2-dc05-4321-b047-9b4cc8c19f9a.png b/app/zh/blogs/enmo/images/20230519-ac9227d2-dc05-4321-b047-9b4cc8c19f9a.png
new file mode 100644
index 0000000000000000000000000000000000000000..68abe55883f0cecd33bc194639ec82b105aac510
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-ac9227d2-dc05-4321-b047-9b4cc8c19f9a.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-b31cd3c8-26ef-4dfc-aec6-2b7c0e22bcaa.png b/app/zh/blogs/enmo/images/20230519-b31cd3c8-26ef-4dfc-aec6-2b7c0e22bcaa.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c46e435367ff086b8ff66df39ef9efd99730b91
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-b31cd3c8-26ef-4dfc-aec6-2b7c0e22bcaa.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-e859f69e-e346-4021-881c-b4e726dbde9e.png b/app/zh/blogs/enmo/images/20230519-e859f69e-e346-4021-881c-b4e726dbde9e.png
new file mode 100644
index 0000000000000000000000000000000000000000..1af79697aba89dd099b49d4f85b99a69c4ccce9a
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-e859f69e-e346-4021-881c-b4e726dbde9e.png differ
diff --git a/app/zh/blogs/enmo/images/20230519-f740d960-2da1-478b-9e4f-18be79b53dbc.png b/app/zh/blogs/enmo/images/20230519-f740d960-2da1-478b-9e4f-18be79b53dbc.png
new file mode 100644
index 0000000000000000000000000000000000000000..20906978bb4b2690a32e31afbb7bbfacf9d57252
Binary files /dev/null and b/app/zh/blogs/enmo/images/20230519-f740d960-2da1-478b-9e4f-18be79b53dbc.png differ
diff --git "a/app/zh/blogs/enmo/opengauss 5.0 CM\346\226\260\347\211\271\346\200\247\344\271\213 vip\351\205\215\347\275\256.md" "b/app/zh/blogs/enmo/opengauss 5.0 CM\346\226\260\347\211\271\346\200\247\344\271\213 vip\351\205\215\347\275\256.md"
new file mode 100644
index 0000000000000000000000000000000000000000..a5dd7bf3063d27946f4dd2a6a7e8e6149c8e8c07
--- /dev/null
+++ "b/app/zh/blogs/enmo/opengauss 5.0 CM\346\226\260\347\211\271\346\200\247\344\271\213 vip\351\205\215\347\275\256.md"
@@ -0,0 +1,165 @@
+---
+title: 'opengauss 5.0 CM新特性之 vip配置'
+
+date: '2023-05-30'
+
+tags: ['opengauss']
+category: 'blog'
+archives: '2023-05'
+
+author: '云和恩墨-戚钰'
+
+summary: 'opengauss 5.0 CM新特性之 vip配置'
+
+img: '/zh/post/enmo/title/img.png'
+
+times: '10:20'
+---
+
+本文出处:[https://www.modb.pro/db/626823](https://www.modb.pro/db/626823)
+
+节点信息
+
+192.168.0.141 主节点
+192.168.0.145 备节点
+192.168.0.10 vip
+
+# 一、数据库集群未安装的场景下配置 VIP
+
+## 1. 添加 vip
+
+```
+ifconfig eth0:26000 192.168.0.10 netmask 255.255.255.0 up
+```
+
+## 2. ifconfig 提权
+
+修改权限文件/etc/sudoers,添加以下内容,为集群用户添加 ifconfig 权限。
+
+```
+# echo "Cmnd_Alias COMMAND_FLAG = /usr/sbin/ifconfig" >> sudoers
+# echo "omm ALL=(root) NOPASSWD: COMMAND_FLAG" >> sudoers
+```
+
+## 3. xml 文件中配置 VIP 相关配置项
+
+示例文件如下
+
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## 4. 使用 xml 进行安装
+
+安装成功后 VIP 便会自动绑定到对应的主机上,可以使用 cm_ctl show 命令查看 VIP 状态
+
+# 二、带 CM 的数据库集群已安装的场景下配置 VIP
+
+## 1. 添加 vip
+
+```
+ifconfig eth0:26000 192.168.0.10 netmask 255.255.255.0 up
+```
+
+## 2. ifconfig 提权
+
+修改权限文件/etc/sudoers,添加以下内容,为集群用户添加 ifconfig 权限。
+
+```
+# echo "Cmnd_Alias COMMAND_FLAG = /usr/sbin/ifconfig" >> sudoers
+# echo "omm ALL=(root) NOPASSWD: COMMAND_FLAG" >> sudoers
+```
+
+## 3. 新增 floatIp 资源
+
+```
+cm_ctl res --add --res_name="VIP_az1" --res_attr="resources_type=VIP,float_ip=192.168.0.10"
+```
+
+```
+cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=1,res_instance_id=6001" --inst_attr="base_ip=192.168.0.141"
+cm_ctl res --edit --res_name="VIP_az1" --add_inst="node_id=2,res_instance_id=6002" --inst_attr="base_ip=192.168.0.145"
+```
+
+执行完成后,建议使用 cm_ctl res –check 命令进行检查。
+自定义资源文件要求每个节点都要有且一致
+
+```
+cm_ctl res --check
+```
+
+执行 check 完成后,在 cmdataPath/cm_agent/目录下会生成一个自定义资源配置文件 cm_resource.json,检查完成没有错误后,需要手动 scp 将该文件分发到其他节点
+
+分发完成后需要重启集群才能生效。该配置文件对格式要求比较严格,所以该操作不建议使用直接修改文件的方式配置,建议配置后使用 cm_ctl res –check 命令进行校验。
+
+## 4. 配置 pg_hba.conf
+
+在数据库 pg_hba.conf 文件中以 sha256 方式添加 floatIp
+
+```
+host all all 192.168.0.10/32 sha256
+```
+
+## 5. 检查 vip 是否绑定成功
+
+```
+cm_ctl show
+```
+
+主节点 postgresql.conf 文件中,listen_addresses 会自动添加 vip(切换为备节点会自动删除 vip)
+
+## 6. jdbc 连接测试
+
+```
+url=jdbc:postgresql://192.168.0.10:26000/postgres?connectTimeout=5&targetServerType=master&tcpKeepAlive=true
+```
diff --git "a/app/zh/blogs/enmo/opengauss 5.0 CM\346\226\260\347\211\271\346\200\247\344\271\213\345\217\252\350\257\273\346\243\200\346\265\213\350\203\275\345\212\233\345\242\236\345\274\272.md" "b/app/zh/blogs/enmo/opengauss 5.0 CM\346\226\260\347\211\271\346\200\247\344\271\213\345\217\252\350\257\273\346\243\200\346\265\213\350\203\275\345\212\233\345\242\236\345\274\272.md"
new file mode 100644
index 0000000000000000000000000000000000000000..d30703a659ee92c5615f7812f04dd4a84b8ce3f1
--- /dev/null
+++ "b/app/zh/blogs/enmo/opengauss 5.0 CM\346\226\260\347\211\271\346\200\247\344\271\213\345\217\252\350\257\273\346\243\200\346\265\213\350\203\275\345\212\233\345\242\236\345\274\272.md"
@@ -0,0 +1,115 @@
+---
+title: 'opengauss 5.0 CM新特性之只读检测能力增强'
+category: 'blog'
+date: '2023-05-30'
+
+tags: ['opengauss']
+
+archives: '2023-05'
+
+author: '云和恩墨-戚钰'
+
+summary: 'opengauss 5.0 CM新特性之只读检测能力增强'
+
+img: '/zh/post/enmo/title/img.png'
+
+times: '10:20'
+---
+
+本文出处:[https://www.modb.pro/db/631091](https://www.modb.pro/db/631091)
+
+# 一、 功能说明
+
+只读状态从数据库获取,保证准确性;
+只读仲裁只仲裁当前超过阈值的实例,其他节点不受影响;
+主机只读保护后自动主备切换,选可用备机升主保证集群能正常提供工作。
+
+# 二、 相关参数设置
+
+1. 设置数据库只读模式的磁盘占用阈值为 95%
+
+```
+$cm_ctl set --param --server -k datastorage_threshold_value_check=95
+```
+
+2. reload server 参数
+
+```
+$ cm_ctl reload --param --server
+```
+
+3. 查看参数是否生效
+
+```
+$cm_ctl list --param --server|grep datastorage_threshold_value_check
+```
+
+# 三、 对比测试
+
+## (1)3.0.0 版本测试
+
+初始集群状态(A 为主)
+
+
+
+使用混沌工具模拟数据目录占用 95%
+
+```
+./blade create disk fill --path /gaussdata --percent 95 --retain-handle
+```
+
+
+
+CMS 主发送命令开启只读模式
+
+
+
+查看集群状态,各实例为 read only 状态
+
+
+
+销毁混沌实验后,CMS 发送命令,关闭只读模式
+
+
+
+集群状态正常
+
+
+
+## (2) 5.0.0 版本测试
+
+### ① 主库数据目录超阈值
+
+初始集群状态
+
+
+
+模拟主节点数据目录占 96%
+
+
+
+主备切换,且新备库为只读
+
+
+
+cm_server key_event 日志显示主备 switchover
+
+
+
+cm_agent–current.log 日志显示开启只读模式
+
+
+
+### ② 备节点数据目录超阈值
+
+初始集群状态
+
+
+
+模拟备节点数据目录 95%
+
+
+
+备库变为只读
+
+
diff --git "a/app/zh/blogs/enmo/opengauss\345\217\214region\346\265\201\345\274\217\345\256\271\347\201\276\346\220\255\345\273\272.md" "b/app/zh/blogs/enmo/opengauss\345\217\214region\346\265\201\345\274\217\345\256\271\347\201\276\346\220\255\345\273\272.md"
new file mode 100644
index 0000000000000000000000000000000000000000..4296d9bbfa26e48b892ec93fda0d561b694727de
--- /dev/null
+++ "b/app/zh/blogs/enmo/opengauss\345\217\214region\346\265\201\345\274\217\345\256\271\347\201\276\346\220\255\345\273\272.md"
@@ -0,0 +1,258 @@
+---
+title: 'opengauss双region流式容灾搭建'
+
+date: '2023-05-30'
+category: 'blog'
+tags: ['openGauss']
+
+archives: '2023-05'
+
+author: '云和恩墨-戚钰'
+
+summary: 'opengauss双region流式容灾搭建'
+
+img: '/zh/post/enmo/title/img.png'
+
+times: '10:20'
+---
+
+本文出处:[https://www.modb.pro/db/626197](https://www.modb.pro/db/626197)
+
+# 一、主备双集群部署
+
+架构:主集群:一主一备;灾备集群:一主一备
+
+**1. 安装集群 1**
+
+主节点:192.168.0.141
+备节点:192.168.0.145
+
+xml 文件参考:
+
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+**2. 安装集群 2**
+
+主节点:192.168.0.142
+备节点:192.168.0.143
+
+xml 文件参考:
+
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+**3. 在主集群创建容灾用户**
+
+```
+gsql -d postgres -p PORT -c "create user DR_USERNAME with replication password 'DR_PASSWORD';"
+```
+
+**4. 将集群 1 启动为主集群**
+
+```
+gs_sdr -t start -m primary -X XMLFILE [-U DR_USERNAME [-W DR_PASSWORD]] [--time-out=SECS]
+```
+
+**5. 将集群 2 启动为备集群**
+
+```
+gs_sdr -t start -m disaster_standby -U USER -W PASSWORD -X XMLFILE [-U DR_USERNAME [-W DR_PASSWORD]] [--time-out=SECS]
+```
+
+**6. 查询**
+
+```
+gs_sdr -t query
+```
+
+主集群:
+
+
+
+
+
+备集群:
+
+
+
+
+
+以上:
+
+-U 容灾用户名,-W 容灾用户密码,为可选参数,如果未携带需要在搭建过程中交互输入;
+
+–time-out 超时时间,为可选参数,默认为 1200 秒。
+
+# 二、搭建容灾关系前后参数对比
+
+**1. 方案**
+
+搭建前后将流复制相关参数导入文件,使用 diff 对比
+
+**2. 步骤**
+
+```
+gsql -p 26000 -d postgres -c "select name,reset_val from pg_settings where category ='Write-Ahead Log / Settings'">settings1.log
+gsql -p 26000 -d postgres -c "select name,reset_val from pg_settings where category ='Write-Ahead Log / Checkpoints'" >>settings1.log
+gsql -p 26000 -d postgres -c "select name,reset_val from pg_settings where category ='Replication / Sending Servers'" >>settings1.log
+gsql -p 26000 -d postgres -c "select name,reset_val from pg_settings where category ='Resource usage / Recovery'" >>settings1.log
+gsql -p 26000 -d postgres -c "select name,reset_val from pg_settings where category ='Replication / Master Server'" >>settings1.log
+gsql -p 26000 -d postgres -c "select name,reset_val from pg_settings where category ='Replication / Standby Servers'" >>settings1.log
+```
+
+1. 对比结果
+
+前
+
+```
+< replconninfo1| localhost=192.168.0.141 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.0.145 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004
+< replconninfo2|
+< replconninfo3|
+```
+
+后
+
+```
+> replconninfo1| localhost=192.168.0.141 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.0.145 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004 iscascade=true iscrossregion=false
+> replconninfo2| localhost=192.168.0.141 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.0.142 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004 iscascade=false iscrossregion=true
+> replconninfo3| localhost=192.168.0.141 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.0.143 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004 iscascade=false iscrossregion=true
+```
+
+前
+
+```
+< wal_keep_segments | 16
+```
+
+后
+
+```
+> wal_keep_segments | 128
+```
+
+注:主集群搭建后 wal_keep_segments=128,备集群搭建后 wal_keep_segments=16
+
+前
+
+```
+< most_available_sync | off
+```
+
+后
+
+```
+> most_available_sync | on
+```
+
+后(新增)
+
+opgs1com/opgs2com
+
+```
+stream_cluster_run_mode = 'cluster_primary'
+```
+
+opgs3com/opgs4com
+
+```
+stream_cluster_run_mode = 'cluster_standby'
+```
diff --git a/app/zh/blogs/guidance/index.md b/app/zh/blogs/guidance/index.md
index ef337e143657b4262deb6fa7ebcb880d94c6f182..d9571e1f46e75f5d26c1c6ee755ceaeb19fc6a8b 100644
--- a/app/zh/blogs/guidance/index.md
+++ b/app/zh/blogs/guidance/index.md
@@ -90,7 +90,3 @@ git push origin :
7. Refer to https://gitee.com/help/articles/4122to submit your Pull Request
8. Wait for reviewing and merging.
-
-
-
-
+
diff --git "a/app/zh/blogs/luozihao/A-FOT\345\267\245\345\205\267\350\207\252\345\212\250\345\217\215\351\246\210\344\274\230\345\214\226.md" "b/app/zh/blogs/luozihao/A-FOT\345\267\245\345\205\267\350\207\252\345\212\250\345\217\215\351\246\210\344\274\230\345\214\226.md"
new file mode 100644
index 0000000000000000000000000000000000000000..765ec3662b2947279b22c521995b998149d1baf5
--- /dev/null
+++ "b/app/zh/blogs/luozihao/A-FOT\345\267\245\345\205\267\350\207\252\345\212\250\345\217\215\351\246\210\344\274\230\345\214\226.md"
@@ -0,0 +1,606 @@
+---
+title: 'A-FOT工具自动反馈优化openGauss教程'
+date: '2023-06-1'
+tags: ['优化']
+archives: '2023-06'
+author: '罗梓浩'
+category: 'blog'
+summary: '指导如何安装、使用A-FOT工具自动反馈优化openGauss性能'
+img: '/zh/post/luozihao/title/img.png'
+times: '21:30'
+---
+
+## 概要
+
+本文档旨在指导用户如何使用 A-FOT 工具实现 openGauss 自动反馈调优。
+
+## 前置条件
+
+服务器端按照[版本编译](https://docs.opengauss.org/zh/docs/5.0.0/docs/CompilationGuide/%E7%89%88%E6%9C%AC%E7%BC%96%E8%AF%91.html)的指导编译一个 openGauss 数据库即可。客户端不做限制,可以安装一个 benchmark,也可以安装一个 sysbench,A-FOT 是一个自动化的定向优化,只针对具体的业务进行优化,所以如果你是要用 benchmark 跑性能结果,就给客户端安装 benchmark。
+
+## 安装 autofdo 和 A-FOT
+
+如果所使用的系统为 openEuler 22.03 以上的版本,可以直接使用 yum 安装 A-FOT 工具及其依赖的工具 autofdo:
+
+```
+yum install -y autofdo a-fot
+```
+
+如果不是,则按照如下步骤安装 autofdo 以及 A-FOT
+
+1. 首先需要安装 autofdo,在安装之前,我们需要使用 yum 下载如下的依赖:
+
+```shell
+yum install -y cmake gcc-c++ protobuf protobuf-devel libtool autoconf automake git elfutils-libelf-devel openssl-devel pkg-config libunwind-devel gflags-devel
+```
+
+2. git clone 下载 autofdo 的源代码:
+
+```shell
+git clone --recursive https://github.com/google/autofdo.git
+```
+
+3. 执行如下命令进行安装:
+
+```shell
+cd autofdo/
+mkdir build
+cd build/
+cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=. ../
+make -j && make install
+```
+
+4. 安装完成之后,可以尝试使用如下命令将 autofdo 中的 create_gcov 等工具加入到路径中,如下所示(假设我的源码路径是/tmp/autofdo):
+
+```shell
+export PATH=/tmp/autofdo/build:$PATH
+```
+
+当你使用 create_gcov --version 时,打印如下所示就代表安装成功了:
+
+
+
+5. 通过如下命令下载 A-FOT 工具
+
+```shell
+git clone https://gitee.com/openeuler/A-FOT.git
+```
+
+该工具目前有一些小问题,导致在使用上会有一些小错误,所以下载完成之后需要修改一些代码,
+首先是 a-fot 文件:
+
+```
+#!/bin/bash
+current_path=$(cd "$(dirname "$0")";pwd)
+config_file=${current_path}/a-fot.ini
+
+# Profile名字
+profile_name="profile.data"
+# gcov名字
+gcov_name="profile.gcov"
+
+# 解析配置文件配置项
+function parse_config() {
+ if [[ ! -f ${config_file} ]]; then
+ echo "[ERROR] Could not load config file at: ${config_file}, please check!"
+ exit 1
+ fi
+ while read line; do
+ if [[ ! ${line} =~ "#" ]]; then
+ key=$(echo ${line} | awk -F "=" '{print $1}')
+ value=$(echo ${line} | awk -F "=" '{print $2}')
+ eval "${key}=${value}"
+ fi
+ done <${config_file}
+}
+
+# 解析输入的参数
+function parse_input_params() {
+ if [[ $# == 1 ]]; then
+ suggest_info
+ exit 1
+ fi
+ while [ $# -ge 2 ]; do
+ case $1 in
+ --opt_mode)
+ opt_mode=$2
+ shift 2
+ ;;
+ --perf_time)
+ perf_time=$2
+ shift 2
+ ;;
+ --app_name)
+ application_name=$2
+ shift 2
+ ;;
+ --bin_file)
+ bin_file=$2
+ shift 2
+ ;;
+ --build_script)
+ build_script=$2
+ shift 2
+ ;;
+ --work_path)
+ work_path=$2
+ shift 2
+ ;;
+ --run_script)
+ run_script=$2
+ shift 2
+ ;;
+ --max_waiting_time)
+ max_waiting_time=$2
+ shift 2
+ ;;
+ --gcc_path)
+ gcc_path=$2
+ shift 2
+ ;;
+ --config_file)
+ config_file=$2
+ shift 2
+ ;;
+ --check_success)
+ check_success=$2
+ shift 2
+ ;;
+ --build_mode)
+ build_mode=$2
+ shift 2
+ ;;
+ --user_name)
+ user_name=$2
+ shift 2
+ ;;
+ *)
+ suggest_info
+ exit 1
+ ;;
+ esac
+ done
+}
+
+function check_config_item() {
+ if [[ -z ${application_name} ]]; then
+ echo "[ERROR] The configuration item 'application_name' is missing, please check!"
+ exit 1
+ fi
+ if [[ -z ${bin_file} ]]; then
+ echo "[ERROR] The configuration item 'bin_file' is missing, please check!"
+ exit 1
+ fi
+
+ if [[ -z ${work_path} ]]; then
+ echo "[ERROR] The configuration item 'work_path' is missing, please check!"
+ exit 1
+ fi
+ if [[ -z ${build_script} ]]; then
+ echo "[ERROR] The configuration item 'build_script' is missing, please check!"
+ exit 1
+ fi
+ if [[ -z ${run_script} ]]; then
+ echo "[ERROR] The configuration item 'run_script' is missing, please check!"
+ exit 1
+ fi
+ if [[ -z ${max_waiting_time} ]]; then
+ echo "[ERROR] The configuration item 'max_waiting_time' is missing, please check!"
+ exit 1
+ fi
+ if [[ -z ${opt_mode} ]]; then
+ echo "[ERROR] The configuration item 'opt_mode' is missing, please check!"
+ exit 1
+ fi
+ if [[ -z ${perf_time} ]]; then
+ echo "[ERROR] The configuration item 'perf_time' is missing, please check!"
+ exit 1
+ fi
+ if [[ -z ${gcc_path} ]]; then
+ echo "[ERROR] The configuration item 'gcc_path' is missing, please check!"
+ exit 1
+ fi
+ if [[ -z ${check_success} ]]; then
+ echo "[ERROR] The configuration item 'check_success' is missing, please check!"
+ exit 1
+ fi
+ if [[ -z ${build_mode} ]]; then
+ echo "[ERROR] The configuration item 'build_mode' is missing, please check!"
+ exit 1
+ fi
+}
+
+function suggest_info() {
+ echo """
+Usage: a-fot [OPTION1 ARG1] [OPTION2 ARG2] [...]
+
+--config_file Path of configuration file
+--opt_mode Optimization modes (AutoFDO/AutoPrefetch/AutoBOLT)
+--perf_time Perf sampling duration (unit: seconds)
+--gcc_path Compiler gcc path
+--app_name Application process name
+--bin_file Executable binary file path
+--build_script Application build script path
+--work_path Script working directory (used to compile the application and store the profile)
+--run_script Script path for run application
+--max_waiting_time Maximum binary startup time (unit: seconds)
+--check_success Check optimization result
+--build_mode Execute build scrip mode (Wrapper/Bear)
+"""
+}
+
+# 根据模式加载不同的优化脚本
+function load_script() {
+ case ${opt_mode} in
+ "AutoFDO")
+ source ${current_path}/auto_fdo.sh
+ ;;
+ "AutoPrefetch")
+ source ${current_path}/auto_prefetch.sh
+ ;;
+ "AutoBOLT")
+ source ${current_path}/auto_bolt.sh
+ ;;
+ *)
+ echo "[ERROR] Optimization mode ${opt_mode} is not supported, Check the configuration item: opt_mode"
+ exit 1
+ ;;
+ esac
+}
+
+# 公共依赖检查项
+function check_common_dependency() {
+ get_arch=`arch`
+ if [[ ${get_arch} =~ "x86_64" || ${get_arch} =~ "aarch64" ]];then
+ echo "[INFO] Current arch: ${get_arch}"
+ else
+ echo "[ERROR] Unsupport arch: ${get_arch}"
+ exit 1
+ fi
+ if ! type perf &>/dev/null; then
+ echo "[ERROR] Optimization mode ${opt_mode} but perf is missing, try 'yum install perf'"
+ exit 1
+ fi
+ is_file_exist ${build_script}
+ is_file_exist ${run_script}
+ is_file_exist "${gcc_path}/bin/gcc"
+}
+
+# 拆分编译数据库
+function split_option() {
+ if [ "$bear_prefix" ];then
+ python3 $current_path/split_json.py -i $PWD/compile_commands.json
+ mv $PWD/compile_commands.json $PWD/compile_commands_$1.json
+ mv $PWD/compile_commands.fail.json $PWD/compile_commands.fail_$1.json
+ fi
+}
+
+# 使用原始编译选项进行编译
+function first_compilation() {
+ echo "[INFO] Start raw compilation"
+ is_file_exist ${build_script} "build_script"
+ if [[ $build_mode =~ "Bear" ]]; then
+ bear_prefix="bear -- "
+ echo "[INFO] Build in Bear mode"
+ else
+ echo "[INFO] Build in Wrapper mode"
+ fi
+ $bear_prefix /bin/bash ${build_script} >> ${log_file} 2>&1
+ split_option first
+ is_file_exist ${bin_file}
+ is_success $?
+}
+
+# 创建wrapper之后的操作
+function post_create_wrapper() {
+ chmod 755 ${gcc_wrapper}/gcc
+ chmod 755 ${gcc_wrapper}/g++
+
+ export CC=${gcc_wrapper}/gcc
+ export CXX=${gcc_wrapper}/g++
+ export LD_LIBRARY_PATH=${gcc_path}/lib64:${LD_LIBRARY_PATH}
+
+ export PATH=${gcc_wrapper}:${PATH}
+}
+
+# 执行应用程序执行脚本
+function execute_run_script() {
+ echo "[INFO] Start to execute the run_script: ${run_script}"
+ process_id=$(pgrep -u ${user_name} ${application_name})
+ if [[ -n ${process_id} ]]; then
+ echo "[ERROR] Application: ${application_name} process already exists. The run_script will not be executed. Please check"
+ exit 1
+ fi
+ is_file_exist ${run_script} "run_script"
+ /bin/bash ${run_script} >> ${log_file} 2>&1 &
+ is_success $?
+}
+
+# 探测应用进程是否存在
+function detect_process() {
+ echo "[INFO] Start to detect whether process ${application_name} is started"
+ detect_time=0
+ while [ -z $(pgrep -u ${user_name} ${application_name}) ]; do
+ sleep 1
+ ((detect_time = ${detect_time} + 1))
+ echo "[INFO] Finding ${application_name}"
+ if [[ ${detect_time} -gt ${max_waiting_time} ]]; then
+ echo "[ERROR] Process ${application_name} is not found after ${max_waiting_time}. Please check"
+ exit 1
+ fi
+ done
+ echo "[INFO] Found Process ${application_name}: $(pgrep -u ${user_name} ${application_name})"
+}
+
+# 使用新的编译选项编译,同时判断优化结果.
+# 需注意此检查依赖wrapper中编译器后添加第一个编译选项,
+# 因此需保证编译器后添加第一个编译选项为优化选项而非通用选项
+function second_compilation() {
+ echo "[INFO] Try compiling with the new compilation options"
+ if [[ ${check_success} -eq 1 ]]; then
+ $bear_prefix /bin/bash ${build_script} >> ${log_file} 2>&1 & build_id=$!
+ echo "[INFO] Found build id: ${build_id}"
+ add_opt=$(cat ${gcc_wrapper}/gcc | awk -F " " '{print $2}')
+ build_status=`ps -p ${build_id} | grep -c ${build_id}`
+ opt_success=0
+ while [[ ${build_status} -ne 0 ]]; do
+ if [[ ${opt_success} -eq 0 ]]; then
+ # 使用:1去除编译选项左边的'-'
+ if [[ $(ps aux | grep -c "${add_opt:1}") -gt 1 ]]; then
+ opt_success=1
+ break
+ fi
+ fi
+ build_status=`ps -p ${build_id} | grep -c ${build_id}`
+ done
+ wait
+ else
+ $bear_prefix /bin/bash ${build_script} >> ${log_file} 2>&1
+ fi
+ echo "[INFO] Finish compiling with new compilation options"
+ split_option second
+ is_success $?
+}
+
+# 判断上一步执行是否成功
+function is_success() {
+ pre_result=$1
+ if [[ ${pre_result} -eq 1 ]]; then
+ echo "[ERROR] Execution failed, please check the log: ${log_file}"
+ exit 1
+ fi
+}
+
+# 检查配置文件脚本是否存在
+function is_file_exist() {
+ file=$1
+ config_item=$2
+ if [[ ! -f ${file} ]]; then
+ if [[ -n ${config_item} ]]; then
+ echo "[ERROR] The file ${file} does not exist. Check the configuration item: ${config_item}"
+ else
+ echo "[ERROR] The file ${file} does not exist"
+ fi
+ exit 1
+ fi
+}
+
+#初始化profile文件夹和log文件
+function init_profile_and_log() {
+ # Profile和log所在路径
+ now_time=$(date '+%Y%m%d-%H%M%S')
+ profile_data_path=${work_path}/${now_time}
+ log_file=${work_path}/${now_time}/opt.log
+ if [[ ! -d ${profile_data_path} ]]; then
+ mkdir -p ${profile_data_path}
+ fi
+ echo "[INFO] Create profile dir: ${profile_data_path}"
+
+ touch ${log_file}
+ echo "[INFO] Init log file: ${log_file}"
+
+ # 创建Wrapper所在路径
+ gcc_wrapper="${work_path}/${now_time}/gcc_wrapper/"
+ mkdir -p ${gcc_wrapper}
+}
+
+#检测是否优化成功
+function is_opt_success() {
+ if [[ ${check_success} -eq 1 ]]; then
+ if [[ ${opt_success} -eq 0 ]]; then
+ echo "[WARNING] Optimization may fail or the build process is too short, please check!"
+ echo "[WARNING] Please try gcc/g++ at: ${gcc_wrapper} instead of the original compiler"
+ exit 1
+ else
+ echo "[INFO] Optimization may success!"
+ fi
+ fi
+ exit 0
+}
+
+#执行入口,部分函数为加载不同优化脚本中得到
+function main() {
+ parse_input_params "$@"
+ parse_config
+ parse_input_params "$@"
+ check_config_item
+ init_profile_and_log
+ load_script
+
+ check_dependency
+ prepare_env
+ first_compilation
+ execute_run_script
+ detect_process
+ perf_record
+
+ prepare_new_env
+ second_compilation
+ is_opt_success
+ exit "$?"
+}
+
+main "$@"
+exit "$?"
+
+```
+
+然后是 auto_fdo.sh 文件:
+
+```
+#!/bin/bash
+
+# 检测依赖软件是否已经安装
+function check_dependency() {
+ check_common_dependency
+ if ! type create_gcov &>/dev/null; then
+ echo "[ERROR] Optimization mode ${opt_mode} but autofdo is missing, try 'yum install autofdo'"
+ exit 1
+ fi
+}
+
+# 根据模式选择Wrapper或者Bear模式构建
+function prepare_env() {
+ case ${build_mode} in
+ "Wrapper")
+ create_wrapper
+ ;;
+ "Bear")
+ export COMPILATION_OPTIONS="-g"
+ export LINK_OPTIONS="-g"
+ ;;
+ *)
+ echo "[ERROR] Build mode ${build_mode} is not supported, the value is : Wrapper/Bear"
+ exit 1
+ ;;
+ esac
+}
+
+# 创建原始wrapper
+function create_wrapper() {
+ echo "[INFO] Start generating the original wrapper"
+ echo "${gcc_path}/bin/gcc -g \"\$@\"" >${gcc_wrapper}/gcc
+ echo "${gcc_path}/bin/g++ -g \"\$@\"" >${gcc_wrapper}/g++
+ post_create_wrapper
+}
+
+# 执行perf采样,生成profile文件
+function perf_record() {
+ echo "[INFO] Start perf record by ${opt_mode} and generate a profile file"
+ process_id=$(pgrep -u ${user_name} ${application_name})
+ if [[ ${get_arch} =~ "x86_64" ]];then
+ perf_event="br_inst_retired.near_taken:u"
+ use_lbr=1
+ elif [[ ${get_arch} =~ "aarch64" ]];then
+ perf_event="inst_retired:u"
+ use_lbr=0
+ else
+ echo "[ERROR] Unsupport arch: ${get_arch}"
+ exit 1
+ fi
+ perf record -e ${perf_event} -o ${profile_data_path}/${profile_name} -p ${process_id} -- sleep ${perf_time} >> ${log_file} 2>&1
+ is_file_exist "${profile_data_path}/${profile_name}"
+ create_gcov --binary=${bin_file} --profile=${profile_data_path}/${profile_name} --gcov=${profile_data_path}/${gcov_name} --gcov_version=1 --use_lbr=${use_lbr} >> ${log_file} 2>&1
+ is_file_exist "${profile_data_path}/${gcov_name}"
+ kill -9 ${process_id}
+}
+
+# 根据模式选择Wrapper或者Bear模式构建
+function prepare_new_env() {
+ case ${build_mode} in
+ "Wrapper")
+ create_new_wrapper
+ ;;
+ "Bear")
+ export COMPILATION_OPTIONS="-fauto-profile=${profile_data_path}/${gcov_name}"
+ ;;
+ *)
+ echo "[ERROR] Build mode ${build_mode} is not supported, the value is : Wrapper/Bear"
+ exit 1
+ ;;
+ esac
+}
+
+#生成新的wrapper
+function create_new_wrapper() {
+ echo "[INFO] Start to generate a new wrapper"
+ echo "${gcc_path}/bin/gcc -fauto-profile=${profile_data_path}/${gcov_name} \"\$@\"" >${gcc_wrapper}/gcc
+ echo "${gcc_path}/bin/g++ -fauto-profile=${profile_data_path}/${gcov_name} \"\$@\"" >${gcc_wrapper}/g++
+}
+
+```
+
+### 开始使用
+
+1. 编辑应用构建脚本,A-FOT 的目录下创建名为 build.sh 的文件,写下下面的内容即可
+
+```shell
+cd /tmp/openGauss-server
+make distclean -sj
+./configure --gcc-version=10.3.1 --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-thread-safety --with-readline --without-readline CFLAGS="-O2 -g3 -D__USE_NUMA -D__ARM_LSE" --enable-mot CC=g++
+make -sj
+make install -sj
+```
+
+2. 编辑运行脚本,A-FOT 的目录下创建名为 run.sh 的文件,该脚本的写法并不固定,取决于你要怎么运行你的程序并进行采样。一般分为启动数据库、跑 tpcc 这两部分。
+
+```shell
+gs_ctl start -D $GAUSSHOME/data_node #启动数据库
+sh /benchmark路径/runBenchmark.sh props.pg #通知客户端跑tpcc
+```
+
+以下我贴一下我自己常用的一个运行脚本
+
+```
+echo "reset the datanode"
+sh /data1/luozihao/reset_env.sh #重置tpcc的环境,即清除现有环境,并用已有的备份进行替换
+echo "run start"
+numactl -C 1-28,32-60,64-92,96-124 gs_ctl start -D /data1/luozihao/data #用numa启动数据库,如果没有numactl就用yum install -y numactl下载一个
+sshpass -p '用户密码' ssh 用户名@客户端ip "sh /benchmark路径/runBenchmark.sh props.pg" #用ssh命令让客户端运行benchmark
+echo "run end"
+```
+
+其中 sshpass 是一个用于扩展 ssh 命令的工具,它可以直接给 ssh 输入密码从而避免手动输入密码,用 root 用户下载安装的方法如下所示:
+
+```
+wget http://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz
+tar xvzf sshpass-1.05.tar.gz
+cd sshpass-1.05.tar.gz
+./configure
+make
+make install
+```
+
+3. 编辑配置文件 a-fot.ini 文件,如下所示
+
+```
+# 应用进程名
+application_name=gaussdb
+# 二进制安装后可执行文件
+bin_file=/tmp/openGauss-server/dest/bin/gaussdb
+# 脚本工作目录(用来编译应用程序/存放profile)
+work_path=/tmp/a-fot_test/work_path
+# 应用构建脚本路径
+build_script=/tmp/A-FOT/build.sh
+# Benhmark路径及运行命令
+run_script=/tmp/A-FOT/run.sh
+# 最大二进制启动时间(单位:秒)
+max_waiting_time=1000
+# 优化模式(AutoFDO、AutoPrefetch、AutoBOLT)
+opt_mode=AutoFDO
+# Perf采样时长(单位:秒)
+perf_time=150
+# gcc路径,gcc版本以自己当前三方包中的gcc版本为基准
+gcc_path=/tmp/openGauss-third_party_binarylibs_openEuler_arm/buildtools/gcc10.3/gcc
+# 检测是否优化成功(1=启用,0=禁用)
+check_success=1
+# 构建模式 (Bear、Wrapper)
+build_mode=Wrapper
+# 结束行勿删
+```
+
+4. 开始运行
+
+```
+./afot --user_name 用户名 --config_file /tmp/A-FOT/a-fot.ini
+```
diff --git a/app/zh/blogs/luozihao/image/17aca41c_7898503.png b/app/zh/blogs/luozihao/image/17aca41c_7898503.png
new file mode 100644
index 0000000000000000000000000000000000000000..45f0629094ad8cb25579cde7416efd73aaa36e82
Binary files /dev/null and b/app/zh/blogs/luozihao/image/17aca41c_7898503.png differ
diff --git a/app/zh/blogs/luozihao/title/img.png b/app/zh/blogs/luozihao/title/img.png
new file mode 100644
index 0000000000000000000000000000000000000000..86a420b92fb8289658d807d49f137b6d13862f6d
Binary files /dev/null and b/app/zh/blogs/luozihao/title/img.png differ
diff --git a/app/zh/blogs/wangyuxuan/title/img.png b/app/zh/blogs/wangyuxuan/title/img.png
new file mode 100644
index 0000000000000000000000000000000000000000..86a420b92fb8289658d807d49f137b6d13862f6d
Binary files /dev/null and b/app/zh/blogs/wangyuxuan/title/img.png differ
diff --git "a/app/zh/blogs/xingchen/OM\345\256\211\350\243\205openssl\345\205\274\345\256\271\351\227\256\351\242\230.md" "b/app/zh/blogs/xingchen/OM\345\256\211\350\243\205openssl\345\205\274\345\256\271\351\227\256\351\242\230.md"
new file mode 100644
index 0000000000000000000000000000000000000000..002eed64c4088bec3684d7f7184c6d943cf5908c
--- /dev/null
+++ "b/app/zh/blogs/xingchen/OM\345\256\211\350\243\205openssl\345\205\274\345\256\271\351\227\256\351\242\230.md"
@@ -0,0 +1,84 @@
+---
+title: 'OM安装后,linux命令报错openssl不兼容'
+date: '2023-06-17'
+category: 'blog'
+tags: ['OM安装后,linux命令报错openssl不兼容']
+archives: '2023-06-17'
+author: 'zhang_xubo'
+summary: 'OM安装后,linux命令报错openssl不兼容'
+img: '/zh/post/xingchen/title/img1.png'
+times: '10:30'
+---
+
+### 概述
+
+在部分系统中,使用 OM 安装完成 openGauss 数据库后,会出现例如 **yum install** 不可用, 或者 **ssh** 不可用的问题。
+
+**问题现象**
+
+1. 在 openeuler20.03 系统上,使用 openGauss 3.0.3 之前的版本,OM 安装完成后,切换到 root 下使用 yum 安装组件,会出现如下错误:
+
+ ```
+ symbol SSLv3_method version OPENSSL_1_1_0 not defined in file libssl.so.1.1 with link time reference
+ ```
+
+2. 在一些高版本系统中,如 centos8 以上。安装完成数据库后,使用 ssh 报错:
+ 
+
+**问题原因**
+
+为了保证兼容和稳定,openGauss 在开源三方库里面引入了 openssl 组件进行管理和维护,这样依赖会导致 openGauss 使用的 openssl 版本和操作系统上自带 openssl 版本的可能存在不兼容的问题。
+
+OM 安装完成后,会再 `/etc/profile` 里面写入自身的环境变量,如下:
+
+```
+export GPHOME=/opt/huawei/install/om
+export UNPACKPATH=/opt/software/openGauss
+export PATH=$PATH:$GPHOME/script/gspylib/pssh/bin:$GPHOME/script
+export LD_LIBRARY_PATH=$GPHOME/script/gspylib/clib:$LD_LIBRARY_PATH
+export LD_LIBRARY_PATH=$GPHOME/lib:$LD_LIBRARY_PATH
+export PYTHONPATH=$GPHOME/lib
+export PATH=$PATH:/root/gauss_om/omm/script
+```
+
+其中的**LD_LIBRARY_PATH**会将 openGauss 包中 lib 目录下的 so 库文件优先级提前,在使用如 yum 命令时候,就会优先去加载 openGauss lib 目录下的二级制。
+
+而 openGauss lib 下放着 libssl.so 和 libcrypto.so ,这两个输入 openssl 的库文件。如果此时存在不兼容,那么在使用操作系统工具时候,如果工具依赖了 openssl 的相关不兼容函数,就会报错。
+
+1. 编译选项不同导致不兼容
+
+`symbol SSLv3_method` 就是由于编译选项引起的不兼容现象。早起 openGauss-third-party 中的 openssl 在编译时候并未开启 sslv3-method,但是操作系统 yum 所依赖的二进制需要用到 sslv3 相关的函数,就导致报错 sslv3-method symbol not found。
+
+2. 系统上对 openssl 做修改导致接口不兼容
+
+在 Centos 8 以及相关的发行版中,操作系统自身对 openssl 做了很大的 patch 改动,其中存在对接口函数的增加和删除。
+`undefined symbol EVP_KDF_ctrl`报错就是场景之一。 在原始的 openssl 中具有该函数,但是在 Centos8 系统上却对该函数做了删除。 此时安装了 openGauss 后,在 openGauss 的环境变量下,部分工具必然会出现问题。
+
+**处理方式**
+
+1. 对于 `symbol SSLv3_method not found`, 可以更新下三方库,在构建 openssl 的时候开启编译选项 `enable-ssl3-method`。
+
+ 
+
+2. 对于 OM 安装过程中出现 `undefined symbol EVP_KDF_ctrl` 问题,可以把系统上的 `libcrypto.so` 放到 `$TOOL/script/gspylib/clib `替换掉 om 包里面的 lib 文件
+
+3. 同意对于 OM 安装过程中出现问题的场景,由于 OM 需要依赖一些开源组件如 psutil,paramiko 等,这些组件编译的二进制文件依赖 openssl 进而产生了不兼容问题,可以在操作系统上手动安装如下四个组件:
+
+ ```
+ psutil
+ netifaces
+ cryptography
+ paramiko
+ ```
+
+ 然后 OM 安装时候, preinstall 加上 --unused-third-party 即可使用系统的组件替代 OM 包中的组件,进而规避该问题。
+
+ ```
+ ./gs_preinstall -U xx -G xx -X /xx/single.xml --unused-third-party
+ ```
+
+4. 对于在安装后,使用 ssh 工具出现 `undefined symbol EVP_KDF_ctrl` 问题的场景; 可以再在使用 ssh 之前, 把系统的 lib 库库优先级放到前面,就不会影响 ssh。
+ ```
+ export LD_LABRRRY_PATH=/usr/lib64:$LD_LABRRRY_PATH;ssh 192.168.0.100 command;
+ ```
+ 这个问题由于系统自身对 openssl 做了修改,尤其在 Centos8 上, 删除 openssl 中的函数在 openGauss 中还继续使用,该兼容问题无法解决,只能通过加载环境变量的优先级方式来规避。
diff --git a/app/zh/blogs/xingchen/illegal_instruction.md b/app/zh/blogs/xingchen/illegal_instruction.md
new file mode 100644
index 0000000000000000000000000000000000000000..37864ec066c38cb0ba2e45ef1af2163361ddab5f
--- /dev/null
+++ b/app/zh/blogs/xingchen/illegal_instruction.md
@@ -0,0 +1,109 @@
+---
+title: '安装时报指令错误的处理'
+date: '2023-06-17'
+category: 'blog'
+tags: ['安装时报指令错误的处理']
+archives: '2023-06-17'
+author: 'zhang_xubo'
+summary: '安装时报指令错误的处理'
+img: '/zh/post/xingchen/title/img1.png'
+times: '10:30'
+---
+
+### 概述
+
+在使用官网提供的镜像安装数据库,有时会遇到一些 `"非法指令" "illegal instruction"` 的问题,或者在一些本地搭建的虚拟机上,数据库启动失败,但是没有很明确的错误信息的问题。 这些往往是由于 CPU 指令集不兼容导致的。
+
+常见的有 3 种:
+
+1. arm CPU 下的 lse 指令
+2. x86_64 CPU 下的 rdtscp 指令
+3. x86_64 CPU 下的 avx 指令
+
+### 1. arm 服务器下 LSE 指令
+
+官网发布的 `openEuler_arm` 包,在编译的时候,打开了`ARM_LSE`指令集做了编译的优化。但是对于一些其他 arm 服务器,不一定支持。
+
+构建脚本:
+
+```
+build\script\utils\make_compile.sh
+
+# it may be risk to enable 'ARM_LSE' for all ARM CPU, but we bid our CPUs are not elder than ARMv8.1
+```
+
+实测在 **_鲲鹏 920_** 和 **_麒麟 990_** 的 cpu 芯片下是支持安装的。
+cpu 可以通过 `lscpu` 名称查看。
+
+对于其他不自持该指令的系统,需要去掉 `-D__ARM_LSE` 指令重新编译即可。
+
+在编译脚本中 `build\script\utils\make_compile.sh`,删除掉所有的 `-D__ARM_LSE` , 重新打包数据库。
+
+```
+sh build.sh -m release -3rd /sdb/binarylibs -pkg
+
+# -3rd 是对应三方库二进制的目录
+```
+
+patch 如下图:
+
+
+
+### 2. x86 服务器下 rdtscp 指令
+
+rdtscp 指令集用来检索 CPU 周期计数器,MOT 特性有用到
+
+在 server 中位置如下:
+`src\gausskernel\storage\mot\core\infra\synchronization\cycles.h`
+
+```
+/**
+ * @brief Retrieve the CPU cycle counter using rdtscp instruction
+ * @detail Force processor barrier and memory barrier
+ * @return The CPU cycle counter value.
+ */
+ static __inline __attribute__((always_inline)) uint64_t Rdtscp()
+ {
+#if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
+ uint32_t low, high;
+ __asm__ __volatile__("rdtscp" : "=a"(low), "=d"(high) : : "%rcx");
+ return (((uint64_t)high << 32) | low);
+#elif defined(__aarch64__)
+ unsigned long cval = 0;
+ asm volatile("isb; mrs %0, cntvct_el0" : "=r"(cval) : : "memory");
+ return cval;
+#else
+#error "Unsupported CPU architecture or compiler."
+#endif
+ }
+```
+
+有些自己搭建的虚拟机可能没有这个指令集,导致数据库无法启动。
+
+**检测方式**
+
+使用 lscpu 命令进行检测是否具有该指令集:
+`lscpu | grep rdtscp`
+
+**解决方法**
+如果没有该指令集,需要开启 CPU 直通模式 (host-passthrough)
+
+### x86 服务器下 avx 指令
+
+avx 指令集用来进行加速计算,主要是 db4ai 在使用。该指令集从 **2.1.0** 版本开始引入,如果存在 2.1.0 之前版本可以运行数据库而 2.1.0 之后数据库启动失败,也有可能是没有该指令导致。
+
+**检测方式**
+
+使用 lscpu 命令进行检测是否具有该指令集:
+`lscpu | grep avx`
+
+**解决方法**
+如果没有该指令集,从代码中删掉该指令集的引用,重新打包数据库。
+
+该指令集的引用在 Makefile 里面,可以全局搜索 `-mavx` , 删掉如下编译选项里面加载-mavx 指令,然后重新打包构建即可。
+
+```
+ifeq ($(PLATFORM_ARCH),x86_64)
+ override CPPFLAGS += -mavx
+endif
+```
diff --git a/app/zh/blogs/xingchen/images/opensslerror/enable_sslv3.png b/app/zh/blogs/xingchen/images/opensslerror/enable_sslv3.png
new file mode 100644
index 0000000000000000000000000000000000000000..03c90cf1b2e0df6da3ebdba504ea92695e7bcc01
Binary files /dev/null and b/app/zh/blogs/xingchen/images/opensslerror/enable_sslv3.png differ
diff --git a/app/zh/blogs/xingchen/images/opensslerror/ssherror.png b/app/zh/blogs/xingchen/images/opensslerror/ssherror.png
new file mode 100644
index 0000000000000000000000000000000000000000..e5ae09245cedb26017d84df6b35397d6d2c13a85
Binary files /dev/null and b/app/zh/blogs/xingchen/images/opensslerror/ssherror.png differ
diff --git "a/app/zh/blogs/zhangcuiping/Mogdb\344\270\273\346\234\272\345\220\257\345\212\250\346\217\220\347\244\272Process exited with status 1\346\200\216\344\271\210\345\244\204\347\220\206.md" "b/app/zh/blogs/zhangcuiping/Mogdb\344\270\273\346\234\272\345\220\257\345\212\250\346\217\220\347\244\272Process exited with status 1\346\200\216\344\271\210\345\244\204\347\220\206.md"
new file mode 100644
index 0000000000000000000000000000000000000000..3aae946233e3fca8b8d6146b30eec4dcf430bea3
--- /dev/null
+++ "b/app/zh/blogs/zhangcuiping/Mogdb\344\270\273\346\234\272\345\220\257\345\212\250\346\217\220\347\244\272Process exited with status 1\346\200\216\344\271\210\345\244\204\347\220\206.md"
@@ -0,0 +1,98 @@
+---
+title: 'Mogdb主机启动提示Process exited with status 1怎么处理'
+
+date: '2023-04-30'
+
+tags: ['openGauss安装']
+
+archives: '2023-04'
+
+author: '张翠娉'
+
+summary: 'Mogdb主机启动提示Process exited with status 1怎么处理'
+
+img: '/zh/post/zhangcuiping/title/img.png'
+
+times: '14:20'
+---
+
+# Mogdb 主机启动提示 Process exited with status 1 怎么处理?
+
+**背景介绍**:
+
+Mogdb 主备环境,主机启动提示 Process exited with status 1
+
+**报错原因**:
+
+根据提示,显示 FATAL: could not create shared memory segment: Cannot allocate memory,意思是无法分配内存
+
+```
+[root@mogdb-kernel-0002 mogdb]# ptk cluster -n mogdb12 start
+INFO[2023-05-16T10:59:09.208] operation: start
+INFO[2023-05-16T10:59:09.209] ========================================
+INFO[2023-05-16T10:59:09.209] start db [172.16.0.245:26007] ...
+ERRO[2023-05-16T10:59:10.331] start db [172.16.0.245:26007] failed
+ERROR: Process exited with status 1
+OUTPUT: [2023-05-16 10:59:09.298][3905515][][gs_ctl]: gs_ctl started,datadir is /home/omm12/mogdb/data
+[2023-05-16 10:59:09.329][3905515][][gs_ctl]: waiting for server to start...
+.0 LOG: [Alarm Module]can not read GAUSS_WARNING_TYPE env.
+
+0 LOG: [Alarm Module]Host Name: mogdb-kernel-0002
+
+0 LOG: [Alarm Module]Host IP: 172.16.0.245
+
+0 LOG: [Alarm Module]Cluster Name: mogdb12
+
+0 WARNING: failed to open feature control file, please check whether it exists: FileName=gaussdb.version, Errno=2, Errmessage=No such file or directory.
+0 WARNING: failed to parse feature control file: gaussdb.version.
+0 WARNING: Failed to load the product control file, so gaussdb cannot distinguish product version.
+The core dump path from /proc/sys/kernel/core_pattern is an invalid directory:/opt/mogdb/corefile/
+2023-05-16 10:59:09.388 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: when starting as multi_standby mode, we couldn't support data replicaton.
+gaussdb.state does not exist, and skipt setting since it is optional.2023-05-16 10:59:09.394 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]can not read GAUSS_WARNING_TYPE env.
+
+2023-05-16 10:59:09.394 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Host Name: mogdb-kernel-0002
+
+2023-05-16 10:59:09.394 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Host IP: 172.16.0.245
+
+2023-05-16 10:59:09.394 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: [Alarm Module]Cluster Name: mogdb12
+
+2023-05-16 10:59:09.399 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: loaded library "security_plugin"
+2023-05-16 10:59:09.402 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets
+2023-05-16 10:59:09.405 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: gstrace initializes with failure. errno = 1.
+2023-05-16 10:59:09.405 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: InitNuma numaNodeNum: 1 numa_distribute_mode: none inheritThreadPool: 0.
+2023-05-16 10:59:09.405 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: reserved memory for backend threads is: 340 MB
+2023-05-16 10:59:09.405 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: reserved memory for WAL buffers is: 320 MB
+2023-05-16 10:59:09.405 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: Set max backend reserve memory is: 660 MB, max dynamic memory is: 27323 MB
+2023-05-16 10:59:09.405 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: shared memory 16032 Mbytes, memory context 27983 Mbytes, max process memory 44032 Mbytes
+2023-05-16 10:59:09.405 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] FATAL: could not create shared memory segment: Cannot allocate memory
+2023-05-16 10:59:09.405 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] DETAIL: Failed system call was shmget(key=26007001, size=16811745280, 03600).
+2023-05-16 10:59:09.405 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] HINT: This error usually means that openGauss's request for a shared memory segment exceeded available memory or swap space, or exceeded your kernel's SHMALL parameter. You can either reduce the request size or reconfigure the kernel with larger SHMALL. To reduce the request size (currently 16811745280 bytes), reduce openGauss's shared memory usage, perhaps by reducing shared_buffers.
+ The openGauss documentation contains more information about shared memory configuration.
+2023-05-16 10:59:09.408 [unknown] [unknown] localhost 70372950802448 0[0:0#0] 0 [BACKEND] LOG: FiniNuma allocIndex: 0.
+[2023-05-16 10:59:10.330][3905515][][gs_ctl]: waitpid 3905594 failed, exitstatus is 256, ret is 2
+
+[2023-05-16 10:59:10.330][3905515][][gs_ctl]: stopped waiting
+[2023-05-16 10:59:10.330][3905515][][gs_ctl]: could not start server
+Examine the log output.
+Process exited with status 1
+```
+
+**主备状态检查**:
+
+```bash
+[root@hostname data]# ptk cluster -n mogdb12 status
+[ Cluster State ]
+cluster_name : mogdb12
+cluster_state : Degraded
+database_version : MogDB 3.0.0 (build 62408a0f)
+
+[ Datanode State ]
+ cluster_name | id | ip | port | user | nodename | db_role | state | upstream
+---------------+------+--------------+-------+-------+----------+---------+------------------------------------+-----------
+ mogdb12 | 6001 | 172.16.0.245 | 26007 | omm12 | dn_6001 | primary | stopped
+
+```
+
+**解决办法**:
+
+进入数据库安装目录/home/omm12/mogdb/data,打开 postgresql.conf, 发现 shared_buffers 参数值为 12GB,改小后, 改为 2GB 后启动数据库,发现启动成功。
diff --git "a/app/zh/blogs/zhangcuiping/Mogdb\345\244\207\346\234\272\345\244\204\344\272\216standby need-repair\347\212\266\346\200\201\346\200\216\344\271\210\345\244\204\347\220\206.md" "b/app/zh/blogs/zhangcuiping/Mogdb\345\244\207\346\234\272\345\244\204\344\272\216standby need-repair\347\212\266\346\200\201\346\200\216\344\271\210\345\244\204\347\220\206.md"
new file mode 100644
index 0000000000000000000000000000000000000000..7aa2d0b14a7f12e51031b1c2df736bb79e83ee89
--- /dev/null
+++ "b/app/zh/blogs/zhangcuiping/Mogdb\345\244\207\346\234\272\345\244\204\344\272\216standby need-repair\347\212\266\346\200\201\346\200\216\344\271\210\345\244\204\347\220\206.md"
@@ -0,0 +1,67 @@
+---
+title: 'Mogdb备机处于standby need-repair(WAL)状态怎么处理'
+category: 'blog'
+date: '2023-04-30'
+
+tags: ['openGauss安装']
+
+archives: '2023-04'
+
+author: '张翠娉'
+
+summary: 'Mogdb备机处于standby need-repair(WAL)状态怎么处理'
+
+img: '/zh/post/zhangcuiping/title/img.png'
+
+times: '14:20'
+---
+
+# Mogdb 备机处于 standby need-repair 状态怎么处理?
+
+**背景介绍**:
+
+Mogdb 主备环境,备机检查发现 Standby Need repair 故障。
+
+**报错原因**:
+
+因网络故障、磁盘满等原因造成主备实例连接断开,主备日志不同步,导致数据库集群在启动时异常。
+
+**主备状态检查**:
+
+```bash
+[root@hostname data]# ptk cluster -n mogdb12 status
+[ Cluster State ]
+cluster_name : mogdb12
+cluster_state : Degraded
+database_version : MogDB 3.0.0 (build 62408a0f)
+
+[ Datanode State ]
+ cluster_name | id | ip | port | user | nodename | db_role | state | upstream
+---------------+------+--------------+-------+-------+----------+---------+------------------------------------+-----------
+ mogdb12 | 6001 | 172.16.0.245 | 26007 | omm12 | dn_6001 | primary | Normal | -
+ | 6002 | 172.16.0.127 | 26007 | omm12 | dn_6002 | standby | Need repair(System id not matched) | -
+```
+
+**解决办法**:
+
+通过 gs_ctl build -D 命令对故障节点进行重建。在此例中我们切换到 need repair 的主机上,执行如下命令进行修复:
+
+```
+gs_ctl build -D /home/omm12/mogdb/data
+```
+
+**恢复后主备状态检查**:
+
+```
+[root@hostname data]# ptk cluster -n mogdb12 status
+[ Cluster State ]
+cluster_name : mogdb12
+cluster_state : Normal
+database_version : MogDB 3.0.0 (build 62408a0f)
+
+[ Datanode State ]
+ cluster_name | id | ip | port | user | nodename | db_role | state | upstream
+---------------+------+--------------+-------+-------+----------+---------+--------+-----------
+ mogdb12 | 6001 | 172.16.0.245 | 26007 | omm12 | dn_6001 | primary | Normal | -
+ | 6002 | 172.16.0.127 | 26007 | omm12 | dn_6002 | standby | Normal | -
+```
diff --git "a/app/zh/blogs/zhangcuiping/\344\275\277\347\224\250yum\345\256\211\350\243\205unixODBC\346\227\266\346\212\245\351\224\231\346\200\216\344\271\210\345\212\236.md" "b/app/zh/blogs/zhangcuiping/\344\275\277\347\224\250yum\345\256\211\350\243\205unixODBC\346\227\266\346\212\245\351\224\231\346\200\216\344\271\210\345\212\236.md"
new file mode 100644
index 0000000000000000000000000000000000000000..8a9a22637c12f07dcbfac56bee5941595d74d6b8
--- /dev/null
+++ "b/app/zh/blogs/zhangcuiping/\344\275\277\347\224\250yum\345\256\211\350\243\205unixODBC\346\227\266\346\212\245\351\224\231\346\200\216\344\271\210\345\212\236.md"
@@ -0,0 +1,213 @@
+---
+title: '使用yum安装unixODBC时报错怎么办'
+category: 'blog'
+date: '2023-03-23'
+
+tags: ['使用yum安装unixODBC时报错怎么办']
+
+archives: '2023-03'
+
+author: '张翠娉'
+
+summary: '使用yum安装unixODBC时报错怎么办'
+
+img: '/zh/post/zhangcuiping/title/img.png'
+
+times: '10:20'
+---
+
+# 使用 yum 安装 unixODBC 时报错怎么办
+
+## 背景介绍
+
+在使用 yum 安装 unixODBC 时,上报如下错误:
+
+```bash
+[root@mc0-0002 odbc_connection]# yum install -y unixODBC
+Traceback (most recent call last):
+ File "/usr/lib64/python3.7/site-packages/libdnf/common_types.py", line 14, in swig_import_helper
+ return importlib.import_module(mname)
+ File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module
+ return _bootstrap._gcd_import(name[level:], package, level)
+ File "", line 1006, in _gcd_import
+ File "", line 983, in _find_and_load
+ File "", line 967, in _find_and_load_unlocked
+ File "", line 670, in _load_unlocked
+ File "", line 583, in module_from_spec
+ File "", line 1043, in create_module
+ File "", line 219, in _call_with_frames_removed
+ImportError: /lib64/libcurl.so.4: symbol SSLv3_client_method version OPENSSL_1_1_0 not defined in
+
+During handling of the above exception, another exception occurred:
+
+Traceback (most recent call last):
+ File "/usr/bin/yum", line 57, in
+ from dnf.cli import main
+ File "/usr/lib/python3.7/site-packages/dnf/__init__.py", line 30, in
+ import dnf.base
+ File "/usr/lib/python3.7/site-packages/dnf/base.py", line 29, in
+ import libdnf.transaction
+ File "/usr/lib64/python3.7/site-packages/libdnf/__init__.py", line 3, in
+ from . import common_types
+ File "/usr/lib64/python3.7/site-packages/libdnf/common_types.py", line 17, in
+ _common_types = swig_import_helper()
+ File "/usr/lib64/python3.7/site-packages/libdnf/common_types.py", line 16, in swig_import_helper
+ return importlib.import_module('_common_types')
+ File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module
+ return _bootstrap._gcd_import(name[level:], package, level)
+ModuleNotFoundError: No module named '_common_types'
+```
+
+## 问题分析
+
+```bash
+[root@mc0-0002 ~]# ldd /lib64/libcurl.so.4
+ linux-vdso.so.1 (0x0000fffe5bf30000)
+ libnghttp2.so.14 => /lib64/libnghttp2.so.14 (0x0000fffe5be20000)
+ libidn2.so.0 => /lib64/libidn2.so.0 (0x0000fffe5bde0000)
+ libssh.so.4 => /lib64/libssh.so.4 (0x0000fffe5bd40000)
+ libpsl.so.5 => /lib64/libpsl.so.5 (0x0000fffe5bd10000)
+ libssl.so.1.1 => /usr/local/etc/lib/libssl.so.1.1 (0x0000fffe5bc60000)
+ libcrypto.so.1.1 => /usr/local/etc/lib/libcrypto.so.1.1 (0x0000fffe5b9b0000)
+ libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x0000fffe5b940000)
+ libkrb5.so.3 => /lib64/libkrb5.so.3 (0x0000fffe5b840000)
+ libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x0000fffe5b800000)
+ libcom_err.so.2 => /lib64/libcom_err.so.2 (0x0000fffe5b7d0000)
+ libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x0000fffe5b760000)
+ liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x0000fffe5b730000)
+ libbrotlidec.so.1 => /lib64/libbrotlidec.so.1 (0x0000fffe5b700000)
+ libz.so.1 => /lib64/libz.so.1 (0x0000fffe5b6c0000)
+ libpthread.so.0 => /lib64/libpthread.so.0 (0x0000fffe5b680000)
+ libc.so.6 => /lib64/libc.so.6 (0x0000fffe5b4f0000)
+ /lib/ld-linux-aarch64.so.1 (0x0000fffe5bf40000)
+ libunistring.so.2 => /lib64/libunistring.so.2 (0x0000fffe5b350000)
+ librt.so.1 => /lib64/librt.so.1 (0x0000fffe5b320000)
+ libdl.so.2 => /lib64/libdl.so.2 (0x0000fffe5b2f0000)
+ libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x0000fffe5b2c0000)
+ libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x0000fffe5b290000)
+ libresolv.so.2 => /lib64/libresolv.so.2 (0x0000fffe5b250000)
+ libsasl2.so.3 => /lib64/libsasl2.so.3 (0x0000fffe5b210000)
+ libm.so.6 => /lib64/libm.so.6 (0x0000fffe5b140000)
+ libbrotlicommon.so.1 => /lib64/libbrotlicommon.so.1 (0x0000fffe5b100000)
+ libselinux.so.1 => /lib64/libselinux.so.1 (0x0000fffe5b0b0000)
+ libcrypt.so.1 => /lib64/libcrypt.so.1 (0x0000fffe5b050000)
+ libsecurity.so.0 => /lib64/libsecurity.so.0 (0x0000fffe5b020000)
+ libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x0000fffe5af80000)
+
+
+[root@mc0-0002 openssl-1.1.1a]# nm libssl.so.1.1 | grep SSLv3_client_method
+
+确实没有SSLv3_client_method
+```
+
+## 解决办法
+
+1. 下载 openssl-1.1.1a 进行编译。
+
+ ```bash
+ [root@mc0-0002 etc]# wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
+
+ tar -zxvf openssl-1.1.1a.tar.gz
+
+ cd openssl-1.1.1a/
+
+ ./config shared enable-ssl3 enable-ssl3-method
+
+ make install
+ ```
+
+2. 检查新编译的文件是否包含 SSLv3_client_method。
+
+ ```bash
+ [root@mc0-0002 openssl-1.1.1a]# nm libssl.so.1.1 | grep SSLv3_client_method
+ 0000000000020800 T SSLv3_client_method
+ 编译完成后是有SSLv3_client_method
+ ```
+
+3. 使用编译好的 libssl.so.1.1 替换原来的 libssl.so.1.1。
+
+ ```bash
+ [root@mc0-0002 openssl-1.1.1a]# cp /etc/openssl-1.1.1a/libssl.so.1.1 /usr/local/etc/lib/
+ cp: overwrite '/usr/local/lib/libssl.so.1.1'? y
+ ```
+
+ 至此,位于原/usr/local/lib/目录下的/usr/local/lib/libssl.so.1.1 文件正常,可使用 yum 安装 unixODBC 了
+
+4. 使用 yum 安装 unixODBC。
+
+ ```bash
+ [root@mc0-0002 odbc_connection]# yum install -y unixODBC
+ Last metadata expiration check: 0:12:31 ago on Thu 23 Mar 2023 05:33:19 PM CST.
+ Dependencies resolved.
+ ==================================================================================================
+ Package Architecture Version Repository Size
+ ==================================================================================================
+ Installing:
+ unixODBC aarch64 2.3.7-2.ky10 ks10-adv-os 389 k
+
+ Transaction Summary
+ ==================================================================================================
+ Install 1 Package
+
+ Total download size: 389 k
+ Installed size: 2.4 M
+ Is this ok [y/N]: y
+ Downloading Packages:
+ unixODBC-2.3.7-2.ky10.aarch64.rpm 4.8 MB/s | 389 kB 00:00
+ --------------------------------------------------------------------------------------------------
+ Total 4.7 MB/s | 389 kB 00:00
+ Running transaction check
+ Transaction check succeeded.
+ Running transaction test
+ Transaction test succeeded.
+ Running transaction
+ Preparing : 1/1
+ Installing : unixODBC-2.3.7-2.ky10.aarch64 1/1
+ Running scriptlet: unixODBC-2.3.7-2.ky10.aarch64 1/1
+ /sbin/ldconfig: /usr/local/lib/libkrb5support_gauss.so.0 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libcom_err_gauss.so.3 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libpq_ce.so.5 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libk5crypto_gauss.so.3 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libodbcinst.so.2 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libpq.so.5 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libgssapi_krb5_gauss.so.2 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libkrb5_gauss.so.3 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libgssrpc_gauss.so.4 is not a symbolic link
+
+
+ /sbin/ldconfig: /usr/local/lib/libkrb5support_gauss.so.0 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libcom_err_gauss.so.3 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libpq_ce.so.5 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libk5crypto_gauss.so.3 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libodbcinst.so.2 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libpq.so.5 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libgssapi_krb5_gauss.so.2 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libkrb5_gauss.so.3 is not a symbolic link
+
+ /sbin/ldconfig: /usr/local/lib/libgssrpc_gauss.so.4 is not a symbolic link
+
+
+ Verifying : unixODBC-2.3.7-2.ky10.aarch64 1/1
+
+ Installed:
+ unixODBC-2.3.7-2.ky10.aarch64
+
+ Complete!
+ [root@mc0-0002 odbc_connection]#
+
+ ```
diff --git "a/app/zh/blogs/zhangcuiping/\345\246\202\344\275\225\344\275\277\347\224\250ODBC\345\272\224\347\224\250\347\250\213\345\272\217\346\216\245\345\217\243\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md" "b/app/zh/blogs/zhangcuiping/\345\246\202\344\275\225\344\275\277\347\224\250ODBC\345\272\224\347\224\250\347\250\213\345\272\217\346\216\245\345\217\243\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md"
new file mode 100644
index 0000000000000000000000000000000000000000..724165f6444adffed40143759a3c1e3a574c4a85
--- /dev/null
+++ "b/app/zh/blogs/zhangcuiping/\345\246\202\344\275\225\344\275\277\347\224\250ODBC\345\272\224\347\224\250\347\250\213\345\272\217\346\216\245\345\217\243\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223.md"
@@ -0,0 +1,102 @@
+---
+title: '如何使用ODBC应用程序接口连接数据库'
+
+date: '2023-03-24'
+category: 'blog'
+tags: ['如何使用ODBC应用程序接口连接数据库']
+
+archives: '2023-03'
+
+author: '张翠娉'
+
+summary: '如何使用ODBC应用程序接口连接数据库'
+
+img: '/zh/post/zhangcuiping/title/img.png'
+
+times: '15:20'
+---
+
+# 如何使用 ODBC 应用程序接口连接数据库?
+
+1. 安装 unixODBC。
+
+ ```
+ yum install -y unixODBC
+ yum install -y unixODBC-devel
+ ```
+
+2. 下载并安装 openGauss ODBC 驱动。本文中使用 arm 架构为例。
+
+ ```
+ (ARM架构)
+ wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/2.0.0/arm/openGauss-2.0.0-ODBC.tar.gz
+ (X86_64架构)
+ wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/2.0.0/x86/openGauss-2.0.0-ODBC.tar.gz
+ ```
+
+3. 解压 odbc 软件包
+
+ ```
+ tar -xf openGauss-2.0.0-ODBC.tar.gz
+ ```
+
+4. 查看配置文件路径,发现为/usr/local/etc/。
+
+ ```
+ [root@mc0-0002 etc]# odbcinst -j
+ unixODBC 2.3.7
+ DRIVERS............: /usr/local/etc/odbcinst.ini
+ SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
+ FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
+ USER DATA SOURCES..: /usr/local/etc/odbc.ini
+ SQLULEN Size.......: 8
+ SQLLEN Size........: 8
+ SQLSETPOSIROW Size.: 8
+ ```
+
+5. 将新下载的 odbc 软件包中的 lib 文件夹及子目录拷贝到本机 odbc 配置文件目录下
+
+ ```
+ cp -pr lib/* /usr/local/etc/lib/
+
+ cp -pr odbc/lib/* /usr/local/etc/lib/
+ ```
+
+6. 配置 unixODBC, 需要把**本机 IP**替换成实际 IP
+
+ ```
+ vi /usr/local/etc/odbcinst.ini
+ [MogDB]
+ Driver64=/usr/local/etc/lib/psqlodbcw.so
+ setup=/usr/local/etc/lib/psqlodbcw.so
+
+ vi /usr/local/etc/odbc.ini
+
+ [MogDB]
+ Driver=MogDB
+ Servername=本机IP
+ Database=postgres
+ Username=user1
+ Password=Enmo@123
+ Port=26000
+
+ vi ~/.bash_profile
+ export LD_LIBRARY_PATH=/usr/local/etc/lib/:$LD_LIBRARY_PATH
+ export ODBCSYSINI=/usr/local/etc
+ export ODBCINI=/usr/local/etc/odbc.ini
+ ```
+
+7. 连接数据库
+
+ ```
+ [root@mc0-0002 ~]# isql -v MogDB
+ +---------------------------------------+
+ | Connected! |
+ | |
+ | sql-statement |
+ | help [tablename] |
+ | quit |
+ | |
+ +---------------------------------------+
+ SQL>
+ ```
diff --git "a/app/zh/blogs/zhangcuiping/\346\225\260\346\215\256\345\272\223\346\234\254\346\234\272\347\263\273\347\273\237\346\243\200\346\237\245\346\227\266\346\217\220\347\244\272\345\274\202\345\270\270\346\243\200\346\237\245\351\241\271\346\200\216\344\271\210\345\212\236.md" "b/app/zh/blogs/zhangcuiping/\346\225\260\346\215\256\345\272\223\346\234\254\346\234\272\347\263\273\347\273\237\346\243\200\346\237\245\346\227\266\346\217\220\347\244\272\345\274\202\345\270\270\346\243\200\346\237\245\351\241\271\346\200\216\344\271\210\345\212\236.md"
new file mode 100644
index 0000000000000000000000000000000000000000..69877ba581bfdaa19e30a69185d4073e0fef9bd1
--- /dev/null
+++ "b/app/zh/blogs/zhangcuiping/\346\225\260\346\215\256\345\272\223\346\234\254\346\234\272\347\263\273\347\273\237\346\243\200\346\237\245\346\227\266\346\217\220\347\244\272\345\274\202\345\270\270\346\243\200\346\237\245\351\241\271\346\200\216\344\271\210\345\212\236.md"
@@ -0,0 +1,77 @@
+---
+title: '数据库本机系统检查时提示异常检查项怎么办'
+
+date: '2023-06-15'
+category: 'blog'
+tags: ['数据库本机系统检查时提示异常检查项怎么办']
+
+archives: '2023-06'
+
+author: '张翠娉'
+
+summary: '数据库本机系统检查时提示异常检查项怎么办'
+
+img: '/zh/post/zhangcuiping/title/img.png'
+
+times: '14:20'
+---
+
+# 数据库本机系统检查时提示异常检查项怎么办?
+
+**背景介绍**:
+
+PTK (Provisioning Toolkit)是一款针对 MogDB 数据库开发的软件安装和运维工具,旨在帮助用户更便捷地安装部署 MogDB 数据库。
+
+如果用户想要运行 MogDB 或者 MogDB 的相关组件时,仅需要执行一行命令即可实现。
+
+PTK 支持安装 MogDB 的操作系统众多,达到 22 个,后期还会不断增多。
+
+本次在使用 PTK 进行安装前本机系统检查时,系统提示如下错误信息。
+
+**报错内容**:
+
+```
+[root@kylinos uqbar]# ptk checkos -f config.yaml
+# Check Results
+ Item | Level
+------------------------------------+-----------
+ A1.Check_OS_Version | OK
+ A2.Check_Kernel_Version | OK
+ A3.Check_Unicode | OK
+ A4.Check_TimeZone | OK
+ A5.Check_Swap_Memory_Configure | OK
+ A6.Check_SysCtl_Parameter | Abnormal
+ A7.Check_FileSystem_Configure | OK
+ A8.Check_Disk_Configure | OK
+ A9.Check_BlockDev_Configure | Warning
+ A9.Check_Logical_Block | OK
+ A10.Check_IO_Request | Warning
+ A10.Check_Asynchronous_IO_Request | OK
+ A10.Check_IO_Configure | OK
+ A11.Check_Network_Configure | OK
+ A12.Check_Time_Consistency | OK
+ A13.Check_Firewall_Status | Abnormal
+ A14.Check_THP_Status | Abnormal
+ A15.Check_Dependent_Package | OK
+ A16.Check_CPU_Instruction_Set | OK
+ A17.Check_Port | OK
+ A18.Check_Selinux | Abnormal
+ A19.Check_User_Ulimit | OK
+ Failed to check os, can't perform installation unless fix all the abnormal items.
+ You can use 'ptk checkos -i ITEM --detail' to get detail message
+ Please check root_fix_os.[TIMESTAMP].sh for commands to resolve.
+```
+
+错误信息显示多个 abnormal item。需要将 abnormal items 修复后,才可执行安装。
+
+**解决办法**:
+
+1. 在当前目录下,查看生成的`root_fix_os.[TIMESTAMP].sh`脚本文件。
+
+2. 执行该脚本文件即可修复异常检查项。
+
+ ```
+ sh root_fix_os.[TIMESTAMP].sh
+ ```
+
+3. 修复后执行安装即可。
diff --git "a/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\345\210\207\346\215\242.md" "b/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\345\210\207\346\215\242.md"
index 9e4b475aef138f910f44c8885d8b8f0c81d26c29..efb0bce6468ef5cfa995607d9ec6bbec7a7ebc70 100644
--- "a/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\345\210\207\346\215\242.md"
+++ "b/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\345\210\207\346\215\242.md"
@@ -17,6 +17,7 @@ times: '9:30'
基于《资源池化+同城dorado双集群》部署方式,集群间切换设计如下:
### 1.1.主备集群状态
+前提条件:已经部署资源池化同城双集群环境
@@ -60,12 +61,43 @@ openGauss=# select * from pg_stat_get_stream_replications();
(1 row)
```
-run mode 指数据库内核运行模式是 primary 还是 standby 还是 normal,是 t_thrd.postmaster_cxt.HaShmData->current_mode 或 t_thrd.xlog_cxt.server_mode 参数指代的主备运行模式类型
+`Tips`:run mode 指数据库内核运行模式是primary还是standby还是normal,是t_thrd.postmaster_cxt.HaShmData->current_mode或t_thrd.xlog_cxt.server_mode参数指代的主备运行模式类型
### 1.2.failover
+ 以下提到的/home/omm/ss_hatest/dn0为数据库dn目录,解释如下:
+
+
+
+ 集群中心 |
+ 端 |
+ 节点类型 |
+ local role |
+ dn目录 |
+
+
+ 生产中心 |
+ 主端 |
+ 主节点0 |
+ primary |
+ /home/omm/ss_hatest/dn0 |
+
+ 备节点1 |
+ standby |
+ /home/omm/ss_hatest/dn1 |
+
+ 容灾中心 |
+ 备端 |
+ 首备节点0 |
+ Main Standby |
+ /home/omm/ss_hatest1/dn0 |
+
+ 从备节点1 |
+ standby |
+ /home/omm/ss_hatest1/dn1 |
+
+
- 基于 cm 模拟部署方式,因此没有管控平台切换同步复制对方向的操作。
- 双集群间 failover 即主集群故障,备集群升为主集群的过程,操作过程如下:
+ 双集群间failover即主集群故障,备集群升为主集群的过程,操作过程如下:
(1) kill 主集群
将主集群节点全部 kill 掉
@@ -82,8 +114,13 @@ gs_ctl stop -D /home/omm/ss_hatest1/dn1
gs_guc set -Z datanode -D /home/omm/ss_hatest1/dn0 -c "cluster_run_mode=cluster_primary"
```
-(4) 以主集群模式重启备集群的节点
+(4) 切换远程同步复制主从端
+ 如果是cm模拟部署方式(博客:博客资源池化同城dorado双集群部署二之cm模拟部署),不需要在管控平台切换同步复制对方向的操作。
+
+ 如果是om部署方式(博客:资源池化同城dorado双集群部署四之om部署),则在拉起集群之前,需要在管控平台切换同步复制对方向的操作,操作如下:
+ 登录到备存储管控平台,操作data protection -> luns -> remote replication pairs(远程复制对) -> 找到远程同步复制xlog对应的lun -> More -> Primary/Standby Switchover,操作完后,即可看到Local Resource从Secondary变成Primary。
+(5) 以主集群模式重启备集群的节点
```
gs_ctl start -D /home/omm/ss_hatest1/dn0 -M primary
gs_ctl start -D /home/omm/ss_hatest1/dn1
@@ -96,9 +133,7 @@ gs_ctl query -D /home/omm/ss_hatest1/dn0
```
### 1.2.switchover
-
- 基于 cm 模拟部署方式,因此没有管控平台切换同步复制对方向的操作。
- 双集群间 switchover 即主集群降为备集群,备集群升为主集群的过程,操作过程如下:
+ 双集群间switchover即主集群降为备集群,备集群升为主集群的过程,操作过程如下:
(1) stop 主集群
@@ -120,8 +155,13 @@ gs_ctl stop -D /home/omm/ss_hatest1/dn1
gs_guc set -Z datanode -D /home/omm/ss_hatest1/dn0 -c "cluster_run_mode=cluster_primary"
```
-(4) 以主集群模式重启备集群的节点
+(4) 切换远程同步复制主从端
+ 如果是cm模拟部署方式(博客:博客资源池化同城dorado双集群部署二之cm模拟部署),不需要在管控平台切换同步复制对方向的操作。
+ 如果是om部署方式(博客:资源池化同城dorado双集群部署四之om部署),则在拉起集群之前,需要在管控平台切换同步复制对方向的操作,操作如下:
+ 登录到备存储管控平台,操作data protection -> luns -> remote replication pairs(远程复制对) -> 找到远程同步复制xlog对应的lun -> More -> Primary/Standby Switchover,操作完后,即可看到Local Resource从Secondary变成Primary。
+
+(5) 以主集群模式重启备集群的节点
```
gs_ctl start -D /home/omm/ss_hatest1/dn0 -M primary
gs_ctl start -D /home/omm/ss_hatest1/dn1
@@ -155,9 +195,8 @@ gs_ctl query -D /home/omm/ss_hatest/dn0
## 2. 主集群内切换
### 2.1.failover
-
- 基于 cm 模拟部署方式
- 主集群内 failover 即主集群主节点降为备节点,备节点升为主节点的过程,操作过程如下:
+ 该章节介绍基于cm模拟部署方式的集群内切换,om部署方式的双集群和资源池化原有集群内切换方法一样。
+ 主集群内failover即主集群主节点降为备节点,备节点升为主节点的过程,操作过程如下:
(1) 检查节点状态
查询状态
@@ -210,7 +249,7 @@ No information
备集群首备节点0
gs_ctl query -D /home/omm/ss_hatest1/dn0
HA state:
- local_role : Standby
+ local_role : Main Standby
static_connections : 1
db_state : Normal
detail_information : Normal
@@ -250,8 +289,7 @@ No information
```
(2) 配置参数
- 主集群节点的 postgresql.conf 文件
-
+ 主集群节点的postgresql.conf文件
```
主集群主节点0
port = 6600
@@ -279,9 +317,7 @@ ss_log_level = 255
ss_log_backup_file_count = 100
ss_log_max_file_size = 1GB
```
-
- 备集群节点的 postgresql.conf 文件
-
+ 备集群节点的postgresql.conf文件
```
备集群首备节点0
port = 9600
@@ -318,10 +354,9 @@ ss_log_max_file_size = 1GB
export CM_CONFIG_PATH=/opt/omm/openGauss-server/src/test/ss/cm_config.ini
```
- (4) 模拟 failover
-
-- 当前节点 0 是主节点,kill -9 pid (pid 是主节点 0 的进程号)
-- 修改 cm_config.ini
+ (4) 模拟failover
++ 当前节点0是主节点,kill -9 pid (pid是主节点0的进程号)
++ 修改 cm_config.ini
```
REFORMER_ID = 1
BITMAP_ONLINE = 2
@@ -329,10 +364,9 @@ export CM_CONFIG_PATH=/opt/omm/openGauss-server/src/test/ss/cm_config.ini
**说明**:模拟主节点 0 故障,REFORMER_ID 模拟 reform 锁被备节点 1 抢到,即为将要做 failover 的节点,BITMAP_ONLINE 模拟 cm 获取的在线节点是节点 1(bitmap = 2 = 0b10)
-### 2.1.failover
-
- 基于 cm 模拟部署方式
- 主集群内 failover 即主集群主节点降为备节点,备节点升为主节点的过程,操作过程如下:
+### 2.2.switchover
+ 基于cm模拟部署方式
+ 主集群内failover即主集群主节点降为备节点,备节点升为主节点的过程,操作过程如下:
(1) 检查节点状态
同 failover 检查一致
@@ -356,10 +390,9 @@ export CM_CONFIG_PATH=/opt/omm/openGauss-server/src/test/ss/cm_config.ini
[2023-04-24 15:49:13.353][3815633][][gs_ctl]: switchover completed (/home/zx/ss_hatest/dn1)
```
-**说明**:`/home/zx/ss_hatest/dn1`是主集群备节点 1 的数据库,做 switchover 将主集群主节点 0 降备,将主集群备节点 1 升主
-
-查看目录`/opt/omm/openGauss-server/src/test/ss/`:
+**说明**:/home/zx/ss_hatest/dn1是主集群备节点1的数据库,做switchover将主集群主节点0降备,将主集群备节点1升主
+查看目录/opt/omm/openGauss-server/src/test/ss/:
```
[omm@nodename ss]$ ll
总用量 56
@@ -436,7 +469,7 @@ No information
[zx@node1host54 pg_log]$ gs_ctl query -D /home/zx/ss_hatest1/dn0
[2023-04-24 15:53:44.305][3878378][][gs_ctl]: gs_ctl query ,datadir is /home/zx/ss_hatest1/dn0
HA state:
- local_role : Standby
+ local_role : Main Standby
static_connections : 2
db_state : Normal
detail_information : Normal
@@ -475,6 +508,7 @@ No information
No information
```
-**说明**:switchover 成功后,备集群的首备节点 0 与主集群新主节点 1 容灾关系自动连接成功,同步复制功能正常,备集群首备回放正常
+**说明**:switchover成功后,备集群的首备节点0与主集群新主节点1容灾关系自动连接成功,同步复制功能正常,备集群首备回放正常
-**_Notice:不推荐直接用于生产环境_**
+***Notice:不推荐直接用于生产环境***
+***作者:Shirley_zhengx***
diff --git "a/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\351\203\250\347\275\262(\344\270\200)\344\271\213dd\346\250\241\346\213\237.md" "b/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\351\203\250\347\275\262(\344\270\200)\344\271\213dd\346\250\241\346\213\237.md"
index ae08e1d178f5d8c0d5af78871d475b011b4f2851..58856cdf987381db46d504bc9c57f3b27163e72d 100644
--- "a/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\351\203\250\347\275\262(\344\270\200)\344\271\213dd\346\250\241\346\213\237.md"
+++ "b/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\351\203\250\347\275\262(\344\270\200)\344\271\213dd\346\250\241\346\213\237.md"
@@ -10,7 +10,33 @@ img: '/zh/post/zhengxue/title/img1.png'
times: '9:30'
---
-资源池化支持同城 dorado 双集群部署方式:dd 模拟(手动部署+无 cm)、cm 模拟(手动部署 dd 模拟+有 cm)、磁阵(手动部署)、集群管理工具部署
+
+- [1. 环境描述](#1.环境描述)
+ - [1.1.组网方式](#1.1.组网方式)
+ - [1.2.环境配置](#1.2.环境配置)
+- [2. 环境搭建](#2.环境搭建)
+ - [2.1.创建lun](#2.1.创建lun)
+ - [2.2.下载源码编译](#2.2.下载源码编译)
+ - [2.3.环境变量](#2.3.环境变量)
+ - [2.4.dss配置-dd模拟](#2.4.dss配置-dd模拟)
+ - [2.5.数据库部署](#2.5.数据库部署)
+- [3. 主备集群功能验证](#3.主备集群功能验证)
+ - [3.1.集群状态查询](#3.1.集群状态查询)
+ - [3.2.主集群一写多读](#3.2.主集群一写多读)
+ - [3.2.备集群只读](#3.2.备集群只读)
+
+
+
+
+
+# 资源池化支持同城dorado双集群部署(一)----dd模拟
+
+资源池化支持同城dorado双集群部署方式:
+(一) dd模拟(手动部署 + 无cm)
+(二) cm模拟(手动部署dd模拟 + 有cm)
+(三) 磁阵搭建(手动部署)
+(四) 集群管理工具部署(om + cm)
+
## 1.环境描述
@@ -404,10 +430,9 @@ gs_ctl build -D /opt/omm/cluster/dn0 -b cross_cluster_full -g 0 --vgname=+data -
```
参数解释:
-
-- -b cross_cluster_full
-- -g 0 指资源池化的节点 0,表明是对节点 0 进行 build
-- -q
++ -b cross_cluster_full
++ -g 0 指资源池化的节点0,表明是对节点0进行build
++ -q build成功后,不启动数据库
(4)备集群从备节点 1 初始化
@shirley_zhengx tell you in secret that is very important!@:备集群第一次初始化的时候,一定要初始化首备节点 0 并对首备做完 build 之后,再初始化备集群其它从备节点,即第(3)要在第(4)之前执行 @very very important!@:
@@ -494,7 +519,7 @@ No information
gs_ctl query -D /opt/omm/cluster/dn0
[2023-04-03 19:29:20.472][2720317][][gs_ctl]: gs_ctl query ,datadir is /opt/omm/cluster/dn0
HA state:
- local_role : Standby
+ local_role : Main Standby
static_connections : 1
db_state : Normal
detail_information : Normal
@@ -564,4 +589,6 @@ gsql -d postgres -p 48100 -r
select * from test01;
```
-**_Notice:不推荐直接用于生产环境_**
+
+***Notice:不推荐直接用于生产环境***
+***作者:Shirley_zhengx***
diff --git "a/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\351\203\250\347\275\262(\344\272\214)\344\271\213cm\346\250\241\346\213\237.md" "b/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\351\203\250\347\275\262(\344\272\214)\344\271\213cm\346\250\241\346\213\237.md"
index e979c4c7388224c90d572df647c994199ad096d1..f9bd1e71f243d536b719f95e2e92bbe81ad64123 100644
--- "a/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\351\203\250\347\275\262(\344\272\214)\344\271\213cm\346\250\241\346\213\237.md"
+++ "b/app/zh/blogs/zhengxue/\350\265\204\346\272\220\346\261\240\345\214\226\346\224\257\346\214\201\345\220\214\345\237\216dorado\345\217\214\351\233\206\347\276\244\351\203\250\347\275\262(\344\272\214)\344\271\213cm\346\250\241\346\213\237.md"
@@ -10,7 +10,33 @@ img: '/zh/post/zhengxue/title/img1.png'
times: '9:30'
---
-资源池化支持同城 dorado 双集群部署方式:dd 模拟(手动部署+无 cm)、cm 模拟(手动部署 dd 模拟+有 cm)、磁阵(手动部署)、集群管理工具部署
+
+- [1. 环境描述](#1.环境描述)
+ - [1.1.组网方式](#1.1.组网方式)
+ - [1.2.环境配置](#1.2.环境配置)
+- [2. 环境搭建](#2.环境搭建)
+ - [2.1.创建lun](#2.1.创建lun)
+ - [2.2.下载源码编译](#2.2.下载源码编译)
+ - [2.3.环境变量](#2.3.环境变量)
+ - [2.4.dss配置-dd模拟](#2.4.dss配置-dd模拟)
+ - [2.5.数据库部署](#2.5.数据库部署)
+- [3. 主备集群功能验证](#3.主备集群功能验证)
+ - [3.1.集群状态查询](#3.1.集群状态查询)
+ - [3.2.主集群一写多读](#3.2.主集群一写多读)
+ - [3.2.备集群只读](#3.2.备集群只读)
+
+
+
+
+
+# 资源池化支持同城dorado双集群部署(二)----cm模拟
+
+资源池化支持同城dorado双集群部署方式:
+(一) dd模拟(手动部署 + 无cm)
+(二) cm模拟(手动部署dd模拟 + 有cm)
+(三) 磁阵搭建(手动部署)
+(四) 集群管理工具部署(om + cm)
+
## 1.环境描述
@@ -193,18 +219,16 @@ export CM_CONFIG_PATH=/opt/omm/openGauss-server/src/test/ss/cm_config.ini
`Tips`: 环境变量里面一定要写 export,即使`echo $GCC_PATH`存在,也要写 export 才能真正导入路径
参数说明:
-HOME 为用户自己创建的工作目录;
-GAUSSHOME 为编译完成的目标文件路径,包含 openGauss 的 bin、lib 等;
-CM_CONFIG_PATH 用于主集群 cm 模拟部署下的集群内节点切换
-
-(2) 备集群环境变量 ss_env1
+GAUSSHOME 为编译完成的目标文件路径,包含openGauss的bin、lib等;
+CM_CONFIG_PATH 用于主集群cm模拟部署下的集群内节点切换
+目录/home/omm中omm指自己创建的用户
+(2) 备集群环境变量ss_env1
```
-export HOME=/opt/omm
-export GAUSSHOME=${HOME}/openGauss-server/mppdb_temp_install/
+export GAUSSHOME=/openGauss-server/mppdb_temp_install/
export LD_LIBRARY_PATH=$GAUSSHOME/lib:$LD_LIBRARY_PATH
export PATH=$GAUSSHOME/bin:$PATH
-export DSS_HOME=/home/omm/ss_hatest/dss_home0
+export DSS_HOME=/home/omm/ss_hatest1/dss_home0
export CM_CONFIG_PATH=/opt/omm/openGauss-server/src/test/ss/cm_config_standby.ini
```
@@ -220,11 +244,23 @@ export CM_CONFIG_PATH=/opt/omm/openGauss-server/src/test/ss/cm_config_standby.in
sh ha_test.sh dual_cluster
```
- ha_test.sh 脚本适配了双集群模拟, 执行的时候带上 dual_cluster 就是双集群,不带就是单集群。脚本会自动将数据库拉起,执行完该脚本后,就相当于部署了 2 套独立的资源池化
+dssserver有可能存在端口冲突,执行sh ha_test.sh dual_cluster之前修改conf_start_dss_inst.sh脚本中dss端口
+```
+DSS_PORT_BASE=30000
+```
- (2) 集群状态查询
-因为是在一个机器上模拟双集群,所以开两个窗口,一个窗口导入主集群环境变量 ss_env0,一个窗口导入备集群环境变量 ss_env1
+数据库有可能存在端口冲突,执行sh ha_test.sh dual_cluster之前修改ha_test.sh脚本中数据库端口
+```
+PGPORT=(6600 6700)
+STANDBY_PGPORT=(9600 9700)
+
+nodedata_cfg="0:127.0.0.1:6611,1:127.0.0.1:6711"
+standby_nodedata_cfg="0:127.0.0.1:9611,1:127.0.0.1:9711"
+```
+ ha_test.sh脚本适配了双集群模拟, 执行的时候带上dual_cluster就是双集群,不带就是单集群。脚本会自动将数据库拉起,执行完该脚本后,就相当于部署了2套独立的资源池化
+ (2) 集群状态查询
+因为是在一个机器上模拟双集群,所以开两个窗口,一个窗口导入主集群环境变量ss_env0,一个窗口导入备集群环境变量ss_env1
```
主集群节点0
[omm@nodename dn0]$ gs_ctl query -D /home/omm/ss_hatest/dn0
@@ -289,17 +325,15 @@ No information
#### 2.5.1 手动容灾搭建
##### 2.5.1.1 主集群(生产中心)
-
-(1) 配置主集群主节点 0 的 dorado 容灾参数
-**postgresql.conf 文件**
-
+(1) 配置主集群主节点0的dorado容灾参数
+ postgresql.conf文件
```
port = 6600
-xlog_file_path = '/home/zx/ss_hatest/dorado_shared_disk'
-xlog_lock_file_path = '/home/zx/ss_hatest/shared_lock_primary'
+xlog_file_path = '/home/omm/ss_hatest/dorado_shared_disk'
+xlog_lock_file_path = '/home/omm/ss_hatest/shared_lock_primary'
application_name = 'dn_master_0'
cross_cluster_replconninfo1='localhost=127.0.0.1 localport=6600 remotehost=127.0.0.1 remoteport=9600'
-cross_cluster_replconninfo1='localhost=127.0.0.1 localport=6600 remotehost=127.0.0.1 remoteport=9700'
+cross_cluster_replconninfo2='localhost=127.0.0.1 localport=6600 remotehost=127.0.0.1 remoteport=9700'
cluster_run_mode = 'cluster_primary'
ha_module_debug = off
ss_log_level = 255
@@ -321,13 +355,34 @@ host all all 10.10.10.10/32 sha256
host all all 10.10.10.20/32 sha256
```
-(2) 以 primary 模式重启主集群主节点 0
+(2) 配置主集群备节点1的dorado容灾参数
+ postgresql.conf文件
+```
+port = 6700
+xlog_file_path = '/home/omm/ss_hatest/dorado_shared_disk'
+xlog_lock_file_path = '/home/omm/ss_hatest/shared_lock_primary'
+application_name = 'dn_master_1'
+cross_cluster_replconninfo1='localhost=127.0.0.1 localport=6700 remotehost=127.0.0.1 remoteport=9600'
+cross_cluster_replconninfo2='localhost=127.0.0.1 localport=6700 remotehost=127.0.0.1 remoteport=9700'
+cluster_run_mode = 'cluster_primary'
+ha_module_debug = off
+ss_log_level = 255
+ss_log_backup_file_count = 100
+ss_log_max_file_size = 1GB
+```
+(3) 以primary模式重启主集群主节点0
```
gs_ctl start -D /home/omm/ss_hatest/dn0 -M primary
```
+执行build前一定要给主集群主节点0配置容灾参数并以primary模式重启主集群主节点0
+如果是cm模拟方式,可以不用指定-M参数,reform会自动识别模式
+
+(4) 启动主集群备节点1
-执行 build 前一定要给主集群主节点 0 配置容灾参数并以 primary 模式重启主集群主节点 0
+```
+gs_ctl start -D /home/omm/ss_hatest/dn0
+```
##### 2.5.1.2 备集群(容灾中心)
@@ -336,11 +391,11 @@ gs_ctl start -D /home/omm/ss_hatest/dn0 -M primary
```
port = 9600
-xlog_file_path = '/home/zx/ss_hatest/dorado_shared_disk'
-xlog_lock_file_path = '/home/zx/ss_hatest/shared_lock_standby'
+xlog_file_path = '/home/omm/ss_hatest/dorado_shared_disk'
+xlog_lock_file_path = '/home/omm/ss_hatest/shared_lock_standby'
application_name = 'dn_standby_0'
cross_cluster_replconninfo1='localhost=127.0.0.1 localport=9600 remotehost=127.0.0.1 remoteport=6600'
-cross_cluster_replconninfo1='localhost=127.0.0.1 localport=9600 remotehost=127.0.0.1 remoteport=6700'
+cross_cluster_replconninfo2='localhost=127.0.0.1 localport=9600 remotehost=127.0.0.1 remoteport=6700'
cluster_run_mode = 'cluster_standby'
ha_module_debug = off
ss_log_level = 255
@@ -365,11 +420,32 @@ host all all 10.10.10.20/32 sha256
gs_ctl build -D /home/zx/ss_hatest1/dn0 -b cross_cluster_full -g 0 --vgname=+data --enable-dss --socketpath='UDS:/home/zx/ss_hatest1/dss_home0/.dss_unix_d_socket' -q
```
-(3) 以 standby 模式重启备集群首备节点 0
+(3) 配置备集群从备节点1的容灾参数
+ postgresql.conf文件
+```
+port = 9700
+xlog_file_path = '/home/zx/ss_hatest/dorado_shared_disk'
+xlog_lock_file_path = '/home/zx/ss_hatest/shared_lock_standby'
+application_name = 'dn_standby_1'
+cross_cluster_replconninfo1='localhost=127.0.0.1 localport=9700 remotehost=127.0.0.1 remoteport=6600'
+cross_cluster_replconninfo2='localhost=127.0.0.1 localport=9700 remotehost=127.0.0.1 remoteport=6700'
+cluster_run_mode = 'cluster_standby'
+ha_module_debug = off
+ss_log_level = 255
+ss_log_backup_file_count = 100
+ss_log_max_file_size = 1GB
+```
+(4) 以standby模式重启备集群首备节点0
```
gs_ctl start -D /home/omm/ss_hatest1/dn0 -M standby
```
+如果是cm模拟方式,可以不用指定-M参数,reform会自动识别模式
+
+(5) 以standby模式重启备集群从备节点1
+```
+gs_ctl start -D /home/omm/ss_hatest1/dn0
+```
#### 2.5.2 自动化容灾搭建
@@ -390,7 +466,7 @@ sh standby_full_build_reconnect.sh
[2023-04-18 09:38:34.397][1498175][][gs_ctl]: gs_ctl query ,datadir is /home/omm/ss_hatest/dn0
HA state:
local_role : Primary
- static_connections : 1
+ static_connections : 2
db_state : Normal
detail_information : Normal
@@ -442,8 +518,8 @@ No information
[omm@nodename pg_log]$ gs_ctl query -D /home/omm/ss_hatest1/dn0
[2023-04-18 11:33:09.288][2760315][][gs_ctl]: gs_ctl query ,datadir is /home/omm/ss_hatest1/dn0
HA state:
- local_role : Standby
- static_connections : 1
+ local_role : Main Standby
+ static_connections : 2
db_state : Normal
detail_information : Normal
@@ -455,14 +531,14 @@ No information
peer_role : Primary
peer_state : Normal
state : Normal
- sender_sent_location : 2/A458
- sender_write_location : 2/A458
- sender_flush_location : 2/A458
- sender_replay_location : 2/A458
- receiver_received_location : 2/A458
- receiver_write_location : 2/A458
- receiver_flush_location : 2/A458
- receiver_replay_location : 2/A458
+ sender_sent_location : 2/5C8
+ sender_write_location : 2/5C8
+ sender_flush_location : 2/5C8
+ sender_replay_location : 2/5C8
+ receiver_received_location : 2/5C8
+ receiver_write_location : 2/5C8
+ receiver_flush_location : 2/5C8
+ receiver_replay_location : 2/5C8
sync_percent : 100%
channel : 127.0.0.1:41952<--127.0.0.1:6600
```
@@ -494,7 +570,7 @@ gs_ctl query -D /opt/omm/cluster/dn0
[2023-04-03 19:29:20.472][1324519][][gs_ctl]: gs_ctl query ,datadir is /opt/omm/cluster/dn0
HA state:
local_role : Primary
- static_connections : 1
+ static_connections : 2
db_state : Normal
detail_information : Normal
@@ -543,8 +619,8 @@ No information
gs_ctl query -D /opt/omm/cluster/dn0
[2023-04-03 19:29:20.472][2720317][][gs_ctl]: gs_ctl query ,datadir is /opt/omm/cluster/dn0
HA state:
- local_role : Standby
- static_connections : 1
+ local_role : Main Standby
+ static_connections : 2
db_state : Normal
detail_information : Normal
@@ -620,5 +696,6 @@ select * from test01;
pg_controldata -I 0 --enable-dss --socketpath=UDS:$DSS_HOME/.dss_unix_d_socket +data
```
-(2)
-**_Notice:不推荐直接用于生产环境_**
+
+***Notice:不推荐直接用于生产环境***
+***作者:Shirley_zhengx***
diff --git a/app/zh/blogs/zhoucong/img/image-20230302172631067.png b/app/zh/blogs/zhoucong/img/image-20230302172631067.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f81c5e3cc8cfc9dc94797653c9c3bb4de840a60
Binary files /dev/null and b/app/zh/blogs/zhoucong/img/image-20230302172631067.png differ
diff --git a/app/zh/blogs/zhoucong/img/image-20230302195426114.png b/app/zh/blogs/zhoucong/img/image-20230302195426114.png
new file mode 100644
index 0000000000000000000000000000000000000000..3453e3d0cd3ef19deed12ad5c1a131551477640c
Binary files /dev/null and b/app/zh/blogs/zhoucong/img/image-20230302195426114.png differ
diff --git a/app/zh/blogs/zhoucong/img/image-20230302195456401.png b/app/zh/blogs/zhoucong/img/image-20230302195456401.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb1f9e68960c9f43dc617de5498e4483226b0f45
Binary files /dev/null and b/app/zh/blogs/zhoucong/img/image-20230302195456401.png differ
diff --git "a/app/zh/blogs/zhoucong/opengauss-jdbc\351\227\256\351\242\230\346\225\264\347\220\206.md" "b/app/zh/blogs/zhoucong/opengauss-jdbc\351\227\256\351\242\230\346\225\264\347\220\206.md"
index 91fe94173b22f42776e38bc0fa019f2bcdb22e69..7f6ccbdcded696857c469864ccbd181e74c0b1aa 100644
--- "a/app/zh/blogs/zhoucong/opengauss-jdbc\351\227\256\351\242\230\346\225\264\347\220\206.md"
+++ "b/app/zh/blogs/zhoucong/opengauss-jdbc\351\227\256\351\242\230\346\225\264\347\220\206.md"
@@ -10,7 +10,7 @@ img: ''
times: '16:00'
---
-# opengauss-jdbc 问题整理
+# opengauss-jdbc问题整理(更新中)
## 问题 1 jdbc 批量执行 insert 语句时返回结果不符合 Spring jpa 预期
@@ -30,3 +30,59 @@ jdbc 自身的优化机制,使用 executeBatch 批量执行 sql 时,如果
**解决办法:**
在连接串配置`batchMode=off`,所有 sql 分别执行,返回结果为`[1, 1, 1, 1, 1]`。
+
+## 问题2 数据类型不匹配时查询速度慢的问题
+
+**问题描述:**
+
+jdbc创建一个主键为id的表。
+```
+create table jdbc_test (id int primary key, class_id int, name varchar(128), score number(10,2));
+```
+基于如下sql构造PrepareStatement,分别使用setInt()和setBigDecimal插入主键,sql执行实现相差明显。其中使用setInt()插入主键的比较快,使用setBigDecimal()插入主键的比较慢。
+```
+"merge into " + tableName + " using (select 1) on (id = ? ) when matched then update set class_id =? , name = ? , score = ? when not matched then insert (id, class_id, name, score ) values (?,?,?,?)"
+```
+两种sql各执行1000次的耗时对比
+```
+使用int创建表,并准备数据
+mergeBatchedFast,mergeCount:1000,cost:100 ms
+mergeBatchedSlow,mergeCount:1000,cost:20733 ms
+```
+
+**分析过程:**
+抓取jdbc堆栈,发现jdbc主要卡在等待socket响应的地方,判断sql执行过慢为内核原因。
+
+
+
+在postgresql.conf添加如下配置
+```
+x log_min_duration_statement = 0
+track_stmt_stat_level = 'L2,L2'
+```
+执行`select * from dbe_perf.statement_history;`对比两个sql的查询计划。执行较快的sql的查询计划中,使用的是索引扫描。执行较慢的sql的查询计划中,使用的是全表扫描。
+
+
+
+
+
+**问题原因:**
+
+jdbc_test表的主键是int类型,主键数据类型与输入数据类型不一致时,会导致索引失效。merge into执行时有join操作,在查询时,执行慢的sql使用numeric类型的数据检索,导致索引失效,所以使用全表扫描,执行时间较长。执行快的sql则使用的是索引扫描,执行时间短。
+
+## 问题3 jdbc负载均衡功能适用范围相关说明及用例
+
+1. **负载均衡功能的已有算法分类**:openGauss目前主要使用autoBalance实现负载均衡功能,包括:"roundrobin"(轮询模式), "leastconn"(最小连接模式), "shuffle"(随机模式), "priority roundrobin"(带优先级的最小连接模式)。这些算法的主要实现思路是,在开发者通过在URL串上配置多个ip、port的方式连接主备集群时,在每次创建连接时,基于特定的负载均衡算法,对URL串上的数据库节点做优先级排序,优先在高优先级的节点上建连,使得连接均匀分散在各节点上。其中:
+ * roundrobin(轮询模式):通过该URL串连续创建连接时,根据固定顺序依次在URL串的各个节点上循环创建连接。
+ * leastconn(最小链接模式):JDBC在客户端内存里维护各节点通过该URL串创建的连接数,通过该URL串创建连接时,优先选择连接数少的节点创建连接。
+ * shuffle(随机模式):通过该URL串连续创建连接时,每次随机选择URL串中的节点创建连接。
+ * priority roundrobin(带优先级的最小连接模式):取值为"priority[n]", 与roundrobin相似,但是优先对前n个节点做轮询建连。
+2. **负载均衡功能的适用范围**:
+ * openGauss的负载均衡功能是基于连接的负载均衡功能,旨在基于特定算法在创建连接时将连接分散到URL串上的各节点上,与连接或数据库节点的实际运行压力无关。
+ * roundrobin、leastconn、priority roundrobin三种模式的生效范round围是对单个进程内的同一集群的连接做负载均衡,如果同一个程序内有多个配置了相同autoBalance参数和相同数据库节点的URL串,JDBC会对通过这些URL串创建的连接统一做负载均衡。
+3. **负载均衡功能与targetSeverType的配合方式**:
+ 在主备场景下,主节点可读可写,备节点可读不可写,如果连接主备集群时配置了autoBalance,并且业务中有写操作,有可能因为执行写操作的连接被创建在了备节点而报错。针对这种场景,可以将autoBalance和targetServerType配合使用,targetServerType可以控制只在主节点或者备节点上创建连接,并且targetServerType优先级高于autoBalance。以roundrobin为例,针对不同业务使用不同的URL串配置。
+ ```
+ jdbc:opengauss://node1,node2,node3/database?autoBalance=roundrobin&targetServerType=master
+ jdbc:opengauss://node1,node2,node3/database?autoBalance=roundrobin&targetServerType=slave
+ ```
\ No newline at end of file