MySQL主从复制

1,为什么要主从复制

生产环境中如果数据库只有一台服务器,容易产生单点故障问题,如这台服务器访问压力过大没有响应,服务不可用,或者硬盘坏了,整个数据库数据就丢失了为了保障数据安全可靠性,我们需要将数据复制多份部署在多台不同的服务器上,就算一台坏了其他还可以提供服务主从复制可以实现对数据库备份和读写分离主服务器负责读和写,从服务器只负责读

2,一主多从架构

MySQL主从复制

3,主从复制原理

当 master 主服务器上的数据发生改变时,则将其改变写入二进制事件日志文件中salve 从服务器会在一定时间间隔内对 master主服务器上的二进制日志进行探测,探测其是否发生过改变,如果探测到 master主服务器的二进制事件日志发生了改变,则开始一个 I/O Thread 请求 master 二进制事件日志同时 master 主服务器为每个 I/O Thread 启动一个dump Thread,用于向其发送二进制事件日志slave 从服务器将接收到的二进制事件日志保存至自己本地的中继日志文件中salve 从服务器将启动 SQL Thread从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致;最后 I/O Thread 和 SQL Thread将进入睡眠状态,等待下一次被唤醒
MySQL主从复制

4,搭建MySQL的实例(搭建多台MySQL服务器)

说明:
在实际开发中一台每台服务器部署一台MySQL,
学习中也可以开两台虚拟机,分别安装MySQL服务;
这里使用一台服务器启动两台MySQL服务搭建一主一从

4.1安装MySQL服务

1,上传MySQL安装包(也可以通过yum,rpm,docker方式)
mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz到/usr/local/software
2,解压
tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
3,重命名(随便,重命名知识看着舒服)
mv mysql-5.7.24-linux-glibc2.12-x86_64 mysql-5.7.24
4,在mysql-5.7.24目录中创建data目录(存储数据库表)
cd mysql-5.7.24
mkdir data
5,进入data目录 创建2个文件夹 mkdir 3307 3308 
(后面我们使用3307,3308端口开启两台MySQL服务器,两台MySQL的表分别存储3307,3308目录)
cd data
mkdir 3307
mkdir 3308
6,如果此Linux从未安装过MySQL 执行下面步骤
groupadd mysql
useradd -g mysql mysql
7.修改权限(cd /usr/local/software目录)
chgrp -R mysql mysql-5.7.24
chown -R mysql mysql-5.7.24/data/
8,添加MySQL环境变量
  vim /etc/profile
  在文件末尾添加
  export MYSQL_HOME=/usr/local/software/mysql-5.7.24
  export PATH=$MYSQL_HOME/bin:$PATH
9,执行source /etc/profile 使得环境变量配置生效
10,执行数据库初始化
初始化3307
mysqld --initialize-insecure --basedir=/usr/local/software/mysql-5.7.24 --datadir=/usr/local/software/mysql-5.7.24/data/3307 --user=mysql
初始化3308
mysqld --initialize-insecure --basedir=/usr/local/software/mysql-5.7.24 --datadir=/usr/local/software/mysql-5.7.24/data/3308 --user=mysql
10.1
说明:
--initialize-insecure 表示不生成MySQL数据库root用户的随机密码,
即root密码为空
--basedir:mysql解压之后的路径
--datadir:存储数据库表的路径
--user:用户
10.2如果初始化时出现
mysqld:error while loading shared libraries :libaio.so.1
:cannot open shared object file:NO Such file or directory.
解决方法:
需要安装libaio
执行命令:
yum install -y libaio

5,配置2个MySQL数据库服务的my.cnf文件在/data/3307,/data/3308两个目录下分别创建一个my.cnf文件在两个my.cnf文件分别配置如下内容(注意:不同的实例下配置要修改端口号)

1,
在/usr/local/software/mysql-5.7.24/data/3307目录下
touch my.cnf
在/usr/local/software/mysql-5.7.24/data/3308目录下
touch my.cnf
2,
在3307目录下的my.cnf中添加
[client]
port        = 3307
socket      = /usr/local/software/mysql-5.7.24/data/3307/mysql.sock
default-character-set=utf8
[mysqld]
port    = 3307
socket  = /usr/local/software/mysql-5.7.24/data/3307/mysql.sock
datadir = /usr/local/software/mysql-5.7.24/data/3307
log-error = /usr/local/software/mysql-5.7.24/data/3307/error.log
pid-file = /usr/local/software/mysql-5.7.24/data/3307/mysql.pid
character-set-server=utf8
lower_case_table_names=1
autocommit = 1

