mafa1993

mafa1993 查看完整档案

济南编辑  |  填写毕业院校  |  填写所在公司/组织 1.com 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

mafa1993 发布了文章 · 6月13日

OAuth

OAuth

open authorization 开放认证\
一般用于第三方登录,例如微信授权登录,在不知道你微信账号密码的情况下,仍然可以登录其他网站\
流程

  1. 用户访问网站-> 选择第三方登录->请求第三方地址->输入第三方账号密码->第三方返回登录结果

版本

  1. 1.0发布于07年,存在bug
  2. 2.0发布于10年初

OAuth应用

  1. 根据第三方用户登录方式不同,开发特定功能
  2. 同一公司间用户数据开放,例如淘宝账号登录支付宝等

3

oauth实现流程

  1. 请求oaut登录页,这个登录页的url成为request token url,未授权的令牌请求服务地址

    • 此网址是带有特定参数的url,例如跳转地址,appid等
    • 会生成一个appid和一个appkey
    • 例如:https://graph.qq.com/oauth/.....://www.baid.com/xxx
    • 第三方登录需要先去开通,会分配一个client_id给用户,申请时,需要填写回调地址,qq会验证这个redirect_uri是否合法等
  2. 用户使用qq登录并授权

    • 验证成功会跳转到redirect_uri,并且会带上一个参数CODE,是一个加密的字符串
  3. 返回登录结果

    • 利用返回的code,验证code是否合法,
    • user authorization url 用户授权的令牌请求服务器,进行code验证的url,防止回话劫持,返回一个假code
    • 例如 https://xxx.qq.com/oauth/...?...
    • code有过期时间,很快就过期,一个code值可以使用一次
    • 响应数据会返回登录用户的一些基本信息,qq号,头像,昵称等

accessToken

  1. 用户通过第三方应用访问oauth接口的令牌
  2. 利用此令牌可以获取一些用户信息,分享内容等,标识这个第三方应用已经登录,有一些权限
  3. accessToken与refreshToken

    • accesstoken 过期时间一般很长10天以上
    • accessToken的更新有两种,一是客户端重新授权,2是服务器推送
查看原文

赞 1 收藏 1 评论 0

mafa1993 发布了文章 · 5月14日

mysql视图,触发器,存储过程优缺点及应用分析

mysql视图,触发器,存储过程优缺点及应用分析

视图

mysql使用较少,是sql server和orcale使用多

  1. create view 视图名 as 查询语句

    • create view user_view as select name,id from user;
    • select * from user_view; //查询视图,查询视图的结果和视图绑定的语句返回的数据相同
    • 修改视图数据 update user_view set username='two' where id=2;
    • 视图保存了sql逻辑,并没有保存真实的数据,数据还是从数据表获取的
    • drop view view_name
    • 建立视图时,最后增加with check option,在插入数据时,需要满足视图条件才允许操作
  2. 优点

    • 简化操作,可以把复杂的sql进行封装,使用起来简单
    • 降低耦合,只需要修改视图,不需要修改代码中的sql语句
    • 安全,可以隐藏某些字段

      • create view a as select name,id,age from user;
      • 操作a视图时,只能得到name,id,age字段 select name from a; 视图中没有select的字段也不能修改、排序、group by等,例如 select commit from a; 会报错,没有commit字段
      • create view custom_view as select * from user group by id; 然后update custom_view set name=1 where id=1; 会报错,custom_view不可更新
  3. 缺点

    • 数据库发生改变,视图需要手动修改
    • 不易于维护

触发器

针对写操作(insert,delete,update),去触发事件,例如写一张表的时候去更新另一张表

  1. create trigger 触发器名 触发时间(after、before) 触发事件(insert,delete,update) on table for each row begin 方法体 end; for each row表示行级触发

    • create trigger user_trigger after insert on user for each row begin insert test vales(1,2) end;
    • drop trigger user_trigger;
    • 一个事件只能增加一个触发器
    • show triggers 查看所有的触发器创建信息
  2. 缺点

    • 批量操作不适用
    • 触发器错误不易定位
  3. 优点

存储过程

对mysql并不友好,sqlserver和orcale支持更好,sqlserver期望所有业务都交由存储过程来实现

  1. create procedure 存储过程名(参数列表) begin 方法体 end
-- in表示输入,out表示输出,inout即表示输入又表示输出

create procedure user_procedure(in x int,out y varchar(25))
begin
-- into代表将结果存入到y
    select username into y from user where id=x;

end
  1. call user_procedure(1,@a); 调用
  2. drop procedure procedure_name;
  3. select @a; 搜索输出
  4. 优点

    • 执行块,存储过程会预编译,第一次运行存储过程会进行编译,再次次奥用不会再经过sql解释器
    • 安全性高
  5. 缺点

    • 不便维护
    • 移植性差,不好调试,也不易扩展
