龚哥哥 爱生活、做自己!
一次服务器高峰期宕机排查经历
发表于 2016-12-14 | 浏览(1550) | 服务器

服务器配置与环境

系统:CentOS7
内存:16G
CPU:8核
磁盘:两块(100G, 1T)
mysql:MySQL5.7
php:PHP5.6
带宽:10兆

将近百万访问量,每天上午9点左右和晚上10点左右必定会宕机。每次重启服务器后问题都没有了,没法知道具体是那块所造成。开始仔细想问题在那边,H5新闻站点基本上都是使用搜索引擎运行的,包括后来我开发的PC站点全部采用搜索引擎运行,不会有任何数据库操作。以为是mysql配置需要优化,所以就开始做起了服务器优化。

1、第一看见就是服务器IO过高造成了宕机,经过排查是mysql所占用,开始调整H5项目把直接操作数据库的部分都改成搜索引擎。重启后通过mysql命令行 show processlist; 查看正常,怀疑这个时候是脚本没运行,所以查不到问题了。

2、为了不影响业务运作,把线上有收益的业务迁移到其它服务器。磁盘重新分布,图片,数据库,搜索引擎全部分开,发现mysql磁盘过高,由此可以完全定位IO过高和mysql脱不了一点干系。

3、开始做mysql配置优化,不能让服务器宕机,经过两天的调试,服务器不宕机了,IO还是能够达到80%以上。平时偶尔也发现IO也不小。开始头疼了应用程序和服务器都优化了还是不见有个好的效果。

4、持续观察IO状况,在IO高的时候排查mysql,发现有部分sql运行时间都是在30秒以上,IO都是读的负载过高,肯定是这个原因导致的,这条sql所使用的字段没有索引,加上索引后,IO明显下降到5%左右。

5、当时心里非常激动,花了两天调试服务器各种配置优化。结果发现饶了这么大一个弯。最终还是因为mysql索引优化问题,最终问题还是出现在爬虫上面,每次爬虫跑的时候都会比对数据,再数据表越来越大的时候,字段没有索引就慢如蜗牛。虽然绕弯了还是有很大的收获的,在各种配置优化上也更明白的认识到了很多场景的优化方式。

6、很多时候都是本地开发好的项目,怎么玩都正常,只要上线都会有点问题,运营一段时间后问题也越来越多,这都是没有考虑到很多因素的问题。

阅读全文

Linux监控http服务是否正常
发表于 2016-12-7 | 浏览(1016) | 服务器

使用定时任务定时校验是否正确,如果状态不正常,则发送邮件通知,邮件发送服务可以搜索本博客中的文章。

添加文件 vim http_mog.sh   内容如下

#!/bin/bash

#@author:Devil
#@desc:监控http服务是否正常
#@blog:http://gong.gg/
#@date:2016-12-07

HTTP_CODE=`curl -I -m 10 -o /dev/null -s -w %{http_code}"\n" gong.gg`

# 不等于200则发送邮件
if [ $HTTP_CODE != 200 ]
then
	echo "亲^_^!你的服务器好像不乖了哦,状态码:[${HTTP_CODE}] ,请尽快处理哦~" | mail -v -s '服务器HTTP监控' devil@gong.gg
fi

阅读全文

Linux上排查IO使用过高的进程
发表于 2016-12-7 | 浏览(1047) | 服务器

iotop 命令

CentOS7以下使用yum安装
	yum -y install iotop
	iotop
CentOS7由于yum源没有包
	git clone git://repo.or.cz/iotop.git
		cd iotop
		python iotop.py

iostat 命令

iostat -x 1 10

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.48    0.00    1.24   10.22    4.28   78.78

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda              0.37     3.00   27.30    5.47   722.00   173.14    54.64     0.78   23.81    9.61   94.70   1.40   4.58
xvdb              0.00     0.00    0.32    0.00     2.19     0.00    13.75     0.00    5.39    5.30   31.00   2.73   0.09
xvdc              1.29    21.12  130.74   13.60  3575.35   175.45    51.97     2.97   20.55   21.01   16.15   4.78  69.03

%idle小于70% IO压力就较大了,一般读取速度有较多的%wait.
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。

dstat 命令

dstat --top-io -d --top-bio -l
dstat -t --top-io-adv -d -l

监控工具,根据系统类型选择脚本然后直接运行即可,以下是centos

centos下直接
  yum -y install nmon

