【GTID主从】

GTID主从

4.1 GTID概念介绍

GTID即全局事务ID (global transaction identifier), 其保证为每一个在主上提交的事务在复制集群中可以生成一个唯一的ID。GTID最初由google实现,官方MySQL在5.6才加入该功能。mysql主从结构在一主一从情况下对于GTID来说就没有优势了,而对于2台主以上的结构优势异常明显,可以在数据不丢失的情况下切换新主。使用GTID需要注意: 在构建主从复制之前,在一台将成为主的实例上进行一些操作(如数据清理等),通过GTID复制,这些在主从成立之前的操作也会被复制到从服务器上,引起复制失败。也就是说通过GTID复制都是从最先开始的事务日志开始,即使这些操作在复制之前执行。比如在server1上执行一些drop、delete的清理操作,接着在server2上执行change的操作,会使得server2也进行server1的清理操作。

GTID实际上是由UUID+TID (即transactionId)组成的。其中UUID(即server_uuid) 产生于auto.conf文件(cat /data/mysql/data/auto.cnf),是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且会补全没有执行的事务)。GTID在一组复制中,全局唯一。 下面是一个GTID的具体形式 :

mysql> show master status;
+-----------+----------+--------------+------------------+---------------
----------------------------+
| File      | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_
Set |
+-----------+----------+--------------+------------------+---------------
--------------------------------+
| on.000003 |      187 |              |                  | 7256f791-125d11e9-9a9c-0050568843f8:1-362|
+-----------+----------+--------------+------------------+---------------
--------------------------------+
1 row in set (0.00 sec)

了解了GTID的格式,通过UUID可以知道这个事务在哪个实例上提交的。通过GTID可以极方便的进行复制结构上的故障转移,新主设置,这就很好地解决了下面这个图所展现出来的问题。
请添加图片描述

如图, Server1(Master)崩溃,根据从上show slave status获得Master_log_File/Read_Master_Log_Pos的值,Server2(Slave)已经跟上了主,Server3(Slave)没有跟上主。这时要是把Server2提升为主,Server3变成Server2的从。这时在Server3上执行change的时候需要做一些计算。

这个问题在5.6的GTID出现后,就显得非常的简单。由于同一事务的GTID在所有节点上的值一致,那么根据Server3当前停止点的GTID就能定位到Server2上的GTID。甚至由于MASTER_AUTO_POSITION功能的出现,我们都不需要知道GTID的具体值,直接使用CHANGE MASTER TO MASTER_HOST=‘xxx’, MASTER_AUTO_POSITION命令就可以直接完成failover的工作。

====== GTID和Binlog的关系 ======

GTID在binlog中的结构
请添加图片描述

GTID event 结构
请添加图片描述

Previous_gtid_log_event
Previous_gtid_log_event 在每个binlog 头部都会有每次binlog rotate的时候存储在binlog头部Previous-GTIDs在binlog中只会存储在这台机器上执行过的所有binlog,不包括手动设置gtid_purged值。换句话说,如果你手动set global gtid_purged=xx; 那么xx是不会记录在Previous_gtid_log_event中的。

GTID和Binlog之间的关系是怎么对应的呢? 如何才能找到GTID=? 对应的binlog文件呢?
假设有4个binlog: bin.001,bin.002,bin.003,bin.004
bin.001 : Previous-GTIDs=empty; binlog_event有: 1-40
bin.002 : Previous-GTIDs=1-40; binlog_event有: 41-80
bin.003 : Previous-GTIDs=1-80; binlog_event有: 81-120
bin.004 : Previous-GTIDs=1-120; binlog_event有: 121-160
假设现在我们要找GTID=$A,那么MySQL的扫描顺序为:

从最后一个binlog开始扫描(即: bin.004)

bin.004的Previous-GTIDs=1-120,如果$A=140 > Previous-GTIDs,那么肯定在bin.004中

bin.004的Previous-GTIDs=1-120,如果$A=88 包含在Previous-GTIDs中,那么继续对比上一个binlog文件 bin.003,然后再循环前面2个步骤,直到找到为止.

gtid_mode=on (必选)
enforce-gtid-consistency=1 (必选)
log_bin=mysql-bin (可选) #高可用切换,最好开启该功能
log-slave-updates=1 (可选) #高可用切换,最好打开该功能

====== GTID 重要参数的持久化 =======

GTID相关参数

