1、使用的数据库为postgresql,由于需要满足公司不同地方办公室的数据库使用,以及数据库备份等需求,需要数据库进行异地部署及数据及时同步。。
2、系统存在文件管理服务,系统需要满足文件共享功能,但由于防火墙规则限制,异地办公室不能访问主服务器所在地的网络共享文件,所以需要进行远程传输。
docker
DockerFile docker-compose.yml
SSH公钥和私钥配置免密登录
客户主机和服务器
IP | 角色 |
---|---|
..*.80 | 主节点(server) |
..*.161 | 从节点(client) |
采用pgsql主从备份的方式具体参考postgresql官网
postgresql数据库官方提供了后备服务器的相关方法,其中流复制(流复制,就是从服务器通过tcp流从主服务器中同步相应的数据。这样当主服务器数据丢失时从服务器中仍有备份。后备服务器连接到主服务器,主服务器则在 WAL 记录产生时即将它们以流式传送给后备服务器而不必等到 WAL 文件被填充。)机制满足本次需求。
传输方式及安全性:流复制分为同步流复制和异步流复制。postgresql默认情况下流复制是异步的,在这种情况下主服务器上提交一个事务与该变化在后备服务器上变得可见之间存在短暂的延迟。在后备服务器的能力足以跟得上负载的前提下延迟通常低于一秒,如果主服务器崩溃,则某些已被提交的事务可能还没有被复制到后备服务器,这会导致数据丢失。数据的丢失量与故障转移时的复制延迟成比例。还有同步流复制,同步复制能够保证一个事务的所有修改都能被传送到一台或者多台同步后备服务器。这里先采用默认异步流复制的方式
主库拥有三个账号,系统账号、只读账号(用以OrCAD用户进行数据源连接)和复制角色(用以从库对主库进行备份),主库负责物料信息系统的增删改查功能。
从库设计有一个账号,由于将从库系统设置为热备份,所以本身的系统账号只有查询权限。
采用rsync实现文件的远程定时同步(rsync是linux系统下的数据镜像备份工具)。
采用samba实现linux和windows系统间的文件共享(是在Linux和UNIX系统上实现SMB协议的一个软件,SMB是一种在局域网上共享文件和打印机的一种通信协议)。
主节点
docker-compose.yaml
version: "3.9"
volumes:
master-db:
Cadence_CIS:
services:
#数据库服务
pgsqlserver:
container_name: pgsql-server
image: postgres:12.12-alpine
ports:
- "15432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=erp
volumes:
- master-db:/var/lib/postgresql/data
- ./db/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d:ro
#文件备份服务
rsync-server:
image: apnar/rsync-server
container_name: rsync-server
ports:
- "10022:22"
- "10873:873"
restart: always
environment:
- USERNAME=user
- PASSWORD=pass
#允许访问的客户端网段
- ALLOW=0.0.0.0/0
volumes:
- Cadence_CIS:/data
#文件共享服务
samba:
image: dperson/samba
ports:
- "139:139/tcp"
- "445:445/tcp"
command: '-u "user;0" -u "root;0" -s "Cadence_CIS;/mount;yes;yes;no;all;root;root"'
volumes:
- Cadence_CIS:/mount
/db/docker-entrypoint-initdb.d目录下编写docker启动参数(数据库服务):
#!/bin/bash
set -e
echo "Appending $PGDATA/pg_hba.conf"
{
printf '\n'
printf 'host replication all all trust\n'
} >> "$PGDATA/pg_hba.conf"
echo "Appended."
echo "Appending $PGDATA/postgresql.conf"
{
printf '\n'
printf 'wal_level=replica\n'
printf 'max_wal_senders=5\n'
printf 'wal_keep_segments=128\n'
printf 'wal_sender_timeout=60s\n'
printf 'max_connections=200\n'
printf 'hot_standby=on\n'
printf 'max_standby_streaming_delay=30s\n'
printf 'wal_receiver_status_interval=10s\n'
printf 'hot_standby_feedback=on\n'
} >> "$PGDATA/postgresql.conf"
echo "Appended."
echo "Creating replica user"
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE USER replica WITH REPLICATION LOGIN CONNECTION LIMIT 10 ENCRYPTED PASSWORD '123456'; #创建一个可供复制的用户
CREATE ROLE readonly;
GRANT USAGE ON schema public TO readonly;
GRANT readonly TO replica;
EOSQL
echo "Created."
wal_level = replica # 这个是设置主为wal的主机
max_wal_senders = 5 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 128 # 设置流复制保留的最多的xlog数目
wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间
max_connections = 200 # 一般查多于写的应用从库的最大连接数要比较大
hot_standby = on # 说明这台机器不仅仅是用于数据归档,也用于数据查询(热备)
max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
wal_receiver_status_interval = 10s # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈
wal_log_hints = on # also do full page writes of non-critical updates
从节点
version: '1.0'
volumes:
Cadence_CIS:
slave-db:
services:
rsync-client:
build:
context: ./rsync
dockerfile: Dockerfile
image: my/rsync:0.1
container_name: rsync-client2
restart: always
environment:
- RSYNC_PASSWORD=pass
command: crond -f
volumes:
- Cadence_CIS:/backup
- ./crontabs:/etc/crontabs:ro
samba:
image: dperson/samba
ports:
- "139:139/tcp"
- "445:445/tcp"
command: '-u "user;0" -u "root;0" -s "Cadence_CIS;/mount;yes;yes;no;all;root;root"'
volumes:
- Cadence_CIS:/mount
postgresql-client:
container_name: postgresql-client
image: postgres:12.12-alpine
ports:
- "15433:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=erp
- PGPASSFILE=/root/.pgpass
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- slave-db:/var/lib/postgresql/data
- ./db/.pgpass:/root/.pgpass:ro
- ./db/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d:ro
./db/docker-entrypoint-initdb.d目录下编写docker启动参数(数据库服务):
#!/bin/bash
set -ex
echo "Stopping temp server"
PGUSER="${PGUSER:-postgres}" \
pg_ctl -D "$PGDATA" -m fast -w stop
echo "Stopped."
echo "Removing $PGDATA"
rm -rf "$PGDATA"
echo "Removed."
echo "Setup replication"
# 基础复制
pg_basebackup -h "*.*.*.80" -p 15432 -U replica -Fp -Xs -Pv -R -D $PGDATA
{
printf '\n'
printf 'wal_level=replica\n'
printf 'max_wal_senders=10\n'
printf 'wal_keep_segments=128\n'
printf 'wal_sender_timeout=60s\n'
printf 'max_connections=210\n'
printf 'hot_standby=on\n'
printf 'max_standby_streaming_delay=30s\n'
printf 'wal_receiver_status_interval=10s\n'
printf 'hot_standby_feedback=on\n'
printf "hot_standby = 'on'\n"
printf "primary_conninfo = 'application_name=salve user=replica password=123456 host=*.*.*.80 port=15432 sslmode=disable sslcompression=0 gssencmode=disable krbsrvname=postgres target_session_attrs=any'\n"
} >> "$PGDATA/postgresql.conf"
echo 'Ok.'
echo "Starting temp server"
set -- "$@" -c listen_addresses='' -p "${PGPORT:-5432}"
PGUSER="${PGUSER:-$POSTGRES_USER}" \
pg_ctl -D "$PGDATA" \
-o "$(printf '%q ' "$@")" \
-w start
Dockerfile(rsync)
ARG alpine_ver=3.17
FROM alpine:${alpine_ver}
# Install Rsync
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
&& apk update \
&& apk add --no-cache \
--virtual .run-deps \
rsync \
&& rm -rf /var/cache/apk/*
rsync定时服务crontabs
* * * * * rsync -avz --delete rsync://[email protected]:10873/data/ /backup/
=============================================================================
前提:准备好主节点和从节点的公钥和私钥(配置免密登录)
主节点
docker-compose.yaml
volumes:
Cadence_CIS:
services:
rsync-server:
image: apnar/rsync-server
container_name: rsync-server
ports:
- "10022:22"
- "11873:873"
restart: always
environment:
#允许访问的客户端网段
- ALLOW=0.0.0.0/24
volumes:
- ./SSH/authorized_keys:/root/.ssh/authorized_keys
- Cadence_CIS:/data
从节点
docker-cmpose.yaml:
version: '1.0'
volumes:
Cadence_CIS:
services:
rsync-client:
build:
dockerfile: ./DockerFile
container_name: rsync-client
restart: always
volumes:
- ./rsync/.ssh/:/root/.ssh/
- Cadence_CIS-node:/backup
Dockerfile
# https://hub.docker.com/_/alpine
ARG alpine_ver=3.17
FROM alpine:${alpine_ver}
ARG build_rev=2
# Install Rsync and SSH.
RUN apk update \
&& apk add --no-cache \
rsync \
openssh-client-default \
sshpass \
&& rm -rf /var/cache/apk/*
RUN mkdir /docker-entrypoint-init.d
COPY ./rsync/.ssh/ /root/.ssh/
COPY ./rsync/docker-entrypoint /docker-entrypoint-init.d
RUN chmod 744 /docker-entrypoint-init.d/init.sh
ENTRYPOINT /docker-ent
./rsync/docker-entrypoint目录下编写docker启动参数:
#!/bin/sh
set -ex
#修改相关文件权限
echo "edit permission"
chmod 700 /root/.ssh
chmod 600 /root/.ssh/id_rsa
echo "end"
#打印日志
function log() {
echo -e "`date -d @$$((\`date +%s\`+3600*8)) '+%Y-%m-%d %H:%M:%S'` $$@"
}
function backup() {
log "begin: $1"
#-a 归档,递归方式传输文件,并保持文件属性不变
#-v 详细模式输出
#-z 对备份的文件传输时压缩处理
#-- delete 删除备份源没有而目标位置有的文件
rsync -avz --delete -e "ssh -i /root/.ssh/id_rsa -p 10022" $2:/data/ /$1/
log "end: $1"
}
while true
do
backup "backup" 10.3.0.80
#休眠时间10分钟
sleep 600
done
.ssh下config配置文件:
# 去掉对主机的验证检查
StrictHostKeyChecking no
UserKnownHostsFile /dev/null