其它linux系统可以下载包使用
wget http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz
tar -zxvf http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz
./nmon_x86_64_centos6

阅读全文

Nginx中判断是否手机访问
发表于 2016-11-23 | 浏览(928) | 服务器

1、开源库

无论是PC还是手机,由于操作系统、浏览器的多样性,自己来实现这个判断并不容易不够准确。国外有一套开源的通过User-Agent区分PC和手机的解决方案,支持的语言较多(Apache ASP ASP.NET ColdFusion C# IIS JSP JavaScript jQuery Lasso nginx node.js PHP Perl Python Rails)

传送门:http://detectmobilebrowsers.com/

2、Nginx实例,在server中加入

set $mobile_rewrite do_not_perform;

if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {
	set $mobile_rewrite perform;
}

if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {
	set $mobile_rewrite perform;
}

if ($mobile_rewrite = perform) {
	rewrite ^(.*) http://h5.gong.gg$1 redirect;
	break;
}

阅读全文

Linux磁盘使用量监控
发表于 2016-11-2 | 浏览(773) | 服务器

Linux中使用crontab定时运行脚本即可。添加文件 vim disk.sh

#!/bin/bash

#@desc:服务器磁盘使用量报警脚本
#@author:Devil
#@blog:http://gong.gg/
#@date:2016-11-02

# 获取磁盘使用量
list=`df -h | awk 'NR==2,NR==$NF{print int(substr($5,0,length($5)-1));}'`

# 计算磁盘超过比例的值
server='博客'
max=95
count=0
for i in $list
do
	if [ $i -ge $max ]
	then
		let count++
	fi
done

# 邮件通知
if [ $count -gt 0 ]
then
	echo "亲^_^!您的[${server}]服务器有${count}块磁盘使用超过${max}%,请尽快处理哦~" | mail -v -s '服务器磁盘使用量报警' xxx[at]gongfuxiang.com
fi

邮件发送方法,搜索本博客中的文章

阅读全文

Python中文转拼音
发表于 2016-11-2 | 浏览(1320) | Python

最近写一个项目的时候,需要将汉字转化成拼音,在github上找到一个现成的库。

Python汉字转拼音 GitHub地址

1、使用如下

from pinyin import PinYin

test = PinYin()
test.load_word()
print test.hanzi2pinyin(string='钓鱼岛是中国的')
print test.hanzi2pinyin_split(string='钓鱼岛是中国的', split="-")

输出
['diao', 'yu', 'dao', 'shi', 'zhong', 'guo', 'de']
'diao-yu-dao-shi-zhong-guo-de'

2、在中文与英文混合的时候英文会丢失,所以我们需要对库进行一点调整。

2.1、hanzi2pinyin方法调整

# 原始
    def hanzi2pinyin(self, string=""):
        result = []
        if not isinstance(string, unicode):
            string = string.decode("utf-8")
        
        for char in string:
            key = '%X' % ord(char)
            result.append(self.word_dict.get(key, char).split()[0][:-1].lower())

        return result

# 调整后
    def hanzi2pinyin(self, string=""):
        result = []
        if not isinstance(string, unicode):
            string = string.decode("utf-8")
        en = ''
        for char in string:
            key = '%X' % ord(char)
            if not self.word_dict.get(key) :
                # 为字母或数字才进入(排除特殊字符)
                if(char.isalpha() == True or char.isdigit() == True) :
                    en += char
                else :
                    # 空格则分割数据
                    if(char.isspace() == True) :
                        result.append(en)
                        en = ''
            else:
                # en有数据则先处理
                if(len(en) > 0) :
                    result.append(en)
                    en = ''
                # 中文转拼音
                result.append(self.word_dict.get(key, char).split()[0][:-1].lower())
        # 防止全是英文或数字
        if(len(en) > 0) :
            result.append(en)
            en = ''

        return result

2.2、hanzi2pinyin_split方法调整

# 原始
    def hanzi2pinyin_split(self, string="", split=""):
        result = self.hanzi2pinyin(string=string)
        if split == "":
            return result
        else:
            return split.join(result)

# 调整后
    def hanzi2pinyin_split(self, string="", split=""):
        return split.join(self.hanzi2pinyin(string=string))

3、调整后的效果

print test.hanzi2pinyin(string='钓鱼岛是hello中国的')
print test.hanzi2pinyin_split(string='钓鱼岛是hello中国world的', split="-")

输出
['diao', 'yu', 'dao', 'shi', 'hello', 'zhong', 'guo', 'de']
diao-yu-dao-shi-hello-zhong-guo-world-de

阅读全文

Linux内核参数优化
发表于 2016-10-17 | 浏览(836) | 服务器

1、修改   vim /etc/sysctl.conf   文件

# 值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开
net.ipv4.ip_forward = 0

# 多网卡接收多播
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0

# 验证设置
kernel.sysrq = 0
kernel.core_uses_pid = 1

# 开启SYN Cookies,当出现SYN 等待队列溢出时,启用cookies 来处理
net.ipv4.tcp_syncookies = 1

# 确定一个消息队列的容量。该参数的取值存储在消息队列标识符结构的某个域中,用于确定是否存在着对新消息进行排队的空间。msgmnb 值可以动态修改,默认为16384。修改其取值会影响到所有新的消息队列的容量。用户可以通过 Msgctl()系统调用来增加现有消息队列的容量
kernel.msgmnb = 65536

# 限制进程可以发送的消息长度。该参数由 Msgsnd()函数加以应用。如果待发送消息的长度超过该值,则返回一个错误。该参数可以在运行时调整
kernel.msgmax = 65536

# 最大共享内存段大小。取物理内存大小的一半,单位为字节(此处为8G)
kernel.shmmax = 8589934592

# 整个系统共享内存段的最大数目
kernel.shmmni = 4096

# 可以使用的共享内存的总量
kernel.shmall = 4294967296

# 每个信号对象集的最大信号对象数;系统范围内最大信号对象数;每个信号对象支持的最大操作数;系统范围内最大信号对象集数
kernel.sem = 250 32000 100 128

# timewait 的数量,默认是180000
net.ipv4.tcp_max_tw_buckets = 204800

# web 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn 限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值
net.core.somaxconn = 262144

# 该参数标识是否启用选择性确认SACKS选项。默认值为1(true)
net.ipv4.tcp_sack = 1

# 设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力
net.ipv4.tcp_window_scaling = 1

# tcp_rmem:min表示为TCP socket预留用于接收缓冲的最小内存数量,default为TCP socket预留用于接收缓冲的缺省内存数量,max用于TCP socket接收缓冲的内存最大值
net.ipv4.tcp_rmem = 4096 87380 4194304

# tcp_wmem:min表示为TCP socket预留用于发送缓冲的内存最小值,default为TCP socket预留用于发送缓冲的缺省内存值,max用于TCP socket发送缓冲的内存最大值
net.ipv4.tcp_wmem = 4096 16384 4194304

# 系统套接字写默认缓冲区
net.core.wmem_default = 8388608

# 系统套接字读默认缓冲区
net.core.rmem_default = 8388608

# 系统套接字读最大缓冲区
net.core.rmem_max = 16777216

# 系统套接字写最大缓冲区
net.core.wmem_max = 16777216

# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144

# 统中最多有多少个TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
net.ipv4.tcp_max_orphans = 3276800

# 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M 内存的系统而言,缺省值是1024,小内存的系统则是128
net.ipv4.tcp_max_syn_backlog = 262144

# 时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉
net.ipv4.tcp_timestamps = 0

# 为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量
net.ipv4.tcp_synack_retries = 1

# 在内核放弃建立连接之前发送SYN 包的数量
net.ipv4.tcp_syn_retries = 1

# 启用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1

# 开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接
net.ipv4.tcp_tw_reuse = 1

# 确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)
net.ipv4.tcp_mem = 94500000 915000000 927000000

# 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180 秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只能吃掉1.5K 内存,但是它们的生存期长些
net.ipv4.tcp_fin_timeout = 15

# 当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
net.ipv4.tcp_keepalive_time = 15

# 允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024 65000

# 系统中所允许的文件句柄最大数目
fs.file-max = 204800

1.1、让参数生效

/sbin/sysctl -p

2、修改文件句柄数量,修改   vim /etc/security/limits.conf

* soft nofile 204800
* hard nofile 204800

2.1、重启生效,查看参数

ulimit -a

阅读全文

CentOS下使用Ansible自动部署
发表于 2016-10-16 | 浏览(1139) | 服务器

一、服务器准备

Master 		10.0.82.55
Node1		10.0.82.56
Node2		10.0.82.37

二、配置Master SSH免密码登录节点服务器

具体方法,搜索本博客中的文章

三、Master安装Ansible服务

1、yum安装

yum -y install ansible

2、配置文件   vim /etc/ansible/hosts 添加node的ip

10.0.82.56
10.0.82.37

# 可以分组 如:
[web]
10.0.82.56

[db]
10.0.82.37

四、测试

1、在远程服务器根目录创建hello目录

ansible all -a "mkdir /hello"

运行结果
10.0.82.37 | SUCCESS | rc=0 >>
10.0.82.56 | SUCCESS | rc=0 >>

2、把Master本地文件拷贝到远程服务器

ansible all -m copy -a "src=/data/www/test.txt dest=/data/www"

报错了
10.0.82.56 | FAILED! => {
    "changed": false, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "failed": true, 
    "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"

解决方案(如果受控机开启SELinux,则必须在受控机上安装libselinux-python)
ansible all -k -m yum -a "name=libselinux-python state=installed"


再次运行 ansible all -m copy -a "src=/data/www/test.txt dest=/data/www"

运行结果
10.0.82.37 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/data/www/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "src": "/root/.ansible/tmp/ansible-tmp-1476215949.6-127742282482280/source", 
    "state": "file", 
    "uid": 0
}
10.0.82.56 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/data/www/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 0, 
    "src": "/root/.ansible/tmp/ansible-tmp-1476215949.96-237849415762054/source", 
    "state": "file", 
    "uid": 0
}

3、查看节点服务器的某个进程

ansible all -m shell -a "ps -ef | grep nginx"

运行结果
172.17.0.4 | SUCCESS | rc=0 >>
root         68      1  0 09:55 ?        00:00:00 nginx: master process /data/soft/nginx/nginx -c /data/soft/nginx/nginx.conf
nobody       69     68  0 09:55 ?        00:00:00 nginx: worker process
root        298    293  0 09:58 pts/0    00:00:00 /bin/sh -c ps -ef | grep nginx
root        300    298  0 09:58 pts/0    00:00:00 grep nginx

172.17.0.3 | SUCCESS | rc=0 >>
root         71      1  0 08:18 ?        00:00:00 nginx: master process /data/soft/nginx/nginx -c /data/soft/nginx/nginx.conf
nobody       72     71  0 08:18 ?        00:00:00 nginx: worker process
root       1816   1811  0 09:58 pts/0    00:00:00 /bin/sh -c ps -ef | grep nginx
root       1818   1816  0 09:58 pts/0    00:00:00 grep nginx

4、更改节点服务器文件权限

ansible all -m file -a "dest=/data/www/gong.txt mode=777"

运行结果
172.17.0.4 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "path": "/data/www/gong.txt", 
    "size": 6, 
    "state": "file", 
    "uid": 0
}
172.17.0.3 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "path": "/data/www/gong.txt", 
    "size": 6, 
    "state": "file", 
    "uid": 0
}