参数comment
gtid_executed执行过的所有GTID
gtid_purged丢弃掉的GTID
gtid_modeGTID模式
gtid_nextsession级别的变量,下一个gtid
gtid_owned正在运行的GTID
enforce_gtid_consistency保证GTID安全的参数
====== 开启GTID的必备条件 ======

gtid_mode=on (必选)
enforce-gtid-consistency=1 (必选)
log_bin=mysql-bin (可选) #高可用切换,最好开启该功能
log-slave-updates=1 (可选) #高可用切换,最好打开该功能

GTID工作原理

从服务器连接到主服务器之后,把自己执行过的GTID (Executed_Gtid_Set: 即已经执行的事务编码) 、获取到的GTID (Retrieved_Gtid_Set: 即从库已经接收到主库的事务编号) 发给主服务器,主服务器把从服务器缺少的GTID及对应的transactions发过去补全即可。当主服务器挂掉的时候,找出同步最成功的那台从服务器,直接把它提升为主即可。如果硬要指定某一台不是最新的从服务器提升为主, 先change到同步最成功的那台从服务器, 等把GTID全部补全了,就可以把它提升为主了。

GTID是MySQL 5.6的新特性,可简化MySQL的主从切换以及Failover。GTID用于在binlog中唯一标识一个事务。当事务提交时,MySQL Server在写binlog的时候,会先写一个特殊的Binlog Event,类型为GTID_Event,指定下一个事务的GTID,然后再写事务的Binlog。主从同步时GTID_Event和事务的Binlog都会传递到从库,从库在执行的时候也是用同样的GTID写binlog,这样主从同步以后,就可通过GTID确定从库同步到的位置了。也就是说,无论是级联情况,还是一主多从情况,都可以通过GTID自动找点儿,而无需像之前那样通过File_name和File_position找点儿了。

简而言之,GTID的工作流程为:

master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
如果有记录,说明该GTID的事务已经执行,slave会忽略。
如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
4.3 GTID主从配置
环境说明:
|数据库角色 |IP |应用与系统版本|
|:----😐:----😐
|主数据库| 172.16.12.128 |centos8/redhat8 mysql-5.7|
|从数据库| 172.16.12.129| centos8/redhat8 mysql-5.7|
主库配置。vi /etc/my.cnf,添加以下配置,重启mysql。

[root@zhuku ~]# systemctl stop firewalld
[root@zhuku ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@zhuku ~]# setenforce 0
**//将第六行中的 enforcing 改为 disabled**
[root@zhuku ~]# vim /etc/selinux/config
[root@zhuku ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes
are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

从库配置。vi /etc/my.cnf, 添加以下配置,重启mysql。

[root@congku ~]# systemctl stop firewalld
[root@congku ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
**//将第六行中的 enforcing 改为 disabled**
[root@congku ~]# vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes
are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

主库配置。vi /etc/my.cnf,添加以下配置,重启mysql。

[root@zhuku ~]# vim /etc/my.cnf
log-bin=mysql_zhuku
server-id=10
gtid_mode=on
enforce-gtid-consistency=true
log-slave-updates=on
[root@zhuku ~]# systemctl restart mysqld

从库设置要同步的主库信息,并开启同步。

[root@congku ~]# vim /etc/my.cnf
server-id=20
relay-log=myrelay
gtid_mode=on
enforce-gtid-consistency=true
log-slave-updates=on
read_only=on
master-info-repository=TABLE
relay-log-info-repository=TABLE
[root@congku ~]# systemctl restart mysqld

主库授权复制用户。

mysql> grant replication slave on *.* to 'tom'@'192.168.139.132' identifi
ed by 'tom123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
[root@zhuku ~]# mysql -uroot -p123456
mysql> show master status;
+------------------+----------+--------------+------------------+--------
----------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Execute
d_Gtid_Set |
+------------------+----------+--------------+------------------+--------
----------------------------------+
| mysql_zhuku.000001 |    635 |              |                   | 8dd47
f79-10af-11ed-aac3-000c29135e86:1-2 |
+------------------+----------+--------------+------------------+--------
----------------------------------+
1 row in set (0.00 sec)

从库设置要同步的主库信息,并开启同步。

mysql> change master to master_host='192.168.223.151',
-> master_port=3306,master_user='tom',
-> master_password='tom123',
-> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
//查看详细信息
mysql> show slave status\G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 192.168.139.131
                   Master_User: tom
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mysql_zhuku.000001
           Read_Master_Log_Pos: 451
                Relay_Log_File: myrelay.000002
                 Relay_Log_Pos: 664
         Relay_Master_Log_File: mysql_zhuku.000001
              Slave_IO_Running: Yes #要为yes才有效
             Slave_SQL_Running: Yes #要为yes才有效

配置完之后,通过查看 slave 的状态,可以看是否配置成功。同时可以在主库进行一些操作,提交一些事务(insert,update),之后数据就会自动同步到从库。

http协议

状态码
lamp简介

lamp简介

所谓lamp,其实就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一组动态网站或者服务器的开源软件,除Linux外其它各
部件本身都是各自独立的程序,但是因为经常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平
台。

web服务器工作流程

web服务器的资源分为两种,静态资源和动态资源
静态资源就是指静态内容,客户端从服务器获得的资源的表现形式与原文件相同。可以简单的理解为就是直接存储于文件系统中的
资源
动态资源则通常是程序文件,需要在服务器执行之后,将执行的结果返回给客户端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PxNBT044-1659361813442)(./1659359068306.png)]
如上图所示
阶段①显示的是 httpd 服务器(即 apache)和 php 服务器通过 FastCGI 协议进行通信,且 php 作为独立的服务进程运行。
阶段②显示的是 php 程序和 mysq l数据库间通过 mysql 协议进行通信。php 与 mysql 本没有什么联系,但是由 php 语言写成的程
序可以与 mysql 进行数据交互。同理 perl 和 python 写的程序也可以与 mysql 数据库进行交互。

