实验环境:
server1:172.25.66.1 master(主库)
server2:172.25.66.2 slave (从库)
安装包:
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
1.Mysql的主从复制
概述:
主从复制:是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。
1.主从复制原理
图解:
原理:
1.数据库有个bin-log二进制文件,记录了所有sql语句。
2.我们的目标就是把主数据库的bin-log文件的sql语句复制过来。
3.让其在从数据库的relay-log重做日志文件中再执行一次这些sql语句即可。
4.具体需要三个线程来操作:
(1).主库dump线程:每当有从库连接到主库的时候,主库都会创建一个dump线程然后发送binlog(二进制日志)内容到从库。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:
(2).从库IO线程:当START SLAVE语句在从库开始执行之后,从库创建一个IO线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库IO线程读取主库的binlog输出线程发送的更新并拷贝这些更新到 relay log 文件。
(3).从库的SQL线程:从库创建一个SQL线程,这个线程读取从库IO线程写到 relay log 的更新事件并执行。从而实现主从的操作一致,最终数据一致;
总结:
从结点slave是根据读取主结点master的binlog二进制日志(记录了对数据库的所有操作)完成复制的
2.主从复制用途
1、做数据的热备;作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。(实时灾备,用于故障切换)
2、架构的扩;业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3、读写分离,使数据库能支撑更大的并发;在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度
3.主从复制存在的问题
1.主库宕机后,数据可能丢失
2.从库只有一个sql Thread线程,主库写压力大,复制很可能延时
4.解决方法
半同步复制---解决数据丢失的问题
并行复制-----解决从库复制延迟的问题
5.主从部署必要条件
1.主库开启binlog日志(二进制日志)
2.主从server-id不同
3.从库服务器能连通主库(远程登陆)
实验:
1.配置主结点
(1)下载并安装数据库
#1.在官网上下载mysql
[root@sever1 ~]# ls
mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
#2.解压
[root@sever1 ~]# tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
[root@sever1 ~]# ls
#3.安装
[root@sever1 ~]# yum install -y mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm
(2).开启二进制日志并指定id
[root@sever1 ~]# vim /etc/my.cnf
################
log-bin=mysql-bin #开启二进制日志
server-id=1 #指定id
(3).开启数据库
#1.开启数据库
[root@sever1 ~]# systemctl start mysqld
#2.查看端口
[root@sever1 ~]# netstat -anltp
(4)查看数据库初始密码
[root@sever1 ~]# cat /var/log/mysqld.log | grep password
(5)登陆数据库
发现虽然可以登陆,但实际上无法使用数据库,根据提示需要先更改数据库密码,才能使用数据库
#登陆数据库
[root@sever1 ~]# mysql -uroot -p'+t2q(Ci0(WRa'
(6)初始化
[root@sever1 ~]# mysql_secure_installation
(7)登陆数据库并创建用户授权
[root@sever1 ~]# mysql -uroot -phym19970818HYM#
mysql> show databases; #查看年数据库
mysql> grant replication slave on *.* to repl@'172.25.66.%' identified by 'hym19970818HYM#'; #创建用户并授权
注释:
replication #表示授权复制的权限
*.* #表示所有数据库可以进行同步
repl #表示授权用户,可以随意填写
'172.25.66.%' #表示授权172.25.66/24的网段所有服务器可以同步, %表示任意
hym19970818HYM# #表示用户密码(我这里设定成root用户的密码是为了方便记忆)
#mysql-bin.000002表示当前正在使用的二进制日志文件,1003表示执行当前二进制日志位置,即从那里开始复制
mysql> show master status; #查看master的状态
mysql> exit #退出
Bye
查看日志:
[root@sever1 ~]# cd /var/lib/mysql
[root@sever1 mysql]# ls
auto.cnf ibdata1 mysql-bin.000002 public_key.pem
ca-key.pem ib_logfile0 mysql-bin.index server-cert.pem
ca.pem ib_logfile1 mysql.sock server-key.pem
client-cert.pem ibtmp1 mysql.sock.lock sys
client-key.pem mysql performance_schema
ib_buffer_pool mysql-bin.000001 private_key.pem
[root@sever1 mysql]# cat mysql-bin.index
./mysql-bin.000001
./mysql-bin.000002
[root@sever1 mysql]# file mysql-bin.index
mysql-bin.index: ASCII text
#查看日志
[root@sever1 mysql]# mysqlbinlog ./mysql-bin.000002
2.配置从结点
(1).下载并安装数据库
[root@sever1 ~]# scp mysql-community-client-5.7.24-1.el7.x86_64.rpm mysql-community-common-5.7.24-1.el7.x86_64.rpm mysql-community-libs-5.7.24-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm mysql-community-server-5.7.24-1.el7.x86_64.rpm root@172.25.66.2:
[root@sever2 ~]# ls
[root@sever2 ~]# yum install -y *
(2).指定id
[root@sever2 ~]# vim /etc/my.cnf
################
server-id=2 #指定id
(3)开启数据库
[root@sever2 ~]# systemctl start mysqld
[root@sever2 ~]# netstat -antlp
注意:如果开启数据库时,特别缓慢怎么办呢?
[root@server2 ~]# systemctl start mysqld
^C
[root@server2 ~]# ps aux | grep mysql
mysql 2717 1.1 23.2 1119484 176448 ? Sl 09:21 0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root 2747 0.0 0.1 112648 960 pts/0 R+ 09:22 0:00 grep --color=auto mysql
#1.杀死进程
[root@server2 ~]# kill -9 2717
[root@server2 ~]# ps aux | grep mysql
mysql 2769 10.0 22.7 988412 172548 ? Sl 09:22 0:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root 2799 0.0 0.1 112648 960 pts/0 R+ 09:22 0:00 grep --color=auto mysql
#2.重新启动
[root@server2 ~]# systemctl start mysqld
(4)查看数据库初始密码
[root@sever2 ~]# cat /var/log/mysqld.log | grep password
(5)初始化
#将密码设定成与主库root用户密码一样是为了方便记忆,并不是必须
[root@sever2 ~]# mysql_secure_installation
(6)登陆数据库
[root@sever2 ~]# mysql -uroot -phym19970818HYM#