在3308目录下的my.cnf中添加
[client]
port        = 3308
socket      = /usr/local/software/mysql-5.7.24/data/3308/mysql.sock
default-character-set=utf8
[mysqld]
port    = 3308
socket  = /usr/local/software/mysql-5.7.24/data/3308/mysql.sock
datadir = /usr/local/software/mysql-5.7.24/data/3308
log-error = /usr/local/software/mysql-5.7.24/data/3308/error.log
pid-file = /usr/local/software/mysql-5.7.24/data/3308/mysql.pid
character-set-server=utf8
lower_case_table_names=1
autocommit = 1

6,多实例启动

启动3307
mysqld_safe --defaults-file=/usr/local/software/mysql-5.7.24/data/3307/my.cnf &
启动3308
mysqld_safe --defaults-file=/usr/local/software/mysql-5.7.24/data/3308/my.cnf &
说明:
--defaults-file 是指定配置文件
& 符合表示后台启动

7,登录启动的两台数据库,修改密码,授权

1,打开两个XShell窗口 分别登录 密码为空
mysql -uroot -p -P3307 -h127.0.0.1
mysql -uroot -p -P3308 -h127.0.0.1
2,修改密码
alter user 'root'@'localhost' identified by '密码';
3,授权远程访问(这样远程客户端才能访问)
grant all privileges on *.* to root@'%' identified by '密码';
说明:
其中*.* 的第一个*表示所有数据库名,
第二个*表示所有的数据库表
root@'%' 中的root表示用户名
%表示所有ip地址,%也可以指定具体的ip地址,
比如root@localhost,		root@192.168.10.129
4,刷新权限
flush privileges;

8,多实例关闭

mysqladmin -uroot -p -P3307 -h127.0.0.1 shutdown
mysqladmin -uroot -p -P3308 -h127.0.0.1 shutdown	

9,一主一从的环境搭建

9.1 修改各个系统配置文件my.cnf

修改3307配置文件my.cnf
log-bin=mysql-bin   		#表示启用二进制日志
server-id=3307 			#表示server编号,编号要唯一
binlog_format=STATEMENT	#设置logbin格式(默认)
修改3307配置文件my.cnf
server-id=3308        	#表示server编号,编号要唯一

说明:
logbin模式的区别(了解)
STATEMENT模式
基于SQL语句的复制,每一条修改数据的sql语句会记录到binlog中。
优点
不需要记录每一条sql语句和每一行数据变化,减少binlog日志量
缺点
update xxx set xx time=now() where name=xxx
上面now函数在master上执行但在slave上执行时time就变了
ROW模式
基于行的复制
对于update xxx set xx time=now() where name=xxx
记录每一行的改变 直接把值复制过去
缺点
比方说有一个部门表 部门有CEO字段 一个公司的老总变了,
那么所有行CEO都会变,执行语句是update不加where条件就可以
比方说这个公司有10万人 每行都记录就会有10万行记录	
会产生大量的日志,效率有问题 
MIXED模式
结合上面两种模式,有函数切换到行模式,没函数切换到STATEMENT模式
缺点
如果有系统变量(@@hostname)也没有办法避免主从复制不一致问题 

9.2 重启两个MySQL服务,启动时指定配置文件

mysqld_safe --defaults-file=/usr/local/software/mysql-5.7.24/data/3307/my.cnf &
mysqld_safe --defaults-file=/usr/local/software/mysql-5.7.24/data/3308/my.cnf &

9.3主服务器设置

主服务器3307设置
需要登录到主服务器3307的客户端
mysql -uroot -p -P3307 -h127.0.0.1
在主服务器上创建复制数据的账号并授权(给从服务器授权,允许从服务器copy数据)
grant replication slave on *.* to 'copy'@'%' identified by '123';
查看主服务器状态
show master status;
mysql主服务器默认初始值:
File:mysql-bin.000001
Position:154
如果主服务状态不是初始状态,需要重置状态
reset master;

9.4从服务器设置

a.需要登录到从服务器3308的客户端
mysql -uroot -p -P3308 -h127.0.0.1
b.如果从服务器不是初始状态,建议重置一下
show slave status \G;    #\G表示格式化输出
stop slave; 	#停止复制,相当于终止从服务器上的IO和SQL线程
reset slave;
c.设置从服务器的master(在3308从服务器客户端执行)
change master to master_host='182.92.234.71',master_user='copy',
master_port=3307,master_password='123',
master_log_file='mysql-bin.000001',master_log_pos=154;
d.在从机器上执行开始复制命令
start slave;

9.5若主从复制失效了 需要在主机上执行下面操作

reset master;	(主master上执行)
stop slave;		(从slave上面执行)
reset slave;	(从slave上面执行)
start slave;	(从slave上面执行)

10 验证

结果:
主MySQL服务器操作之后的数据,从服务器的数据同步与其同步。

上一篇:phpstudy运行时显示3306端口被占用


下一篇:MySQL8.0单机器多实例主从安装配置