Demor's Blog

Keep Growing


  • Home

  • Tags

  • Categories

  • Archives

  • Sitemap

  • Search

初始Kafka

Posted on 2018-03-19 | In KeepLearning | | Visitors:

消息队列

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性的架构,是大型分布式系统中不可缺少的中间件

使用场景

异步处理

串行方式:用户注册->写入数据库->发送注册邮件->发送注册短信

并行方式:用户注册->写入数据库->发送邮件并且发送短信

消息队列:用户注册->写入数据库->写入消息队列->发送邮件和短信的消费者异步读取消息队列,写入消息队列即将结果返回给客户端

流量大的时候redis并不可靠

应用解耦
用户下单后,订单系统需要通知库存系统

传统方式:订单系统调用库存系统的接口

消息队列:

    订单系统:当用户下单后,将订单内容写入消息队列,返回订单下单成功

    库存系统:订阅下单的消息,采用拉/推的方式获取下单的信息,库存系统根据下单的信息,进行库存操作

流量削锋
秒杀活动,因为流量过大,导致流量暴增

传统方式:突然接受来自前端大量订单请求

消息队列:在应用前端加入消息队列

用户请求,服务器接收后首先写入消息队列,超过最大数量,直接抛弃用户请求或者跳转到错误页面,

秒杀业务根据消息队列的信息进行相关处理

日志处理

解决大量日志传输的问题
日志采集客户端负责日志数据采集写入Kafka

Kafka消息队列负责日志数据的接受、存储和转发

日志处理应用:订阅并消费Kafka队列中的日志数据

生产环境中,使用较多的消息队列有ActiveMQ、RabbitMQ、Kafka、RocketMQ

Read more »

初识ElasticSearch

Posted on 2018-03-08 | In 技术笔记 | | Visitors:

数据分类

  • 结构化数据

概念

行数据,存储在数据库里,可以使用二维表结构来逻辑表达实现的数据,能够用数据或者统一的结构加以表示
数字、符号

  • 非结构化数据

无法使用数字或者统一的结构表示

文本、图像、声音、网页

结构化数据属于非结构化数据

非结构化数据即为全文数据

全文检索

一种将文件中或者数据库中所有文本与检索匹配的文字资料检索的方法称之为全文检索

两种方法
  • 顺序扫描法

    将数据表中所有数据进行挨个扫描,然后对每一个扫描的内容进行逐字扫描,非常慢

  • 索引扫描法

    全文检索的基本思路,即将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的

全文检索过程

两个过程

  • 索引创建

    索引创建只会创建一次。索引保存了什么?————索引就是一个字典

第一步:将一些索引的源文档拿出

第二步:将源文档传递给分词组件,将内容拆分成一个个单词,去掉标点符号,去掉停词

第三步:将得到的词元传给语言处理组件,变成小写,将单词缩减为词根形式,将单词转换为词根形式

第四步:将得到的词传递给索引组件,利用得到的词创建一个词典,对词典安字母顺序进行排序,合并相同的词组合成一个链表

Read more »

Warning:require(): open_basedir restriction in effect. File

Posted on 2018-01-20 | In 常见错误 | | Visitors:

【问题描述】

使用lnmp新建一个项目的时候,引入上级文件报错

1
Warning: require(): open_basedir restriction in effect. File(/home/wwwroot/my.cmf.com/simplewind/thinkphp/base.php) is not within the allowed path(s): (/home/wwwroot/my.cmf.com/public/:/tmp/:/proc/) in /home/wwwroot/my.cmf.com/public/index.php on line 39

原因

大体意思就是open_basedir生效中,没有权限访问当前路径

1
2
3
4
5
6
7
8
open_basedir
#限制可以访问的路径
#可以在php.ini里设置,也可以在nginx下设置

#在文件fastcgi.conf中有
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";

限制了不能引入上一级的文件

关于open_basedir的描述在这个博客里有讲到
https://www.iamle.com/archives/1854.html

Redis安全性简介

Posted on 2018-01-17 | In 技术笔记 | | Visitors:

Redis安全性

常规安全模式

Redis被设计成仅有可信环境下的可信用户才可以访问

网路安全

仅可信的网络用户才可以访问Redis端口

redis.conf 修改 bind 127.0.0.1

认证的特性

Redis没有尝试去实现访问控制,提供了一个轻量级的认证方式,可以编辑redis.conf文件来启用

认证授权方式启用后,Redis会拒绝来自没有认证的用户的任何查询

密码是明文配置在redis.conf文件中的

Redis并不支持加密,需要实现新增的保护层,例如SSL代理

