前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >负载均衡、集群、高可用解决方案

负载均衡、集群、高可用解决方案

作者头像
老七Linux
发布2018-05-31 10:56:46
3.2K0
发布2018-05-31 10:56:46
举报
文章被收录于专栏:Laoqi's Linux运维专列

企业需求:

代码语言:javascript
复制
搭建一个高可用负载均衡集群架构出来,并运行三个站点,具体需求如下。
------------------------------------------------------------------------------------------
基础:
1 设计你认为合理的架构,用visio把架构图画出来

7 所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo

8 给所有服务器做一个简单的命令审计功能
------------------------------------------------------------------------------------------
一、web(LNMP+Tomcat):

2 搭建lnmp、tomcat+jdk环境

3 三个站点分别为:discuz论坛、dedecms企业网站以及zrlog博客

4 由于机器有限,尽可能地把三个站点放到同一台服务器上,然后做负载均衡集群,要求所有站点域名解析到一个ip上,也就是说只有一个出口ip

5 需要共享静态文件,比如discuz需要共享的目录是 data/attachment,dedecms需要共享upload(具体目录,你可以先上传一个图片,查看图片所在目录)

6 设计合理的目录、文件权限,比如discuz的data目录需要给php-fpm进程用户可写权限,其他目录不用写的就不要给写权限(目录755,文件644,属主属组root)

9 php-fpm服务要求设置慢执行日志,超时时间为2s,并做日志切割,日志保留一月

10 所有站点都需要配置访问日志,并做日志切割,要求静态文件日志不做记录,日志保留一月

17 给三个站点的后台访问做二次认证,增加安全性
------------------------------------------------------------------------------------------
二、mysql

11 制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器

12 制定代码、静态文件的备份方案,并写备份脚本,要求把备份

12 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据
------------------------------------------------------------------------------------------

三、监控zabbix

13 搭建zabbix监控告警系统,要求监控各个基础指标(cpu、内存、硬盘),网卡流量需要成图,还需要监控web站点的可用性,

14 定制自定义监控脚本,监控web服务器的并发连接数,超过100告警

15 定制自定义监控脚本,监控mysql的队列,队列超过300告警

16 定制自定义监控脚本,监控mysql的慢查询日志,每分钟超过60条日志需要告警,需要仔细分析慢查询日志的规律,确定日志条数
------------------------------------------------------------------------------------------
四、分发系统(代码上线)

18 用shell脚本实现文件、代码同步上线(参考分发系统)

基础篇:

分析得到如下架构图:

一、批量创建admin用户

需要在9台机器上创建admin用户,并设置密码

ip为192.168.14.101-109

1.1、登录192.168.14.101,安装expect

代码语言:javascript
复制
yum  install -y expect
cd  /usr/local/sbin
mkdir shell
cd shell

1.2、创建expect文件

代码语言:javascript
复制
vim  useradd.expect
#!/usr/bin/expect
set user [ lindex $argv 0 ]
set passwd "123456"
set host [ lindex $argv 1 ]
set cm [ lindex $argv 2 ]
spawn ssh $user@$host

expect {
"yes/no" { send "yes\r"; exp_continue}
"assword:" { send "$passwd\r" }
}

expect  "]*"
send  "$cm\r"
expect  "]*"
send  "exit\r"
  • 赋予useradd.expect执行权限

1.3、创建执行脚本

使用useradd.sh调用useradd.expect

代码语言:javascript
复制
vim useradd.sh
#!/bin/bash

for i in `cat ip.txt`
do
        ./useradd.expect "root" "$i" " useradd admin && echo "test@123"|passwd --stdin admin "
done

ip.txt的内容为

代码语言:javascript
复制
cat ip.txt
192.168.14.101
192.168.14.102
192.168.14.103
192.168.14.104
192.168.14.105
192.168.14.106
192.168.14.107
192.168.14.108
192.168.14.109

1.4、执行useradd.sh即可为每台ip.txt中的每台机器创建admin用户并设置密码。


二、Linux 系统添加操作记录审计

需求:现在需要对几台机器进行命令审计

服务器:192.168.14.101-109

2.1、单台机器的命令审计如下操作

2.1.1、创建审计日志存放位置
代码语言:javascript
复制
mkdir -p /usr/local/domob/records/  && chmod 777 /usr/local/domob/records/  &&  chmod +t /usr/local/domob/records/
2.1.2、修改/etc/profile

添加以下内容

代码语言:javascript
复制
if [ ! -d  /usr/local/domob/records/${LOGNAME} ]
then 
	mkdir -p /usr/local/domob/records/${LOGNAME}
 	chmod 300 /usr/local/domob/records/${LOGNAME}
 fi
 
export HISTORY_FILE="/usr/local/domob/records/${LOGNAME}/bash_history"
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE'
2.1.3、重新加载/etc/profile
代码语言:javascript
复制
source /etc/profile

2.2、多台机器进行命令审计

如果多台机器都使用步骤1执行,过程比较繁琐。所以我们可使用expect实现

2.2.1、首先给每台机器都同步一个文件

文件内容为要追加在/etc/profile,而且每一台机器都安装了rsync(install-rsync.expect)

(1)/tmp/prompt_command

代码语言:javascript
复制
vim /tmp/prompt_command
if [ ! -d  /usr/local/domob/records/${LOGNAME} ]
then 
	mkdir -p /usr/local/domob/records/${LOGNAME}
 	chmod 300 /usr/local/domob/records/${LOGNAME}
 fi
 
export HISTORY_FILE="/usr/local/domob/records/${LOGNAME}/bash_history"
export PROMPT_COMMAND='{ date "+%Y-%m-%d %T ##### $(who am i |awk "{print \$1\" \"\$2\" \"\$5}") #### $(history 1 | { read x cmd; echo "$cmd"; })"; } >>$HISTORY_FILE'

(2)rsync.expect

代码语言:javascript
复制
#!/usr/bin/expect
#将本机的/tmp/prompt_command同步到指定主机,配合rsync.sh使用
set user [ lindex $argv 0 ]
set passwd "[email protected]"
set host [ lindex $argv 1 ]
spawn rsync -av /tmp/prompt_command  $user@$host:/tmp

expect {
"yes/no" { send "yes\r"; exp_continue}
"assword:" { send "$passwd\r" }
}

expect eof
  • 创建完成后需要赋予执行权限

(3)ip.txt

代码语言:javascript
复制
cat ip.txt
192.168.14.101
192.168.14.102
192.168.14.103
192.168.14.104
192.168.14.105
192.168.14.106
192.168.14.107
192.168.14.108
192.168.14.109

