[MySQL优化案例]系列 — 分页优化

通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询。例如下面这个SQL:

SELECT * FROM `t1` WHERE ftype=1 ORDER BY id DESC LIMIT 100, 10;

或者像下面这个不带任何条件的分页SQL:

SELECT * FROM `t1` ORDER BY id DESC LIMIT 100, 10;

一般而言,分页SQL的耗时随着 start 值的增加而急剧增加,我们来看下面这2个不同起始值的分页SQL执行耗时: Continue reading

基本调优工具


mpstat - 查看CPU使率信息
vmstat - 报告虚存统计数据
iostat - 报告CPU状态和存储I/O统计数据
netstat - 报告络栈各项参数
ps - 系统上运的进程及其状态
top - 报告占CPU和内存最的进程
sar - 报告系统活动状态
pidstat - 检查具体某个进程的CPU和内存情况
perf - 综合性能检查具


sysctl - 调整内核参数
strace - 跟踪进程的执
dtrace - 综合跟踪具
stap - 综合跟踪具
taskset - 绑定执CPU
pmap - 报告进程内存映射信息
free - 报告物理帧和虚拟帧信息
dmesg - 系统启动信息,包括对各设备的监测
/proc - 各项系统参数读写接


/sys - 额外系统参数读写接
iotop - 类似top,但于检测I/O
ionice - 类似nice,但于设置进程的I/O优先级
ifcong - 监测与配置络接
tcpdump - 捕获某个络接上的流量
nicstat - 监测卡状态
sysctl - 调整内核参数
strace - 跟踪进程的执
dtrace - 综合跟踪具
stap - 综合跟踪具
taskset - 绑定执CPU
pmap - 报告进程内存映射信息
free - 报告物理帧和虚拟帧信息
dmesg - 系统启动信息,包括对各设备的监测
/proc - 各项系统参数读写接
mpstat - 查看CPU使率信息
vmstat - 报告虚存统计数据
iostat - 报告CPU状态和存储I/O统计数据
netstat - 报告络栈各项参数
ps - 系统上运的进程及其状态
top - 报告占CPU和内存最的进程
sar - 报告系统活动状态
pidstat - 检查具体某个进程的CPU和内存情况
perf - 综合性能检查具

RabbitMQ中的ack介绍

no_ack 的用途:确保 message 被 consumer “成功”处理了。这里“成功”的意思是,(在设置了 no_ack=false 的情况下)只要 consumer 手动应答了 Basic.Ack ,就算其“成功”处理了。

对于ack简单的说就是“消费者”先从queue里读取一条数据,然后去处理,等处理完了,再给queue一个 ack 回应,表示处理完了,这时queue就将这条数据从队列中删除。如果不回应给队列ack的话,则这条消息仍然存在在queue中(这个也属于一种应用场景)。 Continue reading

RabbitMQ管理后台操作流程

默认的管理地址为 http://localhost:15672

rabbit_steps

1.创建一个虚拟主机

这个在后台的"Admin"页面的右侧第二个菜单可以找到。为了方便管理,每一个步都使用一个前缀来命名,每一步的前缀是不一定的,这样方便管理。

命名:VHost_虚拟主机名称

2.创建一个交换机

命名:Ex_交换机名称

3.创建一个队列

命名:Queue_队列名称

4.将交换机与队列进行绑定,通过指定路由关键字实现

命名:RouteKey_路由关键字

RabbitMQ中Ack的介绍:http://blog.haohtml.com/archives/15285

RabbitMQ的结构图如下

rabbitmq-struct

几个概念说明:
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer:消息生产者,就是投递消息的程序。
consumer:消息消费者,就是接受消息的程序。
channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

Continue reading

将rabbitmq 里的消息持久化

消息持久设置:

1) 将交换机置为可持久;
2) 将通道置为可持久
3) 消息发送时设置可持久。
当我们“生产”了一条可持久化的消息,尝试中断MQ服务,启动消费者获取消息,消息依然能够恢复。相反,则抛出异常。
上面三条必须全部设置,不然消息将无法持久化。

rabbitmq 添加远程访问功能

刚刚安装过的rabbitmq 消息队列,并启用了插件管理功能,3.3.1版中,处于安全的考虑,guest这个默认的用户只能通过http://localhost:15672 来登录,其他的IP无法直接使用这个账号。 这对于服务器上没有安装桌面的情况是无法管理维护的,除非通过在前面添加一层代理向外提供服务,这个又有些麻烦了,这里通过配置文件来实现这个功能。

只要编辑 /etc/rabbitmq/rabbitmq.config 文件,添加以下配置就可以了。

[
{rabbit, [{tcp_listeners, [5672]}, {loopback_users, ["asdf"]}]}
].

现在添加了一个新授权用户asdf,可以通过外网使用这个用户名和密码访问.(记得要先用命令添加这个命令才行,  #rabbitmqctl  add_user asdf pwd123456)我是通过在管理平台里直接添加的用户和密码的,我的测试环境装有桌面的。
参考文档:http://www.rabbitmq.com/access-control.html

# rabbitmqctl add_user asdf pwd123456
# rabbitmqctl list_users
Listing users ...
asdf
guest   [administrator]

Setting permissions for user "asdf" in vhost "/" ...

# rabbitmqctl set_permissions -p "/" asdf ".*" ".*" ".*"
# rabbitmqctl list_permissions -p /
Listing permissions in vhost "/" ...
asdf .* .* .*
guest .* .* .*

可以看到添加用户成功了,但不是administrator角色,这里我们也将asdf用户设置为administrator角色.

# rabbitmqctl set_user_tags asdf administrator
Setting tags for user "asdf" to [administrator] ..

# rabbitmqctl list_users
Listing users ...
asdf [administrator]
guest [administrator]

我用rpm包安装的rabbitmq,所以提供默认的配置参考文件(/usr/share/doc/rabbitmq-server-3.5.0/rabbitmq.config.example),如果你使用源码编译的话,可以找到一个默认的配置文件rabbitmq.config.example,点击这里下载此文件rabbitmq.config

$sudo rabbitmqctl set_permissions -p /vhost1 user_admin '.*' '.*' '.*'

该命令使用户user_admin具有/vhost1这个virtual host中所有资源的配置、写、读权限以便管理其中的资源

【架构】关于RabbitMQ

1      什么是RabbitMQ?

RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然:
rabbitmq_decouping
Continue reading