说明
- 持续化存储方案使用的是: OpenEBS
- 数据库版本: postgresql 10
- pgpool-ll 3.7.0
- 不要直接使用在生产环境
创建 Postgresql 使用的ConfigMap
一般配置 Postgresql 需要配置 postgresql.conf
和 pg_hba.conf
两个文件。
这里的 ConfigMap 我只配置了 pg_hba.conf
然后通过数据卷挂载把配置文件挂载进去。postgresql.conf
文件通过 postgresql 的镜像设置参数来配置。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27apiVersion: v1
data:
pg_hba.conf: |
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host replication all 10.244.0.0/16 trust
host all all all md5
kind: ConfigMap
metadata:
creationTimestamp: 2018-03-29T06:47:00Z
name: postgresql
namespace: default
resourceVersion: "189457"
selfLink: /api/v1/namespaces/default/configmaps/postgresql
uid: fb96f72f-331c-11e8-a8fa-0014c240a2ba
主要添加了这一句 host replication all 10.244.0.0/16 trust
。10.244.0.0/16
是 Pod
的网段,因为集群开启了 TSL
,暂时认为这个网络是安全的。
note: all
权限不包含 replication
。
Postgresql Service
1 | # Headless service for stable DNS entries of StatefulSet members. |
创建 Postgresql Statefulset
postgresql 官方镜像
postgresql 10 关于 High Availability, Load Balancing, and Replicationwal_level=replica
写前日志等级改成 replica
hot_standby
开启热备hot_standby_feedback
开始热备反馈
POSTGRES_PASSWORD
这个环境变量的值要设成自己的密码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgresql
spec:
selector:
matchLabels:
app: postgresql
serviceName: postgresql
replicas: 3
template:
metadata:
labels:
app: postgresql
spec:
initContainers:
- name: clone-postgresql
image: postgres:10
command:
- bash
- "-c"
- |
set -ex
# Skip the clone on master (ordinal index 0).
[[ `hostname` =~ -([0-9]+)$ ]] || exit 1
ordinal=${BASH_REMATCH[1]}
[[ $ordinal -eq 0 ]] && exit 0
pg_basebackup \
-D /var/lib/postgresql/data \
-Fp \
-R \
-Xs \
-c fast \
-l 'initial clone' \
-P \
-v \
-h postgresql-0.postgresql \
-U postgres
volumeMounts:
- name: postgresql
mountPath: /var/lib/postgresql/data
subPath: data
containers:
- name: postgresql
image: postgres:10
env:
- name: POSTGRES_PASSWORD
value: "your_password"
args:
- "-c"
- "wal_level=replica"
- "-c"
- "full_page_writes=on"
- "-c"
- "wal_log_hints=on"
- "-c"
- "max_wal_senders=10"
- "-c"
- "max_replication_slots=10"
- "-c"
- "hot_standby=on"
- "-c"
- "hot_standby_feedback=on"
- "-c"
- "hba_file=/mnt/conf/pg_hba.conf"
ports:
- name: postgresql
containerPort: 5432
volumeMounts:
- name: postgresql
mountPath: /var/lib/postgresql/data
subPath: data
- name: conf
mountPath: /mnt/conf
volumes:
- name: conf
configMap:
name: postgresql
volumeClaimTemplates:
- metadata:
name: postgresql
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "openebs-standalone"
resources:
requests:
storage: 5Gi
因为 statefulset 的实例按顺序创建的,所以 postgresql-0
默认为master。 clone 步骤使用脚本控制,如果是postgresql-0
那么就不进行数据库拷贝。如果是 standby
节点,那么进行拷贝(配置中直接从master拷贝,也可以按照官方Mysql的例子从上一个节点拷贝,降低master的压力)。
是否使用cascade replication 涉及到同步的问题。如果使用了 cascade replication 那么就不能使用同步拷贝,也就是说master节点操作成功后便返回并且不等待其他节点确认数据已写入磁盘,那么就会产生可能会丢失数据的窗口期。
详细描述可以看这里
创建 pgpool-ll ConfigMap
1 | apiVersion: v1 |
在配置文件中配置master节点和slave节点。
在kubernetes中因为有service一层,所以可以通过service找到背后的endpoints,而pgpool的配置文件中看似只有“两个”节点。
创建 pgpool-ll Pod
1 | kind: Pod |
修改 hba
文件,使用MD5计算密码认证,把数据库用户的账号和通过MD5计算的密码保存到 pool_passwd
文件。添加账号和MD5密码的步骤可以通过 pg_md5 --md5auth --username=your_username your_password
pgpool service
内网测试没有域名,所以使用NodePort的形式暴露服务。1
2
3
4
5
6
7
8
9
10
11
12
13
14apiVersion: v1
kind: Service
metadata:
name: pgpool
labels:
app: pgpool
spec:
ports:
- name: pgpool
port: 9999
targetPort: 9999
selector:
app: pgpool
type: NodePort
测试
1 | pgbench -p 30473 -h 202.192.18.63 -U postgres -i test |
1 | Password for user postgres: |
参考
Run a Replicated Stateful Application
pgpool document
postgresql 10 document