Mysql主从复制

引言

在生产环境中,数据库的查询请求压力较大的时候,通常需要采取数据库主从模式,读写分离的方式来提高数据库查询效率,本文就教大家如何搭建Mysql主从服务器配置

安装两台Mysql服务器

为了模拟生产环境,本文教程采取docker容器的方式安装mysql,搭建Mysql主从服务

docker安装mysql

docker安装教程请参照另一篇博文(内含docker安装mysql容器教程) 物理机安装Centos系统

  1. 拉取镜像
#拉取最新mysql镜像
docker pull mysql
  1. 安装主从Mysql(master和slave)
#为了在物理机里面能够方便的修改mysql配置文件my.cnf,特将容器内my.cnf映射到物理机目录中
#创建目录mysql_01和mysql_02,子级目录都是如下,并提前准备my.cnf文件放置于conf目录内
├── conf
│   └── my.cnf
└── data
#创建Mysql 主(master)服务器容器,命名为mysql_01
docker run -itd --name mysql_01 -p 33061:3306  -v /home/data/docker/mysql_01/data:/var/lib/mysql -v /home/data/docker/mysql_01/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
#在物理机中指定其配置文件,直接使用物理机端口号
docker run -itd --name mysql_write --net=host -v /home/data/docker/mysql_write/data:/var/lib/mysql -v /home/data/docker/mysql_write/conf/my.cnf:/etc/mysql/my.cnf -v /home/data/docker/mysql_write/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

#mysql_01容器内的IP:172.17.0.4
#mysql_01容器内的Mysql服务器端口:3306
#在mysql_01中创建需要同步的数据库am
create database am;

#创建Mysql 从(slave)服务器容器
#Mysql 从服务器(slave)安装方式与master一致,命名为mysql_02
docker run -itd --name mysql_02 -p 33062:3306  -v /home/data/docker/mysql_02/data:/var/lib/mysql -v /home/data/docker/mysql_02/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
#mysql_02容器内的IP:172.17.0.5
#mysql_02容器内的Mysql服务器端口:3306
#在mysql_02中创建需要同步的数据库am
create database am;

进入docker的mysql容器内部

#进入docker容器内部
docker exec -it mysql_01 /bin/bash
#进入容器中的mysql界面:进入容器后,输入以下命令回车,再输入密码,即可登陆进mysql
mysql -u root -p

配置master主服务器

修改master配置文件

编辑my.cnf文件 vim /home/data/docker/mysql_01/conf/my.cnf
添加内容至[mysqld]结点内,如下

#二进制文件名称
log-bin=master-bin
#二进制日志格式,有row、statement、mixed三种格式,row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍,statement指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。mixed指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
binlog-format=ROW  
#要求各个服务器的id必须不一样
server-id=1
#同步的数据库名称(可心设置多个,添加多行 binlog-do-db=db_name)
binlog-do-db=am

# 不需要同步的数据库
binlog_ignore_db=information_schema
binlog_ignore_db=mysql
binlog_ignore_db=performance_schema
binlog_ignore_db=test

创建slave登陆用户(repeat)

创建用户

create user 'repeat'@'%' IDENTIFIED WITH mysql_native_password BY 123456;

分配权限

grant replication slave on *.* to 'repeat'@'%';

刷新权限

flush privileges

重启master数据库

docker restart mysql_01

记录master保存点

show master status


记录其中的 File和Position的值,配置slave时会用到
值记录过后,暂时就不能再对master数据库做任何修改操作了,紧接着配置slave

配置slave从服务器

修改slaver的配置文件

编辑my.cnf文件 vim /home/data/docker/mysql_02/conf/my.cnf
添加内容至[mysqld]结点内,如下

#二进制文件的名称
log-bin=master-bin

#二进制文件的格式
binlog-format=ROW

#服务器的id
server-id=2

重启slave数据库

docker restart mysql_02

连接至服务器

#其中
#master_user是指在主服务器上创建的repeat用户,master_password指repeat用户的密码
#master_host指master的IP,master_port指master数据库的端口号
#master_log_file指的是在master库中运行show master status显示的File字段信息
#master_log_pos指的是在master库中运行show master status显示的Position字段信息
change master to master_host='172.17.0.4',master_user='repeat',master_password='123456',master_port=3306,master_log_file='master-bin.000001',master_log_pos=3362;

开启slave

在slave库中运行

start slave;

查看slave状态

show slave status;


若显示的是Slave_IO_State: Waiting for master to send event,则,配置成功。

posted @ 2021-05-26 22:31  心若向阳花自开  阅读(95)  评论(0编辑  收藏  举报