查看原文

赞 0 收藏 0 评论 0

mafa1993 发布了文章 · 5月12日

mysql主从复制

mysql主从复制

  1. 去除原有主从关系

    • 从服务器执行 stop slave即可
  2. 主服务器开启binlog

    • my.cnf 配置
    • log_bin = mysql_bin
    • server-id=x
  3. 主增加用户

    • create user 'slave'@'192.168.1.%' identified with mysql_native_password by 'slave'; 创建slave用于,密码为slave
  4. 给slave用户授权

    • grant replication slave on . to 'slave'@'192.168.1.%';
  5. 从服务器开启binlog配置server-id,开启中继日志relay_log=/path/to/mysql-relay-bin,中继日志索引relay_log-index=/path/to/mysql-relay-index 所有的server-id不能重复
  6. 从服务器配置主服务器信息

    • change master to mastr_host='192.168.1.35',master_port=3306,master_user='slave',master_password='slave',master_log_file='mysql-bin.001',master_log_pos=100;
    • 指定开始主从复制时主节点binlog文件,以及开始复制的位置(pos),
    • 主服务器执行show master status可以查看当前bin log 文件名和position,重启mysql服务,会发生变化
  7. start slave; 开启从服务
  8. 从执行show slave statusG 查看状态
  9. 在数据目录下有一个auto.cnf文件,记录了一个uuid 主从的uuid不能重复,否则报错
查看原文

赞 0 收藏 0 评论 0

mafa1993 发布了文章 · 5月5日

php-fpm优化,3种运行模式详解

三种工作模式

ondemand,static,dynamic(内存优先、静态池、服务优先)

ondemand

php-fpm启动的时候不会启动worker进程,按需启动worker,有链接进来后,才会启动

listen = 127.0.0.1:9001
pm = ondemand 
pm.process_idle_timeout = 60
pm.max_children = 10

连接到来时(只有链接,不没有数据也会创建,telnet也会创建),创建新worker进程,worker进程数的创建收max_children设置限制,也受限于全局的process.max设置(三种模式都受限此,下文中有全局配置项讲解),如果空闲时间超过了process_idle_timeout的设置就会销毁worker进程

  • 优点:按流量需求创建,不浪费系统资源,
  • 缺点:因为php-fpm是短连接的,如果每次请求都先建立连接,大流量场景下会使得master进程变得繁忙,浪费cpu,不适合大流量模式
  • 不推荐使用此模式

dynamic

会初始化创建一部分worker,在运行过程中,动态调整worker数量,最大worker数受pm.max_children和process.max

listen = 127.0.0.1:9001
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6
  1. 当空闲进程数小于min_spare_servers时,创建新的子进程,总子进程数小于等于pm.max_children,小于等于process.max
  2. 当空闲进程数大于max_spare_servers,会杀死启动时间最长的子进程
  3. 如果子进程(idle状态)数大于max_children,会打印warning日志,结束处理
  4. process小于 max_children ,计算一个num,启动num个worker
  5. 优点:动态扩容,不浪费系统资源
  6. 缺点:所有worker都在工作,新的请求到来需要等待创建worker进程,最长等待1s(内部存在一个1s的定时器,去查看,创建进程),频繁启停进程消耗cpu,请求数稳定,不需要频繁销毁

static

启动固定大小数量的worker,也有1s的定时器,用于统计进程的一些状态信息,例如空闲worker个数,活动worker个数

pm.max_children = 10   #必须配置这个参数,而且只有这个参数有效
  1. 优点:不用动态判断负载,提升性能
  2. 缺点:如果配置成static,只需要考虑max_children数量,数量取决于cpu的个数和应用的响应时间,一次启动固定大小进程浪费系统资源

模式选择

  1. 静态适合大内存机器,动态适合小内存服务器,2g,ondemand模式适合微小的内存,2g以下
  2. 进程数不是越多越好,进程数增多会增加进程管理开销以及进程上下文切换,并发执行数也不会超过cpu核数,cpu密集型,pm.max_children不能超过cpu内核数,如果不是可以将pm.max_children的值设置大于cpu核数
  3. 动态建立进程个数

    • N+20% 到 M/m之间
    • N是cpu核数,M是内存,m是每个php进程内存数
  4. 静态进程个数

    • M/(m*1.2)
    • pm.max_requests, 设置最大请求数,达到这个数量以后,会自动长期worker进程,繁殖内存意外增长

其他配置讲解

# 全局设置
process.max = 10 #最大进程数

# www.conf
user = nobody # 进程发起的用户和用户组,nobody为任意用户,user必须设置,group不用
group = www

listen = [::]:9000

