参考于:https://blog.csdn.net/tr1912/article/details/81302648
本文基于docker 构建 主从及双机热备。
主从复制的根本操作就是把从主服务器上所执行过的sql在从机上再执行一遍,只要两个机器的数据库初态(数据库结构,数据,配置)是一样的,那么我们开启主从复制之后就能保证他们一直都是一样的状态。这些都是mysql自己实现的,我们就配置一下就可以了。
首先看下面一张图:
从图中我们可以看出来了,主服务器需要做的事情非常简单的,就只是把执行的sql语句存储到二进制文件binary-log中,而从服务器需要做的事情比较多,而且还得使用两个线程进行整个事件的监听和处理。
我们的主从复制一共分为三步:
1、master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events。
2、slave将master的binary log events拷贝到它的中继日志(relay log)。
3、slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的。
基本原则
由于主从复制的一些特性,为了保证数据一一致,所以这里有些原则需要遵守:
1、每个slave只有一个master
2、每个slave只能有一个唯一的服务器ID
3、每个master可以有多个salve
同步数据(非必须)
我们做主从同步,在最开始的时候,必须保证主从上的数据表的结构和数据都是一样的,所以如果有数据不一样的情况,我们需要进行这一步。
首先执行master的数据dump备份:
mysqldump --all-databases -uroot -p > /tmp/dbdump.db
然后我们在设定的目录下拿到dump备份后,复制到从机上进行还原:
mysql --all-databases -uroot -p < /tmp/dbdump.db
这样就搞定了主机的配置以及数据的同步。
开始准备 docker 环境。(docker 的安装和 使用请自行搜索其它文档)
准备挂载文件。
mkdir docker;cd docker;mkdir data;mkdir config;cd config;
vim my.cnf;
配置文件如下
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
主库:再添加
[mysqld]
log-bin=mysql-bin
server-id=1
说明:
1. log-bin:开启二进制日志,该日志是在事务提交时写日志文件的。默认大小是1G,后面加001,002这样的后缀顺加。
2. server-id,唯一标识主机,mysql主从每个mysql实例配置都不一样就行。这个值默认是0,如果是0,主服务器拒绝任何从服务器的连接。
其他配置(不是必须配置的):
1、binlog-do-db=db_001 #配置需要同步的数据库,可以配置多个,如果没有此配置项则同步全部。
2、binlog-ignore-db=mysql #配置不同步的数据库,可以配置多个。
3、binlog_format = mixed #配置binlog的格式
4、read-only = 0 #配置是否只读 0代表不只读,1代表只读
5、auto-increament-increment = 10 #用于设定双主情况下自增列的ID冲突使用的,主要用来设置自增步长
6、auto-increment-offset = 1 #表示这台服务器的序号,从1开始,不超过auto-increament-increment
从库:my.cnf 再添加如下配置
[mysqld]
server-id=2
skip-slave-start=true
执行下面命令创建容器
docker run -d -p 3306:3306 --restart always --privileged=true --name mysql -e MYSQL_USER="新用户" -e MYSQL_PASSWORD="新创建的用户密码" -e MYSQL_ROOT_PASSWORD="设置的密码" -v /docker/mysql/config/my.cnf:/etc/my.cnf -v /docker/mysql/data:/var/lib/mysql mysql:5.7
参数说明:
–restart always:开机启动
–privileged=true:提升容器内权限
-v /docker/mysql/config/my.cnf:/etc/my.cnf :映射配置文件
-v /docker/mysql/data:/var/lib/mysql:映射数据目录
在两台 机器上 启动(自己测试的话 可以 修改一下端口(-p 3307:3306),再运行一个mysql容器) ;
配置运行:
我们先到主(master)服务器上获取binlog的信息,在mysql的命令界面输入:
show master status;
这里展示的就是我们当前主服务器使用的binlog的文件名,其中position是文件中偏移量,我们之后配置slave需要用到这些信息。
配置从服务器认主:
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='root',
MASTER_PASSWORD='密码',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=419;
注:MASTER_LOG_POS 改为Posutuib 相同值。
启动从服务
最后我们在从服务器的mysql命令中输入:
start slave;
就可以启动我们的从服务器进行同步了。我们可以查看状态:
show slave status\G;
看到图中的两个yes,就表示我们的从服务器已经在完全运行了。
现在我们可以在主服务器的数据库上做一个修改数据看看是否同步到从服务器的数据库上来证明可用性。
我们实现双机热备,原理其实就是做两个机器的互相主从,我们把上述步骤主从对调,然后做一遍就能实现了双机热备了,实现图为:
我们的两个节点互为主从,然后都可以接收读写的操作。
如果只是单点的读的话,我们还需要设置Slave节点为readonly,即slave节点的 my.cnf 设置 read-only=1