搭建高性能数据库集群之一:主从复制

一、概述

1. 数据库主从概念、优点、用途
  主从数据库是什么意思呢,主是主库的意思,从是从库的意思。数据库主库对外提供读写的操作,从库对外提供读的操作。
搭建高性能数据库集群之一:主从复制_第1张图片
数据库为什么需要主从架构呢?
  高可用,实时灾备,用于故障切换。比如主库挂了,可以切从库。读写分离,提供查询服务,减少主库压力,提升性能备份数据,避免影响业务。
  
2. 数据库主从复制原理
主从复制原理,简言之,分三步曲进行:
①主数据库有个 binlog 二进制文件,记录了所有增删改 SQL 语句;
②(binlog线程)从数据库把主数据库的binlog文件的 SQL 语句复制到自己的中继日志relaylog;
③(io线程)从数据库的relaylog重做日志文件,再执行一次这些sql语句。
(sql执行线程)详细的主从复制过程如图:
搭建高性能数据库集群之一:主从复制_第2张图片

二、安装mysql数据库

在主从服务器上均需要完成以下工作:

1.创建本地工作目录: /usr/rdc/mysql-8.0.23 以及 其下的 文件夹 conf、logs、data、binlogs;并给工作目录授权

cd /usr/rdc
chmod 777 mysql-8.0.23

搭建高性能数据库集群之一:主从复制_第3张图片

2.安装mysql数据库(基于docker)

docker search mysql
docker pull mysql:8.0.23

3.获取mysql配置文件模板

#将/etc/my.cnf文件拷贝到/usr/rdc/mysql-8.0.23/conf/
cp /etc/my.cnf /usr/rdc/mysql-8.0.23/conf

二、配置master库

1.在主服务器中编辑my.cnf文件

vi /usr/rdc/mysql-8.0.23/conf/my.cnf

2.配置文件的[mysqld]节点中添加以下内容

#服务器ID
server-id=1

#启用二进制日志
log-bin=/usr/rdc/mysql-8.0.23/master-bin
#设置logbin格式:STATEMENT / ROW / MIXED
binlog_format=ROW

#设置忽略同步的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql

#设置需要同步的数据库
binlog-do-db=pmonitor-cloud
binlog-do-db=ucoal

保存文件后授权

chmod 777 my.cnf

3.创建容器(映射数据卷)

docker run -p 3306:3306 --name mysql -v /usr/rdc/mysql-8.0.23/conf:/etc/mysql/conf.d -v /usr/rdc/mysql-8.0.23/logs:/var/log -v /usr/rdc/mysql-8.0.23/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.23

4.进入容器访问mysql

#查看容器id
docker ps

#进入容器
docker exec -it 容器id /bin/bash

#访问mysql数据库
mysql -uroot -p

搭建高性能数据库集群之一:主从复制_第4张图片

5.创建从机访问主库使用的账号

#创建账号
create user 'slave1'@'%' identified by 'slave1';
#授权
grant replication slave on *.* to 'slave1'@'%';
#更新用户密码方案(一定要执行否则无法远程访问)
alter user 'slave1'@'%' identified with mysql_native_password by 'slave1';

#刷新
flush privileges;

6.获取日志文件名和偏移量
执行一下命令:

show master status;

记住file 和 position两个字段的值,配置从机时需要。
搭建高性能数据库集群之一:主从复制_第5张图片

7.重启容器

docker restart 容器id或名称

在这里插入图片描述

三、配置slave库

1.在从服务器中编辑my.cnf文件

vi /usr/rdc/mysql-8.0.23/conf/my.cnf

2.配置文件的[mysqld]节点中添加以下内容

#服务器ID
server-id=2

#启用中继日志
relay-log=/usr/rdc/mysql-8.0.23/binlogs/slave-relay
relay-log-index=/usr/rdc/mysql-8.0.23/binlogs/slave-relay-log.index
#设置日志最长保存时间
expire_logs_days=30

#设置允许复制的库
replicate-do-db=pmonitor-cloud
replicate-do-db=ucoal

#设置忽略复制的库
replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema


#1代表slave写进自己的二进制
log_slave_updates=1

保存文件后授权

chmod 777 my.cnf

3.创建容器(映射数据卷)

docker run -p 3306:3306 --name mysql -v /usr/rdc/mysql-8.0.23/conf:/etc/mysql/conf.d -v /usr/rdc/mysql-8.0.23/logs:/var/log -v /usr/rdc/mysql-8.0.23/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.23

4.进入容器访问mysql

#查看容器id
docker ps

#进入容器
docker exec -it 容器id /bin/bash

#访问mysql数据库
mysql -uroot -p

搭建高性能数据库集群之一:主从复制_第6张图片
5.主库参数关联设置

change master to master_host='192.168.0.201', master_user='slave1', master_password='slave1', master_log_file='binlog.000002', master_log_pos=3151, get_master_public_key=1;

6.重启容器

docker restart 容器id或名称

在这里插入图片描述

7.查看从机状态

show slave status \G;

使用上述命令查看状态,Slave_IO_Running、Slave_SQL_Running两个参数均为YES时,表示集群状态正常。
否则,需要根据 Last_IO_Error 的报错信息进行排查。
搭建高性能数据库集群之一:主从复制_第7张图片
上图中报错信息表示集群中的服务器ID重复,使用使用下列命令分别在主从机上查看server_id

show variables like 'server_id';

搭建高性能数据库集群之一:主从复制_第8张图片
搭建高性能数据库集群之一:主从复制_第9张图片

说明从机配置文件中的server-id未生效。
可以通过以下两种方式修复:
①将my.cnf文件中的server-id 改成 server_id,重启mysql容器;
②在从机mysql控制台执行如下命令:

stop slave;
set global server_id = 2;
start slave;

执行完成后再查看从机状态,服务正常了。
搭建高性能数据库集群之一:主从复制_第10张图片

你可能感兴趣的:(docker,mysql,linux,数据库,mysql,java)