CGI 与 FastCGI

CGI(Common Gateway Interface,通用网关接口),CGI 是外部应用程序(CGI 程序)与 web 服务器之间的接口标准,是在 CGI
程序和 web 服务器之间传递信息的过程。CGI 规范允许 web 服务器执行外部程序,并将它们的输出发送给 web 浏览器,CGI 将
web 的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。
FastCGI(Fast Common Gateway Interface)是 CGI 的改良版,CGI 是通过启用一个解释器进程来处理每个请求,耗时且耗资源,
而 FastCGI 则是通过 master­worker 形式来处理每个请求,即启动一个 master 主进程,然后根据配置启动几个 worker 进程,当请
求进来时,master 会从 worke r进程中选择一个去处理请求,这样就避免了重复的生成和杀死进程带来的频繁 CPU 上下文切换而导
致耗时。

httpd 与 php 结合的方式

httpd 与 php 结合的方式有以下三种:
modules:php 将以 httpd 的扩展模块形式存在,需要加载动态资源时,httpd 可以直接通过 php 模块来加工资源并返回给客户端
httpd prefork:libphp5.so(多进程模型的 php)
httpd event or worker:libphp5­zts.so(线程模型的php)
CGI:httpd 需要加载动态资源时,通过 CGI 与 php 解释器联系,获得 php 执行的结果,此时 httpd 负责与 php 连接的建立和断开

FastCGI:利用 php­fpm 机制,启动为服务进程,php 自行运行为一个服务,https 通过 socket 与 php 通信
较于 CGI 方式,FastCGI 更为常用,很少有人使用 CGI 方式来加载动态资源

lamp

lamp简介

Lamp架构∶
Linux+apache/nginx+mysql+php/python/perl
lamp
lnmp
lamt
lnmt
lanmp
lanmt
有了前面学习的知识的铺垫,今天可以来学习下第一个常用的web架构了。
所谓lamp,其实就是由Linux+Apache+Mysql/MariaDB+Php/Perl/Python的一组动态网站或者服务
器的开源软件,除Linux外其它各部件本身都是各自独立的程序,但是因为经常被放在一起使用,拥
有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。
LAMP指的是Linux(操作系统)、Apache(HTTP服务器)、MySQL(也指MariaDB,数据库软
件)和PHP(有时也是指Perl或Python)的第一个字母,一般用来建立web应用平台。
请添加图片描述

web服务器工作流程

在说lamp架构平台的搭建前,我们先来了解下什么是CGI,什么是FastCGI,什么是……
web服务器的资源分为两种,静态资源和动态资源
静态资源就是指静态内容,客户端从服务器获得的资源的表现形式与原文件相同。可以简单的
理解为就是直接存储于文件系统中的资源
动态资源则通常是程序文件,需要在服务器执行之后,将执行的结果返回给客户端
那么web服务器如何执行程序并将结果返回给客户端呢?下面通过一张图来说明一下web服务器如
何处理客户端的请求
请添加图片描述