4、在节点服务器上拉取一个git库

ansible all -m shell -a "cd /data/www; git clone git@git.coding.net:gongfuxiang/hello.git"

运行结果
172.17.0.4 | SUCCESS | rc=0 >>
Cloning into 'hello'...

172.17.0.3 | SUCCESS | rc=0 >>
Cloning into 'hello'...

Ansible更多使用方法 Ansible中文使用权威指南

阅读全文

CentOS安装Munin监控服务器
发表于 2016-10-13 | 浏览(1565) | 服务器

效果图


作为一个网络资源监控工具,Munin能够帮助分析资源趋势和查看薄弱环节以及导致产生性能问题的原因。开发此软件的团队希望它能够易用和用户体验友好。该软件是用Perl开发的,并采用rrdtool来绘制图形,使用了web界面进行呈现。开发人员推广此应用时声称当前已有500多个监控插件可以“即插即用*”。

一、安装web服务器 nginx或apache都可以(搜索本博客中有nginx的安装教程)

服务器列表
Master 	192.168.1.100
Node1 	192.168.1.200
Node2 	192.168.1.201

二、Master安装Munin

1、安装EPEL源(已安装可跳过)

rpm -Uvh https://mirrors.tuna.tsinghua.edu.cn/epel/6/i386/epel-release-6-8.noarch.rpm

2、Master 安装munin服务

yum -y install munin

3、修改配置文件  vim /etc/munin/munin.conf