(4)rsync.sh

代码语言:javascript
复制
#!/bin/bash
#配合./rsync.expect使用

for ip in `cat ip.txt`
do
        ./rsync.expect root $ip
done

(5)执行rsync.sh即可将/tmp/prompt_command同步到其他机器

2.2.2、批量修改其他机器/etc/profile

(1)profile.expect

代码语言:javascript
复制
#!/usr/bin/expect
#登录到指定主机,创建命令审计日志存放位置,修改/et/profile,配合profile.sh使用
set user [ lindex $argv 0 ]
set passwd "[email protected]"
set host [ lindex $argv 1 ]
set cm1 [ lindex $argv 2 ]
set cm2 [ lindex $argv 3 ]
set cm3 [ lindex $argv 4 ]

spawn ssh $user@$host

expect {
"yes/no" { send "yes\r"; exp_continue}
"assword:" { send "$passwd\r" }
}

expect  "]*"
send  "$cm1\r"
expect  "]*"
send  "$cm2\r"
expect "]*"
send  "$cm3\r"
expect "]*"
send  "exit\r"
  • 创建后需要赋予执行权限

(2)ip.txt

代码语言:javascript
复制
cat ip.txt
192.168.14.101
192.168.14.102
192.168.14.103
192.168.14.104
192.168.14.105
192.168.14.106
192.168.14.107
192.168.14.108
192.168.14.109

(3)profile.sh

代码语言:javascript
复制
#!/bin/bash
#配合useradd.expext使用
a="mkdir -p /usr/local/domob/records/  && chmod 777 /usr/local/domob/records/  &&  chmod +t /usr/local/domob/records/"
b="cat /tmp/prompt_command >> /etc/profile"
c="source /etc/profile"

for ip in `cat ip.txt`
do
        ./profile.expect "root" "$ip"  "$a" "$b" "$c"
done

执行profile.sh即可,但是有个bug。有些机器还需要在source /etc/profile,或者重新连接即可。可能的原因是,expect脚本ssh登录其他机器时创建了一个子shell


三、批量关闭selinux和firewalld

我们有多台机器需要关闭,我们可以只登陆到其中一台机器。使用expect批量去登陆

3.1、关闭selinux

首先我们需要知道如何关闭selinux

代码语言:javascript
复制
永久关闭:修改/etc/selinux/config,将"SELINUX=disabled"改为"SELINUX=disabled",然后重启机器生效
即时关闭:我们可以使用"setenforce 0"实现,立即生效,但是重启会失效。

根据以上两种方式,我们可以进行组合。先是其永久关闭,再即时生效。也就是说我们登录其他机器后需要做这两个操作。

3.1.1、selinux-firewalld.expect
代码语言:javascript
复制
#!/usr/bin/expect
#配合selinux.sh可以用来批量关闭selinux
#配合firewalld.sh可以用来批量关闭firewalld

set user "admin"
set passwd "[email protected]"
set host [ lindex $argv 0 ]
set cm1 [ lindex $argv 1 ]
set cm2 [ lindex $argv 2 ]
spawn  ssh $user@$host


expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}

expect "]*"
send "$cm1\r"

#如果$user定义的是root,这一步就不需要。
expect {
"password" { send "$passwd\r" }
}

expect "]*"
send "$cm2\r"
expect "]*"
send "exit\r"
  • 保存后记得赋予执行权限
3.1.2、selinux.sh
代码语言:javascript
复制
#!/bin/bash
#批量修改selinux状态,配合selinux.expect使用

cm1="sudo sed  -i 's/SELINUX=enforcing/SELINUX=disabled/g'  /etc/selinux/config"
cm2="sudo setenforce 0"
for ip in `cat ip.txt`
do
        ./selinux.expect  "$ip"  "$cm1"  "$cm2"
done

利用selinux.sh的for循环,得到我们需要登录的机器。

接下来就是,调用之前的selinux-firewalld.expect。

登录到指定的机器上执行$cm1和$cm2

3.2、关闭firewalld

关闭firewalld也是需要两步

代码语言:javascript
复制
停止firewalld:关闭firewalld,即时生效
关闭firewalld自启动:如果不关闭,那么之前执行的停止firewalld,在重启服务器之后就失效了
2.1、selinux-firewalld.expect

与关闭selinux的expect脚本一样,都是登录到指定机器执行命令

代码语言:javascript
复制
#!/usr/bin/expect
#配合selinux.sh可以用来批量关闭selinux
#配合firewalld.sh可以用来批量关闭firewalld

set user "admin"
set passwd "[email protected]"
set host [ lindex $argv 0 ]
set cm1 [ lindex $argv 1 ]
set cm2 [ lindex $argv 2 ]
spawn  ssh $user@$host


expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}

expect "]*"
send "$cm1\r"

#如果$user定义的是root,这一步就不需要。
expect {
"password" { send "$passwd\r" }
}

expect "]*"
send "$cm2\r"
expect "]*"
send "exit\r"
3.2.2、firewalld.sh
代码语言:javascript
复制
#!/bin/bash
#批量关闭firewalld,配合iptables.expect使用

cm1="sudo systemctl stop firewalld " 
cm2="sudo systemctl disable firewalld "
for ip in `cat ip.txt`
do
        ./selinux.expect  "$ip"  "$cm1"  "$cm2"
done
  • 与selinux不同的是,$cm1跟$cm2是不同的,该脚本执行的是关闭firewalld

四、批量设置密钥登录

现在有9台机器,需要针对admin用户配置密钥认证登录

思路,生成一个密钥对,9台机器都使用一个公钥。用户通过使用私钥登录

本实验是在xshell中操作

4.1、首先生成密钥对

(1)打开工具

(2)设置密钥长度

(3)生成密钥对-生成公钥

(4)设置私钥

(5)获取公钥内容

4.2、在Linux上配置公钥

随便登录到一台机器,这里我使用admin登录109

4.2.1、创建公钥文件存放位置
代码语言:javascript
复制
#登录109的admin用户
mkdir /home/admin/.ssh
chmod 700 /home/admin/.ssh
ls -l /home/admin/.ssh
总用量 4
-rw-rw-r--. 1 admin admin 381 9月  24 16:21 authorized_keys
4.2.2、创建公钥文件并写入公钥内容
代码语言:javascript
复制
vim  /home/admin/.ssh/authorized_keys
#创建完成后写入如下图内容
#保存后赋予644权限
chmod 644 /home/admin/.ssh/authorized_keys