pm = dynamic   # 进程池管理器如何控制子进程数量,static,静态,固定值  dynamic 动态 ondemand
pm.max_children = 16    # 同一时刻能够存活的最大子进程数
pm.start_servers = 4    # 启动时启动的子进程数
pm.min_spare_servers = 2   # 处于空闲 idle状态的最小进程,如果空闲进程数量小于这个值,那么相应的子进程会被创建, 可以有效的减少创建的进程数,请求处理不过来,才会循序渐进的创建 
pm.max_spare_servers = 16   # 最大空想进程数,空闲子进程数超过这个值,那么相应的子进程会被杀掉
catch_workers_output = yes  # worker进程的标准输出和错误输出会重定向到错误日志中,没有设置会输出到/dev/null

;slowlog = xxx   # 默认关闭,慢日志路径
;request_slowlog_timeout = 0   # 脚本执行超过多久就记录到日志文件
查看原文

赞 0 收藏 0 评论 0

mafa1993 赞了回答 · 5月5日

有没有朋友知道php并发执行为什么会有大批进程休眠了

查到原因了,mysql进程出现大量的state为writing to net导致PHP进程阻塞了。
可能是虚拟机的出入网口流量不太行

关注 2 回答 2

mafa1993 发布了文章 · 5月4日

nginx优化(二)io优化 直接io与零拷贝等

nginx优化(二)io优化 直接io与零拷贝

nginx io相关基础配置

  1. debug_points abort|stop; 在main模块,当nginx产生套接字泄漏时,要不要停止,产生core文件,产生core文件会占用io
  2. error_log file|stderr[debug|info|notice|warn|error|crit|alert|emerg],定义错误日志记录的地方以及日志级别,在main,http server location模块中定义,stderr会输出到屏幕,标准错误输出

直接io

顾名思义直接落盘

  1. 直接io,绕开磁盘高速缓存

    • 正常情况下,文件读写都先读写用户存储的缓冲区,然后读写内核缓冲区,我们可以让读写操作绕过内核缓冲区,直接读写用户缓冲去,提高速度,避免磁盘缓存页的拷贝
    • directio size|off,定义多大的文件直接io,如 directio 10m;
    • directioaligiunent 文件偏移量,默认的即可
    • 高速缓冲区作用,某些文件存入高速缓冲区,可以复用,大文件直接读取,小文件缓存

绕过磁盘高速缓存

异步io

  1. 异步io,aio

    • 在发生io阻塞的时候,让其去处理其他任务,
    • aio on|off threads=[pool],server模块中配置
    • nginx的worker进程发生io阻塞以后,把阻塞io的任务放入到一个新的如无队列中,利用线程去处理这些阻塞io的任务,完成后返回给nginx
    • 定义线程池

      • thread_pool name threads=number [max_queue=number]; 在main中定义
      • 默认配置thread_pool default threads=32 max_queue=65535;
      • aio on threads=default; 使用线程
    • 需要nginx有threads和file-aio模块
    • aio和直接io,两个必须同时出现
    • sendfile和直接io是互斥的,两个不能同时存在,直接io不经过磁盘io,0拷贝时从磁盘io直接发送到socket,所以存在互斥性

零拷贝

  1. sendfile零拷贝

    • sendfile on | off;在http server loction模块中定义,
    • sendfile_max_chunk size; 一次sendfile的数据量
    • 正常情况下,读取文件,先从磁盘(内核)拷贝到应用程序缓冲区(用户),然后应用程序缓冲区将内容写入到socket缓冲区(内核),然后发送到网卡,零拷贝,从磁盘直接拷贝到socket缓冲区

零拷贝原理

查看原文

赞 0 收藏 0 评论 0

mafa1993 发布了文章 · 5月3日

nginx优化(一)cpu相关