如上图所示
阶段①显示的是httpd服务器(即apache)和php服务器通过FastCGI协议进行通信,且php作为
独立的服务进程运行
阶段②显示的是php程序和mysql数据库间通过mysql协议进行通信。php与mysql本没有什么联
系,但是由Php语言写成的程序可以与mysql进行数据交互。同理perl和python写的程序也可以与
mysql数据库进行交互

cgi与fastcgi

上图阶段①中提到了FastCGI,下面我们来了解下CGI与FastCGI。
CGI(Common Gateway Interface,通用网关接口),CGI是外部应用程序(CGI程序)与
WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。CGI规范允许
Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将web的一组简单的静态
超媒体文档变成一个完整的新的交互式媒体。
FastCGI(Fast Common Gateway Interface)是CGI的改良版,CGI是通过启用一个解释器进
程来处理每个请求,耗时且耗资源,而FastCGI则是通过master­worker形式来处理每个请求,
即启动一个master主进程,然后根据配置启动几个worker进程,当请求进来时,master会从
worker进程中选择一个去处理请求,这样就避免了重复的生成和杀死进程带来的频繁cpu上下
文切换而导致耗时

httpd与php结合的方式

httpd与php结合的方式有以下三种:
modules:php将以httpd的扩展模块形式存在,需要加载动态资源时,httpd可以直接通过php
模块来加工资源并返回给客户端
httpd prefork:libphp5.so(多进程模型的php)
httpd event or worker:libphp5­zts.so(线程模型的php)
CGI:httpd需要加载动态资源时,通过CGI与php解释器联系,获得php执行的结果,此时
httpd负责与php连接的建立和断开等
FastCGI:利用php­fpm机制,启动为服务进程,php自行运行为一个服务,https通过socket与
php通信
较于CGI方式,FastCGI更为常用,很少有人使用CGI方式来加载动态资源
1.HTTP协议 是什么? 状态码
HTTP协议是基于TCP/IP的应用层协议
HTTP协议,即 超文本传输协议(Hypertext transfer protocol) 。是用于从WWW服务器传输
超文本
到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少.是一种详细规定了
浏览器和
万维网(WWW =World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档
的数据
传送协议。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是
一个无
状态的协议。
每条HTTP响应消息都必须在第一行中包含一个状态码,说明请求的结果。根据代码的第一
位数
字,可将状态码分为以下5类。
1xx —提供信息。
2xx —请求被成功提交。
3xx —客户端被重定向到其他资源。
4xx —请求包含某种错误。
5xx —服务器执行请求时遇到错误。
常见的十个HTTP状态码
200 : 成功,表示访问成功,正常状态。
301 : 永久移动,表示本网页已经永久性的移动到一个新的地址,在客户端自动将请求地址
改为服
务器返回的新地址。
302 : 临时重定向,表示网页暂时性的转移到一的新的地址,客户端在以后可以继续向本地
址发起
请求。
303 : 表示必须临时重定向,并且必须使用GET方式请求。
304 : 重定向至浏览器本身,当浏览器多次发起同一请求,且内容未更改时,使用浏览器缓
存,这
样可以减少网络开销。
401 : 表示协议格式出错,可能是此IP地址被禁止访问该资源,与403类似。
403 : 表示没有权限,服务器拒绝访问请求。
404 : 这是最常见的错误,表示找不到系统资源,但是只是暂时性地。
500 : 表示服务器程序错误,一个通用的错误信息。
503 : 表示服务器繁忙,或者服务器负载,通常这只是一个临时状态

lamp架构运行原理

LAMP是一个多C/S架构的平台,最初级为web客户端基于TCP/IP通过http协议发起传送,
这个请求
可能是动态的,也可能是静态的。
所以web服务器通过发起请求的后缀来判断,如果是静态的资源就由web服务器自行处理,
然后将
资源发给客户端。如果是动态这时web服务器会通过CGI(Common Gateway interface)
协议发给
PHP。
但是如果php是以模块形式与Web服务器联系。那么它们是通过共享内存的方式。如果是
PHP单独
的放置与一台服务器,那么它们是通过sockets套接字监听的方式通信(这又是一个C/S架
构)。
这时php会相应的执行一段程序,如果执行程序时,需要用到数据。那么php就会通过
mysql协议发
送给mysql服务器(也可以看作是一个C/S架构)。由mysql服务器处理,将数据供给php程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值