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

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

功能需求描述

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://user@10.3.0.161: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命令
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用以下的 docker-compose.yml 文件部署 canal 同步 rabbitmq: ``` version: '3' services: canal: image: canal/canal-server:v1.1.4 ports: - "11111:11111" environment: - canal.auto.scan=false - canal.instance.master.address=127.0.0.1:3306 - canal.instance.dbUsername=canal - canal.instance.dbPassword=canal - canal.instance.connectionCharset=UTF-8 - canal.rabbitmq.host=rabbitmq - canal.rabbitmq.port=5672 - canal.rabbitmq.username=guest - canal.rabbitmq.password=guest - canal.rabbitmq.virtualHost=/ - canal.rabbitmq.exchangeName=canal.exchange - canal.rabbitmq.queueName=canal.queue - canal.rabbitmq.routingKey=canal.routing.key depends_on: - rabbitmq networks: - canal-net rabbitmq: image: rabbitmq:3.8.9-management ports: - "5672:5672" - "15672:15672" environment: - RABBITMQ_DEFAULT_USER=guest - RABBITMQ_DEFAULT_PASS=guest networks: - canal-net networks: canal-net: ``` 在该文件中,定义了两个服务 `canal` 和 `rabbitmq`。其中,`canal` 服务使用了 `canal-server` 镜像,暴露了 11111 端口,设置了一系列环境变量,包括连接 MySQL 数据库的相关信息和连接 RabbitMQ 的相关信息。`rabbitmq` 服务使用了 `rabbitmq:3.8.9-management` 镜像,暴露了 5672 和 15672 端口,设置了默认的用户名和密码。 需要注意的是,`canal` 服务依赖于 `rabbitmq` 服务,所以需要在 `canal` 服务的 `depends_on` 中添加 `rabbitmq`。 最后,在文件最后定义了一个网络 `canal-net`,将 `canal` 和 `rabbitmq` 服务加入到该网络中,以便它们之间可以互相访问。 在部署时,只需要在包含该文件的目录下运行以下命令即可启动服务: ``` docker-compose up -d ``` 其中,`-d` 参数表示在后台运行服务

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值