nginx优化

  1. 增大nginx使用cpu的有效时长

    • 使其能够使用全部cpu资源
    • nginx进程间不争抢cpu资源(繁忙的worker进程不应让出,资源调度不应让出资源)
    • 不和其他进程争抢资源(提升优先级使其占用cpu时间更长,减少操作系统上耗资源的非nginx进程)

      • 阻塞api会导致主动让出cpu(程序处理尽量不进行阻塞)
      • 业务场景产生的阻塞api(同步读网络报文)

        • 同步:报文的发送和接受是同步进行的,发送后等待接受。 就是请求发送后需要等待响应
    • worker进程数量设置

      • 不能超过逻辑核数的4倍,一般设置为何逻辑核数一样即可
      • 两核设置worker_processes 2;
    • 减少进程上下文切换

      • 主动切换的触发条件,sleep,资源调度阻塞等
      • 被动切换,时间片耗尽(静态优先级,nice,top命令中的NI列,值为-20到19,动态优先级,top中的PR列,越低时间片越长)
      • worker_priority 0; main模块设置优先级
    • 绑定cpu,多核cpu进程切换后,如果改变了运行cpu的核,会导致一些缓存丢失,绑定后利用固定的cpu响应用户请求,可以利用缓存(时间片轮训导致运行的cpu核改变)

      • worker_cpu_affinity auto/cpumask; main模块 auto为自动绑定cpu和进程,cpumask是cpu掩码,手工配置,有几个nginx进程,写几个worker_cpu_affinity 0001 0010; #4核两个进程 绑定不同的cpu
  2. 连接数

    • io模型选择

      • use epoll; use event,events模块,配置需要使用什么事件模型,不需要配置,会自动选择一个最优的
    • 单个worker允许连接的数量

      • worker_connections number; number的计算方式 一个connection大约232个字节,event约有96个字节,一个连接共占用大约232+96*2(读写两个事件)B内存左右
    • worker进程最大打开文件数

      • 文件数会限制连接数,此参数收最大文件句柄数限制,超过了最大句柄数限制,就会报 too many open file错误,大并发时可能句柄不够用
      • worker_rlimit_nofile number; events模块设置
      • cat /proc/sys/fs/file-max 内核最大的文件数(默认是内存百分之10可打开的数量)
      • 单个进程可分配的最大文件数 cat /proc/sys/fs/nr_open 单个进程的不能超过内核的
    • 修改用户的文件句柄数

      • ulimt -n 查看用户的最大句柄数
      • ulimit -HSn 1000 修改,临时修改,-H为硬限制,-S是软限制
      • /etc/security/limits.conf 永久修改,对用户进行设置
      • nofile中的 hard limit不能超过单个进程的数量,如果超过了,无法建立新的连接,xshell新窗口都打不开

        • 文件描述符设置:``
a.所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max ,内核的文件描述符数
b.单个进程打开的文件描述符数不能超过user limit中nofile的soft limit,进程打开的数量受用户的限制,但是设置的时候必须要设置的比用户的大,进程的设置要比用户大,用户操作也需要一个文件操作描述符
c.nofile的soft limit不能超过其hard limit 
d. nofile的hard limit不能超过/proc/sys/fs/nr_open,进程必须大于用户的
查看原文

赞 2 收藏 2 评论 0

mafa1993 发布了文章 · 5月1日

cgi、fastcgi、php-cgi、php-fpm异同

1. cgi
    - 通用网关接口,就是外部应用程序(cgi程序)与web服务器之间的接口标准。
    - nginx是内容分发者,如果是请求index.php,根据配置文件内容得知不是静态文件,就会去找对应的cgi程序进行解析
    - cgi就是规定要传那些数据,以什么格式传递给后方进行处理的协议
    - cgi工作模式,一个请求发送过来,启动cgi解释器(创建进程)-> 逻辑处理 -> 退出 (fork and exec 模式) 每次都需要重新创建进程,加载配置,浪费系统资源

2. fastcgi
    - 快速通用网关接口,常驻型的cgi,不用每次都fork进程,其会使cgi解解释器进程常驻内存,所以性能较高
    - master-worker模型,服务器启动时载入fastcgi进程管理器
    - fastcgi会进行自身初始化,初始化时会创建多个进程
    - 请求到达web服务器后,fastcgi进程管理器会选择并通过socket连接到一个cgi解释器

3. php-cgi
    - php自带的cgi管理器
    - php-cgi的缺点,不能平滑重启,需要重启php-cgi才能使php.ini生效

4. php-fpm
    - php-fpm是php的一种fastcgi的实现,管理php的fastcgi进程池
    - 能够调度php-cgi程序
    - 能够实现平滑重启
    - php-fpm创建一个master进程,然后创建进程池,监听socket,fork出多个子进程,子进程各自accept请求,php-fpm的子进程同时只能响应一个请求,处理完一个请求才可以accept下一个请求,多进程,同步阻塞模型
    - master和worker进程之间不直接进行通信,master通过共享内存获取worker进程信息,master进程发送信号通知worker进程
    - php-fpm可以同时监听多个端口,每个端口对应一个worker pool
    - worker是cgi程序,php-fpm是fastcgi协议的php是实现

查看原文

赞 0 收藏 0 评论 0

mafa1993 回答了问题 · 5月1日

Elasticsearch快速并发插入数据会丢数据?

elasticsearch bulk入库文件大小有限制,如果bulk文件过大会导致录入失败,你需要把录入后的返回打印查看,还有你bulk文件是怎么写的,是不是有重复的,由create变成了update导致,最后还有elasticsearch有个延后,默认30s,录入到数据可搜索有延迟,bulk文件也需要时间处理,使用task API进行查看是否有bulk任务正在执行

关注 2 回答 1

mafa1993 回答了问题 · 4月30日

有没有朋友知道php并发执行为什么会有大批进程休眠了

io阻塞中断了吧

关注 2 回答 2

认证与成就

  • 获得 4 次点赞
  • 获得 3 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 3 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 4月30日
个人主页被 106 人浏览