文章目录
一、Mysql的主从复制
1、为什么要做主从复制?
在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
2.主从复制原理
当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
主从复制的基础是主库记录数据库的所有变更记录到binlog( binary log,主库中保存更新事件日志的二进制文件)。binlog是数据库中保存配置中过期时间内所有修改数据库结构或内容的一个文件。如果过期时间是10d的话,那么就是最近10d的数据库修改记录。
**mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。
-
在 主库 里,只要有更新事件出现,就会被依次地写入到binlog里面,是之后从库连接到主库时,从主库拉取过来进行复制操作的数据源。
binlog输出线程 每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。
对于每一个即将发送给从库的sql事件,binlog输出线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。 -
在 从库 里,当复制开始的时候,从库就会创建两个线程进行处理:
从库I/O线程 当START SLAVE语句在从库开始执行之后,从库启动I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。
从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。从库的SQL线程 从库启动SQL线程,这个线程读取从库I/O线程写到relay log(中继日志)的更新事件并执行。
可知道,对于每一个主从复制的连接,都有三个线程。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。 从库通过启动两个独立的线程,使得在进行复制时,从库的读和写进行了分离。因此,即使负责执行的线程运行较慢,负责读取更新语句的线程并不会因此变得缓慢。比如说,如果从库有一段时间没运行了,当它在此启动的时候,尽管它的SQL线程执行比较慢,它的I/O线程可以快速地从主库里读取所有的binlog内容。这样一来,即使从库在SQL线程执行完所有读取到的语句前停止运行了,I/O线程也至少完全读取了所有的内容,并将其安全地备份在从库本地的relay log,随时准备在从库下一次启动的时候执行语句。
3、异步复制
MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主库如果crash掉了,此时主库上已经提交的事务可能并没有传到从库上,如果此时,强行将从提升为主,可能导致新主库上的数据不完整。
二.实现主从复制的要求
1.主库开启binlog日志(设置log-bin参数)
2.主从server-id不同
3.从库服务器能连同主库
三.主从复制的实现
实验环境
主机名 IP | 服务 |
---|---|
虚拟机server1 172.25.7.1 | 数据库的master节点 |
虚拟机server2 172.25.7.2 | 数据库的slave节点 |
物理机 172.25.7.250 | 测试端 |
- 配置主库端:
step1 在主库中安装mysql:
1.在server1和server2上,下载mysql的rpm包,解压:
2、安装需要的包
yum install -y mysql-community-client-5.7.25-1.el7.x86_64.rpm mysql-community-common-5.7.25-1.el7.x86_64.rpm mysql-community-libs-5.7.25-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm mysql-community-server-5.7.25-1.el7.x86_64.rpm
server2上同样的操作:
step2 打开数据库:
systemctl start mysqld
master节点(server1 )的数据库初始化
1)开启服务之后会生成一个临时密码,使用临时密码进行数据库安全初始化,复制密码:cat /var/log/mysqld.log | grep password
2)mysql -uroot -p 粘贴密码,登录成功
3)show databases;发现必须进行初始化
step3 查看初始化密码:
cat /var/log/mysqld.log | grep password
step4 安全初始化:
mysql_secure_installation
- 安全初始化登陆的时候使用的是临时密码,接下来要自己设置数据库的密码,这个密码必须有特殊字符,英文字母的大小写还有数字
step5 编辑配置文件:开始配置主节点(server1)数据库 vim /etc/my.cnf
vim /etc/my.cnf
最后面添加:
29 log-bin=mysql-bin #开启二进制日志
30 server-id=1 #服务器ID
systemctl restart mysqld #重启服务
step6 创建用户并授权:创建并授权用来做复制的用户
使用自己设置的密码登录数据库:mysql -uroot -pWestos+001==
在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中
mysql> grant replication slave on *.* to repl@'172.25.7.%' identified by 'Westos+001';
## 创建用户,可以使用此用户远程登录数据库;授权为可以复制master节点数据的slave节点
mysql> show plugins;
##查看插件,因为有密码插件,所以密码必须设置为复杂的
mysql> show master status;
##查看master状态
参数解释:
replication 表示授权复制的权限
*.* 表示所有数据库可以进行同步
repl 表示授权名,可以随意填写
'172.25.254.%' 表示授权172.25.19.0/24的网段所有服务器可以同步, %表示任意
- 配置从库端:
step1 在从库中安装mysql:
yum install -y mysql-community-client-5.7.25-1.el7.x86_64.rpm mysql-community-common-5.7.25-1.el7.x86_64.rpm mysql-community-libs-5.7.25-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm mysql-community-server-5.7.25-1.el7.x86_64.rpm
step2 打开数据库:
systemctl start mysqld
step3 查看初始化密码:
cat /var/log/mysqld.log | grep password
step4 安全初始化:
mysql_secure_installation
step5 编辑配置文件:
vim /etc/my.cnf
最后面添加:
28 server-id=2 #服务器ID,填写主端不同即可
systemctl restart mysqld #重启服务
step6 设定从设备并开启从设备:在 slave(server2)上配置master信息
mysql> change master to master_host='172.25.254.1',
##在这个slave节点上面设置管理它的master节点主机信息
->master_user='repl',
##用户
->master_password='Westos+001',
##密码
->master_log_file='mysql-bin.000001',
##基于position的主从复制的重要信息
->master_log_pos=448;
##
mysql> start slave; ##开启本节点的slave
mysql> show slave status\G ##查看主从复制状态
##这两个参数是Yes,表示成功 。Slave_IO_Running: Yes Slave_SQL_Running: Yes
注意:master_log_file 和master_log_pos 的值都要依照主设备状态中的值来设定
对于slave节点来说,io线程和sql线程是最重要的两个线程。只有当io线程和sql线程都开启的时候,slave节点才可以正常复制master节点的数据
- 测试:测试主从同步是否生效
- 注意:写操作只能在master节点上做,因为master节点不会去同步slave节点的内容
step1 在主库端创建库:
step2 在从库中可以看到westos库:
step3 在主库中创建表,并插入数据:
step4 在从库中可以看到数据: