Zabbix监控工具

1.什么是监控
监视,控制
2.为什么要做监控
教室: 监控学员的学生状况
超市: 防偷
马路: 事故(事后追溯)
监控:  本质上是  行为  

系统为什么要做监控:
监控是整个运维乃至整个产品生命周期中最重要的一环.
事前及时预警发现故障,事后提供详实的数据用于追查定位问题。

3.监控怎么做,比如我要监控内存的使用率,低于百分之20则报警
1.提取内存的指标
2.判断比对 ,与管理人员设定的阈值
3.大于百分之20, 则忽略
4.小于百分之20, 则触发警告
4.监控有哪些工具来辅助实现
cacti         用于监控网络设备   交换机 路由器 防火墙    流量为主
Nagios        用于监控系统   
Zabbix        用于监控系统    web界面  分布式  报警 自带模板
open-falcon   小米公司
Prometheus+grafana
5.如何着手监控
1.硬件监控      ( 交换机  路由器  防火墙  服务器 )   DELL  IRDAC   ipmi
2.系统监控      ( CPu  内存  磁盘   IO  )
3.服务监控      ( nginx  php   mysql   tomcat  ....... )
4.日志监控      ( ELK 架构    )
5.web监控     ( 请求延时 响应延时 加载时间  ..... pv uv ip )
6.业务监控       新增用户  流量  购买量 
7.分布式监控 多机房监控 proxy
8.自动化监控 自动的添加主机进行监控

6.单机时代如何监控

命令监控
监控层面:

        cpu:    top htop
        内存: free -m     大量消耗内存会占用swap,如果没有swap 则会触oom
        磁盘:   df -h 空间  iotop
        网络:   ifconfig route iftop nethogs nethogs -v 3
        glances 工具

引用shell脚本 + crond 定时任务 (监控当前系统用户登录的数量 超过4 则报警)

for ip in {7..9}
do
    users=$(ssh root@172.16.1.$ip "who|wc -l")
    
    if [ $user -ge 3 ];then
        echo "报警通知  172.16.1.$ip"
    fi
done

--------------------------------引入zabbix监控----------------------------------------

4.安装zabbix4.0

1.配置yum仓库

rpm -ivh http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm

2.安装zabbix相关功能组件
DNS地址变更,网络快可忽略
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DNS1="8.8.4.4"
systemctl restart network

安装php72w 依赖httpd环境,安装php72

yum -y install php*   --skip-broken 

避免网络延迟导致失败时使用,多次尝试下载

yum install zabbix-server-mysql zabbix-web-mysql httpd mariadb-server -y
yum install zabbix-web-mysql -y
yum install zabbix-web-mysql -y
yum install zabbix-web-mysql -y
yum install zabbix-web-mysql -y
yum install zabbix-web-mysql -y

————————————————

3.创建数据库
# systemctl start mariadb
# systemctl enable mariadb
# mysql -uroot -e "create database zabbix character set utf8 collate utf8_bin;"
# mysql -uroot -e "grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';"
4.导入数据至数据库中
zcat /usr/share/doc/zabbix-server-mysql-4.0.19/create.sql.gz | mysql -uroot -p123123 zabbix
5.配置zabbix-server指向数据库
[root@zabbix-server ~]# grep '^D' /etc/zabbix/zabbix_server.conf 
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
6.启动 Zabbix server 进程
# systemctl enable zabbix-server
# systemctl start zabbix-server
7.配置Zabbix 前端 web页面
vim /etc/httpd/conf.d/zabbix.conf
    .....
    php_value date.timezone Asia/Shanghai
    ....
systemctl restart httpd  #重启Httpd
8.通过url访问zabbix-server

可通过ip地址访问,例:10.0.0.7:10050

    1.根据提示填写信息即可
    2.默认的用户名和密码是
        username: Admin
        password: zabbix

当zabbix初始界面出现错误
解决步骤:

vim /etc/php.ini

post_max_size8M16M

max_execution_time30300

max_input_time60300

date.timezone = Asia/Shanghai

systemctl restart httpd.service 
9.登录zabbix后

1.修改密码
页面右上角小人头,进行修改
2.将zabbix修改为中文

10.如何快速的监控一台主机

1.需要安装zabb-agent
2.agent版本有有要求?
平级
低于

3.安装zabbix-agent (没有依赖)

rpm -Uvh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.14-1.el7.x86_64.rpm

4.配置zabbix-agent,允许172.16.1.71 能够采集172.16.1.7本地的数据