将以下几行的注释去掉(分别是 数据路径,wab路径,日志路径,运行run路径,模板文件路径)
dbdir  /var/lib/munin
htmldir /var/www/html/munin
logdir /var/log/munin
rundir  /var/run/munin
tmpldir /etc/munin/templates

将以下监控本机的代码注释掉
#[localhost]
#    address 127.0.0.1
#    use_node_name yes
同时添加被监控机地址
[node1]
	address 192.168.1.200
	use_node_name yes
[node2]
	address 192.168.1.201
	use_node_name yes

use_node_name命令控制munin命名节点的方式,如果后面跟的参数为yes就是用括号中的值来命名,如果是no则将执行一个DNS查询。

4、配置服务需要用户名和密码才能访问,apache中自带htpasswd,nginx中没,可以搜索本博客中的教程

htpasswd -c /etc/munin/munin-htpasswd 用户名
然后输入密码

5、在nginx中或apache中添加htpasswd用户认证(这里nginx做演示 server中)

auth_basic "Authorized users only";
auth_basic_user_file /etc/munin/munin-htpasswd;

6、安装完munin服务端后,程序会自动创建一个计划任务,可以看到是每5分钟获取一次数据(可以根据自己的需求修改定时任务时间)

cat /etc/cron.d/munin

*/5 * * * * munin test -x /usr/bin/munin-cron && /usr/bin/munin-cron

7、启动crond服务

service crond start

三、Node服务器安装Munin

1、安装EPEL源(已安装可跳过)

rpm -Uvh https://mirrors.tuna.tsinghua.edu.cn/epel/6/i386/epel-release-6-8.noarch.rpm

yum -y install munin-node

2、修改配置文件   vim /etc/munin/munin-node.conf

找到 allow ^127\.0\.0\.1$
这里是表示允许谁来获取信息,在下面加上监控机IP:
allow ^192\.168\.1\.100$

3、防火墙配置   vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 4949 -j ACCEPT

4、启动munin-node

service munin-node start

四、进入Master测试看看

telnet 192.168.1.200 4949

访问Master配置的尾部服务器查看节点服务的监控数据

阅读全文

CentOS编译安装MySQL5.7
发表于 2016-10-12 | 浏览(1204) | 数据库

1、准备

mkdir /data
cd /data
mkdir soft src dbdata
cd soft
mkdir mysql

2、安装cmake

cd /data/src
wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz
tar -zxvf cmake-2.8.10.2.tar.gz
cd cmake-2.8.10.2
./bootstrap
gmake
gmake install

3、下载boost源码包,从5.7开始boost包是必须的

cd /data/src
wget http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
mkdir /usr/local/boost
tar -zxvf boost_1_59_0.tar.gz -C /usr/local/boost

4、安装mysql

cd /data/src
wget http://dev.mysql.com/get/archives/mysql-5.7/mysql-5.7.15.tar.gz
tar -zxvf mysql-5.7.15.tar.gz
cd mysql-5.7.15
cmake . -DCMAKE_INSTALL_PREFIX=/data/soft/mysql -DMYSQL_DATADIR=/data/dbdata -DSYSCONFDIR=/data/soft/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DMYSQL_USER=mysql -DWITH_DEBUG=0 -DMYSQL_TCP_PORT=3306 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DWITH_SSL=yes -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost
make
make install

5、初始化操作

cd /data/soft/mysql
bin/mysqld --initialize --user=mysql --basedir=/data/soft/mysql --datadir=/dbdata --explicit_defaults_for_timestamp=1
/data/soft/mysql/support-files
这里会给出默认的随机密码,请一定要记下来一会儿登录使用(mysql从5.7开始密码不再默认空了)

6、mysql配置文件

cd support-files
cp my-default.cnf /etc/my.cnf

7、配置mysql服务开机自动启动

cp mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql

8、检查自启动项列表中没有mysql这个,如果没有就添加mysql

chkconfig --list mysql
chkconfig --add mysql

9、设置MySQL在345等级自动启动

chkconfig --level 345 mysql on
chkconfig mysql on

10、创建mysql命令路径

ln -s /data/soft/mysql/bin/mysql /usr/bin

11、mysql操作命令

service mysql start
service mysql stop
service mysql restart

12、登录mysql

mysql -uroot -p
输入安装完成的时候给的随机密码,如:123456

13、修改root的密码

alter user 'root'@'localhost' identified by '123456';

退出后重新登录使用新密码即可

阅读全文

TOP