一、引言来
此教程简要领导针对Mysql
数据库的基于GTID
的双主备份。
二、步骤来
0.环境筹备
- 两台Centos零碎的服务器,服务器调配在同一网段,并保障互相网络畅通
-server-a ip : 192.168.1.220
-server-b ip : 192.168.1.221
- 服务器事后装置好
Docker
,Docker-Compose
,pullMysql:8.0
镜像 - Navicat for mysql 执行数据库命令
1.设置Mysql配置文件
新建mysql配置文件my.cnf
,具体配置省去,只阐明主从备份相干配置。
1.1设置server-a
的配置文件
与主主备份相干的配置
[mysqld]#为服务器调配id,能够自定义,不辨别大小,起标识作用。不同数据库节点调配不同的idserver_id=1# 关上Mysql 日志,日志格局为二进制log-bin=mysql-bin# 可选项Mixed,Statement,Row,默认格局是 Statement,mixed混合Satement,ROW两种模式binlog_format=mixed#当启用时,服务器通过只容许执行能够应用GTID平安地记录的语句来强制GTID一致性。enforce-gtid-consistency=true#启用基于GTID的复制,启用之前必须保障enforce-gtid-consistency=truegtid_mode=ON#该选项让从库写入哪些来自于主库的更新,并把这些更新写入bin-log文件,一台服务器即做主库又做从库必须开启log-slave-updates=true
一些定制化的配置
针对主服务器
疏忽不同步主从的数据库
#个别设置 sys,performace_schema,infomation_schema,mysqlbinlog-ignore-db=<YOUR-DB-NAME>
容许同步的数据库
#个别设置成备份的生产数据的数据库binlog-do-db=<YOUR-DB-NAME>
针对从服务器
疏忽不同步主从的数据库
#个别设置 sys,performace_schema,infomation_schema,mysqlreplicate-ignore-db=<YOUR-DB-NAME>
容许同步的数据
#个别设置成备份的生产数据的数据库replicate-do-db=<YOUR-DB-NAME>
因为咱们配置的是双主服务器,每台服务器既要作为主又要作为从。所以以上针对主,从服务器的个性化配置在两台数据库都要按具体业务需要进行配置。
另,以上4个定制化参数可反复设置,如下图
replicate-ignore-db=sysreplicate-ignore-db=mysql
1.2 设置server-b
配置
区别于server-a
的配置,改变以下配置即可,其余定制化配置按需自定义
#server_id 必须举世无双server_id=2
2.编辑docker-compose.yml
两个服务器配置雷同内容的docker-compoe.yml文件
version: '3.7'services: #mysql service mysql: image: mysql:8.0 ports: - "3306:3306" command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-time-zone='+8:00' restart: always volumes: #长久化数据库,留神门路 - ./data/db:/var/lib/mysql #替换数据库配置文件,留神门路 - ./my.conf:/etc/mysql/conf.d/mysql.cnf environment: MYSQL_ROOT_PASSWORD: <YOUR_PAASWORD> container_name: mysql_service
3.docker 开启数据库容器
每个服务器针对数据库的docker-compose
目录如下(供参考):
-mysql_replicate
docker-compose.yml
my.conf
-data
-db
启动数据库服务
docker-compose up -d
确保数据库服务启动胜利。
4.配置同步信息并启动同步
4.1 查看两台服务器Mysql状态
MySQL [(none)]> show master status;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000014 | 81 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)
File
示意以后正在写入的binlog文件
Postion
示意以后正在写入的地位
Binlog_Do_DB
示意只记录指定数据库的二进制文件
Binlog_Ignore_DB
示意不记录指定数据库的二进制文件
Executed_Gtid_Set
这是5.7mysql库引入了新的表gtid_executed,会记录以后执行的GTID
如果未开启GTID
,配置同步信息会用到File
和Postion
4.2创立Replication用户
创立针对限定host的Slave登录用账户和明码,并刷新权限
针对server-a,其ip为192.168.8.220
create user 'repl'@'192.168.1.221' identified by 'vo7kphndxlzfr6u3';grant replication slave on *.* to 'repl'@'192.168.1.221';flush privileges;
针对server-b,其ip为192.168.8.221
create user 'repl'@'192.168.1.220' identified by 'vo7kphndxlzfr6u3';grant replication slave on *.* to 'repl'@'192.168.1.220';flush privileges;
4.3配置同步信息
使数据库实例和Master实例关联起来
针对server-a,其ip为192.168.8.220
change master to master_host='192.168.1.221', master_port=3306, master_user='repl', master_password='vo7kphndxlzfr6u3', MASTER_AUTO_POSITION=1, GET_MASTER_PUBLIC_KEY=1;
针对server-b,其ip为192.168.8.221
change master to master_host='192.168.1.220', master_port=3306, master_user='repl', master_password='vo7kphndxlzfr6u3', MASTER_AUTO_POSITION=1, GET_MASTER_PUBLIC_KEY=1;
MASTER_AUTO_POSITION
主动获取Master 的地位,就不要去指定master_log_file
和master_log_pos
。
GET_MASTER_PUBLIC_KEY
很重要,如果不设置此参数,会导致Slave开启后,Slave无奈连贯到Master。谬误见下图
eror connecting to master 'repl@mysql-master:3306' - retry-time: 60 retries: 3, Error_code: MY-002061...
这个是因MySQL 8默认启用了caching_sha2_password authentication plugin,通过mysql官网文档介绍能够在CHANGE MASTER TO
增加GET_MASTER_PUBLIC_KEY=1
参数来解决这个问题。
4.4 启动同步和查看同步状态
在两个数据库实例中启动同步
start slave;
示意启动从库的两个线程:
- I/O线程,示意线程会连贯近程Master的mysql,并把它的bin-log拷贝到本机的中继日志relay-log中。
- sql线程,示意该线程会读取本机中继日志中的数据,并把这些数据恢复到本机本人的mysql表中。
这样Master的数据就会同步到从库的数据库中。
查看同步状态
show slave status;
显示以下状态则失常
Slave_IO_Running: YesSlave_SQL_Running: Yes
至此,配置同步信息,启动同步实现。批改任意数据库表构造或表数据,会同步更新到另一个数据库中。
三、扩大来
主主备份的设置过程曾经分明了,那么Mysql
数据库是如何实现备份过程的?如何解决主从备份过程中同步有提早问题呢?主从同步过程中呈现行数据抵触如何解决?先留给同志们思考思考。接下来会有其它文章进行一一论述。