基于Docker的数据库和文件同步的服务部署

基于Docker的数据库和文件同步的服务部署

目录

  • 基于Docker的数据库和文件同步的服务部署
    • 功能需求描述
    • 准备
    • 同步方案
      • 一、数据库同步
          • 1、如何同步。
          • 2、主从数据库功能划分
      • 二、文件同步方案一( rsyncd方式 建议)
          • 1、如何同步
          • 2、异地实现文件共享
          • 示例代码
      • 相关启动命令解释如下
            • 分别在两个节点上执行docker-compose命令
      • 文件同步方案二(sshd方式)
            • 分别在两个节点上执行docker-compose命令

功能需求描述

1、使用的数据库为postgresql,由于需要满足公司不同地方办公室的数据库使用,以及数据库备份等需求,需要数据库进行异地部署及数据及时同步。。

2、系统存在文件管理服务,系统需要满足文件共享功能,但由于防火墙规则限制,异地办公室不能访问主服务器所在地的网络共享文件,所以需要进行远程传输。

准备

docker
DockerFile docker-compose.yml
SSH公钥和私钥配置免密登录
客户主机和服务器

IP 角色
..*.80 主节点(server)
..*.161 从节点(client)

同步方案

一、数据库同步

1、如何同步。

采用pgsql主从备份的方式具体参考postgresql官网
postgresql数据库官方提供了后备服务器的相关方法,其中流复制(流复制,就是从服务器通过tcp流从主服务器中同步相应的数据。这样当主服务器数据丢失时从服务器中仍有备份。后备服务器连接到主服务器,主服务器则在 WAL 记录产生时即将它们以流式传送给后备服务器而不必等到 WAL 文件被填充。)机制满足本次需求。
传输方式及安全性:流复制分为同步流复制和异步流复制。postgresql默认情况下流复制是异步的,在这种情况下主服务器上提交一个事务与该变化在后备服务器上变得可见之间存在短暂的延迟。在后备服务器的能力足以跟得上负载的前提下延迟通常低于一秒,如果主服务器崩溃,则某些已被提交的事务可能还没有被复制到后备服务器,这会导致数据丢失。数据的丢失量与故障转移时的复制延迟成比例。还有同步流复制,同步复制能够保证一个事务的所有修改都能被传送到一台或者多台同步后备服务器。这里先采用默认异步流复制的方式

2、主从数据库功能划分

主库拥有三个账号,系统账号、只读账号(用以OrCAD用户进行数据源连接)和复制角色(用以从库对主库进行备份),主库负责物料信息系统的增删改查功能。

从库设计有一个账号,由于将从库系统设置为热备份,所以本身的系统账号只有查询权限。

二、文件同步方案一( rsyncd方式 建议)

1、如何同步

采用rsync实现文件的远程定时同步(rsync是linux系统下的数据镜像备份工具)。

2、异地实现文件共享

采用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命令

=============================================================================

文件同步方案二(sshd方式)

前提:准备好主节点和从节点的公钥和私钥(配置免密登录)
主节点
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
分别在两个节点上执行docker-compose命令

你可能感兴趣的:(数据库,docker,服务器)