禁用特殊命令

在Redis可以禁用命令或者将他们重命名成难以推测的名称,这样普通用户就只能使用部分命令了

在redis.conf中

rename-command CONFIG basdadjdh23234j
或者删除这个命令
rename-command CONFIG ''

外部客户端通过仔细构造的输入触发的攻击

一个攻击者可以通过提交表单提交大量一样的字符串到哈希表里,是的O(1)的算法复杂度(平均时间)达到最差的O(N),Redis将需要更多的CPU来处理,到最后会导致无法提供服务

为了防止这类特殊的攻击,redis的哈希函数使用per-excution的伪随机种子

Redis持久化简介

Posted on 2018-01-11 | In 技术笔记 | | Visitors:

RDB Redis DataBase

可以在指定的时间间隔内生成数据及的时间点快照

  • 是一个非常紧凑的文件,保存了Redis在某个时间点上的数据集,适用于进行备份。

  • 非常适用于灾难恢复:只有一个文件,并且内容非常紧凑,可以在加密后将它传送到别的数据中心

  • 可以最大化Redis性能:服进行在保存RDB文件唯一要做的就是fork一个子进程,然后子进程就会处理接下来所有的保存工作,服进行无须执行任何磁盘I/O操作
  • 在恢复大数据集时笔AOF速度要快
  • 发生错误时,会有几分钟的数据丢失
  • 每次保存RDB时都需要fork子进程,数据量大时,会非常耗时,如果CPU时间紧张,就会停止处理客户端

AOF Append Only File

记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集

AOF文件中的命令全部以Redis协议的格式保存,新命令会被追加到文件的末尾

Redis还可以在后台对AOF文件进行重写,使得AOF文件的提及不会超出保存数据集状态所需的实际大小

  • 会让Redis变得非常耐久:可以设置不同的fsync策略,默认每秒fsync一次
  • AOF文件是一个只进行追加操作的日志文件,对AOF文件写入不需要进行seek
  • Redis

可以同时使用AOF持久化和RDB持久化,在Redis重启时,会优先使用AOF文件来还原数据集,因为AOF保存的数据集通常比RDB文件更加完整

Linux设置VIP

Posted on 2018-01-09 | In 技术笔记 | | Visitors:

问题描述

在使用VMVare时,因为mac的ip经常会改变,每次重启虚拟机的时候IP也会改变,所有就要去改host去访问虚拟机中的项目,很麻烦,其实可以固定虚拟机的ip,及时宿主机ip变了也不会改变

1
2
3
sudo -s

vim /Library/Preferences/VMware\Fusion/vmnet8/dhcpd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/bin/bash
# Configuration file for ISC 2.0 vmnet-dhcpd operating on vmnet8.
#
# This file was automatically generated by the VMware configuration program.
# See Instructions below if you want to modify it.
#
# We set domain-name-servers to make some DHCP clients happy
# (dhclient as configured in SuSE, TurboLinux, etc.).
# We also supply a domain name to make pump (Red Hat 6.x) happy.
#


###### VMNET DHCP Configuration. Start of "DO NOT MODIFY SECTION" #####
# Modification Instructions: This section of the configuration file contains
# information generated by the configuration program. Do not modify this
# section.
# You are free to modify everything else. Also, this section must start
# on a new line
# This file will get backed up with a different name in the same directory
# if this section is edited and you try to configure DHCP again.

# Written at: 11/08/2017 23:14:55
allow unknown-clients;
default-lease-time 1800; # default is 30 minutes
max-lease-time 7200; # default is 2 hours

subnet 192.168.37.0 netmask 255.255.255.0 {
range 192.168.37.128 192.168.37.254;
option broadcast-address 192.168.37.255;
option domain-name-servers 192.168.37.2;
option domain-name localdomain;
default-lease-time 1800; # default is 30 minutes
max-lease-time 7200; # default is 2 hours
option netbios-name-servers 192.168.37.2;
option routers 192.168.37.2;
}
host vmnet8 {
hardware ethernet 00:50:56:C0:00:08;
fixed-address 192.168.37.1;
option domain-name-servers 0.0.0.0;
option domain-name "";
option routers 0.0.0.0;
}



#在这里添加你的虚拟机的固定ip
host 你的虚拟机的名字 {
hardware ethernet 00:50:56:C0:00:08;
fixed-address 192.168.37.88;
}
# hardware ethernet查看上面配置
# fixed-address 你要配置的固定ip

MySQL慢查询

Posted on 2018-01-08 | In 技术笔记 | | Visitors:

MySQL 慢查询的相关参数解释:

slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭。

