所谓的双机热备就是保证两个数据库的状态同步。其中一个数据库的操作会自动同步到另外一个数据库中去,保证两个数据库的数据一致。
大概介绍一下数据库是如何实现双机热备的。
首先先说说主从同步概念,就是数据库读操作都放在主数据库上,一旦数据有变化,则从数据库将主数据库的数据变化同步过来,保证从数据库的数据与主数据库的数据一致。
看下图
主数据库开启binlog记录数据库的数据变化情况,从数据库开启一条I/O thread不断的去读取主树据库的binlog,然后交由另一条SQL thread去执行相应的sql,将数据变化同步过来。
因此主从同步要配置的内容就是:
以上四步完成了主从同步配置,而双机互备就是两台已经做主从同步的数据库角色调换再做一次主从同步即可。
新建两个mysql容器
主服务器 mysqltest1
docker run --name mysqltest1 -v /data/test1/my.cnf:/etc/mysql/my.cnf -v /data/test1/mysql/:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d 192.168.168.98:5000/mysql
从服务器 mysqltest2
docker run --name mysqltest2 -v /data/test2/my.cnf:/etc/mysql/my.cnf -v /data/test2/mysql/:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 -d 192.168.168.98:5000/mysql
主服务器 mysqltest1 开启binlog。在配置文件中添加如下配置。
[mysqld]
server-id = 1
log_bin = /var/lib/mysql/mysql-bin.log
主服务器 mysqltest1 上创建一个专门用于主从同步的帐号添加同步数据的权限。
Create user 'rep'@'%' identified by '123456' require ssl;
grant replication slave on *.* to 'rep'@'%' identified by '123456';
flush privileges;
查看主服务器 mysqltest1 的binlog位置,后面配置从服务器要用到。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 840 | | | |
+------------------+----------+--------------+------------------+-------------------+
登录从服务器 mysqltest2 配置同步参数。
change master to master_host="10.18.139.81", master_port=3307, master_user="rep", master_password="123456", master_log_file="mysql-bin.000004", master_log_pos=840;
各项参数解释如下
change master to
master_host="10.18.139.81:3307", ---->主服务器的地址
master_user="rep", ---->主服务器的帐号,用刚刚创建用于同步的帐号
master_password="123456", ---->主服务器的帐号对应的密码
master_log_file="mysql-bin.000004", ----->主服务器中通过show master获取的binlog文件
master_log_pos="840"; ----->主服务器中通过show master获取的log文件位置
最后,启动从服务器 mysqltest2的同步进程。
start slave;
检查进程启动的状态。
show slave status \G
查看这两项均为Yes,则启动成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上完成主从备份,也就是从服务器可以备份主服务器的数据。
接下来将两台服务器的角色调换一下,mysqltest2 作为主服务器,mysqltest1作为从服务器重新配置一遍,即可完成两个数据库相互备份。
mysqltest2开启binlog,在my.cnf中添加如下配置。
log_bin = /var/lib/mysql/mysql-bin.log
mysqltest2中创建用于备份数据的账户。
Create user 'rep'@'%' identified by '123456';
grant replication slave on *.* to 'rep'@'%' identified by '123456';
flush privileges;
查看 mysqltest2 的binlog位置。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 824 | | | |
+------------------+----------+--------------+------------------+-------------------+
在mysqltest1中添加同步的相关配置。
change master to master_host="10.18.139.81", master_port=3308, master_user="rep", master_password="123456", master_log_file="mysql-bin.000004", master_log_pos=824;
启动主从同步进程。
start slave;
至此,主从热备的配置完成。