[root@web01 ~]# grep "^[a-Z]" /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=172.16.1.71
Include=/etc/zabbix/zabbix_agentd.d/*.conf

5.启动zabbix-agent

    systemctl enable zabbix-agent
    systemctl start zabbix-agent    
    systemctl restart  zabbix-agent

6.登录zabbix-server web界面

        1.配置-->主机-->添加主机
        2.模板-->关联-->Template Linux OS 

11.zabbix中文乱码

    rpm -ql zabbix-web | grep  /usr/share/zabbix/assets/fonts
    在主机\C\windows下的font中上传
     cd  /usr/share/fonts/dejavu
     mv DejaVuSans.ttf DejaVuSans_bak.ttf
     mv msyh.ttf DejaVuSans.ttf

12.zabbixserver如何监控自己本身?

 rpm -Uvh https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.14-1.el7.x86_64.rpm
    systemctl start zabbix-agent
    systemctl enable zabbix-agen
13.zabbix基础架构**
zabbix-agent
zabbix-server
mariadb
zabbix-web
14.zabbix架构拆分

j将LAMP架构拆分为LAP+MySQL (拆分数据库到单台主机 )

172.16.1.71 zabbix-server  zabbix-web
172.16.1.51 数据库

1.安装数据库

    yum install mariadb-server -y
    systemctl enable mariadb
    systemctl start mariadb

2.创建zabbix库,配置远程授权用户

    create database zabbix character set utf8 collate utf8_bin;
    grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix';

3.在172.16.1.71上进行如下操作

    [root@zabbix-server ~]# mysqldump -B zabbix >zabbix.sql
    [root@zabbix-server ~]# cat zabbix.sql | mysql -h 172.16.1.51 -uzabbix -pzabbix zabbix

4.修改zabbix-server配置的指向

[root@zabbix-server ~]# cat /etc/zabbix/zabbix_server.conf
#DBHost=localhost
DBHost=172.16.1.51
[root@zabbix-server ~]# systemctl restart zabbix-server

5.修改zabbix-web配置的指向

[root@zabbix-server ~]# vim /etc/zabbix/web/zabbix.conf.php
$DB['SERVER']   = '172.16.1.51';

[root@zabbix-server ~]# systemctl restart httpd

自定义监控项

15.如何快速监控一个自定义对象,比如监控当前用户登录数量

Format: UserParameter=<key>,<shell command>
1.使用shell命令提取当前用户登录的数量 who|wc -l
2.使用zabbix-agent将shell命令提取的结果封装一个监控项 UserParameter
3.zabbix-agent自己检查该监控项是否能正确提取到对应的值 zabbix_agentd -p
4.zabbix-server通过zabbix-get检查zabbix-agent端自定义的监控项是否正常 zabbix_get -s 172.16.1.7 -k user_login
5.登录zabbix-web页面, 找到对应的主机, 然后添加对应的监控项.
6.点击检测中--->最新数据--->选择主机--->选择应用级-->检查监控项指标的变化

cat /etc/zabbix/zabbix_agentd.d/all.conf 
UserParameter=user_login,who|wc -l
    
systemctl restart zabbix-agent

zabbix-get   server端检测agent端的取值

server端手动测试取值结果
server端安装zabbix-get

rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-get-4.0.14-1.el7.x86_64.rpm

zabbix_get -s 172.16.1.7 -k user_login

16.如何快速设定一个自定义阈值,比如超过4个人登录则触发报警

1.基于已创建好的监控项设定阈值
2.如果达标则触发
3.如果不达标,继续探测,监视

17.前端展示报警:

1.点击右上角小人头-->正在发送消息-->勾选前端信息中



监控项、触发器、报警通知

1.详细讲解自定义监控

1.认识Template OS Linux 模块的所有监控项都是干什么的
2.自定义一个监控项  ( 创建监控项中的所有选项 )


3.历史保留如何计算? ( 数据 )
days*(items/refresh rate)*24*3600*bytes
items:监控项数量。
days:保留历史数据的天数。
refresh rate:监控项的更新间隔。
bytes:保留单个值所需要占用的字节数,依赖于数据库引擎,通常为 ~90 字节。   

90*(200/60)*24*3600   ~ 24MB    * 200主机 =  5G


4.趋势保留如何计算? ( 图形 )
days*(items/3600)*24*3600*bytes
items:监控项数量。
days:保留历史数据的天数。
bytes:保留单个趋势数据所需要占用的字节数,依赖于数据库引擎,通常为 ~90 字节。

365*(200/3600)*24*3600  ~ 2MB     * 200主机  = 500MB

5.事件如何计算?
days*events*24*3600*bytes
events:每秒产生的事件数量。假设最糟糕的情况下,每秒产生 1 个事件。
days:保留历史数据的天数。
bytes:保留单个趋势数据所需的字节数,取决于数据库引擎,通常为 ~170 字节。

365*1*24*3600    ~ 30MB     *200主机  = 6G 

https://www.zabbix.com/documentation/4.0/zh/manual/installation/requirements


6.自定义监控TCP 11种状态?
    netstat -an | grep -c ESTABLISHED
    netstat -an | grep -c LISTEN
    netstat -an | grep -c SYN_SENT
    netstat -an | grep -c TIME_WAIT

    1.使用shell命令提取状态
    2.通过zabbix-agent将提取的状态封装为一个又一个的监控项目
    3.检查封装后的监控项是否取值正确
    4.创建一个模板
    5.基于模板创建监控项
    6.将主机关联该模板,完成监控
    7.检查监控后的数据

UserParameter=tcp[*], netstat -lntp | grep -c "$1"

7.如何让其他机器也能使用该模板?
    1.推送*.conf文件,这样其他主机也能提取到key对应的值
    2.将主机关联对应的模板

2.自定义触发器
https://www.cnblogs.com/kingle-study/p/10172413.html

1.监控内存的百分比,   如果 低于20%  则触发报警
    1.通过shell命令提取内存的百分比
    2.设定触发器

多条件触发器
2.监控内存, 以及swap 当内存低于百分之20,并且swap使用率超过百分之1% 则触发报警
内存取的是剩余 20
swap取的是已使用 1

变量
监控项
key  | 键值 

and #并且 多个监控项,同时成立
or #或者 多个监控项,一个成立

last() #比对最新的值
avg() #平均值 网络的流量 avg(5m) 进程 负载 IO
diff() #比对上一次文件的内容
nodata() #收不到数据进行报警nodata(5m) 探测主机存活
test.nodata(5m) = 1 这个条件为真 获取不到数据报警
(5m) #表示最近5分钟得到值
(#5) #表示最近5次得到的值

3.自定义图形
1.基于监控项, 创建图形, 可以在模板上创建,这个所有的主机都应用成功
2.基于图形创建, 聚合图形, 将多个小图片整合至一个大图片上 ( 检测中--->聚合图形 )
3.基于聚合图形创建幻灯片, 可以让多张聚合图形进行轮播 (大屏显示器 --> )

扩展: 如果希望出更好看,更炫的图,需要使用grafana   
    注意: grafana只是一个出图,所有的数据都是zabbix提供   (  皮肤 )


    1.安装grafana
        # yum localinstall grafana-6.4.4-1.x86_64.rpm 
    
    
    2.启动grafana  默认监听在3000端口
        # systemctl start grafana-server

    3.安装插件, 集成zabbix
        # grafana-cli plugins install alexanderzobnin-zabbix-app
        # systemctl restart grafana-server

    4.启用已安装好的zabbix插件,这样就完成了集成
    5.配置zabbix数据源
    
    6.grafana  变量   ()

    1.实现一个单条件触发器
    2.实现一个多条件触发器
    3.基于监控项
        1.图形
        2.聚合图形
        3.幻灯片
    4.grafana安装

3.自定义报警

基于监控项-->触发器-->执行动作--> ( 通知  |  执行命令  
1.怎么发        
2.发什么
3.发给谁

邮箱报警
1.修改报警媒介
smtp.qq.com
端口:465
HELo: qq.com
SMTP电邮: 发件人邮箱 *****qq.com
安全连接: SSL
打开验证对端,验证主机
认证:
用户:发件人邮箱 *****qq.com
密码:邮箱授权码
2.收件人设置:
右上角小人头,报警媒介填写接收人邮箱

    1.启用动作
    2.动作中将所有的报警消息通过介质发送给administrator用户
    3.配置介质--> 新建一个发邮件的邮箱介质
    4.配置administrator用户, 填写收件人邮件

https://www.zabbix.com/documentation/3.4/zh/manual/appendix/macros/supported_by_location

修改报警的消息

报警主机:{HOST.NAME1}
报警服务: {ITEM.NAME1}
报警Key1: {ITEM.KEY1}:{ITEM.VALUE1}
报警Key2: {ITEM.KEY2}:{ITEM.VALUE2}
严重级别: {TRIGGER.SEVERITY}

3.配置故障恢复消息,消息内容如下:
恢复主机:{HOST.NAME1}
恢复服务: {ITEM.NAME1}
恢复Key1:{ITEM.KEY1}:{ITEM.VALUE1}
恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2}

{ALERT.SENDTO} #发送的用户
{ALERT.SUBJECT} #发送的主题
{ALERT.MESSAGE} #发送的内容

邮件报警
微信报警
安装python-pip 模块
     yum  install python-pip -y
     pip install requests
     cd /usr/lib/zabbix/alertscipts
     rz weixin.py chown +x weixin.py
     ./weixin.py  WeiXinID   Subject Messages
切记一定要删除,否则导致权限问题。
        rm -f /tmp/weixin.log
        
操作流程:单击管理---> 报警媒介类型--> 创建媒介类型      

企业微信地址,个人可注册
https://work.weixin.qq.com/

登录企业微信

  1. 企业 -> 微工作台里可以直接微信关注,无需要下载企业微信
  2. 通讯录里的账号在发微信脚本中要用到
  3. 应用与小程序可创建应用

发微信的python脚本/usr/local/zabbix/alertscripts/weixin.py
[root@zabbix-server alertscripts]# cat weixin.py

!/usr/bin/env python

-- coding: utf-8 --

author: bgx

date: 2018

comment: zabbix接入微信报警脚本

import requests
import sys
import os
import json
import logging

logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
datefmt = '%a, %d %b %Y %H:%M:%S',
filename = os.path.join('/tmp','weixin.log'),
filemode = 'a')

corpid='xxx'
appsecret='xxx'
agentid=xxx

获取accesstoken

token_url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + appsecret
req=requests.get(token_url)
accesstoken=req.json()['access_token']

发送消息

msgsend_url='https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + accesstoken

touser=sys.argv[1]
subject=sys.argv[2]

toparty='3|4|5|6'

message=sys.argv[2] + "\n\n" +sys.argv[3]

params={
"touser": touser,

"toparty": toparty,

    "msgtype": "text",
    "agentid": agentid,
    "text": {
            "content": message
    },
    "safe":0

}

req=requests.post(msgsend_url, data=json.dumps(params))

logging.info('sendto:' + touser + ';;subject:' + subject + ';;message:' + message)

测试脚本
/usr/local/zabbix/alertscripts/weixin.py 'abc' 'weixin_subject' 'weixin_message'

钉钉报警

钉钉企业的地址
https://oa.dingtalk.com/

钉钉企业告警的注意事项
1.通讯录管理里的userid发钉钉需要用到
2.工作台里可自建应用
3.微应用管理可以管理应用
4.开发账号管理可以查看密码信息

发送钉钉告警的脚本/usr/local/zabbix/alertscripts/zabbix_dingding.py

!/usr/bin/python

-- coding: utf-8 --

curl 'https://oapi.dingtalk.com/gettoken?corpid=xxx&corpsecret=xxx'

import json,urllib2,sys

appkey = 'dingbb89fne7xgn86dri'
appsecret = 'c81LS_3h7pDRB6ul94tzXfyfcwmWaoy68yr-PGn7eG6MVE8RGXqADmw2DYQFsOsX'
agentid = '682880648'
touser = sys.argv[1]
content = sys.argv[2]

tockenurl = 'https://oapi.dingtalk.com/gettoken?corpid=' + appkey + "&corpsecret=" + appsecret
tockenresponse = urllib2.urlopen(tockenurl)
tockenresult = json.loads(tockenresponse.read().decode('utf-8'))
tocken = tockenresult['access_token']

sendurl = 'https://oapi.dingtalk.com/message/send?access_token=' + tocken
headers = {
'Content-Type':'application/json'
}
main_content = {
"touser": touser,
"toparty": "",
"agentid": agentid,
"msgtype": "text",
"text": {
"content": content
}
}
main_content = json.dumps(main_content)
req = urllib2.Request(sendurl,headers=headers)
response = urllib2.urlopen(req, main_content.encode('utf8'))
print(response.read().decode('utf-8'))

手动发钉钉告警测试
chmod +x /usr/local/zabbix/alertscripts/zabbix_dingding.py
/usr/local/zabbix/alertscripts/dingding.py manager8495 '监控测试'

{ALERT.SENDTO} #发送的用户
{ALERT.SUBJECT} #发送的主题
{ALERT.MESSAGE} #发送的内容

4.告警升级 | 告警抑制

1.远程执行命令
2.告警抑制是怎么回事

1个故障 出现 发邮件给运维 邮件
超过1分钟没有被处理 发邮件给经理 微信
超过2分钟没有被处理 发邮件给总监 钉钉

7.自定义模板
8.自定义监控Nginx PHP


自定义监控项模板,及服务的状态监控

1.模板的重要
1.手动添加监控比较麻烦,监控项 -> 图形 -> 触发器。
问题:
1.例如: 100台服务器需要检查81端口
2.例如: 100台服务器81改成82
解决:
使用模板可以解决以上问题, 只需要修改一下模板,然后所有的主机都生效

2.两种模板
系统自带模板
自定义模板

自定义模板的使用
1.创建模板,模板得属于某个主机组(Templates)
2.在模板中创建监控项目、触发器、创建图形
3.新增监控主机时添加对应的模板
4.更改模板的监控项,所以使用模板的主机都会自动变更

建议: 监控的时候都使用模板, 因为模板添加啥的都方便,修改也比较方便

1.zabbix监控windows

环境:
1.zabbix server的ip:10.0.0.71
2.被监控windows的ip:10.0.0.1

1.下载Zabbix Agent

https://www.zabbix.com/downloads/4.0.14/zabbix_agents-4.0.14-win-amd64.zip

2.Windows安装zabbix agent
编辑配置文件D:\zabbix_agents-4.0.14-win-amd64\conf\zabbix_agentd.conf
Server=10.0.0.71

3.运行cmd,将zabbix命令注册为服务(使用管理员) services.msc
"d:\zabbix_agents-4.0.14-win-amd64\bin\zabbix_agentd.exe" --config d:\zabbix_agents-4.0.14-win-amd64\conf\zabbix_agentd.conf --install

4.cmd运行
查看监听netstat -an|find "10050"


5.zabbix_get获取windows信息
zabbix_get -s xxx -k system.uname
zabbix_get -s xxx -k vm.memory.size[free]
zabbix_get -s xxx -k vfs.fs.size[C:,pfree]

6.windows防火墙放开10050端口
1.防火墙关闭的可以跳过这步
2.高级设置->入站规则->新建规则->端口->10050->允许连接->所有

7.zabbix页面上添加windows主机
1.直接应用windows模板
2.验证Windows监控是否正常

编写一个最简单的bat脚本D:\zabbix_agents-4.0.14-win-amd64\echo.bat
@echo off
echo "100"

zabbix配置添加D:\zabbix_agents-4.0.14-win-amd64\conf\zabbix_agentd.conf
UserParameter=echo.test,D:\zabbix_agents-4.0.14-win-amd64\echo.bat


2.zabbix监控Nginx

1.监控Nginx什么内容
    监控Nginx⑦中状态

2.怎么监控
    1.开启Nginx stub status 模块
    2.使用curl命令获取stub_status的数据
    3.将获取数据的方法封装为一个又一个的监控项

3.实施监控
    1.开启nginx stub_status状态
    


    2.编写脚本,提取nginx status的指标
    [root@web01 scripts]# cat nginx_status.sh 
    Nginx_status_file=/tmp/nginx_status.tmp
    Nginx_status_name=status.oldxu.com
    Nginx_status_path=/nginx_status
    curl -sH host:${Nginx_status_name} http://127.0.0.1:80${Nginx_status_path} > ${Nginx_status_file}

    case $1 in
        active)
            echo $[ $(awk 'NR==1 {print $NF}' ${Nginx_status_file}) -1 ]
            ;;
        accepts)
            echo $[ $(awk 'NR==3 {print $1}' ${Nginx_status_file}) - 1 ]
            ;;
        handled)
            echo $[ $(awk 'NR==3 {print $2}' ${Nginx_status_file}) - 1 ]
            ;;
        requests)
            echo $[ $(awk 'NR==3 {print $3}' ${Nginx_status_file}) - 1 ]
            ;;
        reading)
            awk 'NR==4 {print $2}' ${Nginx_status_file}
            ;;
        writing)
            awk 'NR==4 {print $4}' ${Nginx_status_file}
            ;;
        waiting)
            awk 'NR==4 {print $NF}' ${Nginx_status_file}
            ;;
        *)
            echo "USAGE: $0 [active|accepts|handled|requests|reading|writing|waiting]"
            ;;
    esac


    3.配置zabbix-agent, 添加自定义监控项
    [root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/nginx.conf 

UserParameter=nginx_status[*], /bin/bash /etc/zabbix/zabbix_agentd.d/scripts/nginx_status.sh "$1"

    4.重启zabbix-agent
    
    
    5.zabbix-server使用zabbix-get获取监控项的值
    [root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k nginx_status[active]
    10
    [root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k nginx_status[requests]
    20
    
    6.登录zabbix-web
        1.创建模板
        2.创建监控项
        3.创建图形
        4.创建触发器
        5.关联对应主机
        

1.nginx的状态监控
2.nginx日志监控 { 200 300 301 304 404 403 500 401 ....  这些状态出现的次数}


    1.提取日志
    awk '{print $9}' /var/log/nginx/access.log|grep -c "302"
    
    2.自定义监控项,支持传参
    [root@web01 ~]# cat  /etc/zabbix/zabbix_agentd.d/nginx.conf 
    UserParameter=nginx_status_code[*], awk '{print $9}' /var/log/nginx/access.log|grep -c "$1"

    [root@web01 ~]# systemctl restart zabbix-agent
    

    3.server使用zabbix-get获取
    [root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k nginx_status_code[200]
    10000
    [root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k nginx_status_code[302]
    327556


    4.登录zabbix-web
        1.创建模板
        2.创建监控项
        3.创建图形
        4.创建触发器
        5.关联对应主机

================================================================================
监控php
1.监控php端口
2.监控php进程 master worker
3.监控php状态

实施:
    1.如何开启php状态
    2.获取php状态中重要的指标
    3.编写脚本支持传参



1.开启php的状态模块
[root@web01 ~]# cat /etc/php-fpm.d/www.conf
....
pm.status_path = /fpm_status
....


2.配置nginx,将http请求转发给php处理
[root@web01 conf.d]# cat status.oldxu.com.conf 
server {
    listen 80;
    server_name status.oldxu.com;
    location /fpm_status {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}


3.php-fpm状态指标含义
[root@web01 conf.d]# curl -H Host:status.oldxu.com http://127.0.0.1/fpm_status
pool:                 www
process manager:      dynamic
start time:           20/Nov/2019:15:15:19 +0800
start since:          200
accepted conn:        22    #当前池接受的请求数
listen queue:         0     #请求队列,如果这个值不为0,那么需要增加FPM的进程数量
max listen queue:     0     #请求队列最高的数量
listen queue len:     128   #socket等待队列长度
idle processes:       5     #空闲进程数量
active processes:     1     #活跃进程数量
total processes:      6     #总进程数量
max active processes: 1     #最大的活跃进程数量(FPM启动开始计算)
max children reached: 0     #超过最大进程数的峰值的次数,如果不为0,需要调整进程的最大活跃进程数量


4.编写取值脚本
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/scripts/fpm_status.sh 
#!/usr/bin/bash

fpm_status_file=/tmp/fpm_status.tmp
fpm_status_name=status.oldxu.com
fpm_status_path=/fpm_status

curl -sH host:${fpm_status_name} http://127.0.0.1:80${fpm_status_path} > ${fpm_status_file}

case $1 in
    accepted_conn)
        awk '/accepted conn:/{print $NF}' ${fpm_status_file}
        ;;
    listen_queue)
        awk '/^listen queue:/{print $NF}' ${fpm_status_file}
        ;;
    max_listen_queue)
        awk '/^max listen queue:/{print $NF}' ${fpm_status_file}
        ;;
    active_processes)
        awk '/^active processes:/{print $NF}' ${fpm_status_file}
        ;;
    idle_processes)
        awk '/^idle processes:/{print $NF}' ${fpm_status_file}
        ;;
    total_processes)
        awk '/^total processes:/{print $NF}' ${fpm_status_file}
        ;;
    max_active_processes)
        awk '/^max active processes:/{print $NF}' ${fpm_status_file}
        ;;
    max_children_reached)
        awk '/^max children reached:/{print $NF}' ${fpm_status_file}
        ;;
    *)
        echo "USAGE: $0 [accepted_conn|listen_queue|max_listen_queue|active_processes|idle_processes|total_processes|max_active_processes|max_children_reached]"
        ;;
esac

    

5.自定义监控项,支持传参
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/fpm.conf

UserParameter=fpm.status[*], /bin/bash /etc/zabbix/zabbix_agentd.d/scripts/fpm_status.sh "$1"

[root@web01 ~]# systemctl restart zabbix-agent
    
6.server使用zabbix-get获取
[root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k fpm.status[accepted_conn]
2031
[root@zabbix-server ~]# zabbix_get -s 172.16.1.7 -k fpm.status[max_active_processes]
50


7.登录zabbix-web
    1.创建模板
    2.创建监控项
    3.创建图形
    4.创建触发器
    5.关联对应主机

==============================================================================
Mysql的基础监控
1.进程存活
2.检测端口

Mysql的高级监控说明
Mysql提供show global status可以实现对Mysql的高级监控
高级监控包含监控Mysql连接数,增删改查数,流量等

其他的监控mysql的方式
天兔 (文档)
percona (视频)

监控命令详解mysql -uroot -poldxu.com -e 'show global status'
Threads_connected:连接数
Com_select:查询总量
Com_insert:插入总量
Com_update:更新总量
Com_delete:删除总量
Bytes_received: 流入总流量
Bytes_sent:流出总流量
Slow_queries:慢查询总量

1.编写取值脚本check_mysql.sh
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/scripts/mysql_status.sh

!/usr/bin/bash

port=1 key=2
mysql -uroot -poldxu.com -P{port} -e "show global status" |grep "{key}\s" |awk '{print $2}'

2.测试监控Shell脚本
[root@web01 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/mysql_status.sh 3306 Threads_connected

3.Zabbix自定义监控项
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/mysql.conf
UserParameter=mysql.status[*], /bin/bash /etc/zabbix/zabbix_agentd.d/scripts/mysql_status.sh "1" "2" 2>/dev/null

重启agent

4测试能否获取到值
zabbix_get -s xxx -k mysql.status[3306,Threads_connected]
zabbix_get -s xxx -k mysql.status[3306,Com_insert]

5.使用Template DB MySQL模板监控Mysql 利用自带的模板改一改
mysql.status[3306,Threads_connected]
mysql.status[3306,Com_select]
mysql.status[3306,Bytes_received]
mysql.status[3306,Bytes_sent]

写一个测试的程序测一下
[root@web01 ~]# cat mysql.sh
for i in {1..1000}
do
mysql -uroot -poldxu.com -h 127.0.0.1 -e "create database IF NOT EXISTS db;
use db;
DROP TABLE IF EXISTS test{i}; create table test{i}(id int);
insert into db.test{i} values (123456); select * from db.test{i};
delete from test${i} where id=123456;"
done
==============================================================================
Mysql主从监控的必要性
1.如果发生主从同步异常,业务会出问题
2.如果从库是用来备份的,会导致数据丢失

Mysql主从同步监控说明
1.从库运行show slave status\G可以来查看主从同步信息
Slave IO Running 可以观察从库的IO进程是否正常,IO进程用于同步二进制日志
Slave SQL Running 可以观察从库的SQL进程是否正常,SQL进程用于执行二进制日志
Seconds Behind Master代表主从同步的延时时间

1.监控Mysql主从的Shell脚本mysql_slave_status.sh
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/scripts/mysql_slave_status.sh

!/usr/bin/bash

port=1 key=2
mysql -uroot -poldxu.com -P{port} -e "show slave status\G"|grep "{key}:"|awk '{print $2}' 2>/dev/null

2.Shell脚本测试
[root@web01 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/mysql_slave_status.sh 3306 Slave_SQL_Running
Yes
[root@web01 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/mysql_slave_status.sh 3306 Slave_IO_Running
Yes
[root@web01 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/mysql_slave_status.sh 3306 Seconds_Behind_Master
0

3.Zabbix自定义Key监控Mysql主从
[root@web01 ~]# cat /etc/zabbix/zabbix_agentd.d/mysql.conf
UserParameter=mysql.slave.status[*], /bin/bash /etc/zabbix/zabbix_agentd.d/scripts/mysql_slave_status.sh "1" "2" 2>/dev/null

重启Agent

4.创建监控模板Template Mysql Slave Status
mysql.slave.status[3306,Slave_IO_Running]
mysql.slave.status[3306,Slave_SQL_Running]
mysql.slave.status[3306,Seconds_Behind_Master]

5.定义解决器来判断主从同步是否异常

1.触发器一: 两个状态都要为Yes 
{Template MySQL Slave Status:mysql.slave.status[3306,Slave_IO_Running].str(Yes)}=0 or {Template MySQL Slave Status:mysql.slave.status[3306,Slave_SQL_Running].str(Yes)}=0

2.触发器二: 延时不能超过100
{Template MySQL Slave Status:mysql.slave.status[3306,Seconds_Behind_Master].last()}>100

网络发现、主动注册

1.zabbix的snmp监控? ( 不重要 )
2.web监控
pv uv ip
请求延时
响应延时
加载时间
网站慢则报警

4.自动化监控:
自动发现,网络发现
主动注册
主动模式与被动模式区别?
主动模式与被动模式效果展示?

https://blog.csdn.net/qq_28657577/article/details/82834442

snmp基础介绍

snmp全称是简单网络管理协议

为什么要用?
    路由器交换机无法安装agent程序,但是都提供snmp服务端, 我们可以使用zabbix的snmp方式监控snmp服务端的数据

snmp基础概念:
OID:
内存的大小:.1.3.6.1.2.1.25.2.2.0
内存的剩余:.1.3.6.1.2.1.25.2.2.1
任何一个指标在snmp中都有一个唯一的值进行表示,那么oid排列顺序是以树状信息排列。

MIB库:统计所有的old库(国际标准)
    获取内存信息,hrMemorySize.0

可以理解MIB是域名,比较好记忆。  OID是IP地址,不太好记忆。

snmp版本:
    v1:不支持加密,任何人都可以取值, 不安全
    v2:简单加密版,通过口令才可以取值  通过 community设定口令
    v3:复杂加密,采集效率比较低
    目前使用的最多的还是v2版本

snmp服务端安装

1.安装
[root@web02 ~]# yum install net-snmp -y

2.配置
[root@web02 ~]# vim /etc/snmp/snmpd.conf
#public是默认密码,建议修改
com2sec notConfigUser default oldxu

#限制丛树杈哪个地方开始取值,如果需要监控的信息,设置.1从顶点开始
view    systemview    included   .1

3.启动
[root@web02 ~]# systemctl enable snmpd.service
[root@web02 ~]# systemctl start snmpd

4.客户端安装命令测试取值
# yum install net-snmp-utils -y
# snmpwalk -v2c -c oldxu 172.16.1.7 .1.3.6.1.2.1.25.2.2.0 #OID方式
# snmpwalk -v2c -c oldxu 172.16.1.7 hrMemorySize.0 #MIB方式

5.在zabbix-web界面直接添加即可

总结:
1.snmp介绍
OID
MIB
版本
2.snmp服务安装配置启动测试

1.zabbix基础架构
2.zabbix内部资源

2.web监控
pv uv ip
1.awk
2.腾讯分析 百度统计 google分析
3.piwiki ---> 改名matomo
4.自建流量分析平台

1.进入腾讯移动分析平台 html应用 别人家
2.给一份js的代码
3.将js的代码加入网站
4.等待一天 就能查看到指标

2.自己家 开源matomo
php+mysql 方式开发 LNMP环境 + matomo代码 = 统计网站

1.准备好一个blog站点  +  qq主题
2.安装matomo程序
3.matomo添加我们的网站,会生成一个js的代码
4.登录blog 将js代码添加进主题
5.用户模拟访问测试
6.登录matomo查看pv 情况


注意: 在内网使用,一定都需要做域名解析
        在外网使用,无需考虑


请求延时
响应延时
加载时间
网站慢则报警


实际案例:  监控一个网站:  zabibx网站速度
    1.访问zabbix
    2.登录zabbix      regex:name="csrf-token" content="([0-9a-z]{16})"            
    3.检查zabbix
    4.退出zabbix
    5.检查是否退出zabbix成功


监控宝   压测宝   

1.snmp监控
2.腾讯移动分析公网--
3.matomo内网分析
4.web检测-->wordpress

4.自动化监控:
自动发现,网络发现
主动注册

主动模式与被动模式区别?
主动模式与被动模式效果展示?

1.自动发现:
规则 + 动作 -->
添加主机
添加主机组
添加模板

2.自动发现弊端:
1.扫描慢
2.容易漏
3.对server压力较大
4.无法根据主机名称关联对应模板


1.主动注册:
agent主动上报数据,而不是server询问
1.agent需要配置 ServerActive HostName 配置为主动模式

主动注册2个场景:
1.根据主机名称,关联不同的模板?
web linux tcp nginx php mysql-slave
db linux tcp mysql

2.根据主机的元数据,关联不同的模板?
    linux
    windows

主动模式和被动模式的区别?

网络发现  ---> 被动模式
主动注册  ---> 主动模式


主动还是被动说的都是Agent程序.

被动:
    形象理解:   领导找你要数据
    Server-->不断轮询Agent获取数据
    
主动:
    形象理解:   主动向领导汇报数据
    Agent自动上报数据给Server

zabbix监控项全部都是被动模式:
针对监控项目被动模式: 获取100个值 需要server轮询获取Agent100次
针对监控项目主动模式: 获取100个监控项的值 Server--->发给Agent Agent一次上报所有数据

主动模式: 自动注册 zabbix监控客户端(主动式)
被动模式: 网络发现 zabbix监控客户端(被动式)

主动模式与被动模式 选择哪个?
1.如果主机超过300+以上,建议主动
2.如果zabbix队列比较繁忙 建议主动模式


分布式监控、优化

20.zabbix分布式监控,模拟多机房实现监控?

1.有多机房时,需要用到proxy
    1.网络不通
    2.网络延迟
2.当监控的主机较多时,也可以用proxy来缓解压力

1.安装proxy
[root@web01 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm

1.安装proxy 数据库

yum install zabbix-proxy-mysql mariadb-server -y

systemctl start mariadb

MariaDB [(none)]> create database zabbix_proxy character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix_proxy.* to zabbix_proxy@localhost identified by 'zabbix_proxy';

zcat /usr/share/doc/zabbix-proxy-mysql-4.0.14/schema.sql.gz | mysql -uzabbix_proxy -pzabbix_proxy zabbix_proxy

2.配置zabbix-proxy
[root@web02 ~]# grep "^[a-Z]" /etc/zabbix/zabbix_proxy.conf
....
Server=10.0.0.71
Hostname=sh_proxy

DBHost=localhost
DBName=zabbix_proxy
DBUser=zabbix_proxy
DBPassword=zabbix_proxy
....

3.启动proxy

systemctl enable zabbix-proxy.service

systemctl start zabbix-proxy

4.配置zabbix-agent 不通区域的agent指向不同的proxy

10.0.0.71   <--- 10.0.0.7       <---172.16.1.51
10.0.0.71   <--- 10.0.0.8       <---172.16.1.41

5.登录zabbix-web
1.管理-->agent代理程序

注意: zabbix-server 与 zabbix-proxy 需要版本一致

ProxyLocalBuffer Proxy将在本地保留数据N小时,即使数据已与server同步。(默认不保留立即发送)
ProxyOfflineBuffer 如果无法连接Zabbix server,proxy将默认保留数据1小时.

zabbix监控jvm? tomcat
zabbix ---> jmx ---> java(zabbix-agent)

1.Zabbix-Server找Zabbix-Java-Gateway获取Java数据
2.Zabbix-Java-Gateway找Java程序获取数据
3.Java程序返回数据给Zabbix-Java-Gateway
4.Zabbix-Java-Gateway返回数据给Zabbix-Server
5.Zabbix-Server进行数据展示

配置JMX监控的步骤:
1.安装Zabbix-Java-Gateway。
2.配置zabbix_java_gateway.conf参数。
3.配置zabbix-server.conf参数。-->连接java-gateway
4.Tomcat应用开启JMX协议。
5.ZabbixWeb配置JMX监控的Java应用。

环境:
zabbix-server 10.0.0.71 172.16.1.71
zabbix-gateway 172.16.1.7
tomcat 172.16.1.8

1.安装Zabbix-Java-Gateway
[root@web01 ~]# yum install zabbix-java-gateway -y

2.启动Zabbix-Java-Gateway
[root@web01 ~]# systemctl restart zabbix-java-gateway
[root@web01 ~]# systemctl enable zabbix-java-gateway.service

3.配置zabbix-server指向zabbix-java-gateway
[root@zabbix-server ~]# vim /etc/zabbix/zabbix_server.conf
JavaGateway=172.16.1.7
JavaGatewayPort=10052
StartJavaPollers=5

[root@zabbix-server ~]# systemctl restart zabbix-server

4.启动tomcat程序,开启jmx协议
[root@web02 soft]# vim /soft/tomcat/bin/catalina.sh #头部添加即可
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=172.16.1.8"

5.登录zabbix-web添加一台jmx的主机

zabbix Api ( 开发 )

1.在使用zabbix-api之前,先获取一个token
curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "123456"
},
"id": 1
}' http://zabbix.oldxu.com/zabbix/api_jsonrpc.php

{"jsonrpc":"2.0","result":"6b322c293dc557631c8ffdb32b1c6b5f","id":1}

curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2,
"auth": "6b322c293dc557631c8ffdb32b1c6b5f"
}' http://zabbix.oldxu.com/zabbix/api_jsonrpc.php

2.使用token验证身份, 并禁用某一台主机

curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.update",
"params": {
"hostid": "10277",
"status": 1
},
"auth": "6b322c293dc557631c8ffdb32b1c6b5f",
"id": 1
}' http://zabbix.oldxu.com/zabbix/api_jsonrpc.php

4.使用API创建主机

curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "10.0.0.1",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "10.0.0.1",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "20"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"auth": "4c831e081ff77510f9662bb9de0f9144",
"id": 1
}' http://zabbix.oldxu.com/zabbix/api_jsonrpc.php

  1. Zabbix属于写多读少的业务, 所以需要针对zabbix的MySQL进行拆分.
    1.LAMP -->拆分成LAP + MySQL
    2.MySQL尽量使用SSD固态盘 (静态盘会有寻道的过程,浪费时间)

  2. 将Zabbix-Agent被动监控模式, 调整为主动监控模式.

  3. 使用zabbix-proxy分布式监控, 在大规模监控时用于缓解Zabbix-Server压力
    用proxy代理服务器可以缓解server的压力

  4. 去掉无用监控项, 增加监控项的取值间隔, 减少历史数据保存周期(由housekeeper进程定时清理)
    一些自带监控项很多我们用不到,可把无用监控项取消。

5)针对于Zabbix-server进程调优, 谁忙就加大谁的进程数量, 具体取决实际情况, 不是越大越好
StartPollersUnreachable=1
调整工作进程数。

6)针对于Zabbix-server缓存调优, 谁使用的缓存多,就加大它的缓存值(zabbix cache usage图表)
调整zabbix-server.conf的主配置文件,CacheSize相关大小。

  1. 关注管理->队列, 是否有被延迟执行的监控项

zabbix单机监控两千台机器是瓶颈,分布式同样最多2000台。

Btree算法结构的构件过程
首先是把数据从小到大进行排序,然后将数据有顺序的存储到数据页上,生成left-node 叶子节点
通过叶子节点的范围(最小值到下个叶子节点的最小值)和每个叶子节点的指针生成枝节点
最后通过枝节点的范围(最小值到下分枝节点的最小值)和枝节点的每个指针生成root根节点
还有我们用的是数据库5.7版本,它对索引的查询范围作了优化,怎么优化的呢就是对叶子节点和枝节点加入了双向指针
加入双向指针的作用是减少了索引IO的次数
减少了随机IO的数量
减少了IO的量级

锁的隔离级别
脏读 读未提交的 比如A发生数据变化,但是没有提交,B事务来了读A修改的这些数据,就是脏读
RU: 读未提交

RC: 读已提交
RR: 可重复读
SR: 串行化

主从复制
两台以上的数据库实例,通过二进制日志,实现数据复制的关系。
实现过程:
1.两台以上数据库实例,设置不同的server_id ,server_uuid
2.主库开启二进制日志,binlog
3.用mysqldump备份主库的数据,并且记录位置点,。把数据恢复到从库。
4.从库通知主库,告诉从库主库相关的信息。
5.从库开启slave复制线程

原理:
包括三个线程,4个文件 主:binlogdump mysql_bin
从: SQL、IO relay_info master_info relay_log
从库执行change master to ,获取连接主库的信息(IP、port、用户、密码、binlog起点)
信息被存到master.info文件中。

  1. 从库:start slave 命令, 启动IO,SQL线程.
  2. IO开始工作,拿着,master.info中的连接信息,连接主库,验证通过,主库开启dump线程
  3. IO按照master.info中记录的binlog位置点信息,向主库的DUMP线程请求新的日志
  4. 主库dump线程返回新的日志event,返回给从库.
  5. 从库IO线程接收binlog,并重新更新master.info信息
  6. 从库IO将接收到的binlog记录到relay-log中
  7. 从库SQL线程读取 relay.info信息,获取到上次执行到的位置点,继续向后回放最新relaylog日志,并重新更新relay.info信息
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容