实验要求-两台服务器-centos7
数据库服务器
-hostname: node133
-ip:192.168.232.133
备份服务器
-hostname: node134
-ip:192.168.232.134
实验步骤
数据库服务器
docker安装(离线)
下载安装包
https://download.docker.com/linux/static/stable/x86_64/
下载版本docker20.10.6
#解压
tar -zxvf docker-20.10.6.tgz
#cp
cp docker/* /usr/bin
#创建文件夹
mkdir /docker
#编辑
vim /etc/systemd/system/docker.service
#复制以下内容到文件docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --graph=/docker
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
#启动
systemctl start docker
#查看
docker info
使用docker-compose配置文件在docker部署odoo13和postgres12
并挂载postgres的data目录和bin目录
version: '2'
services:
web:
image: odoo:13
depends_on:
- db
ports:
- "8132:8069"
- "8139:8072"
volumes:
- odoo-web-data:/var/lib/odoo
- ./config:/etc/odoo
- ./base_addons:/mnt/base_addons
- ./back-end:/mnt/extra-addons
db:
image: postgres:12
ports:
- "15432:5432"
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=odoo
- POSTGRES_USER=odoo
- PGDATA=/var/lib/postgresql/data
volumes:
- odoo-db-data:/var/lib/postgresql/data
- ./usr/lib/postgresql/12/bin
volumes:
odoo-web-data:
odoo-db-data:
#创建目录(自定义)
mkdir /home/test
#编辑文件 将上面内容复制进来并保存
vim /home/test/docker-compose.yml
#安装docker-compose
参考:https://cloud.tencent.com/developer/article/1924733
#在/home/test/目录下启动docker-compose
cd /home/test
docker-compose up
#查看
docker ps -a
#如果odoo容器或者postgres容器为exited
docker-compose restart
#再次查看 如果容器状态都为up 则成功
docker ps -a
#进入docker
docker exec -it test_db_1 /bin/bash
在docker里面安装rsync
#安装rsync 如果E: Unable to locate package rsync 则先更新 apt-get upate
apt-get install rsync
备份服务器
安装 epel 源 (Extra Packages for Enterprise Linux)
yum -y install epel-release
安装python3.7
#安装python3.7所需依赖
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
#创建目录
mkdir /python
cd /python
#下载python源码包 如果没有wget 就先安装 yum install wget
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz
#解压
tar -zxvf Python-3.7.0.tgz
#进入解压后目录
cd Python-3.7.0
./configure
make&&make install
#如果出现了报错“ModuleNotFound:No module named '_ctypes'”
yum install libffi-devel -y
#然后
make&&make install
#设置软连接
mv /usr/bin/python /usr/bin/python.bak
ln -s /usr/local/bin/python3 /usr/bin/python
#查看
python
#yum 依赖python2.7 安装完python3.7以后 需要在yum相关配置中特别指出使用python2.7
#在第一行后面加上2.7 例如:#! /usr/bin/python2.7
vi /usr/libexec/urlgrabber-ext-down
#同上 追加2.7
vi /usr/bin/yum
安装rsync
yum -y install rsync
安装 pgdg 源
rpm -ivh https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
安装barman
#安装
yum install barman
#使用上面命令安装barman的时候会自动安装下面的模块
python36-argcomplete.x86_64
python36-argh
python36-psycopg2
python36-dateutil
#使用 pip 安装需要的 python 模块。进入 python3 的安装目录,执行命令如下
pip3 install argcomplete -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip3 install argh -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip3 install psycopg2 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip3 install python-dateutil -i https://pypi.tuna.tsinghua.edu.cn/simple/
#如果安装第三个模块报错Error: pg_config executable not found. 使用下面这条命令后再次尝试安装
yum install postgresql-devel*
#如果上面这条命令又报错 Error Summary 将提示的冲突软件包的低版本卸载掉
yum remove ***
python -m pip install -U pip
pip3 install psycopg2-binary -i https://pypi.tuna.tsinghua.edu.cn/simple/
在两台服务器之间配置免密登录
参考:https://blog.csdn.net/LSW_JAVADP/article/details/121757927
继续配置数据库服务器
找到postgres的bin目录并远程复制到备份服务器的指定目录
#使用find命令找到postgres的bin目录
find / -name 'bin'
#把PostgreSQL的bin目录复制到备份服务器的目录 /etc/barman.d/中
scp -r /docker/overlay2/02b3c71f22b767fde9b9f199fe0483590a9fbb42fa049061ff84dc1974556ef2/merged/usr/lib/postgresql/12/bin root@192.168.232.134:/etc/barman.d/
使用Navicat连接上postgres数据库
#以下信息在docker-compose.yml文件中都配置过
主机:192.168.232.133
端口:15432
初始数据库:postgres
用户名:odoo
密码:odoo
在数据库中创建用户barman和streaming_barman,其中barman要是superuser,streaming_barman有复制权限。具体的sql如下
CREATE ROLE barman with LOGIN PASSWORD 'barman123' SUPERUSER;
CREATE ROLE streaming_barman with LOGIN PASSWORD 'streaming_barman123' REPLICATION
数据库的配置文件postgresql.conf应该做如下配置:
listen_addresses = '*'
wal_level = replica
max_wal_senders = 20
archive_mode = off
在 pg_hba.conf 中,添加如下内容,允许用户barman和streaming_barman访问
host all barman 127.0.0.1/32 md5
host all barman 192.168.232.133/32 md5
host all barman 192.168.232.134/32 md5
host replication streaming_barman 127.0.0.1/32 md5
host replication streaming_barman 192.168.232.133/32 md5
host replication streaming_barman 192.168.232.134/32 md5
配置备份服务器
创建barman的日志目录 /var/log/barman
mkdir /var/log/barman
编辑 /etc/barman.conf ,在 “[barman]” 之下修改这些配置项,以设置全局的备份参数
System user
barman_user = barman
Directory of configuration files. Place your sections in separate files with .conf extension
For example place the 'main' server section in /etc/barman.d/main.conf
configuration_files_directory = /etc/barman.d
; Main directory
barman_home = /var/lib/barman
Log location
log_file = /var/log/barman/barman.log
Log level (see logging - Logging facility for Python - Python 3.9.4 documentation)
log_level = INFO
Global retention policy (REDUNDANCY or RECOVERY WINDOW) - default empty
retention_policy = RECOVERY WINDOW OF 4 WEEKS
Number of parallel jobs for backup and recovery via rsync (default 1)
parallel_jobs = 3
Immediate checkpoint for backup command - default false
immediate_checkpoint = true
Enable network compression for data transfers - default false
network_compression = false
Number of retries of data copy during base backup after an error - default 0
basebackup_retry_times = 3
Number of seconds of wait after a failed copy, before retrying - default 30
basebackup_retry_sleep = 30
Minimum number of required backups (redundancy)
minimum_redundancy = 2
参数的含义:
barman_user 运行barman的用户
configuration_files_directory 配置文件所在目录。将您的备份放在扩展名为 .conf 的单独文件中
barman_home barmn 的主目录
log_file barman 日志文件的位置
log_level 日志级别
retention_policy 备份的保留策略。空表示禁用;REDUNDANCY 2 表示保留两份基础备份;RECOVERY WINDOW OF 4 WEEKS 表示保留4星期之内的备份
parallel_jobs 通过 rsync 备份和恢复的并行作业数
immediate_checkpoint 备份命令是否执行立即检查点
network_compression 启用网络压缩以进行数据传输。对于流备份,这个参数设置为false
basebackup_retry_times 在基础备份期间发生错误后重新尝试的次数
basebackup_retry_sleep 复制失败后,重试之前等待的秒数
minimum_redundancy 所需的最小备份数量
配置要备份的数据库的信息,进入 /etc/barman.d ,将 streaming-server.conf-template 复制为 pg.conf ,文件名中的“pg”也是此备份任务的名称
conninfo = host=192.168.232.133 port=15432 user=barman dbname=postgres password=barman123
streaming_conninfo = host=192.168.232.133 port=15432 dbname=postgres user=streaming_barman password=streaming_barman123
backup_method = postgres
streaming_archiver = on
slot_name = barman
path_prefix = "/etc/barman.d/bin"
些参数的含义:
conninfo 基础备份的连接信息。
streaming_conninfo 流归档的连接信息。
backup_method 基础备份的方式。“postgres”表示使用 pg_basebackup 进行备份;rsync 表示使用 rsync 备份。
streaming_archiver 是否启用流归档。on 表示是。
slot_name 复制槽的名称
path_prefix 客户端的postgresql的bin的路径。
使用barman在备份服务器进行备份并恢复
备份
#执行barman的命令,创建名为pg的复制槽
barman receive-wal --create-slot pg
#在后台不间断地从数据库服务端接收wal日志
barman receive-wal pg &
#如果报错ERROR: ArchiverFailure:pg_receivewal not present in $PATH
export PATH=$PATH:/etc/barman.d/bin
#检查备份任务pg的运行状态,如果各项结果均为OK,则表示状态正常
barman check pg
#如果检查结果报错 WAL archive: FAILED (please make sure WAL shipping is setup)
barman switch-xlog --force pg
#基础备份 基础备份文件位于 /var/lib/barman/pg/base 中
barman backup pg
#设置常规的定时备份方案
#设置每10分钟检查一次barman服务的状态,进行一次维护操作
echo "*/10 * * * * barman barman cron" >> /etc/crontab
#设置10天做一次基础备份
echo "* * */10 * * barman barman backup pg" /etc/crontab
恢复
#在数据库服务器上停止数据库
docker-compose stop
#在barman服务器上,执行命令恢复数据库
#首先查看有哪些基础备份
barman list-backup pg
备份列表如下:
[root@node133 ~]# barman list-backup pg
pg 20220228T085824 - Mon Feb 28 00:58:26 2022 - Size: 39.6 MiB - WAL Size: 0 B
加8小时是28号8点58分的备份,恢复到九点
su - barman
#/opt/pg_root如果不存在 可能会执行失败 可以事先创建好 并授权chown -R barman.root /opt/pg_root
barman recover --target-time '2022-02-28 09:00:00' pg 20220228T085824 /opt/pg_root
重新启动PostgreSQL,检查服务是否正常
docker-compose start
在备份服务器上继续接收日志
barman receive-wal pg &