4.3、将公钥同步到其他机器

代码语言:javascript
复制
cd /usr/local/sbin/shell/expect/

(1)rsync-pub.expect

代码语言:javascript
复制
sudo vim rsync-pub.expect

#!/usr/bin/expect
#同步公钥文件到其他服务器,配合rsync-pub.sh使用

set user "admin"
set passwd "[email protected]"
set host [ lindex $argv 0 ]
spawn  rsync -av /home/admin/.ssh/authorized_keys $user@$host:/home/admin/.ssh/

expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "$passwd\r" }
}

expect eof
  • 保存后记得赋予执行权限

(2)rsync-pub.sh

代码语言:javascript
复制
sudo vim rsync-pub.sh

#!/bin/bash
#同步公钥文件到其他机器,配合rsync-pub.expect

for ip in `cat ip.txt`
do
        if [ $ip == "192.168.14.109" ]
        then
                echo
        else
                ./rsync-pub.expect "$ip"
        fi
done

执行rsync-pub.sh即可将公钥authorized_keys分发到其他机器

4.4、使用密钥登录admin

(1)打开会话属性

(2)设置密钥对

(3)109测试

(4)登录成功

(5)其他机器只需要进行以上操作即可

4.5、同步公钥后设置时遇到的问题

当我同步完公钥,测试时是使用109本机测试登录成功。以为全部都能成功,但当我去测试101时,出现以下错误。

查看日志文件/var/log/secure

查看/home/admin/.ssh的权限确实不是700,所以还需要保证每台机器的/home/admin/.ssh权限为700

在109上创建1.expect

代码语言:javascript
复制
sudo  vim 1.expect
#!/usr/bin/expect
set user "root"
set host [ lindex $argv 0 ]
spawn ssh $user@$host
set passwd "[email protected]"

expect {
"yes/no" { send "yes\r" }
"password:" { send "$passwd\r" }
}

expect "]*"
send "chmod 700  /home/admin/.ssh\r"
expect "]*"
send "exit\r"
代码语言:javascript
复制
chmod a+x 1.expect
for ip in `cat ip.txt` ;do ./1.expect "$ip" ;done

重新安装步骤时设置,admin即可使用密钥登录


五、keepalived +LVS(DR)

keepalived +LVS(DR)

一、配置real server

5.1.1、配置real server1

登录real server1(192.168.14.103)

代码语言:javascript
复制
sudo vim /usr/local/sbin/lvs_rs.sh
#写入以下内容

#! /bin/bash
vip=192.168.14.11
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
5.1.2、配置real server2

登录real server1(192.168.14.104)

代码语言:javascript
复制
sudo vim /usr/local/sbin/lvs_rs.sh
#写入以下内容

#! /bin/bash
vip=192.168.14.11
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
5.1.3、在real server执行lvs_rs.sh

两台real server都需要执行

代码语言:javascript
复制
sh /usr/local/sbin/lvs_rs.sh

二、配置DIR

因为keepalived和LVS可以结合在一起,所以我们只需要配置keepalived即可。

5.2.1、配置master

登录master(192.168.14.101),打开端口转发

代码语言:javascript
复制
echo 1 >/proc/sys/net/ipv4/ip_forward

(1)安装keepalived

代码语言:javascript
复制
sudo yum install -y keepalived

(2)配置keepalived

代码语言:javascript
复制
sudo mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
sudo vim /etc/keepalived/keepalived.conf
#写入以下内容

