Viblo Learning
+12

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

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

[email protected]:~$ 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

[email protected]:~$ 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é.
[email protected]:~$ 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
[email protected]:~$ 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
[email protected]:~$ 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
[email protected]:~$ 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.


All Rights Reserved