Mysql主从复制
引言
在生产环境中,数据库的查询请求压力较大的时候,通常需要采取数据库主从模式,读写分离的方式来提高数据库查询效率,本文就教大家如何搭建Mysql主从服务器配置
安装两台Mysql服务器
为了模拟生产环境,本文教程采取docker容器的方式安装mysql,搭建Mysql主从服务
docker安装mysql
docker安装教程请参照另一篇博文(内含docker安装mysql容器教程) 物理机安装Centos系统
- 拉取镜像
#拉取最新mysql镜像
docker pull mysql
- 安装主从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
,则,配置成功。