- vừa được xem lúc

Bạn đã backup Database trên production chưa ?

0 0 26

Người đăng: Nguyễn Văn Quy

Theo Viblo Asia

I. Lời mở đầu

1. Tại sao cần phải backup Database ?

Database hay cơ sở dữ liệu là những thông tin vô cùng quan trọng nó có thể là chữ viết, con số, kí hiệu, hình ảnh, âm thanh,… Cụ thể hơn trong từng lĩnh vực dữ liệu sử dụng và được khai thác có thể khác nhau. Ví dụ một trang web như Viblo, các dữ liệu Database có thể là dữ liệu về người dùng, bài viết, hoạt động người dùng,... Một trang web bán hàng thì lại khác, sẽ có thêm thông tin khách hàng, thông tin sản phẩm, chi tiết đơn hàng, ... Trong một ngày đẹp trời, tự dưng dữ liệu của bạn bị bốc hơi do lỗi server, code lỗi hay thậm chí là xóa nhầm thì đó đúng là một điều tồi tệ. Chính vì vậy Database cần được bảo mật, và backup thường xuyên để ta có thể sao lưu bất kỳ lúc nào.

2. Bạn có backup Database trên production và đang thực hiện như thế nào ?

  • Có rất nhiều cách backup Database trên production, tuy nhiên việc backup Database cũng sẽ có chi phí và độ phức tạp khác nhau:

II. Tự động backup Database hằng ngày đơn giản (Ứng dụng chạy docker)

Nhằm giải quyết việc backup Database cho chính nhu cầu của bản thân, mình đã viết một Image khá hữu ích để áp dụng backup nhanh chóng trên production. Nếu bạn mới đang tìm hiểu về docker thì có thể tham khảo series Cùng nhau học docker

Đầu tiên để sử dụng bạn phải pull image về máy : docker push vanquynguyen/mysql-backup

_@.com:~$ docker pull vanquynguyen/mysql-backup
Using default tag: latest
latest: Pulling from vanquynguyen/mysql-backup
Digest: sha256:c587b913db06226440bcfe673533af6d21f0c448abf8ae85f24993a6837d0b10
Status: Image is up to date for vanquynguyen/mysql-backup:latest
docker.io/vanquynguyen/mysql-backup:latest

Sau khi pull xong image backup sẽ được tải về máy của bạn

_@.com:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
vanquynguyen/mysql-backup latest 3979ec7bf361 5 days ago 39.8MB 
  • Backup cho ứng dụng sử dụng docker: Nếu bạn đang chạy ứng dụng của mình bằng docker thì bạn hãy kiểm tra xem container đang chạy Database (Mysql) của hệ thống có hoạt động không nhé.
_@.com:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f520dc5c27c1 framgia/laravel-nginx "nginx" 6 hours ago Up 8 minutes 443/tcp, 0.0.0.0:8000->80/tcp v_nginx
72a08ac89c73 framgia/laravel-php-fpm "docker-php-entrypoi…" 6 hours ago Up 8 minutes 9000/tcp v_php-fpm
646b5e1a7ccc mysql:5.7 "docker-entrypoint.s…" 6 hours ago Up 8 minutes 3306/tcp, 33060/tcp v_mysql
0f77df466355 sunasteriskrnd/php-workspace:7.4 "php-fpm-entrypoint …" 6 hours ago Up 8 minutes 9000/tcp v_workspace
bfaddec57d21 redis "docker-entrypoint.s…" 6 hours ago Up 8 minutes 6379/tcp v_redis 
  • Bạn hãy kiểm tra docker network của v_mysql chứa Database của bạn
