器 | Mysql基于GTID的主主备份实践


主题使用方法:https://github.com/xitu/juejin-markdown-themes

theme: juejin

highlight: github

一、引言

此教程简要指导针对Mysql数据库的基于GTID的双主备份。

二、步骤

0.环境准备
  • 两台Centos系统的服务器,服务器分配在同一网段,并保证相互网络畅通

    -server-a ip : 192.168.1.220

    -server-b ip : 192.168.1.221

  • 服务器预先安装好DockerDocker-Compose,pull Mysql:8.0镜像

  • Navicat for mysql 执行数据库命令

1.设置Mysql配置文件

新建mysql配置文件my.cnf,详细配置省去,只说明主从备份相关配置。

1.1设置server-a的配置文件

与主主备份相关的配置


``` [mysqld]

为服务器分配id,可以自定义,不区分大小,起标识作用。不同数据库节点分配不同的id

server_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=true

gtid_mode=ON

该选项让从库写入哪些来自于主库的更新,并把这些更新写入bin-log文件,一台服务器即做主库又做从库必须开启

log-slave-updates=true ```

一些定制化的配置


针对主服务器

忽略不同步主从的数据库

```

一般设置 sys,performaceschema,infomationschema,mysql

binlog-ignore-db= ```

允许同步的数据库

```

一般设置成备份的生产数据的数据库

binlog-do-db= ```

针对从服务器

忽略不同步主从的数据库

```

一般设置 sys,performaceschema,infomationschema,mysql

replicate-ignore-db= ```

允许同步的数据

```

一般设置成备份的生产数据的数据库

replicate-do-db= ```

因为我们配置的是双主服务器,每台服务器既要作为主又要作为从。所以以上针对主,从服务器的个性化配置在两台数据库都要按具体业务需求进行配置。

另,以上4个定制化参数可重复设置,如下图

replicate-ignore-db=sys replicate-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=mysqlnativepassword --character-set-server=utf8mb4 --collation-server=utf8mb4unicodeci --default-time-zone='+8:00' restart: always volumes: #持久化数据库,注意路径 - ./data/db:/var/lib/mysql #替换数据库配置文件,注意路径 - ./my.conf:/etc/mysql/conf.d/mysql.cnf environment: MYSQLROOTPASSWORD: containername: mysqlservice

```

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 | BinlogDoDB | BinlogIgnoreDB | ExecutedGtidSet | +------------------+----------+--------------+------------------+-------------------+ | 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,配置同步信息会用到FilePostion

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_filemaster_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默认启用了cachingsha2password authentication plugin,通过mysql官方文档介绍可以在CHANGE MASTER TO添加GET_MASTER_PUBLIC_KEY=1参数来解决这个问题。

4.4 启动同步和查看同步状态

在两个数据库实例中启动同步

start slave;

表示启动从库的两个线程:

  1. I/O线程,表示线程会连接远程Master的mysql,并把它的bin-log拷贝到本机的中继日志relay-log中。
  2. sql线程,表示该线程会读取本机中继日志中的数据,并把这些数据恢复到本机自己的mysql表中。

这样Master的数据就会同步到从库的数据库中。

查看同步状态

show slave status;

显示以下状态则正常

Slave_IO_Running: Yes Slave_SQL_Running: Yes

至此,配置同步信息,启动同步完成。修改任意数据库表结构或表数据,会同步更新到另一个数据库中。

三、扩展

主主备份的设置过程已经清楚了,那么Mysql数据库是如何完成备份过程的?如何解决主从备份过程中同步有延迟问题呢?主从同步过程中出现行数据冲突如何处理?先留给同志们思考思考。接下来会有其它文章进行一一阐述。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值