This is the multi-page printable view of this section. Click here to print.
任务与教程
- 1: Nginx:向外代理暴露Web服务
- 2: Docker:启用容器支持与配置
- 3: 使用 PostgreSQL 作为 Ansible 的配置清单与 CMDB
- 4: 使用 Keepalived 为 Pigsty 节点集群配置二层 VIP
- 5: 使用 VIP-Manager 为 PostgreSQL 集群配置二层 VIP
- 6: 使用 PostgreSQL 作为 Grafana 后端数据库
- 7: 使用 TimescaleDB + Promscale 存储 Prometheus 时序指标数据
1 - Nginx:向外代理暴露Web服务
Pigsty 在 INFRA节点上默认会安装 Nginx 作为 Web 服务代理。(单机安装时,本机默认也是一个 INFRA节点 )
Nginx 是 Pigsty 所有 WebUI 类服务的访问入口,默认使用管理节点 80/443
端口。
Pigsty 提供了一个全局配置变量 infra_portal
,用于配置 Nginx 的代理规则,以及对应的上游服务。
如果您直接通过端口访问 Nginx,默认访问的是 h.pigsty
,即 Pigsty 文件系统首页。(/www/
目录)。
因为 Nginx 通过同一个端口对外提供多个服务,因此必须通过域名进行区分(浏览器的 HOST
首部),所以在默认情况下,Nginx 只会对外暴露 带有
domain` 参数的
默认情况下,Nginx 除了 home
(文件系统,软件源)之外,还对外暴露 grafana
,prometheus
,alertmanager
三项可观测性服务:
infra_portal: # domain names and upstream servers
home : { domain: h.pigsty }
grafana : { domain: g.pigsty ,endpoint: "${admin_ip}:3000" , websocket: true }
prometheus : { domain: p.pigsty ,endpoint: "${admin_ip}:9090" }
alertmanager : { domain: a.pigsty ,endpoint: "${admin_ip}:9093" }
blackbox : { endpoint: "${admin_ip}:9115" }
loki : { endpoint: "${admin_ip}:3100" }
#minio : { domain: sss.pigsty ,endpoint: "${admin_ip}:9001" ,scheme: https ,websocket: true }
如何配置 Nginx 代理?
Pigsty 自带的配置模板 full.yml
配置文件,作为一个参考,额外对外部暴露了一些 Web 服务:
infra_portal: # domain names and upstream servers
home : { domain: h.pigsty }
grafana : { domain: g.pigsty ,endpoint: "${admin_ip}:3000" , websocket: true }
prometheus : { domain: p.pigsty ,endpoint: "${admin_ip}:9090" }
alertmanager : { domain: a.pigsty ,endpoint: "${admin_ip}:9093" }
blackbox : { endpoint: "${admin_ip}:9115" }
loki : { endpoint: "${admin_ip}:3100" }
minio : { domain: sss.pigsty ,endpoint: "${admin_ip}:9001" ,scheme: https ,websocket: true }
postgrest : { domain: api.pigsty ,endpoint: "127.0.0.1:8884" }
pgadmin : { domain: adm.pigsty ,endpoint: "127.0.0.1:8885" }
pgweb : { domain: cli.pigsty ,endpoint: "127.0.0.1:8886" }
bytebase : { domain: ddl.pigsty ,endpoint: "127.0.0.1:8887" }
jupyter : { domain: lab.pigsty ,endpoint: "127.0.0.1:8888", websocket: true }
gitea : { domain: git.pigsty ,endpoint: "127.0.0.1:8889" }
wiki : { domain: wiki.pigsty ,endpoint: "127.0.0.1:9002" }
noco : { domain: noco.pigsty ,endpoint: "127.0.0.1:9003" }
supa : { domain: supa.pigsty ,endpoint: "10.10.10.10:8000", websocket: true }
这里不难看出,每一条记录都有一个独一无二的 name
作为 key
,一个配置字典作为 value
。在配置字典中,目前有以下四个可用配置项:
endpoint
:必填,指定上游服务的地址,可以是IP:PORT
或者DOMAIN:PORT
。- 在此参数中,可以使用
${admin_ip}
占位符,Pigsty会填入admin_ip
的值。
- 在此参数中,可以使用
domain
:可选,指定代理的域名,如果不填写,则 Nginx 不会对外暴露此服务。- 对于那些需要知道 endpoint 地址,但不想对外暴露的服务(例如 Loki, Blackbox Exporter),可以不填写
domain
。
- 对于那些需要知道 endpoint 地址,但不想对外暴露的服务(例如 Loki, Blackbox Exporter),可以不填写
scheme
:可选,指定转发时的协议(http
/https
),留空则默认使用 http- 对于那些强制要求 HTTPS 访问的上游 Web 服务(例如 MinIO 管理界面),需要指定
scheme: https
。
- 对于那些强制要求 HTTPS 访问的上游 Web 服务(例如 MinIO 管理界面),需要指定
websocket
:可选,指定是否开启 WebSocket,留空则默认关闭。- 类似 Grafana、Jupyter 等需要 WebSocket 的服务需要设置为
true
方能正常工作。
- 类似 Grafana、Jupyter 等需要 WebSocket 的服务需要设置为
因此,如果您需要新增一个通过 Nginx 暴露的 Web 服务,首先需要在 infra_portal
中添加相应地记录,然后执行剧本生效:
./infra.yml -t nginx_config # 重新生成 Nginx 配置文件
./infra.yml -t nginx_cert # 重新签发自签名 HTTPS 证书,囊括新增的域名
./infra.yml -t nginx_launch # 重启 Nginx 以使配置生效(如果您不希望出现中断,手动使用 nginx -s reload)
如果您始终通过 Pigsty 管理 Nginx 配置,也可以直接使用以下任务重新初始化 Nginx 配置:
./infra.yml -t nginx # 直接重新初始化 Nginx 至描述的状态
Nginx相关配置参数位于:配置:INFRA - NGINX
如何通过域名访问 Nginx 代理的服务?
Nginx 通过浏览器设置的 HOST
首部中的域名,来区分不同的服务,所以默认除了软件仓库之外服务,都的您需要通过域名访问。
您可以通过 IP地址 + 端口的方式直接访问这些服务。但我们更推荐您使用域名通过 Nginx 80/443 端口代理访问所有组件。
使用域名访问 Pigsty WebUI 时,您需要配置 DNS 解析,或者修改本地的 /etc/hosts
静态解析文件,有几种典型的方式
-
如果您的服务需要直接暴露在公网上,那么应当通过 DNS 服务商(Cloudflare,Aliyun DNS 等)解析互联网域名。注意,在这种情况下,通常您还需要修改 Pigsty 的
infra_portal
参数,因为默认的*.pigsty
并不是一个适合公网使用的域名。 -
如果您的服务需要在办公网共享访问,那么应当通过内网 DNS 服务商(公司内部 DNS 服务器)解析内网域名,并将其指向 Nginx 服务器所在的 IP。您可以要求网络管理员在公司内部 DNS 服务器中添加相应的解析记录,也可以要求系统的用户手工配置静态的 DNS 解析记录。
-
如果您的服务仅供自己,或少数用户使用(例如 DBA),那么您可以要求这些用户使用静态域名解析记录。在 Linux / MacOS 系统上,修改
/etc/hosts
文件(需要 sudo 权限)或C:\Windows\System32\drivers\etc\hosts
(Windows)文件。
我们建议普通单机用户使用第三种方式,在 使用浏览器访问 Web 系统的机器上 ,添加以下解析记录:
<your_public_ip_address> h.pigsty a.pigsty p.pigsty g.pigsty
这里的 IP 地址是安装 Pigsty 服务的 对外IP地址,然后您就可以在浏览器中通过: http://g.pigsty 这样的域名网址,访问 Pigsty 的子系统了。
其他的 Web 服务与自定义域名,也可以通过同样的方式添加。例如以下是 Pigsty 沙箱 Demo 可能用到的域名解析记录:
10.10.10.10 h.pigsty a.pigsty p.pigsty g.pigsty
10.10.10.10 api.pigsty ddl.pigsty adm.pigsty cli.pigsty lab.pigsty
10.10.10.10 supa.pigsty noco.pigsty odoo.pigsty dify.pigsty
如何使用 HTTPS 访问 Nginx 代理的服务?
Pigsty默认使用自动生成的自签名的 CA 证书为 Nginx 启用 SSL,如果您希望使用 HTTPS 访问这些页面,而不弹窗提示"不安全",通常有三个选择:
- 在您的浏览器或操作系统中信任 Pigsty 自签名的 CA 证书:
files/pki/ca/ca.crt
- 如果您使用 Chrome,可以在提示不安全的窗口键入
thisisunsafe
跳过提示 - 您可以考虑使用 Let’s Encrypt 或其他免费的 CA 证书服务,为 Pigsty Nginx 生成正式的 SSL证书。
2 - Docker:启用容器支持与配置
Pigsty 提供了 DOCKER
模块,但默认并不安装。您可以使用 docker.yml
剧本在指定节点上安装并启用 Docker。
./docker.yml -l <ip|group|cls> # 在指定的节点、分组、集群上安装并启用 Docker
如何建配置代理服务器?
本文不会介绍如何“翻墙”,而是假设你已经有了一个可用的 HTTP(s) 代理服务器,应该如何配置,让 Docker 可以通过代理服务器,访问 docker hub 或 quay.io 等镜像站点:
你的代理服务器软件应该会提供一个形如:
http://<ip|domain>:<port>
或者https://[user]:[pass]@<ip|domain>:<port>
的代理地址
例如,假设您使用的代理服务器配置为:
export ALL_PROXY=http://192.168.0.106:8118
export HTTP_PROXY=http://192.168.0.106:8118
export HTTPS_PROXY=http://192.168.0.106:8118
export NO_PROXY="localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.pigsty,*.aliyun.com,mirrors.*,*.myqcloud.com,*.tsinghua.edu.cn"
您可以使用 curl
命令,检验代理服务器是否可以正常工作,例如成功可以访问 Google,通常说明代理服务器工作正常。
curl -x http://192.168.0.106:8118 -I http://www.google.com
如何为Docker Daemon配置代理服务器?
如果您希望 Docker 在 Pull 镜像时使用代理服务器,那么应当在 pigsty.yml
配置文件的全局变量中,指定 proxy_env
参数:
all:
vars:
proxy_env: # global proxy env when downloading packages
no_proxy: "localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.pigsty,*.aliyun.com,mirrors.*,*.myqcloud.com,*.tsinghua.edu.cn"
http_proxy: http://192.168.0.106:8118
all_proxy: http://192.168.0.106:8118
https_proxy: http://192.168.0.106:8118
那么当 Docker 剧本执行,时,这些配置会被渲染为 /etc/docker/daemon.json
中的代理配置:
{
"proxies": {
"http-proxy": "{{ proxy_env['http_proxy'] }}",
"https-proxy": "{{ proxy_env['http_proxy'] }}",
"no-proxy": "{{ proxy_env['no_proxy'] }}"
}
}
请注意,Docker Daemon 不使用
all_proxy
参数
如果您希望手工指定代理服务器,可以选则直接修改 /etc/docker/daemon.json
中的 proxies
配置;
或者也可以修改 /lib/systemd/system/docker.service
(Debian/Ubuntu) 与 /usr/lib/systemd/system/docker.service
的服务定义,在 [Service]
一节中添加环境变量声明,并重启生效:
[Service]
Environment="HTTP_PROXY=http://192.168.0.106:8118"
Environment="HTTPS_PROXY=http://192.168.0.106:8118"
Environment="NO_PROXY=localhost,127.0.0.1,10.0.0.0/8,192.168.0.0/16,*.pigsty,*.aliyun.com,mirrors.*,*.myqcloud.com,*.tsinghua.edu.cn"
重启后生效:
systemctl restart docker
如何使用其他镜像站点?
您可以在 docker_registry_mirrors
参数中指定其他镜像站点,例如阿里云、腾讯云、清华大学等镜像站点:
[ "https://mirror.ccs.tencentyun.com" ] # tencent cloud mirror, intranet only
["https://registry.cn-hangzhou.aliyuncs.com"] # aliyun cloud mirror, login required
不过目前来看,所有位于中国大陆的 DockerHub 公有镜像站都已经被封禁了,建议使用代理服务器直接访问 Docker Hub
如果您需要使用其他镜像站,例如 quay.io
,可以首先执行:
docker login quay.io
username #> # input your username
password #> # input your password
3 - 使用 PostgreSQL 作为 Ansible 的配置清单与 CMDB
您可以使用 PostgreSQL 作为 Pigsty 的配置源,替代静态 YAML 配置文件。
使用 CMDB 作为 Ansible 的动态 配置清单 具有一些优点:元数据以高度结构化的方式以数据表的形式呈现,并通过数据库约束确保一致性。 同时,使用 CMDB 允许您使用第三方的工具来编辑管理 Pigsty 元数据,便于与外部系统相互集成。
Ansible配置原理
Pigsty 默认的配置文件路径在 ansible.cfg
中指定为:inventory = pigsty.yml
修改该参数,可以更改默认使用的配置文件路径。如果您将其指向一个可执行的脚本文件,那么 Ansible 会使用动态 Inventory 机制,执行该脚本,并期待该脚本返回一份配置文件。
修改配置源实质上是编辑Pigsty目录下的 ansible.cfg
实现的:
---
inventory = pigsty.yml
+++
inventory = inventory.sh
而 inventory.sh
则是一个从 PostgreSQL CMDB 的记录中,生成等效 YAML/JSON 配置文件的简单脚本。
你可以使用 bin/inventory_cmdb
切换到动态的 CMDB 清单,
使用 bin/inventory_conf
返回到本地配置文件。
你还需要使用 bin/inventory_load
将当前的配置文件清单加载到 CMDB。
加载配置
Pigsty CMDB的模式会在pg-meta
元数据库初始化时自动创建(files/cmdb.sql
),位于meta
数据库的pigsty
模式中。使用bin/inventory_load
可以将静态配置文件加载至CMDB中。
必须在元节点完整执行
infra.yml
安装完毕后,方可使用 CMDB
usage: inventory_load [-h] [-p PATH] [-d CMDB_URL]
load config arguments
optional arguments:
-h, --help show this help message and exit„
-p PATH, --path PATH config path, ${PIGSTY_HOME}/pigsty.yml by default
-d DATA, --data DATA postgres cmdb pgurl, ${METADB_URL} by default
默认情况下,不带参数执行该脚本将会把$PIGSTY_HOME/pigsty.yml
的名称载入默认CMDB中。
bin/inventory_load
bin/inventory_load -p conf/demo.yml
bin/inventory_load -p conf/prod.yml -d postgresql://dbuser_meta:[email protected]:5432/meta
当原有配置文件加载至 CMDB 作为初始数据后,即可配置 Ansible 使用 CMDB 作为配置源:
bin/inventory_cmdb
您可以切换回静态配置文件:
bin/inventory_conf
4 - 使用 Keepalived 为 Pigsty 节点集群配置二层 VIP
您可以在节点集群上绑定一个可选的 L2 VIP —— 前提条件是:集群中的所有节点都在一个二层网络中。
在节点集群(任何一个 Ansible Group,包括数据库集群定义都可以视作一个节点集群)上,启用 vip_enabled
参数,即可在节点集群上启用 Keepalived ,绑定一个2层 VIP。
proxy:
hosts:
10.10.10.29: { nodename: proxy-1 } # 您可以显式指定初始的 VIP 角色:MASTER / BACKUP
10.10.10.30: { nodename: proxy-2 } # , vip_role: master }
vars:
node_cluster: proxy
vip_enabled: true
vip_vrid: 128
vip_address: 10.10.10.99
vip_interface: eth1
使用以下命令,刷新节点的 Keepalived 配置,并生效:
./node.yml -l proxy -t node_vip # 首次启用 VIP
./node.yml -l proxy -t vip_refresh # 刷新 vip 配置(例如指定 master)
5 - 使用 VIP-Manager 为 PostgreSQL 集群配置二层 VIP
您可以在 PostgreSQL 集群上绑定一个可选的 L2 VIP —— 前提条件是:集群中的所有节点都在一个二层网络中。
这个 L2 VIP 强制使用 Master - Backup 模式,Master 始终指向在数据库集群主库实例所在的节点。
这个 VIP 由 VIP-Manager 组件管理,它会从 DCS (etcd) 中直接读取由 Patroni 写入的 Leader Key,从而判断自己是否是 Master。
启用VIP
在 PostgreSQL 集群上定义 pg_vip_enabled
参数为 true
,即可在集群上启用 VIP 组件。当然您也可以在全局配置中启用此配置项。
# pgsql 3 node ha cluster: pg-test
pg-test:
hosts:
10.10.10.11: { pg_seq: 1, pg_role: primary } # primary instance, leader of cluster
10.10.10.12: { pg_seq: 2, pg_role: replica } # replica instance, follower of leader
10.10.10.13: { pg_seq: 3, pg_role: replica, pg_offline_query: true } # replica with offline access
vars:
pg_cluster: pg-test # define pgsql cluster name
pg_users: [{ name: test , password: test , pgbouncer: true , roles: [ dbrole_admin ] }]
pg_databases: [{ name: test }]
# 启用 L2 VIP
pg_vip_enabled: true
pg_vip_address: 10.10.10.3/24
pg_vip_interface: eth1
请注意,pg_vip_address
必须是一个合法的 IP 地址,带有网段,且在当前二层网络中可用。
请注意,pg_vip_interface
必须是一个合法的网络接口名,并且应当是与 inventory 中使用 IPv4 地址一致的网卡。
如果集群成员的网卡名不一样,用户应当为每个实例显式指定 pg_vip_interface
参数,例如:
pg-test:
hosts:
10.10.10.11: { pg_seq: 1, pg_role: primary , pg_vip_interface: eth0 }
10.10.10.12: { pg_seq: 2, pg_role: replica , pg_vip_interface: eth1 }
10.10.10.13: { pg_seq: 3, pg_role: replica , pg_vip_interface: ens33 }
vars:
pg_cluster: pg-test # define pgsql cluster name
pg_users: [{ name: test , password: test , pgbouncer: true , roles: [ dbrole_admin ] }]
pg_databases: [{ name: test }]
# 启用 L2 VIP
pg_vip_enabled: true
pg_vip_address: 10.10.10.3/24
#pg_vip_interface: eth1
使用以下命令,刷新 PG 的 vip-manager 配置并重启生效:
./pgsql.yml -t pg_vip
6 - 使用 PostgreSQL 作为 Grafana 后端数据库
您可以使用 PostgreSQL 作为 Grafana 后端使用的数据库。
这是了解Pigsty部署系统使用方式的好机会,完成此教程,您会了解:
- 如何创建新数据库集群
- 如何在已有数据库集群中创建新业务用户
- 如何在已有数据库集群中创建新业务数据库
- 如何访问Pigsty所创建的数据库
- 如何管理Grafana中的监控面板
- 如何管理Grafana中的PostgreSQL数据源
- 如何一步到位完成Grafana数据库升级
太长不看
vi pigsty.yml # 取消注释DB/User定义:dbuser_grafana grafana
bin/pgsql-user pg-meta dbuser_grafana
bin/pgsql-db pg-meta grafana
psql postgres://dbuser_grafana:DBUser.Grafana@meta:5436/grafana -c \
'CREATE TABLE t(); DROP TABLE t;' # 检查连接串可用性
vi /etc/grafana/grafana.ini # 修改 [database] type url
systemctl restart grafana-server
创建数据库集群
我们可以在pg-meta
上定义一个新的数据库grafana
,也可以在新的机器节点上创建一个专用于Grafana的数据库集群:pg-grafana
定义集群
如果需要创建新的专用数据库集群pg-grafana
,部署在10.10.10.11
,10.10.10.12
两台机器上,可以使用以下配置文件:
pg-grafana:
hosts:
10.10.10.11: {pg_seq: 1, pg_role: primary}
10.10.10.12: {pg_seq: 2, pg_role: replica}
vars:
pg_cluster: pg-grafana
pg_databases:
- name: grafana
owner: dbuser_grafana
revokeconn: true
comment: grafana primary database
pg_users:
- name: dbuser_grafana
password: DBUser.Grafana
pgbouncer: true
roles: [dbrole_admin]
comment: admin user for grafana database
创建集群
使用以下命令完成数据库集群pg-grafana
的创建:pgsql.yml
。
bin/createpg pg-grafana # 初始化pg-grafana集群
该命令实际上调用了Ansible Playbook pgsql.yml
创建数据库集群。
./pgsql.yml -l pg-grafana # 实际执行的等效Ansible剧本命令
定义在 pg_users
与 pg_databases
中的业务用户与业务数据库会在集群初始化时自动创建,因此使用该配置时,集群创建完毕后,(在没有DNS支持的情况下)您可以使用以下连接串访问数据库(任一即可):
postgres://dbuser_grafana:[email protected]:5432/grafana # 主库直连
postgres://dbuser_grafana:[email protected]:5436/grafana # 直连default服务
postgres://dbuser_grafana:[email protected]:5433/grafana # 连接串读写服务
postgres://dbuser_grafana:[email protected]:5432/grafana # 主库直连
postgres://dbuser_grafana:[email protected]:5436/grafana # 直连default服务
postgres://dbuser_grafana:[email protected]:5433/grafana # 连接串读写服务
因为默认情况下Pigsty安装在单个元节点上,接下来的步骤我们会在已有的pg-meta
数据库集群上创建Grafana所需的用户与数据库,而并非使用这里创建的pg-grafana
集群。
创建Grafana业务用户
通常业务对象管理的惯例是:先创建用户,再创建数据库。
因为如果为数据库配置了owner
,数据库对相应的用户存在依赖。
定义用户
要在pg-meta
集群上创建用户dbuser_grafana
,首先将以下用户定义添加至pg-meta
的集群定义中:
添加位置:all.children.pg-meta.vars.pg_users
- name: dbuser_grafana
password: DBUser.Grafana
comment: admin user for grafana database
pgbouncer: true
roles: [ dbrole_admin ]
如果您在这里定义了不同的密码,请在后续步骤中将相应参数替换为新密码
创建用户
使用以下命令完成dbuser_grafana
用户的创建(任一均可)。
bin/pgsql-user pg-meta dbuser_grafana # 在pg-meta集群上创建`dbuser_grafana`用户
实际上调用了Ansible Playbook pgsql-createuser.yml
创建用户
./pgsql-user.yml -l pg-meta -e pg_user=dbuser_grafana # Ansible
dbrole_admin
角色具有在数据库中执行DDL变更的权限,这正是Grafana所需要的。
创建Grafana业务数据库
定义数据库
创建业务数据库的方式与业务用户一致,首先在pg-meta
的集群定义中添加新数据库grafana
的定义。
添加位置:all.children.pg-meta.vars.pg_databases
- { name: grafana, owner: dbuser_grafana, revokeconn: true }
创建数据库
使用以下命令完成grafana
数据库的创建(任一均可)。
bin/pgsql-db pg-meta grafana # 在`pg-meta`集群上创建`grafana`数据库
实际上调用了Ansible Playbook pgsql-createdb.yml
创建数据库
./pgsql-db.yml -l pg-meta -e pg_database=grafana # 实际执行的Ansible剧本
使用Grafana业务数据库
检查连接串可达性
postgres://dbuser_grafana:DBUser.Grafana@meta:5432/grafana # 直连
postgres://dbuser_grafana:DBUser.Grafana@meta:5436/grafana # default服务
postgres://dbuser_grafana:DBUser.Grafana@meta:5433/grafana # primary服务
这里,我们将使用通过负载均衡器直接访问主库的 Default服务访问数据库。
首先检查连接串是否可达,以及是否有权限执行DDL命令。
psql postgres://dbuser_grafana:DBUser.Grafana@meta:5436/grafana -c \
'CREATE TABLE t(); DROP TABLE t;'
直接修改Grafana配置
为了让Grafana使用 Postgres 数据源,您需要编辑 /etc/grafana/grafana.ini
,并修改配置项:
[database]
;type = sqlite3
;host = 127.0.0.1:3306
;name = grafana
;user = root
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
;password =
;url =
将默认的配置项修改为:
[database]
type = postgres
url = postgres://dbuser_grafana:DBUser.Grafana@meta/grafana
随后重启Grafana即可:
systemctl restart grafana-server
从监控系统中看到新增的 grafana
数据库已经开始有活动,则说明Grafana已经开始使用Postgres作为首要后端数据库了。
但一个新的问题是,Grafana中原有的Dashboards与Datasources都消失了!这里需要重新导入监控面板与Postgres数据源
管理Grafana监控面板
您可以使用管理用户前往 Pigsty 目录下的files/ui
目录,执行grafana.py init
重新加载Pigsty监控面板。
cd ~/pigsty/files/ui
./grafana.py init # 使用当前目录下的Dashboards初始化Grafana监控面板
执行结果:
vagrant@meta:~/pigsty/files/ui
$ ./grafana.py init
Grafana API: admin:pigsty @ http://10.10.10.10:3000
init dashboard : home.json
init folder pgcat
init dashboard: pgcat / pgcat-table.json
init dashboard: pgcat / pgcat-bloat.json
init dashboard: pgcat / pgcat-query.json
init folder pgsql
init dashboard: pgsql / pgsql-replication.json
init dashboard: pgsql / pgsql-table.json
init dashboard: pgsql / pgsql-activity.json
init dashboard: pgsql / pgsql-cluster.json
init dashboard: pgsql / pgsql-node.json
init dashboard: pgsql / pgsql-database.json
init dashboard: pgsql / pgsql-xacts.json
init dashboard: pgsql / pgsql-overview.json
init dashboard: pgsql / pgsql-session.json
init dashboard: pgsql / pgsql-tables.json
init dashboard: pgsql / pgsql-instance.json
init dashboard: pgsql / pgsql-queries.json
init dashboard: pgsql / pgsql-alert.json
init dashboard: pgsql / pgsql-service.json
init dashboard: pgsql / pgsql-persist.json
init dashboard: pgsql / pgsql-proxy.json
init dashboard: pgsql / pgsql-query.json
init folder pglog
init dashboard: pglog / pglog-instance.json
init dashboard: pglog / pglog-analysis.json
init dashboard: pglog / pglog-session.json
该脚本会侦测当前的环境(安装时定义于~/pigsty
),获取Grafana的访问信息,并将监控面板中的URL连接占位符域名(*.pigsty
)替换为真实使用的域名。
export GRAFANA_ENDPOINT=http://10.10.10.10:3000
export GRAFANA_USERNAME=admin
export GRAFANA_PASSWORD=pigsty
export NGINX_UPSTREAM_YUMREPO=yum.pigsty
export NGINX_UPSTREAM_CONSUL=c.pigsty
export NGINX_UPSTREAM_PROMETHEUS=p.pigsty
export NGINX_UPSTREAM_ALERTMANAGER=a.pigsty
export NGINX_UPSTREAM_GRAFANA=g.pigsty
export NGINX_UPSTREAM_HAPROXY=h.pigsty
题外话,使用grafana.py clean
会清空目标监控面板,使用grafana.py load
会加载当前目录下所有监控面板,当Pigsty的监控面板发生变更,可以使用这两个命令升级所有的监控面板。
管理Postgres数据源
当使用 pgsql.yml
创建新PostgreSQL集群,或使用pgsql-createdb.yml
创建新业务数据库时,Pigsty会在Grafana中注册新的PostgreSQL数据源,您可以使用默认的监控用户通过Grafana直接访问目标数据库实例。应用pgcat
的绝大部分功能有赖于此。
要注册Postgres数据库,可以使用pgsql.yml
中的register_grafana
任务:
./pgsql.yml -t register_grafana # 重新注册当前环境中所有Postgres数据源
./pgsql.yml -t register_grafana -l pg-test # 重新注册 pg-test 集群中所有的数据库
一步到位更新Grafana
您可以直接通过修改Pigsty配置文件,更改Grafana使用的后端数据源,一步到位的完成切换Grafana后端数据库的工作。编辑pigsty.yml
中grafana_database
与grafana_pgurl
参数,将其修改为:
grafana_database: postgres
grafana_pgurl: postgres://dbuser_grafana:DBUser.Grafana@meta:5436/grafana
然后重新执行 infral.yml
中的grafana
任务,即可完成 Grafana升级
./infra.yml -t grafana
7 - 使用 TimescaleDB + Promscale 存储 Prometheus 时序指标数据
虽然这并不是推荐的行为,但这是了解Pigsty部署系统使用方式的好机会。
注意,使用 Promscale 存储 Prometheus 指标占用的存储空间大约是 Prometheus 的 4 倍,但是可以使用 SQL 来查询分析 Prometheus 监控指标。
准备Postgres数据库
vi pigsty.yml # 取消注释DB/User定义:dbuser_prometheus prometheus
pg_databases: # define business users/roles on this cluster, array of user definition
- { name: prometheus, owner: dbuser_prometheus , revokeconn: true, comment: prometheus primary database }
pg_users: # define business users/roles on this cluster, array of user definition
- {name: dbuser_prometheus , password: DBUser.Prometheus ,pgbouncer: true , createrole: true, roles: [dbrole_admin], comment: admin user for prometheus database }
创建 Prometheus 业务数据库与业务用户。
bin/createuser pg-meta dbuser_prometheus
bin/createdb pg-meta prometheus
检查数据库可用性并创建扩展
psql postgres://dbuser_prometheus:[email protected]:5432/prometheus -c 'CREATE EXTENSION timescaledb;'
配置Promscale
在元节点上执行以下命令安装 promscale
yum install -y promscale
如果默认软件包中没有,可以直接下载:
wget https://github.com/timescale/promscale/releases/download/0.6.1/promscale_0.6.1_Linux_x86_64.rpm
sudo rpm -ivh promscale_0.6.1_Linux_x86_64.rpm
编辑 promscale
的配置文件 /etc/sysconfig/promscale.conf
PROMSCALE_DB_HOST="127.0.0.1"
PROMSCALE_DB_NAME="prometheus"
PROMSCALE_DB_PASSWORD="DBUser.Prometheus"
PROMSCALE_DB_PORT="5432"
PROMSCALE_DB_SSL_MODE="disable"
PROMSCALE_DB_USER="dbuser_prometheus"
最后启动promscale,它会访问安装有 timescaledb
的数据库实例,并创建所需的schema
# launch
cat /usr/lib/systemd/system/promscale.service
systemctl start promscale && systemctl status promscale
配置Prometheus
Prometheus可以使用Remote Write/ Remote Read的方式,通过Promscale,使用Postgres作为远程存储。
编辑Prometheus配置文件:
vi /etc/prometheus/prometheus.yml
添加以下记录:
remote_write:
- url: "http://127.0.0.1:9201/write"
remote_read:
- url: "http://127.0.0.1:9201/read"
重启Prometheus后,监控数据即可放入Postgres中。
systemctl restart prometheus