一、概述
1. 数据库主从概念、优点、用途
主从数据库是什么意思呢,主是主库的意思,从是从库的意思。数据库主库对外提供读写的操作,从库对外提供读的操作。
数据库为什么需要主从架构呢?
高可用,实时灾备,用于故障切换。比如主库挂了,可以切从库。读写分离,提供查询服务,减少主库压力,提升性能备份数据,避免影响业务。
2. 数据库主从复制原理
主从复制原理,简言之,分三步曲进行:
①主数据库有个 binlog 二进制文件,记录了所有增删改 SQL 语句;
②(binlog线程)从数据库把主数据库的binlog文件的 SQL 语句复制到自己的中继日志relaylog;
③(io线程)从数据库的relaylog重做日志文件,再执行一次这些sql语句。
(sql执行线程)详细的主从复制过程如图:
二、安装mysql数据库
在主从服务器上均需要完成以下工作:
1.创建本地工作目录: /usr/rdc/mysql-8.0.23 以及 其下的 文件夹 conf、logs、data、binlogs;并给工作目录授权
cd /usr/rdc
chmod 777 mysql-8.0.23
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
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两个字段的值,配置从机时需要。
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
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 的报错信息进行排查。
上图中报错信息表示集群中的服务器ID重复,使用使用下列命令分别在主从机上查看server_id
show variables like 'server_id';
说明从机配置文件中的server-id未生效。
可以通过以下两种方式修复:
①将my.cnf文件中的server-id 改成 server_id,重启mysql容器;
②在从机mysql控制台执行如下命令:
stop slave;
set global server_id = 2;
start slave;
执行完成后再查看从机状态,服务正常了。