log-slow-queries :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log

slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log

long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志。

log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。

log_output:日志存储方式。log_output=’FILE’表示将日志存入文件,默认值是’FILE’。log_output=’TABLE’表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=’FILE,TABLE’。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。

//查看是否开启慢查询,默认为OFF
mysql> show variables  like '%slow_query_log%';
//开启慢查询(仅对当前一次有效,重启后就失效了)
mysql> set global slow_query_log = 1;
//修改慢查询记录触发时间为4秒,默认为10秒
mysql> set global long_query_time = 4;

//修改my.cnf文件修改参数永久有效
在my.cnf文件里增加
//开启慢查询
slow_query_log =1
//指定慢查询日志文件
slow_query_log_file=/tmp/mysql_slow.log
//设置慢查询记录时间
long_query_time = 4

系统变量log-queries-not-using-indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用full index scan的sql也会被记录到慢查询日志。
set global log_queries_not_using_indexes=1;



慢查询日志分析工具
mysqldumpslow 日志文件路径

mysqldumpslow /usr/local/var/mysql/Demoer-slow.log

Nginx 504解决方案

Posted on 2018-01-06 | In 技术笔记 | | Visitors:

修改nginx.conf文件

在http{

#添加如下配置

}

gzip on
gzip_min_length  1k;
gzip_buffers     4 128k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
gzip_vary on;
gzip_proxied   expired no-cache no-store private auth;
gzip_disable   "MSIE [1-6]\.";

fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;#8 128
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

修改php-fpm.conf

http://blog.csdn.net/senlin1202/article/details/50800194

如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设 置成0s。

0s的含义是让PHP-CGI一直执行下去而没有时间限制。

而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽 带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根 据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分 钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。

而”max_children” 这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。

设置”max_children” 也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我 设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我 的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处 理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

max_requests即是说每个进程若超过这个数目(跟php进程有一点点关系,关 系不大),就自动杀死..我这里应该设置512的,不过懒得压力测试了,设置大一点,不过也不要设置过大,是个结构体,没测试过,接近8K到9K大小.网 上动辄设置100k,有点浪费内存了.一个进程浪费大小接近1M.按照网上常用配置的128个进程,大概浪费100M左右.好吧,我承认100M是白菜 价,但也别这样浪费..= =

max_children基本就是进程数,跟nginx的进程没有想象中的那么大,因为FPM会自己管理进程(有待考证,起码我简单浏览了一下源码,认为是这个意思).参数不宜设置过大,很占内存,进程的消耗就不用我多说了.

max_children较好的设置方式根据req/s来设置,若程序是 100 req/s的处理能力..最大并发是10K,那么就设置 100比较好,这是动态来调整的.

Mysql Explain使用详解

Posted on 2018-01-01 | In 技术笔记 | | Visitors:

Mysql Explain 是常用分析mysql性能的工具,下面简单说一下各参数的分析

1)id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询。

2)select_type列常见的有:
    A:simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个
    B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个
    C:union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
    D:dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响
    E:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null
    F:subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
    G:dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
    H:derived:from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select

3)table
显示的查询表名,如果查询使用了别名,那么这里显示的是别名,如果不涉及对数据表的操作,那么这显示为null,如果显示为尖括号括起来的<derived N>就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生。如果是尖括号括起来的<union M,N>,与<derived N>类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集。
Read more »

beginning-c-nine

Posted on 2017-11-09 | In 《C语言程序设计》 | | Visitors:

在程序进行通常的编译之前先对程序中的这些特殊命令进行预处理,再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码

预处理、编译、连接

C提供的预处理功能主要有三种1、宏定义2、文件包含3、条件编译 均以#开头

9.1 宏定义

9.1.1 不带参数的宏定义

1
2
#define 标识符 字符串
#define PI 3.1415926

9.1.2 带参数的宏定义

1
2
3
4
5
6
7
带参数的宏定义不是进行简单的字符串替换,还要进行参数替换
#deine 宏名(参数表) 字符串

#define S(a,b) a*b

area = S(3,2);
area = 3 * 2;

9.2 文件包含处理

1
2
3
4
5
6
#include "文件名"//系统先在用户当前目录中寻找要包含的文件,若找不到再按照标准方式查找
#include <文件名>//系统存放C库函数都文件的目录中寻找要包含的文件,成为标准方式

自己的用"",系统的用<>

包含了之后就是一个文件了
Read more »
12345
Demor

Demor

43 posts
11 categories
25 tags
© 2016 — 2019 Demor
Powered by Hexo
|
Theme — NexT.Pisces v5.1.4