一、什么是主从复制?

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。

二、主从复制的作用(好处,或者说为什么要做主从)重点!

1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3、读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

三、主从复制的原理(重中之重,面试必问):

1.数据库有个bin-log二进制文件,记录了所有sql语句。
2.我们的目标就是把主数据库的bin-log文件的sql语句复制过来。
3.让其在从数据的relay-log重做日志文件中再执行一次这些sql语句即可。
4.下面的主从配置就是围绕这个原理配置
5.具体需要三个线程来操作:
	1.binlog输出线程:每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
	2.从库I/O线程:当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。
	
	3.从库的SQL线程:从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。
可以知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。

mysql为什么要做主从 mysql主从和主主哪个好_mysql为什么要做主从

mysql为什么要做主从 mysql主从和主主哪个好_数据库_02

骤一:主库db的更新事件(update、insert、delete)被写到binlog
步骤二:从库发起连接,连接到主库
步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.
步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db.

国际惯例,先安装docker

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce-18.06.0.ce -y
systemctl start docker
systemctl enable docker

创建主从数据库

  1. 设置目录
    为了使MySql的数据保持在宿主机上,我们先建立几个目录。
    mkdir -p /data/mysql/data
    建立主服务器的配置目录
    mkdir -p /data1/mysql/conf.d/001 建立从服务器的配置目录
    mkdir -p /data1/mysql/conf.d/002mkdir -p /data1/mysql/conf.d/003以上步骤创建了几个目录,一个是存mysql数据的目录,还有几个是存放mysql配置的地方
  2. 设置主从服务器配置
    添加几个mysql配置文件
    server-id=001这个id是唯一的,不能相同
vi /data/mysql/conf.d/001/001.cnf
[mysqld]
log-bin=mysql-bin
server-id=001

vi /data/mysql/conf.d/002/002.cnf
[mysqld]
log-bin=mysql-bin
server-id=002

vi /data/mysql/conf.d/003/003.cnf
[mysqld]
log-bin=mysql-bin
server-id=003
  1. 创建主从服务器容器
    创建三个mysql容器,一主二从
docker run -d --name mysql001 -v /data/mysql/data/mysql001:/var/lib/mysql -v /data/mysql/conf.d/001:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -p 13306:3306 mysql:5.7
docker run -d --name mysql002 -v /data/mysql/data/mysql002:/var/lib/mysql -v /data/mysql/conf.d/002:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -p 23306:3306 mysql:5.7
docker run -d --name mysql003 -v /data/mysql/data/mysql003:/var/lib/mysql -v /data/mysql/conf.d/003:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -p 33306:3306 mysql:5.7
  1. 登录主服务器的mysql,查询master的状态
docker exec -it mysql001 mysql -uroot -p;
show master status;

主库创建用户

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';

记下FilePosition的参数,后续配置从服务器的时候会用到

mysql为什么要做主从 mysql主从和主主哪个好_mysql_03

  1. 登录从服务器的mysql,设置与主服务器相关的配置参数
docker exec -it mysql002 mysql -uroot -p;
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
change master to master_host='192.168.1.12', master_port = 13306, master_user='backup',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=4785;

master_user是在主库创建的用户
master_log_pos是主库show master status;查询出的Position

注意上面的master_log_file='mysql-bin.000003',master_log_pos=4785;配置,需要填写上面主服务器展示的内容,否则会报错。

启动服务
`start slave;`
查看服务状态
`show slave status;` 或者  `show slave status \G`
Waiting for master to send event 就是成功了

mysql为什么要做主从 mysql主从和主主哪个好_mysql为什么要做主从_04

  1. 创建一个只读用户(从)
    GRANT SELECT ON *.* TO 'rsync'@'%' IDENTIFIED BY '123456';
  2. 创建所有权限用户(从)
    GRANT ALL ON *.* TO 'allen'@'localhost' IDENTIFIED BY '123456';FLUSH PRIVILEGES; # 将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里。MySQL用户数据和权限有修改后,希望在"不重启MySQL服务"的情况下直接生效,那么就需要执行这个命令。通常是在修改ROOT帐号的设置后,怕重启后无法再登录进来,那么直接flush之后就可以看权限设置是否生效。

配置读写分离

  1. 创建容器
docker run -d --name mysqlproxy -p 4041:4041 -p 3306:3306 \
-v /data0/logs:/var/log/supervisor \
-e ADMIN_ADDRESS=0.0.0.0:4041 \
-e ADMIN_USERNAME=root\
-e ADMIN_PASSWORD=123456\
-e PROXY_ADDRESS=0.0.0.0:3306 \
-e MASTER_ADDRESSES=192.168.1.12:13306 \
-e SLAVE_ADDRESSES=192.168.1.12:23306,192.168.1.12:33306 \
mobingi/mysqlproxy
  1. 查看运行状态
docker exec -it mysql001 mysql -h192.168.1.12 -P4041 -uroot -p123456
select * from backends;

mysql为什么要做主从 mysql主从和主主哪个好_docker_05

  1. 登录数据库
    使用客户端登录 192.168.1.12,端口使用3306,帐号密码为:root 123456