Cheapest and most simple way is implementing a site wide maintenance system that closes site for XX minutes during backup. 20GB database should only take between 4-8 minutes to backup when done optimally, so maintenance time can be 10 minutes at a time. Most my private clients opt for this approach otherwise you may be throwing $1000s of dollars at the solution to keep that extra 10 minutes of online client facing time intact. 10 minutes is a small price to pay

Why not use Percona XtraBackup? Its a Mysql Hot Backup that have incremental backups and full backups without downtimes. I have used it and its perfect for large databases.
The restore is also much faster.

Percona Xtrabackup is nice but it's more all or nothing out of box for ALL databases on server and is a bit more involved if you only want to restore a single database from the backup usually. For single database restores and backups, I prefer mydumper.

Last tests I did with mydumper 0.9 branch vs mysqldump on MariaDB 10.0.23 and percona xtrabackup 2.3.3 for 24 table test innodb only database of 3.1GB size on 1GB OpenVZ server with 4 cpu threads on CentOS 6.7 64bit with Centmin Mod LEMP.

These results are with OpenVZ server with 4 cpu threads and a database with 24 tables and as mydumper is multi-threaded, usually mydumper starts to match xtrabackup backup times closer as the number of cpu threads increases.

@eva2000 you can backup a single database with xtrabackup using the --include command. For example, if you wanted to backup only the centminmod database, you would do: innobackupex --include="^centminmod\." /tmp/ (innodb_file_per_table needs to be enabled). This is a partial backup and restoring it is also a bit more complicated.
You can even restore single tables from a database: Restoring Individual Tables

The whole process is a lot more complicated than using mysqldump or mydumper, but for very larges databases, like 100Gb or more, it totally worth it.