_@.com:~$ docker inspect v_mysql
...
"Networks": { "v_default": { "IPAMConfig": null, "Links": null, "Aliases": [ "mysql", "646b5e1a7ccc" ], "NetworkID": "b46c18c4dfe41ee4ecc90efe4319346498f4aa2c55bd836725fb6f2184e7df58", "EndpointID": "baa09411fb4b292ae4ee486d64559bb5be36adbb468d9585ca3f2dc1617c5b38", "Gateway": "172.18.0.1", "IPAddress": "172.18.0.4", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:12:00:04", "DriverOpts": null }
}

Hãy focus vào phần networks để biết bạn đang sử dụng network nào cho container v_mysql, ở đây thì mình đang dùng network có tên là v_default. Tuy nhiên, bạn cũng có thể tạo thêm một network mới và thêm container v_mysql vào network đó. Tham khảo Docker network

  • Tiếp theo là bước cuối cùng bạn run image mới tải về thành container và uống trà hưởng thụ thành quả :v
docker run --env HOSTNAME={MYSQL_HOST} \ --env ROOT_DATABASE={MYSQL_DATABASE} \ --env MYSQL_USERNAME={MYSQL_USERNAME} \ --env MYSQL_PASSWORD={MYSQL_PASSWORD} \ --network {NETWORK} \ --volume {VOLUME} \ --name {CONTAINER_NAME} \ -d vanquynguyen/mysql-backup
  • Bạn hãy kiểm tra lại xem container backup đã hoạt động chưa
_@.com:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abdcb29afa66 vanquynguyen/mysql-backup "crond -l2 -f" 4 seconds ago Up 3 seconds v-backup_mysql
f520dc5c27c1 framgia/laravel-nginx "nginx" 6 hours ago Up 34 minutes 443/tcp, 0.0.0.0:8000->80/tcp v_nginx
72a08ac89c73 framgia/laravel-php-fpm "docker-php-entrypoi…" 6 hours ago Up 34 minutes 9000/tcp v_php-fpm
646b5e1a7ccc mysql:5.7 "docker-entrypoint.s…" 6 hours ago Up 34 minutes 3306/tcp, 33060/tcp v_mysql
0f77df466355 sunasteriskrnd/php-workspace:7.4 "php-fpm-entrypoint …" 6 hours ago Up 34 minutes 9000/tcp v_workspace
bfaddec57d21 redis "docker-entrypoint.s…" 6 hours ago Up 34 minutes 6379/tcp v_redis 
  • Kiểm tra xem container đã tạo backup database chưa
_@.com:~$ docker exec -it v-backup_mysql sh
/ # ls -la
total 64
drwxr-xr-x 1 root root 4096 Feb 9 09:54 .
drwxr-xr-x 1 root root 4096 Feb 9 09:54 ..
-rwxr-xr-x 1 root root 0 Feb 9 09:54 .dockerenv
drwxr-xr-x 2 root root 4096 Sep 11 2018 bin
drwxr-xr-x 3 root root 4096 Feb 9 09:58 data
drwxr-xr-x 5 root root 340 Feb 9 09:54 dev
drwxr-xr-x 1 root root 4096 Feb 9 09:54 etc
drwxr-xr-x 2 root root 4096 Sep 11 2018 home
drwxr-xr-x 1 root root 4096 Sep 11 2018 lib
drwxr-xr-x 5 root root 4096 Sep 11 2018 media
drwxr-xr-x 2 root root 4096 Sep 11 2018 mnt
dr-xr-xr-x 274 root root 0 Feb 9 09:54 proc
drwx------ 1 root root 4096 Feb 9 09:58 root
drwxr-xr-x 1 root root 4096 Feb 9 09:54 run
drwxr-xr-x 2 root root 4096 Sep 11 2018 sbin
drwxr-xr-x 2 root root 4096 Sep 11 2018 srv
dr-xr-xr-x 13 root root 0 Feb 9 09:54 sys
drwxrwxrwt 2 root root 4096 Sep 11 2018 tmp
drwxr-xr-x 1 root root 4096 Sep 11 2018 usr
drwxr-xr-x 1 root root 4096 Sep 11 2018 var 

Mình đang để Database backup sẽ được lưu trong namespace là /data. Bạn có thể đổi namespace trước khi run container với

ENV BACKUP_DIR=/data

Và đây là Database được backup

/ # cd data
/data # ls -la
total 12
drwxr-xr-x 3 root root 4096 Feb 9 09:58 .
drwxr-xr-x 1 root root 4096 Feb 9 09:54 ..
drwxr-xr-x 2 root root 4096 Feb 9 10:02 2021-02-09-daily
/data # cd 2021-02-09-daily
/data/2021-02-09-daily # ls -la
total 1940
drwxr-xr-x 2 root root 4096 Feb 9 10:02 .
drwxr-xr-x 3 root root 4096 Feb 9 09:58 ..
-rw-r--r-- 1 root root 849727 Feb 9 10:00 mysql.sql.gz
-rw-r--r-- 1 root root 1126322 Feb 9 10:00 v-quy.mysql.gz 

Done! Vậy là Database đã được tự backup hằng ngày. Hiện tại mình đang để là 4h mỗi ngày Database sẽ được tự động tạo backup. Bạn cũng có thể sửa lại thông số này và run lại container

ENV CRON_EXPRESSION="0 4 * * *"

Đầy đủ source code publish tại :

III. Tạm kết

Hy vọng image nho nhỏ của mình sẽ giúp các bạn giải quyết được bài toán backup Database cho các bạn. Rất mong được sự góp ý và contribution từ tất cả mọi người.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 374

- vừa được xem lúc

Phần 1: Giới thiệu về Kubernetes

Kubernetes là gì. Trang chủ: https://kubernetes.io/. Ai cần Kubernetes.

0 0 80

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 1- Lịch sử)

1. Vì sao nên sử dụng. . .

0 0 89

- vừa được xem lúc

Docker - những kiến thức cơ bản phần 1

Giới thiệu. Nếu bạn đang làm ở một công ty công nghệ thông tin, chắc rằng bạn đã được nghe nói về Docker.

0 0 65

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 2 - Dockerfile)

1. Mở đầu.

0 0 53

- vừa được xem lúc

Docker: Chưa biết gì đến biết dùng (Phần 3: Docker-compose)

1. Mở đầu. . .

0 0 106