vrrp_instance VI_1 {
    #备用服务器上为 BACKUP
    state MASTER
    #绑定vip的网卡为ens192,根据实际修改
    interface ens192
    virtual_router_id 51
    #备用服务器上为90
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass [email protected]123
    }
    virtual_ipaddress {
        192.168.14.11
    }
}
virtual_server 192.168.14.11 80 {
    #(每隔10秒查询realserver状态)
    delay_loop 10
    #(lvs 算法)
    lb_algo wlc
    #(DR模式)
    lb_kind DR
    #(同一IP的连接60秒内被分配到同一台realserver)
    persistence_timeout 0
    #(用TCP协议检查realserver状态)
    protocol TCP
    real_server 192.168.14.103 80 {
        #(权重)
        weight 100
        TCP_CHECK {
        #(10秒无响应超时)
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.14.104 80 {
        weight 90
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

(3)重启keepalived

代码语言:javascript
复制
systemctl  restart keepalived
5.2.2、配置BACKUP

登录到BACKUP(192.168.14.104),打开端口转发

代码语言:javascript
复制
echo 1 >/proc/sys/net/ipv4/ip_forward

(1)安装keepalived

代码语言:javascript
复制
sudo yum install -y keepalived

(2)配置keepalived

代码语言:javascript
复制
sudo mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
sudo vim /etc/keepalived/keepalived.conf
#写入以下内容

vrrp_instance VI_1 {
    #备用服务器上为 BACKUP
    state BACKUP
    #绑定vip的网卡为ens192,根据实际修改
    interface ens192
    virtual_router_id 51
    #备用服务器上为90
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass [email protected]123
    }
    virtual_ipaddress {
        192.168.14.11
    }
}
virtual_server 192.168.14.11 80 {
    #(每隔10秒查询realserver状态)
    delay_loop 10
    #(lvs 算法)
    lb_algo wlc
    #(DR模式)
    lb_kind DR
    #(同一IP的连接60秒内被分配到同一台realserver)
    persistence_timeout 0
    #(用TCP协议检查realserver状态)
    protocol TCP
    real_server 192.168.14.103 80 {
        #(权重)
        weight 100
        TCP_CHECK {
        #(10秒无响应超时)
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.14.104 80 {
        weight 90
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}
  • stat为BACKUP
  • priority应该比master的小

(3)重启keepalived

代码语言:javascript
复制
sudo yum install -y keepalived
5.2.3、查看是否配置成功

在master上查看VIP

在backup上查看vip

也可以安装ipvsadm,查看后端real server状态


web 篇:

需求中所涉及的使用LNMP环境搭建多个虚拟机不多讲了,文中也已经附上链接如下。

其中一个反向代理详细如下: tomcat+nginx反向代理(实现一个服务器,一个ip共用80端口)

在搞定之前一直认为,认为nginx站点(discuz,dedecms)和tomcat站点(zrlog)不可以共存的,绞尽脑汁也咩有想到一个共存的例子,唯一的突破点全部放在了,访问的时候添加“8080”, 幸运的是成功了,也可以使用8080去访问,但是作为一个用户你觉得我会在访问百度的时候再次输入www.baidu.com:8080, 这样的话,估摸着过不了多久站点的用户就会全部流失掉!

配置tomcat的zrlog

LNMP搭建多个虚拟主机

大家应该还记得,使用LNMP创建多站点,每增加一个虚拟机(站点)就需要增加在vhost配置一下 Tomcat仍然也是一样的,来看配置:

代码语言:javascript
复制
[[email protected]1 conf]# cd /usr/local/nginx/conf/vhost/
[[email protected]1 vhost]# ls
dedecms.com.conf  discuz.com.conf  zrlog.com.conf

先来回顾下discuz的(应该没有问题!)

代码语言:javascript
复制
[root@Centos-1 vhost]# cat discuz.com.conf 
server
{
    listen 80;     
    server_name www.discuz.com  discuz.com;
    index index.html index.htm index.php;
    root /data/wwwroot/www.discuz.com;
     ##添加PHP解析
    location ~ \.php$    
      {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/www.discuz.com$fastcgi_script_name;
      }
}

再来体验一下Tomcat:

代码语言:javascript
复制
[[email protected]1 vhost]# cat zrlog.com.conf 
server {
       listen       80;
       server_name www.zrlog.com zrlog.com;  
       
        location / {
                        proxy_pass http://192.168.14.103:8080;  
                        proxy_pass_header Server;
                        proxy_set_header Host   $host:8080;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Scheme $scheme;
                        proxy_set_header Host $host;
                        proxy_set_header X-Forwarded-For $remote_addr;
            }
}

顺带一篇:如何保证2站点或多站点在负载均衡下站点内容保持一致呢?


Zabbix 篇:

七、zabbix WEB监控配置

一、环境配置:

主机名

IP 地址

角色

zabbix

192.168.14.109

server

zabbix_mysql

192.168.14.110

server

WEB Master

192.168.14.103

client

WEB Slave

192.168.14.104

client

Mysql Master

192.168.14.105

client

Mysql Slave

192.168.14.106

client

其实zabbix是可以使用yum直接安装的,前提需要安装epel扩展源,但是唯一的一点是版本太旧。推荐使用官方下载的yum源去下载更新。

代码语言:javascript
复制
yum install net-tools -y
Server端配置:

1.1 zabbix 配置

代码语言:javascript
复制
www.zabbix.com/download

下载指定版本:

代码语言:javascript
复制
wget repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm

安装zabbix的yum扩展源:

代码语言:javascript
复制
rpm -ivh zabbix-release-3.2-1.el7.noarch.rpm

安装服务:

代码语言:javascript
复制
yum install -y zabbix-agent zabbix-get zabbix-server-mysql zabbix-web zabbix-web-mysql

其中涵盖了  httpd服务,php服务。
代码语言:javascript
复制
sudo vim /etc/php.ini

;date.timezone = 
改成: 
date.timezone = Asia/Shanghai
zabbix_mysql端配置:

2.1 安装mysql(两种方法,①yum安装 ②编译mysql安装<安装LAMP的时候>)这边编译安装:

代码语言:javascript
复制
cd /usr/local/src

sudo wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz 

sudo tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz

mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql

cd /usr/local/mysql

sudo useradd mysql

sudo mkdir -p /data/mysql

sudo chown -R mysql:mysql /data/mysql

sudo ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

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

sudo cp support-files/mysql.server /etc/init.d/mysqld

sudo vi /etc/init.d/mysqld 

vim编辑下面两行basedir和datadir配置
basedir=/usr/local/mysql
datadir=/data/mysql

/etc/init.d/mysqld start

报错:

代码语言:javascript
复制
1. [[email protected] mysql]$ ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db:
Data::Dumper

解决方法 :安装autoconf库
  命令: sudo yum -y install autoconf   //此包安装时会安装Data:Dumper模块
  
2. /bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
解决方法 :
  sudo yum install libaio* -y

2.2 配置mysql

代码语言:javascript
复制
# sudo vim /etc/my.cnf 

//需要增加配置

character_set_server = utf8

如果不添加此值,后期zabbix的web界面改成中文后会出现问题。

重启mysqld服务

代码语言:javascript
复制
sudo systemctl restart mysqld

启动服务并设为开机启动

代码语言:javascript
复制
sudo chkconfig --add mysqld
代码语言:javascript
复制
export PATH=$PATH:/usr/local/mysql/bin/

sudo vim /etc/profile

source /etc/profile

mysql -uroot

进入mysql命令行,创建zabbix库:

(这个就类似于之前创建wordpress,discuz站点一样的,其实zabbix也是一个php写的web监控站点)

代码语言:javascript
复制
mysql> create database zabbix character set utf8;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on zabbix.* to 'zabbix'@'192.168.14.109' identified by '[email protected]';
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| zabbix             |
+--------------------+
5 rows in set (0.03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

2.3 导入自带数据库

连接远端Mysql服务器

代码语言:javascript
复制
[[email protected] ~]$ mysql -uzabbix [email protected]123 -h 192.168.14.110
mysql > quit

导入数据库

代码语言:javascript
复制
[[email protected] ~]$ cd /usr/share/doc/zabbix-server-mysql-3.2.7/

[[email protected] zabbix-server-mysql-3.2.7]$ ls
AUTHORS  ChangeLog  COPYING  create.sql.gz  NEWS  README

[admin@zabbix zabbix-server-mysql-3.2.7]$ gzip -d create.sql.gz 
gzip: create.sql: Permission denied

[admin@zabbix zabbix-server-mysql-3.2.7]$ sudo gzip -d create.sql.gz 
[sudo] password for admin: 

[admin@zabbix zabbix-server-mysql-3.2.7]$ mysql -uzabbix [email protected]123 -h 192.168.14.110 zabbix < create.sql 
Warning: Using a password on the command line interface can be insecure.

**这边所用到的用户名和密码,就是刚刚创建的。所以在导入数据库的时候要连接到远程的数据库并导入。

2.4 启动zabbix-server,和httpd服务

代码语言:javascript
复制
sudo systemctl start zabbix-server

sudo systemctl start httpd

配置开机启动:

代码语言:javascript
复制
sudo systemctl enable zabbix-server
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-server.service to /usr/lib/systemd/system/zabbix-server.service.

sudo systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

2.5 查看zabbix的日志:

代码语言:javascript
复制
less /var/log/zabbix/zabbix_server.log

2.6 配置zabbix:

代码语言:javascript
复制
sudo vim /etc/zabbix/zabbix_server.conf 


//修改或增加
DBHost=192.168.14.110    //在DBName=zabbix上面增加
(在此写的是咱们的独立指定的mysql server地址)

DBUser=zabbix
[email protected]123      //在DBuser下面增加

再次重启zabbix

代码语言:javascript
复制
sudo systemctl restart zabbix-server

查看端口启动情况

代码语言:javascript
复制
ps aux |grep zabbix 

我们会看到有很多的zabbix子进程。

监听的端口为:10051

安装配置zabbix web界面

代码语言:javascript
复制
浏览器访问http://192.168.14.109/zabbix/

完成,进入管理界面:

代码语言:javascript
复制
初始用户名Admin 密码zabbix

熟悉的zabbix监控配置web界面:

切记:配置好了之后,第一件事情

更改密码!更改密码!更改密码!([email protected]

Administration→Users→Admin→Change password

并且在修改密码下,可以更改web界面为中文。


二、zabbix客户端安装

下载指定版本:

代码语言:javascript
复制
$ sudo wget repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm

安装zabbix的yum扩展源:

代码语言:javascript
复制
sudo rpm -ivh zabbix-release-3.2-1.el7.noarch.rpm

client端仅仅只需要安装服务:

代码语言:javascript
复制
sudo yum install -y zabbix-agent

配置mysql(略)

2.2 配置zabbix

代码语言:javascript
复制
$ sudo vim /etc/zabbix/zabbix_agentd.conf 

//增加如下配置:

Server=127.0.0.1 修改为 Server=192.168.14.109 //定义监控服务端的ip(被动模式)

ServerActive=127.0.0.1 修改为 ServerActive=192.168.14.109 //定义监控服务端的ip(主动模式:客户端主动上报自己的状态给server端)
 
Hostname=Zabbix server修改为Hostname=nginx1 //这是自定义的主机名,一个是让自己容易分别监控的是哪台主机,第二个是服务器可以识别

2.3 启动服务并查看进程以及端口

代码语言:javascript
复制
sudo systemctl start zabbix-agent

ps aux | grep zabbix

netstat -lntp   //我们发现被监控的端口为10050
 
sudo systemctl enable zabbix-agent

三、添加监控主机

3.1 添加主机组

代码语言:javascript
复制
配置 → 主机群组 → 创建主机群组 23zabbixserver(添加主机前先要创建组)

组名:23zabbixserver → 添加即可。

配置 → 主机 → 创建主机

添加刚刚创建的组

IP 地址:192.168.14.103(客户端的IP)

DNS名称:目前用不到,当我们IP地址写主机名的时候可以填写此值。

端口:10050(默认,或填写自定义的)

第二个选项模板稍后讲。

点击最后的 添加 即可!

3.2、添加自定义模板

首先在模板里面我们可以增加很多自定义监控的项目,然后再次把模板链接到一个组内,当我们在组内增加了新的客户端就不需要我们再次去配置监控项目,直接加入组就ok了。

代码语言:javascript
复制
配置 → 模板 → 创建模版

模板名称:23linux_monitor(自定义即可)
群组:Templetes

简单设置,添加即可。

添加自定义模板:

一定不可以忘记点击 “添加” 按钮

点击 “更新”

但是我们发现需要监控的项目,太多我们不需要那么多,如何去修改呢?

模板 → 链接的模板 → 取消链接

再次去删除 “监控项”的内容即可,然后再次去删除“应用集”的空白项目

四、处理图形中的乱码
  1. 点击刚刚创建的主机 → 点击上面的选项“模板” → “链接指示器” → “添加” → “更新” → 然后我们就会看到模板的中的监控项全部复制到了新添加的主机中。
  2. 点击“图形” → 点击任意一个 → “预览” → 我们会发现其中出现了乱码:

这种情况是因为我们虚拟主机中没有能够解析这个字体的字体库。如何能够解决问题呢?

这种情况其实很容易去处理,直接copy windows中的一个字体,放在linux中指定的路径即可。

代码语言:javascript
复制
$ cd /usr/share/zabbix/fonts/

$ sudo mv graphfont.ttf graphfont.ttf.bak

$ sudo ln -s simhei.ttf graphfont.ttf

然后再次回到我们的zabbix监控页面,再次刷新,我们发现已经可以正常显示中文了。

  1. “监测中” → “最新数据” → “图形” → 就可以看到我们刚刚监控的cpu或者内存的使用信息了。
五、自动发现

点击“自动发现规则” → 按理来说,我们已经配置了自动发现规则,为什么在图形中没有看到任何图表显示呢? 其原因是 我们虽然配置了,但是自动发现规则是1小时候才可以显示,我们可以手动编辑调节“数据更新间隔”为10分钟或者为了让其快速显示,可以临时设置1分钟,当出来图表再次把更新时间间隔调节为600秒即可。 点击“更新”即可。 至于说压力问题,只要不是监控太多的客户端,这个值还是可以的。

然后(重启服务器与客户端的zabbix服务):

代码语言:javascript
复制
server端:
$ sudo systemctl restart zabbix-server

client端:
$ sudo systemctl restart zabbix-agent

同理设置另外一台nginx2服务器!


四、添加自定义监控项目

5.1 需要到==客户端(nginx1)==定义脚本:

代码语言:javascript
复制
$ sudo vim /usr/local/sbin/estab.sh 
//内容如下

#!/bin/bash
##获取80端口并发连接数
netstat -ant |grep ':80 ' |grep -c ESTABLISHED

给脚本授权:

$ sudo chmod 755 /usr/local/sbin/estab.sh

$ sudo vim /etc/zabbix/zabbix_agentd.conf
//增加

UnsafeUserParameters=1  //表示使用自定义脚本

UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh 
//自定义监控项的key为my.estab.count(也就是在监控项中需要填写的键值),后面的[*]里面写脚本的参数,如果没有参数则可以省略,如果有需要用逗号分隔,脚本为/usr/local/sbin/estab.sh

重启客户端的zabbix服务:

代码语言:javascript
复制
$ sudo systemctl restart zabbix-agent

5.2 到服务端验证,执行命令:

代码语言:javascript
复制
[[email protected] ~]$ zabbix_get -s 192.168.14.103 -p 10050 -k 'my.estab.count'
0

-s:源地址
-p: 端口
-k: 键值

如上显示0即为没有任何连接。

5.3 但是这不是我们需要的效果,效果是我们需要在web页面去随时查看:

配置 → 主机 → 监控项 → 创建监控项

其它项默认即可,如有需求按照现场需求定制。

来配置一个图形:

“配置”→“主机” →“图形” → 创建图形”

添加该项目后,到“监测中” → “最新数据”查看刚添加的项目是否有数据出现 有了数据就可以添加图形了

顺便我们也可以创建一个触发器:


六、配置邮件告警

配置告警是目前绝大多数企业必须要有的一个状态,遇到问题第一时间获得警告大大提升了运维的高效性,如果没有配置任何告警,等待客户反应,这是一个非常不明智的选择。

建议配置一个163邮箱,然后邮箱绑定微信,在遇到故障的第一时间就可以收到告警邮件。(QQ邮箱之前绑定的wordpress已经被QQ拉为黑名单了,不建议使用)

6.1 在开始前,一定要把这两项开启:

6.2 编辑报警媒介

登录web管理界面:

管理 → 报警媒介类型 → 创建媒体类型(不建议用自带的,不好用)

脚本名称一定要用自己自定义的!!!

脚本参数(不然不可以发邮件):

{ALERT.SENDTO} //发给谁

{ALERT.SUBJECT} //主题

{ALERT.MESSAGE} //邮件内容

6.3 写一个报警的邮件脚本:

在服务端配置:

下载安装sendEmail邮件包

代码语言:javascript
复制
$ sudo wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz

$ sudo tar xvf sendEmail-v1.56.tar.gz

$ sudo cp -a sendEmail-v1.56/sendEmail /usr/local/bin/

$ ll /usr/local/bin/sendEmail 
-rwxr-xr-x 1 root root 80213 Sep 30  2009 /usr/local/bin/sendEmail
代码语言:javascript
复制
# vim /usr/lib/zabbix/alertscripts SendEmail.sh

脚本为什么放在这边呢?因为咱们在配置文件中=vim /etc/zabbix/zabbix_server.conf有个参数AlertScriptsPath=/usr/lib/zabbix/alertscripts 定义了位置。

代码语言:javascript
复制
#!/bin/bash
SMTP_server='smtp.163.com'    # SMTP服务器
username='[email protected]'     # 邮箱用户名
password='*****'             # 邮箱密码
from_email_address='[email protected]' # 发件人Email地址
to_email_address="$1"               # 收件人Email地址,zabbix传入的第一个参数
message_subject_utf8="$2"           # 邮件标题,zabbix传入的第二个参数
message_body_utf8="$3"              # 邮件内容,zabbix传入的第三个参数
 
# 转换邮件标题为GB2312,解决邮件标题含有中文,收到邮件显示乱码的问题。
message_subject_gb2312=`iconv -t GB2312 -f UTF-8 << EOF
$message_subject_utf8
EOF`
[ $? -eq 0 ] && message_subject="$message_subject_gb2312" || message_subject="$message_subject_utf8"
 
# 转换邮件内容为GB2312
message_body_gb2312=`iconv -t GB2312 -f UTF-8 << EOF
$message_body_utf8
EOF`
[ $? -eq 0 ] && message_body="$message_body_gb2312" || message_body="$message_body_utf8"
 
# 发送邮件
sendEmail='/usr/local/bin/sendEmail'
$sendEmail -s "$SMTP_server" -xu "$username" -xp "$password" -f "$from_email_address" -t "$to_email_address" -u "$message_subject" -m "$message_body" -o message-content-type=text -o message-charset=gb2312
代码语言:javascript
复制
$ sudo chmod 755 /usr/lib/zabbix/alertscripts/SendEmail.sh 

$ sudo chown zabbix:zabbix /usr/lib/zabbix/alertscripts/SendEmail.sh

$ sudo touch /tmp/Email.log 

$ sudo chown zabbix:zabbix /tmp/Email.log 

$ sudo systemctl restart zabbix-server

测试:

代码语言:javascript
复制
$ sh SendEmail.sh 188@163.com 测试邮件  嗯测试邮件
Sep 12 17:42:38 zhdy-04 sendEmail[62400]: Email was sent successfully!

正常收到邮件。

6.4 创建运维人员的邮箱,接受报警邮件

“管理”,“用户”,“创建用户”,

“报警媒介”,类型选择“报警error”,

关于权限选项,我们先保存当前的配置,然后进入用户群组 → Zabbix administrators → 权限

为了防止发生错误,暂时先选择全部用户。千万不要忘记点击添加

然后下一步,万事俱备,就差预警了。

“配置”,“动作”,“创建动作”,名称写“sendmail”(自定义),“操作”页面,内容如下

代码语言:javascript
复制
HOST:{HOST.NAME} {HOST.IP}
TIME:{EVENT.DATE}  {EVENT.TIME} 
LEVEL:{TRIGGER.SEVERITY} 
NAME:{TRIGGER.NAME}
messages:{ITEM.NAME}:{ITEM.VALUE}
ID:{EVENT.ID}

记得一定要点击添加按钮 不然全部都不会保存!!!

最后一个选项“恢复操作” :意思是,如果遇到问题,我们已经解决了,恢复了,状态全部正常了,我们也需要配置一下。

“恢复操作”,把信息改成如下:

代码语言:javascript
复制
HOST:{HOST.NAME} {HOST.IP}
TIME:{EVENT.DATE}  {EVENT.TIME} 
LEVEL:{TRIGGER.SEVERITY} 
NAME:{TRIGGER.NAME}
messages:{ITEM.NAME}:{ITEM.VALUE}
ID:{EVENT.ID}
七、验证配置:

开始搞事情~

配置 → 主机 → 触发器 → 创建触发器

条件是,并发数小于5,咱们的虚拟机压根就没有任何人去访问,所以轻轻松松报警。

点击添加,我们等着就可以了。

可以根据如下去调节监控间隔时长,真实环境不建议这样设置。(会造成服务器负载过高,有些必要的监控项可以设置)

稍微等个30秒 出现如下:

当然 恢复了我们也配置了相关的邮件提醒:


八、监控web站点的可用性
  1. 选择 -> Configuration(配置) -> Hosts(主机) -> web
  1. 右上角 “创建web 监控”
  2. 配置监控的信息:Name 、Agent (就是模拟什么浏览器去调你的api)
  1. 配置url 的地址和名字,如果Header 中有信息,也要填写。Required string 为请求返回的字符串,可以为空。Required status codes 为请求返回的状态码。

Required string和Required status codes 为判断调用 api 成功与否的条件

检查测试:

添加第二台就没有那么复杂了,只要把第二台的主机添加到组,复制链接相应的规则即可!

顺便看下个个监控状态:

二、Zabbix 监控mysql篇

MySQL master的IP:192.168.14.105 zabbix server的IP:192.168.14.109

一、在MySQL master上安装zabbix客户端
1.安装zabbix官方源的配置包:
代码语言:javascript
复制
sudo rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
2.安装zabbix客户端
代码语言:javascript
复制
sudo yum install -y zabbix-agent
3.修改zabbix agent的配置

编辑zabbix agent的配置文件sudo vi /etc/zabbix/zabbix_agentd.conf

代码语言:javascript
复制
Server=192.168.14.109
ServerActive=192.168.14.109
Hostname=dbm

说明:

  • Server=192.168.14.109:定义被动模式的server端
  • ServerActive=192.168.14.109:定义主动模式的server端
  • Hostname=dbm:105的hostname已经设置为dbm,所以在zabbix中就沿用了
4.启动zabbix agent服务并设置开机自启
代码语言:javascript
复制
sudo systemctl start zabbix-agent.service
sudo systemctl enable zabbix-agent.service
二、在server端添加监控主机
1.添加主机群组

创建db_cluster的主机群组:

2.添加主机

添加MySQL master的主机dbm:

3.创建模板

这里有两种方式,一种就是直接从其他模板复制;另外一种直接链接到模板,再取消链接。区别在于前者可以先选择自己想要的监控项,二后者是把别人的东西一股脑全拿过来。

3.1 直接从其他模板复制
添加db_monitor的模板:
为模板添加监控项:
  • zabbix自带了MySQL的几个监控项,可以从Template App MySQL中直接复制
  • 具体操作看下面的步骤

1.找到Template App MySQL,选择监控项

2.点击复制,复制到db_monitor

复制途中两个打钩的监控项(一个是慢查询、一个是MySQL的状态),点击复制,

3.2 链接到模板

在链接指示器中选择Template App MySQL(下图是已经添加过监控项的):

可以看到已经有了1个应用集、14个监控项等等。

点击取消链接:

至此,模板已经初步创建好了。

4.添加自定义的监控项到模板

在客户端开启自定义监控脚本。修改客户端的配置文件zabbix_agent.conf,加入过修改以下内容:

代码语言:javascript
复制
UnsafeUserParameters=1
UserParameter=slow.query.count[*],/usr/local/sbin/zabbix/slow_query_count.sh
4.1 队列数超过300报警

自定义的脚本

代码语言:javascript
复制
#!/bin/bash
# script name: process_count.sh

process_count=`mysql -uroot [email protected]123 -e "SHOW FULL PROCESSLIST;" |wc -l`
echo $process_count
4.2 慢查询日志超过60条/分钟告警

zabbix的MySQL模板里就有慢查询数的监控项,但是为了了解MySQL,还是自己写一个脚本试试水。

创建慢查询统计脚本sudo vim /usr/local/sbin/zabbix/slow_query_count.sh

代码语言:javascript
复制
#!/bin/bash
# script name: slow_query_count.sh

slow_log=/data/mysql/dbm-slow.log
grep 'timestamp' $slow_log | awk -F '=' '{print $2}' |awk -F ';' '{print $1}'|sort -r > /tmp/timestamp.log
now=`sed -n '1'p /tmp/timestamp.log`
alert_num=60
one_min_ago=$[$now-60]
num=0

##### 判断两个时间戳之前的差值
slow_query_sum() {
    if [ $1 -ge $2 ]
    then
        num=$[$num+1]
    else
	break
    fi
}


##### 获取在一分钟内的慢查询数

for n in `cat /tmp/timestamp.log`
do
    slow_query_sum $n $one_min_ago
done

##### 删除临时文件
rm -f /tmp/timestamp.log
# There are $num slow query in a minute.
echo $num
4.3 在zabbix网页端添加监控项
4.3.1 修改脚本权限

agent上执行

代码语言:javascript
复制
sudo chmod 755 /usr/local/sbin/zabbix/process_count.sh
sudo chmod 755 /usr/local/sbin/zabbix/slow_query_count.sh
4.3.2 重启zabbix_agent服务

上述脚本添加成功后,重启zabbix_agent服务。

代码语言:javascript
复制
sudo systemctl restart zabbix-agent.service
4.3.3 服务端验证

server端执行

代码语言:javascript
复制
sudo zabbix_get -s 192.168.14.105 -p 10050 -k 'process.count'
sudo zabbix_get -s 192.168.14.105 -p 10050 -k 'slow.query.count'

这里遇到一个问题:提示grep的权限不够,不能读取日志文件

以慢查询告警脚本为例进行说明。(进程数告警操作基本相同,不再赘述)

经过测试,是因为/data/mysql没有给x权限,不论dbm-slow.log权限给多大,当然都无法读取。 解决方案:如果mysql的数据目录权限要求比较严格,建议更改慢查询日志路径。否则可以直接修改目录权限。

在这里我选择了前者:

代码语言:javascript
复制
mysql> set global slow_query_log_file='/tmp/dbm-slow.log'; //修改慢查询日志文件路径
Query OK, 0 rows affected (0.00 sec)

mysql> SET global slow_query_log='OFF'; //这两条命令的目的是前面更改日志路径的命令即时生效
Query OK, 0 rows affected (0.00 sec)

mysql> SET global slow_query_log='ON';
Query OK, 0 rows affected (0.00 sec)

再对对应脚本中的日志文件进行更改。

4.3.4 给dbm添加监控项

键值就是前面配置文件中写的内容。

4.3.5 添加触发器
5.创建报警媒介类型

如上参考创建WEB的报警媒介。

顺带分享:zabbix监控mysql性能

Mysql 篇

八、mysql 配置

8.1 两台数据库servers 配置主从同步,或者主主高可用即可。

Mysql主从同步架构配置 由于主从架构此篇参考文章mysql server已经有数据了,所以中间部分详细讲述了如何导入数据让两边数据库保持一致。(如果是两台新机器,就没有必要。) 此架构我们采用了mysql-proxy的读写分析,为了避免单点故障,直接安装在Mysql-Master上。其优点已经在文中结尾处阐述!

使用mysql-proxy配置mysql读写分离 此处使用了单独的mysql-proxy,请参考如何配置安装Mysql-proxy即可!

利用Keepalived+mysql构建高可用MySQL双主自动切换

8.2 Mysql 数据备份

把Mysql-Master中的所有数据库全部备份到NFS1上面,在经过NFS1备份到NFS2上面达到双重备份。

制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器。

需求:

  • 本地server访问备份server不需要输入密码(做双机密钥认证)
  • 本地脚本备份不需要输入提示任何输入用户名和密码
  • 每天晚上3点开始执行备份,并把日志输出到指定文件。
  • 本机数据保存1个月,备份server保存3个月。

密钥认证:

代码语言:javascript
复制
$ sudo mkdir /root/.ssh    创建一个.ssh的文件夹
$ sudo chmod 700 /root/.ssh   给.ssh的文件夹授权
$ sudo vi /root/.ssh/authorized_keys    复制公钥到此文件

在 /etc/my.cnf中添加mysqldump的user和password

代码语言:javascript
复制
[mysqldump]
user=root
password=[email protected]123

备份整个数据库脚本,并删除本地30天以外的数据库!

代码语言:javascript
复制
#! /bin/bash

##backup all of mysql we used
##written by zhdya_20170928

d=`date +%Y%m%d`

mysqldump --all-databases  > /bak/mysql/$d.sql

rsync -az /bak/mysql/$d.sql 192.168.14.107:/bak/mysql/

find /bak/mysql/ -mtime +30 -name '*[1-9].sql' -exec rm -rf {} \;

echo "mysql backup end at `date +"%F %T"`." >>/var/log/mysqlbak.log

九、禁止root远程登录,其他用户登录使用密钥登录

一、需求:

使192.168.14.101-109的root无法使用远程登录,其他用户需要使用密匙登录。

可以使用expect+shell脚本实现

二、思路:

(1)使root无法远程登录的方法

代码语言:javascript
复制
修改/etc/ssh/sshd_config的内容,将"#PermitRootLogin yes"修改为"PermitRootLogin no"
重启sshd服务

(2)使用户只能使用密钥登录

代码语言:javascript
复制
修改/etc/ssh/sshd_config的内容
将"#PasswordAuthentication yes"修改为"PasswordAuthentication no"
将"#PubkeyAuthentication yes"修改为"PubkeyAuthentication yes"
重启sshd服务

三、批量实现

3.1、expect

代码语言:javascript
复制
cd /usr/local/sbin/expect
vim ssh.expect
#写入以下内容

#!/usr/bin/expect
#用与禁止root远程登录以及普通用户使用密匙登录

set user "root"
set passwd "123456"
set host [ lindex $argv 0 ]
spawn ssh $user@$host

expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$passwd\r" }
}

expect  "]*"
send "sed -i 's/#PermitRootLogin yes/PermitRootLogin no/g'  /etc/ssh/sshd_config \r"
expect  "]*"
send "sed -i  's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config \r"
expect "]*"
send  "sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config \r"
expect "]*"
send "systemctl restart sshd \r"
expect "]*"
send "exit \r"
  • 保存后需要赋予执行权限

3.2、服务器IP

代码语言:javascript
复制
vim   ip.txt
#写入以下内容
192.168.14.101
192.168.14.102
192.168.14.103
192.168.14.104
192.168.14.105
192.168.14.106
192.168.14.107
192.168.14.108
192.168.14.109

3.3、shell脚本

代码语言:javascript
复制
vim  ssh.sh
#写入以下内容

#!/bin/bash
#禁止指定服务器root登录,普通用户使用密钥登录

for ip in `cat ip.txt`
do
        ./ssh.expect  $ip &>>ssh.log
        if [ $? -eq "0" ]
        then
                echo $ip.....[ ok ]
        else
                echo $ip.....[ faild ]
        fi
done

执行shell脚本即可

由于篇幅过长,分别由团队不同成员编辑,所以不免存在错误,希望有心人多多指正,不胜感激!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/05/05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础篇:
  • 2.1、单台机器的命令审计如下操作
    • 2.1.1、创建审计日志存放位置
      • 2.1.2、修改/etc/profile
        • 2.1.3、重新加载/etc/profile
        • 2.2、多台机器进行命令审计
          • 2.2.1、首先给每台机器都同步一个文件
            • 2.2.2、批量修改其他机器/etc/profile
            • 3.1、关闭selinux
              • 3.1.1、selinux-firewalld.expect
                • 3.1.2、selinux.sh
                • 3.2、关闭firewalld
                  • 2.1、selinux-firewalld.expect
                    • 3.2.2、firewalld.sh
                    • 4.1、首先生成密钥对
                    • 4.2、在Linux上配置公钥
                      • 4.2.1、创建公钥文件存放位置
                        • 4.2.2、创建公钥文件并写入公钥内容
                        • 4.3、将公钥同步到其他机器
                        • 4.4、使用密钥登录admin
                        • 4.5、同步公钥后设置时遇到的问题
                        • 一、配置real server
                          • 5.1.1、配置real server1
                            • 5.1.2、配置real server2
                              • 5.1.3、在real server执行lvs_rs.sh
                              • 二、配置DIR
                                • 5.2.1、配置master
                                  • 5.2.2、配置BACKUP
                                    • 5.2.3、查看是否配置成功
                                    • web 篇:
                                    • Zabbix 篇:
                                      • 一、环境配置:
                                        • Server端配置:
                                          • zabbix_mysql端配置:
                                            • 二、zabbix客户端安装
                                              • 三、添加监控主机
                                                • 四、处理图形中的乱码
                                                  • 五、自动发现
                                                    • 四、添加自定义监控项目
                                                      • 六、配置邮件告警
                                                        • 七、验证配置:
                                                          • 八、监控web站点的可用性
                                                            • 一、在MySQL master上安装zabbix客户端
                                                              • 1.安装zabbix官方源的配置包:
                                                              • 2.安装zabbix客户端
                                                              • 3.修改zabbix agent的配置
                                                              • 4.启动zabbix agent服务并设置开机自启
                                                            • 二、在server端添加监控主机
                                                              • 1.添加主机群组
                                                              • 2.添加主机
                                                              • 3.创建模板
                                                              • 3.1 直接从其他模板复制
                                                              • 添加db_monitor的模板:
                                                              • 为模板添加监控项:
                                                              • 3.2 链接到模板
                                                              • 4.添加自定义的监控项到模板
                                                              • 4.1 队列数超过300报警
                                                              • 4.2 慢查询日志超过60条/分钟告警
                                                              • 4.3 在zabbix网页端添加监控项
                                                              • 4.3.1 修改脚本权限
                                                              • 4.3.2 重启zabbix_agent服务
                                                              • 4.3.3 服务端验证
                                                              • 4.3.4 给dbm添加监控项
                                                              • 4.3.5 添加触发器
                                                            • 5.创建报警媒介类型
                                                            • Mysql 篇
                                                            相关产品与服务
                                                            云数据库 MySQL
                                                            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                                                            领券
                                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档