MySQL 高可用架构之MMM

数据库zkbhj 发表了文章 • 0 个评论 • 1555 次浏览 • 2017-03-13 10:34 • 来自相关话题

简介

MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个slave的read负载均衡。

MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全的保证数据一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度的保证业务可用性的场景。对于那些对数据的一致性要求很高的业务,非常不建议采用MMM这种高可用架构。

MMM项目来自 Google: http://code.google.com/p/mysql-master-master

官方网站为: http://mysql-mmm.org


下面我们通过一个实际案例来充分了解MMM的内部架构,如下图所示。





 
具体的配置信息如下所示:
角色 ip地址 主机名字 server-id
monitoring 192.168.0.30 db2 -
master1 192.168.0.60 db1 1
master2 192.168.0.50 db2 2
slave1 192.168.0.40 db3 3业务中的服务ip信息如下所示:
ip地址 角色 描述
192.168.0.108 write 应用程序连接该ip对主库进行写请求
192.168.0.88 read 应用程序连接该ip进行读请求
192.168.0.98 read 应用程序连接该ip进行读请求具体的配置步骤如下:

(1)主机配置

配置/etc/hosts,在所有主机中,添加所有的主机信息:
[root@192.168.0.30 ~]# cat /etc/hosts
192.168.0.60 db1
192.168.0.50 db2
192.168.0.40 db3
[root@192.168.0.30 ~]#2)首先在3台主机上安装mysql和搭建复制(192.168.0.60和192.168.0.50互为主从,192.168.0.40为192.168.0.60的从)具体的复制搭建这里就省略,要是这都不会,那么该文章对你就没意思了。然后在每个mysql的配置文件中加入以下内容, 注意server_id 不能重复。

db1(192.168.0.60)上:server-id = 1
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 1db2(192.168.0.50)上:
server-id = 2
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 2db3(192.168.0.40)上:
server-id = 3
log_slave_updates = 1上面的id不一定要按顺序来,只要没有重复即可。

(3)安装MMM所需要的Perl模块(所有服务器)执行该脚本,也可以安装epel源,然后 yum -y install mysql-mmm*来安装MMM :
rpm -ivh http://dl.fedoraproject.org/pu ... h.rpm
yum -y install mysql-mmm*

[root@192.168.0.60 ~]# cat install.sh
#!/bin/bash
wget http://xrl.us/cpanm --no-check-certificate
mv cpanm /usr/bin
chmod 755 /usr/bin/cpanm
cat > /root/list << EOF
install Algorithm::Diff
install Class::Singleton
install DBI
install DBD::mysql
install File::Basename
install File::stat
install File::Temp
install Log::Dispatch
install Log::Log4perl
install Mail::Send
install Net::ARP
install Net::Ping
install Proc::Daemon
install Thread::Queue
install Time::HiRes
EOF

for package in `cat /root/list`
do
cpanm $package
done
[root@192.168.0.60 ~]#(4)

下载mysql-mmm软件,在所有服务器上安装:
[root@192.168.0.60 ~]# wget http://mysql-mmm.org/_media/:m ... ar.gz
[root@192.168.0.60 ~]# mv :mmm2:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz
[root@192.168.0.60 ~]# tar xf mysql-mmm-2.2.1.tar.gz
[root@192.168.0.60 ~]# cd mysql-mmm-2.2.1
[root@192.168.0.60 mysql-mmm-2.2.1]# make installmysql-mmm安装后的主要拓扑结构如下所示(注意:yum安装的和源码安装的路径有所区别):
目录 介绍
/usr/lib/perl5/vendor_perl/5.8.8/MMM MMM使用的主要perl模块
/usr/lib/mysql-mmm MMM使用的主要脚本
/usr/sbin MMM使用的主要命令的路径
/etc/init.d/ MMM的agent和monitor启动服务的目录
/etc/mysql-mmm MMM配置文件的路径,默认所以的配置文件位于该目录下
/var/log/mysql-mmm 默认的MMM保存日志的位置到这里已经完成了MMM的基本需求,接下来需要配置具体的配置文件,其中mmm_common.conf,mmm_agent.conf为agent端的配置文件,mmm_mon.conf为monitor端的配置文件。

(5)配置agent端的配置文件,需要在db1,db2,db3上分别配置。

在db1主机上配置agent配置文件:
[root@192.168.0.60 ~]# cd /etc/mysql-mmm/
[root@192.168.0.60 mysql-mmm]# cat mmm_common.conf
active_master_role writer
<host default>
cluster_interface eth1

pid_path /var/run/mmm_agentd.pid
bin_path /usr/lib/mysql-mmm/
replication_user repl
replication_password 123456
agent_user mmm_agent
agent_password mmm_agent
</host>
<host db1>
ip 192.168.0.60
mode master
peer db2
</host>
<host db2>
ip 192.168.0.50
mode master
peer db1
</host>
<host db3>
ip 192.168.0.40
mode slave
</host>
<role writer>
hosts db1, db2
ips 192.168.0.108
mode exclusive
</role>

<role reader>
hosts db2, db3
ips 192.168.0.88, 192.168.0.98
mode balanced
</role>
[root@192.168.0.60 mysql-mmm]#其中 replication_user 用于检查复制的用户, agent_user 为agent的用户, mode 标明是否为主或者备选主,或者从库。 mode exclusive 主为独占模式,同一时刻只能有一个主, <role write> 中hosts表示目前的主库和备选主的真实主机ip或者主机名, ips 为对外提供的虚拟机ip地址 ,<role readr> 中hosts代表从库真实的ip和主机名, ips 代表从库的虚拟ip地址。

由于db2和db3两台主机也要配置agent配置文件,我们直接把mmm_common.conf从db1拷贝到db2和db3两台主机的/etc/mysql-mmm下。

注意:monitor主机要需要:
scp /etc/mysql-mmm/mmm_common.conf db2:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf db3:/etc/mysql-mmm/分别在db1,db2,db3三台主机的/etc/mysql-mmm配置mmm_agent.conf文件,分别用不同的字符标识,注意这三台机器的this db1这块要想,比如本环境中,db1要配置this db1,db2要配置为this db2,而db3要配置为this db3。

在db1(192.168.0.60)上:
[root@192.168.0.60 ~]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1
[root@192.168.0.60 ~]#在db2(192.168.0.50)上:
[root@192.168.0.50 ~]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db2
[root@192.168.0.50 ~]#在db3(192.168.0.40)上:
[root@192.168.0.40 ~]# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db3
[root@192.168.0.40 ~]#在db2(192.168.0.30)配置monitor的配置文件:
[root@192.168.0.30 ~]# cat /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf

<monitor>
ip 127.0.0.1
pid_path /var/run/mysql-mmm/mmm_mond.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.0.40,192.168.0.50,192.168.0.60
auto_set_online 60
</monitor>

<host default>
monitor_user mmm_monitor
monitor_password mmm_monitor
</host>

debug 0
[root@192.168.0.30 ~]#这里只在原有配置文件中的ping_ips添加了整个架构被监控主机的ip地址,而在<host default>中配置了用于监控的用户。

(6)创建监控用户,这里需要创建3个监控用户,具体描述如下:
用户名 描述 权限
monitor user MMM的monitor端监控所有的mysql数据库的状态用户 REPLICATION CLIENT
agent user 主要是MMM客户端用于改变的master的read_only状态用户 SUPER,REPLICATION CLIENT,PROCESS
repl 用于复制的用户 REPLICATION SLAVE在3台服务器(db1,db2,db3)进行授权,因为我之前的主主复制,以及主从已经是ok的,所以我在其中一台服务器执行就ok了。用于复制的账号之前已经有了,所以这里就授权两个账号。
mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.0.%' IDENTIFIED BY 'mmm_agent';
Query OK, 0 rows affected (0.08 sec)

mysql> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.0.%' IDENTIFIED BY 'mmm_monitor';
Query OK, 0 rows affected (0.00 sec)

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

mysql>如果是从头到尾从新搭建,则加上另外一个复制账户(分别在3台服务器都需要执行这3条SQL):GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%' IDENTIFIED BY '123456';(7)启动agent服务。

最后分别在db1,db2,db3上启动agent,并在db2(192.168.0.30)上启动monitor程序:
[root@192.168.0.60 ~]# /etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
[root@192.168.0.60 ~]#[root@192.168.0.50 ~]# /etc/init.d/mysql-mmm-agent start
Starting MMM Agent Daemon: [ OK ]
[root@192.168.0.50 ~]#因为我有些使用yum安装的,所以启动信息有些不一样。^_^
[root@192.168.0.40 ~]# /etc/init.d/mysql-mmm-agent start
Starting MMM Agent Daemon: [ OK ]
[root@192.168.0.40 ~]#启动monitor:
[root@192.168.0.30 ~]# /etc/init.d/mysql-mmm-monitor start
Starting MMM Monitor Daemon: [ OK ]
[root@192.168.0.30 ~]#其中agent的日志存放在/var/log/mysql-mmm/mmm_agentd.log,monitor日志放在/var/log/mysql-mmm/mmm_mond.log,启动过程中有什么问题,通常日志都会有详细的记录。

(8)在monitor主机上检查集群主机的状态:
[root@192.168.0.30 ~]# mmm_control checks all
db2 ping [last change: 2014/04/18 00:29:01] OK
db2 mysql [last change: 2014/04/18 00:29:01] OK
db2 rep_threads [last change: 2014/04/18 00:29:01] OK
db2 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null
db3 ping [last change: 2014/04/18 00:29:01] OK
db3 mysql [last change: 2014/04/18 00:29:01] OK
db3 rep_threads [last change: 2014/04/18 00:29:01] OK
db3 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null
db1 ping [last change: 2014/04/18 00:29:01] OK
db1 mysql [last change: 2014/04/18 00:29:01] OK
db1 rep_threads [last change: 2014/04/18 00:29:01] OK
db1 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null

[root@192.168.0.30 ~]#(9)在monitor主机上检查集群环境在线状况:
[root@192.168.0.30 ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[root@192.168.0.30 ~]#(10)online(上线)所有主机:

我这里主机已经在线了,如果没有在线,可以使用下面的命令将相关主机online
[root@192.168.0.30 ~]# mmm_control set_online db1
OK: This host is already ONLINE. Skipping command.
[root@192.168.0.30 ~]#提示主机已经在线,已经跳过命令执行了。

到这里整个集群就配置完成了。从输出中可以看到虚拟ip 192.168.0.108已经顺利添加到主机192.168.0.60上作为主对外提供写服务,虚拟ip 192.168.0.88添加到主机192.168.0.50上对外提供读服务,而虚拟ip 192.168.0.98添加到192.168.0.40上对外提供读服务。

MMM高可用测试

我们已经完成高可用环境的搭建了,下面我们就可以做MMM的HA测试咯。首先查看整个集群的状态,可以看到整个集群状态正常。
[root@192.168.0.30 ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[root@192.168.0.30 ~]#模拟db2(192.168.0.50 )宕机,手动停止mysql服务,观察monitor日志:
[root@192.168.0.30 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
2014/04/18 00:55:53 FATAL State of host 'db2' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)从日志发现db2的状态有ONLINE转换为HARD_OFFLINE

重新查看集群的最新状态:
[root@192.168.0.30 ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/HARD_OFFLINE. Roles:
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.88), reader(192.168.0.98)

[root@192.168.0.30 ~]#重启db2,可以看到db2由HARD_OFFLINE转到AWAITING_RECOVERY。这里db2再次接管读请求。
[root@192.168.0.30 ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[root@192.168.0.30 ~]#模拟db1主库宕机:

查看集群状态:
[root@192.168.0.30 ~]# mmm_control show
db1(192.168.0.60) master/HARD_OFFLINE. Roles:
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88), writer(192.168.0.108)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[root@192.168.0.30 ~]#查看MMM日志:
[root@192.168.0.30 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
2014/04/18 01:09:20 FATAL State of host 'db1' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)从上面可以发现,db1由以前的ONLINE转化为HARD_OFFLINE,移除了写角色,因为db2是备选主,所以接管了写角色,db3指向新的主库db2,应该说db3实际上找到了db2的sql现在的位置,即db2 show master返回的值,然后直接在db3上change master to到db2。

db1,db2,db3之间为一主两从的复制关系,一旦发生db2,db3延时于db1时,这个时刻db1 mysql宕机,db3将会等待数据追上db1后,再重新指向新的主db2,进行change master to db2操作,在db1宕机的过程中,一旦db2落后于db1,这时发生切换,db2变成了可写状态,数据的一致性将会无法保证。

总结:

MMM不适用于对数据一致性要求很高的环境。但是高可用完全做到了。
 
原文链接:http://www.tuicool.com/articles/qQVN3yA 查看全部
简介

MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个slave的read负载均衡。

MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全的保证数据一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度的保证业务可用性的场景。对于那些对数据的一致性要求很高的业务,非常不建议采用MMM这种高可用架构。


MMM项目来自 Google: http://code.google.com/p/mysql-master-master

官方网站为: http://mysql-mmm.org



下面我们通过一个实际案例来充分了解MMM的内部架构,如下图所示。

zuuEbi.png

 
具体的配置信息如下所示:
角色                    ip地址          主机名字                server-id
monitoring 192.168.0.30 db2 -
master1 192.168.0.60 db1 1
master2 192.168.0.50 db2 2
slave1 192.168.0.40 db3 3
业务中的服务ip信息如下所示:
ip地址                  角色                    描述
192.168.0.108 write 应用程序连接该ip对主库进行写请求
192.168.0.88 read 应用程序连接该ip进行读请求
192.168.0.98 read 应用程序连接该ip进行读请求
具体的配置步骤如下:

(1)主机配置

配置/etc/hosts,在所有主机中,添加所有的主机信息:
[root@192.168.0.30 ~]# cat /etc/hosts
192.168.0.60 db1
192.168.0.50 db2
192.168.0.40 db3
[root@192.168.0.30 ~]#
2)首先在3台主机上安装mysql和搭建复制(192.168.0.60和192.168.0.50互为主从,192.168.0.40为192.168.0.60的从)具体的复制搭建这里就省略,要是这都不会,那么该文章对你就没意思了。然后在每个mysql的配置文件中加入以下内容, 注意server_id 不能重复。

db1(192.168.0.60)上:
server-id       = 1
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
db2(192.168.0.50)上:
server-id       = 2
log_slave_updates = 1
auto-increment-increment = 2
auto-increment-offset = 2
db3(192.168.0.40)上:
server-id       = 3
log_slave_updates = 1
上面的id不一定要按顺序来,只要没有重复即可。

(3)安装MMM所需要的Perl模块(所有服务器)执行该脚本,也可以安装epel源,然后 yum -y install mysql-mmm*来安装MMM :
rpm -ivh http://dl.fedoraproject.org/pu ... h.rpm
yum -y install mysql-mmm*

[root@192.168.0.60 ~]# cat install.sh
#!/bin/bash
wget http://xrl.us/cpanm --no-check-certificate
mv cpanm /usr/bin
chmod 755 /usr/bin/cpanm
cat > /root/list << EOF
install Algorithm::Diff
install Class::Singleton
install DBI
install DBD::mysql
install File::Basename
install File::stat
install File::Temp
install Log::Dispatch
install Log::Log4perl
install Mail::Send
install Net::ARP
install Net::Ping
install Proc::Daemon
install Thread::Queue
install Time::HiRes
EOF

for package in `cat /root/list`
do
cpanm $package
done
[root@192.168.0.60 ~]#
(4)

下载mysql-mmm软件,在所有服务器上安装:
[root@192.168.0.60 ~]# wget http://mysql-mmm.org/_media/:m ... ar.gz
[root@192.168.0.60 ~]# mv :mmm2:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz
[root@192.168.0.60 ~]# tar xf mysql-mmm-2.2.1.tar.gz
[root@192.168.0.60 ~]# cd mysql-mmm-2.2.1
[root@192.168.0.60 mysql-mmm-2.2.1]# make install
mysql-mmm安装后的主要拓扑结构如下所示(注意:yum安装的和源码安装的路径有所区别):
目录                                                            介绍
/usr/lib/perl5/vendor_perl/5.8.8/MMM MMM使用的主要perl模块
/usr/lib/mysql-mmm MMM使用的主要脚本
/usr/sbin MMM使用的主要命令的路径
/etc/init.d/ MMM的agent和monitor启动服务的目录
/etc/mysql-mmm MMM配置文件的路径,默认所以的配置文件位于该目录下
/var/log/mysql-mmm 默认的MMM保存日志的位置
到这里已经完成了MMM的基本需求,接下来需要配置具体的配置文件,其中mmm_common.conf,mmm_agent.conf为agent端的配置文件,mmm_mon.conf为monitor端的配置文件。

(5)配置agent端的配置文件,需要在db1,db2,db3上分别配置。

在db1主机上配置agent配置文件:
[root@192.168.0.60 ~]# cd /etc/mysql-mmm/
[root@192.168.0.60 mysql-mmm]# cat mmm_common.conf
active_master_role writer
<host default>
cluster_interface eth1

pid_path /var/run/mmm_agentd.pid
bin_path /usr/lib/mysql-mmm/
replication_user repl
replication_password 123456
agent_user mmm_agent
agent_password mmm_agent
</host>
<host db1>
ip 192.168.0.60
mode master
peer db2
</host>
<host db2>
ip 192.168.0.50
mode master
peer db1
</host>
<host db3>
ip 192.168.0.40
mode slave
</host>
<role writer>
hosts db1, db2
ips 192.168.0.108
mode exclusive
</role>

<role reader>
hosts db2, db3
ips 192.168.0.88, 192.168.0.98
mode balanced
</role>
[root@192.168.0.60 mysql-mmm]#
其中 replication_user 用于检查复制的用户, agent_user 为agent的用户, mode 标明是否为主或者备选主,或者从库。 mode exclusive 主为独占模式,同一时刻只能有一个主, <role write> 中hosts表示目前的主库和备选主的真实主机ip或者主机名, ips 为对外提供的虚拟机ip地址 ,<role readr> 中hosts代表从库真实的ip和主机名, ips 代表从库的虚拟ip地址。

由于db2和db3两台主机也要配置agent配置文件,我们直接把mmm_common.conf从db1拷贝到db2和db3两台主机的/etc/mysql-mmm下。

注意:monitor主机要需要:
scp /etc/mysql-mmm/mmm_common.conf db2:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf db3:/etc/mysql-mmm/
分别在db1,db2,db3三台主机的/etc/mysql-mmm配置mmm_agent.conf文件,分别用不同的字符标识,注意这三台机器的this db1这块要想,比如本环境中,db1要配置this db1,db2要配置为this db2,而db3要配置为this db3。

在db1(192.168.0.60)上:
[root@192.168.0.60 ~]# cat /etc/mysql-mmm/mmm_agent.conf 
include mmm_common.conf
this db1
[root@192.168.0.60 ~]#
在db2(192.168.0.50)上:
[root@192.168.0.50 ~]# cat /etc/mysql-mmm/mmm_agent.conf 
include mmm_common.conf
this db2
[root@192.168.0.50 ~]#
在db3(192.168.0.40)上:
[root@192.168.0.40 ~]# cat /etc/mysql-mmm/mmm_agent.conf 
include mmm_common.conf
this db3
[root@192.168.0.40 ~]#
在db2(192.168.0.30)配置monitor的配置文件:
[root@192.168.0.30 ~]# cat /etc/mysql-mmm/mmm_mon.conf	
include mmm_common.conf

<monitor>
ip 127.0.0.1
pid_path /var/run/mysql-mmm/mmm_mond.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.0.40,192.168.0.50,192.168.0.60
auto_set_online 60
</monitor>

<host default>
monitor_user mmm_monitor
monitor_password mmm_monitor
</host>

debug 0
[root@192.168.0.30 ~]#
这里只在原有配置文件中的ping_ips添加了整个架构被监控主机的ip地址,而在<host default>中配置了用于监控的用户。

(6)创建监控用户,这里需要创建3个监控用户,具体描述如下:
用户名                          描述                                                    权限
monitor user MMM的monitor端监控所有的mysql数据库的状态用户 REPLICATION CLIENT
agent user 主要是MMM客户端用于改变的master的read_only状态用户 SUPER,REPLICATION CLIENT,PROCESS
repl 用于复制的用户 REPLICATION SLAVE
在3台服务器(db1,db2,db3)进行授权,因为我之前的主主复制,以及主从已经是ok的,所以我在其中一台服务器执行就ok了。用于复制的账号之前已经有了,所以这里就授权两个账号。
mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.0.%'   IDENTIFIED BY 'mmm_agent';
Query OK, 0 rows affected (0.08 sec)

mysql> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.0.%' IDENTIFIED BY 'mmm_monitor';
Query OK, 0 rows affected (0.00 sec)

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

mysql>
如果是从头到尾从新搭建,则加上另外一个复制账户(分别在3台服务器都需要执行这3条SQL):
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%' IDENTIFIED BY '123456';
(7)启动agent服务。

最后分别在db1,db2,db3上启动agent,并在db2(192.168.0.30)上启动monitor程序:
[root@192.168.0.60 ~]# /etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
[root@192.168.0.60 ~]#
[root@192.168.0.50 ~]# /etc/init.d/mysql-mmm-agent start
Starting MMM Agent Daemon: [ OK ]
[root@192.168.0.50 ~]#
因为我有些使用yum安装的,所以启动信息有些不一样。^_^
[root@192.168.0.40 ~]# /etc/init.d/mysql-mmm-agent start
Starting MMM Agent Daemon: [ OK ]
[root@192.168.0.40 ~]#
启动monitor:
[root@192.168.0.30 ~]# /etc/init.d/mysql-mmm-monitor start
Starting MMM Monitor Daemon: [ OK ]
[root@192.168.0.30 ~]#
其中agent的日志存放在/var/log/mysql-mmm/mmm_agentd.log,monitor日志放在/var/log/mysql-mmm/mmm_mond.log,启动过程中有什么问题,通常日志都会有详细的记录。

(8)在monitor主机上检查集群主机的状态:
[root@192.168.0.30 ~]# mmm_control checks all
db2 ping [last change: 2014/04/18 00:29:01] OK
db2 mysql [last change: 2014/04/18 00:29:01] OK
db2 rep_threads [last change: 2014/04/18 00:29:01] OK
db2 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null
db3 ping [last change: 2014/04/18 00:29:01] OK
db3 mysql [last change: 2014/04/18 00:29:01] OK
db3 rep_threads [last change: 2014/04/18 00:29:01] OK
db3 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null
db1 ping [last change: 2014/04/18 00:29:01] OK
db1 mysql [last change: 2014/04/18 00:29:01] OK
db1 rep_threads [last change: 2014/04/18 00:29:01] OK
db1 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null

[root@192.168.0.30 ~]#
(9)在monitor主机上检查集群环境在线状况:
[root@192.168.0.30 ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[root@192.168.0.30 ~]#
(10)online(上线)所有主机:

我这里主机已经在线了,如果没有在线,可以使用下面的命令将相关主机online
[root@192.168.0.30 ~]# mmm_control set_online db1
OK: This host is already ONLINE. Skipping command.
[root@192.168.0.30 ~]#
提示主机已经在线,已经跳过命令执行了。

到这里整个集群就配置完成了。从输出中可以看到虚拟ip 192.168.0.108已经顺利添加到主机192.168.0.60上作为主对外提供写服务,虚拟ip 192.168.0.88添加到主机192.168.0.50上对外提供读服务,而虚拟ip 192.168.0.98添加到192.168.0.40上对外提供读服务。

MMM高可用测试

我们已经完成高可用环境的搭建了,下面我们就可以做MMM的HA测试咯。首先查看整个集群的状态,可以看到整个集群状态正常。
[root@192.168.0.30 ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[root@192.168.0.30 ~]#
模拟db2(192.168.0.50 )宕机,手动停止mysql服务,观察monitor日志:
[root@192.168.0.30 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log 
2014/04/18 00:55:53 FATAL State of host 'db2' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
从日志发现db2的状态有ONLINE转换为HARD_OFFLINE

重新查看集群的最新状态:
[root@192.168.0.30 ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/HARD_OFFLINE. Roles:
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.88), reader(192.168.0.98)

[root@192.168.0.30 ~]#
重启db2,可以看到db2由HARD_OFFLINE转到AWAITING_RECOVERY。这里db2再次接管读请求。
[root@192.168.0.30 ~]# mmm_control show
db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108)
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[root@192.168.0.30 ~]#
模拟db1主库宕机:

查看集群状态:
[root@192.168.0.30 ~]# mmm_control show
db1(192.168.0.60) master/HARD_OFFLINE. Roles:
db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88), writer(192.168.0.108)
db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98)

[root@192.168.0.30 ~]#
查看MMM日志:
[root@192.168.0.30 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log 
2014/04/18 01:09:20 FATAL State of host 'db1' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
从上面可以发现,db1由以前的ONLINE转化为HARD_OFFLINE,移除了写角色,因为db2是备选主,所以接管了写角色,db3指向新的主库db2,应该说db3实际上找到了db2的sql现在的位置,即db2 show master返回的值,然后直接在db3上change master to到db2。

db1,db2,db3之间为一主两从的复制关系,一旦发生db2,db3延时于db1时,这个时刻db1 mysql宕机,db3将会等待数据追上db1后,再重新指向新的主db2,进行change master to db2操作,在db1宕机的过程中,一旦db2落后于db1,这时发生切换,db2变成了可写状态,数据的一致性将会无法保证。

总结:

MMM不适用于对数据一致性要求很高的环境。但是高可用完全做到了。
 
原文链接:http://www.tuicool.com/articles/qQVN3yA

Spring Boot

Javazkbhj 发表了文章 • 0 个评论 • 1831 次浏览 • 2017-03-13 10:26 • 来自相关话题

Web应用开发背景

    使用Java做Web应用开发已经有近20年的历史了,从最初的Servlet1.0一步步演化到现在如此多的框架,库以及整个生态系统。经过这么长时间的发展,Java作为一个成熟的语言,也演化出了非常成熟的生态系统,这也是许多公司采用Java作为主流的语言进行服务器端开发的原因,也是为什么Java一直保持着非常活跃的用户群。





 
最受Java开发者喜好的框架当属Spring,Spring也成为了在Java EE开发中真正意义上的标准,但是随着新技术的发展,脚本语言大行其道的时代(Node JS,Ruby,Groovy,Scala等),Java EE使用Spring逐渐变得笨重起来,大量的XML文件存在与项目中,繁琐的配置,整合第三方框架的配置问题,低下的开发效率和部署效率等等问题。

这些问题在不断的社区反馈下,Spring团队也开发出了相应的框架:Spring Boot。Spring Boot可以说是至少近5年来Spring乃至整个Java社区最有影响力的项目之一,也被人看作是:Java EE开发的颠覆者(但是不是有点too young,too simple的感觉!)。
 
Spring Boot解决的问题

(1) Spring Boot使编码变简单

(2) Spring Boot使配置变简单

(3) Spring Boot使部署变简单

(4) Spring Boot使监控变简单

(5) Spring的不足


Spring Boot的干爹和其优点
 
Spring Boot继承了Spring的优点,并新增了一些新功能和特性:

(1)SpringBoot是伴随着Spring4.0诞生的,一经推出,引起了巨大的反向;

(2)从字面理解,Boot是引导的意思,因此SpringBoot帮助开发者快速搭建Spring框架;

(3)SpringBoot帮助开发者快速启动一个Web容器;

(4)SpringBoot继承了原有Spring框架的优秀基因;

(5)SpringBoot简化了使用Spring的过程;

(6)Spring Boot为我们带来了脚本语言开发的效率,但是Spring Boot并没有让我们意外的新技术,都是Java EE开发者常见的额技术。


Spring Boot主要特性

(1)遵循“习惯优于配置”的原则,使用Spring Boot只需要很少的配置,大部分的时候我们直接使用默认的配置即可;

(2)项目快速搭建,可以无需配置的自动整合第三方的框架;

(3)可以完全不使用XML配置文件,只需要自动配置和Java Config;

(4)内嵌Servlet容器,降低了对环境的要求,可以使用命令直接执行项目,应用可用jar包执行:java -jar;

(5)提供了starter POM, 能够非常方便的进行包管理, 很大程度上减少了jar hell或者dependency hell;

(6)运行中应用状态的监控;

(7)对主流开发框架的无配置集成;

(8)与云计算的天然继承; 查看全部
Web应用开发背景

    使用Java做Web应用开发已经有近20年的历史了,从最初的Servlet1.0一步步演化到现在如此多的框架,库以及整个生态系统。经过这么长时间的发展,Java作为一个成熟的语言,也演化出了非常成熟的生态系统,这也是许多公司采用Java作为主流的语言进行服务器端开发的原因,也是为什么Java一直保持着非常活跃的用户群。

qANbiay.png

 
最受Java开发者喜好的框架当属Spring,Spring也成为了在Java EE开发中真正意义上的标准,但是随着新技术的发展,脚本语言大行其道的时代(Node JS,Ruby,Groovy,Scala等),Java EE使用Spring逐渐变得笨重起来,大量的XML文件存在与项目中,繁琐的配置,整合第三方框架的配置问题,低下的开发效率和部署效率等等问题。

这些问题在不断的社区反馈下,Spring团队也开发出了相应的框架:Spring Boot。Spring Boot可以说是至少近5年来Spring乃至整个Java社区最有影响力的项目之一,也被人看作是:Java EE开发的颠覆者(但是不是有点too young,too simple的感觉!)。
 
Spring Boot解决的问题


(1) Spring Boot使编码变简单

(2) Spring Boot使配置变简单

(3) Spring Boot使部署变简单

(4) Spring Boot使监控变简单

(5) Spring的不足



Spring Boot的干爹和其优点
 
Spring Boot继承了Spring的优点,并新增了一些新功能和特性:


(1)SpringBoot是伴随着Spring4.0诞生的,一经推出,引起了巨大的反向;

(2)从字面理解,Boot是引导的意思,因此SpringBoot帮助开发者快速搭建Spring框架;

(3)SpringBoot帮助开发者快速启动一个Web容器;

(4)SpringBoot继承了原有Spring框架的优秀基因;

(5)SpringBoot简化了使用Spring的过程;

(6)Spring Boot为我们带来了脚本语言开发的效率,但是Spring Boot并没有让我们意外的新技术,都是Java EE开发者常见的额技术。



Spring Boot主要特性


(1)遵循“习惯优于配置”的原则,使用Spring Boot只需要很少的配置,大部分的时候我们直接使用默认的配置即可;

(2)项目快速搭建,可以无需配置的自动整合第三方的框架;

(3)可以完全不使用XML配置文件,只需要自动配置和Java Config;

(4)内嵌Servlet容器,降低了对环境的要求,可以使用命令直接执行项目,应用可用jar包执行:java -jar;

(5)提供了starter POM, 能够非常方便的进行包管理, 很大程度上减少了jar hell或者dependency hell;

(6)运行中应用状态的监控;

(7)对主流开发框架的无配置集成;

(8)与云计算的天然继承;


Redis的短链接和长链接?

回复

工具软件zkbhj 发起了问题 • 1 人关注 • 0 个回复 • 4595 次浏览 • 2017-03-09 20:05 • 来自相关话题

Be Here :陪伴是最长情的告白

影视zkbhj 发表了文章 • 0 个评论 • 1993 次浏览 • 2017-03-07 15:52 • 来自相关话题

写在前面: 在电影院里哭得稀里哗啦,好在隔壁的白人老太太投入更多,抽泣声显然盖过我的,才不至于那么尴尬。看完后才发现在拍摄期间,拍摄片场有虐狗视频流出,热门网站上的评分也因此被刷得很低。如果你正犹豫是否该去看这部电影,这里有一篇GQ出的相关报道,我认为比较中肯,你不妨先读读再决定是否要抵制该片。请戳:GQ - What, exactly is a dog's purpose? 

狗生 一

小Bailey还不叫Bailey,在车里几乎要闷死的时候,我心都悬到了嗓子眼。遇到小男孩Ethan,它有了名字“Bailey Bailey Bailey Bailey”。之后的岁月,它与teen Ethan一起作伴,玩耍,在被子里听Ethan讲故事,帮Ethan撩喜欢的女孩的裙底。。这个犯了错摇着尾巴,一脸呆萌不知道错在哪里的小家伙,好几次让人忍俊不禁啊~真想抱着这只红毛猎犬,好好亲一亲。在他的这个轮回里,他的使命就是Ethan。Ethan酗酒的父亲,在饭桌上莫名谈论政治;在和老板夫妇的饭桌上,准备显摆他收藏的rare coin;。。这些沉闷的成人细节里,Bailey的陪伴,捣蛋,为Ethan本该有些阴郁的童年,增添了诸多绚烂美妙的色彩。成年的Ethan求学远去,Bailey叼着球一路追赶Ethan乘坐的车时,我听到影院有断断续续抽泣的声音。可我眼眶的湿润还没缓过劲来,在等待中老去的Bailey就生了病。混沌中Ethan终于回来了,Bailey眼里,我的Ethan你正值青春,我却垂垂老矣。。在Ethan的注视下他视线越来越模糊,Bailey走向了死亡。






狗生 二

Bailey之后的轮回,他变成了威风凛凛的警犬Ellie。在这个狗生里,她被赋予的使命是协助人类破案。smell,find,and show,她总是陪伴在主人身边,站在领奖台上接受荣誉。在主人孤单只影的夜里,睡在狗窝的Ellie总是摇晃着尾巴蹭进主人房里。她多么期待能睡在主人身边,默默彼此陪伴,而主人总是冷冷的说no。Ellie眨着一对双眼,头耷拉在床榻,主人终于说了yes!她跃上主人的床,高兴的躺在主人身边,她夜晚终于不用夹着尾巴落寞回窝。主人接到营救人质的任务,Ellie在执行任务时表现勇猛,成功救起掉入湍急河流的人质。(这也是虐狗视频流出的镜头起因,狗狗因为恐惧不敢跳入水中,而视频中见到的工作人员多少有些强迫的意思,后来片方解释是为了训练,真相到底是如何这就得见仁见智了。)在关键的一刻,Ellie扑向绑匪,为了保护主人时不幸中枪。主人眼眶含泪,抚摸着濒死的Ellie,说:Ellie,you are a good dog, you are a good dog. 正如这张“好狗卡”,在Ellie的这一生里,就像人类的青年时期,她付出了她对工作的热情,履行了对主人对社会的责任。







狗生 三

这只萌翻人的小短腿叫“Tino”,在这个轮回里,他的主人是个不爱社交的吃货姑娘。Tino最擅长的是读懂这个姑娘的饮食喜好,姑娘说你猜我想要什么时,他们总能在美食面前想法一致。他总能在姑娘孤单寂寞冷的时候,在她身边陪她疯逗她笑。有一幕很日常的桥段,姑娘在泡澡,自卑孤独啜泣。生活在城市森林的寂寞心情,观众情绪秒被代入,大屏幕上小短腿呆萌加点人性的眼神,影院里此起彼伏的“soooo cute”,对tino的爱意溢于言表。小短腿tino成了寂寞女孩疗愈的存在。不仅如此,Tino把妹技术一流,小短腿竟然邂逅了大长腿狗,俘获妹心,改写狗生,走向狗生巅峰~ 大长腿狗的男主是个羞涩的小胖子,小tino再次成就一对害羞腼腆的男女。从此他的主人不再寂寞有了另一个害羞男人的陪伴,而Tino也有了大长腿狗的相守。这个狗生里,Tino过得波澜不惊,像人生来到了中年,已经懂了更多的人世,明白了无常。他的死亡少了很多怅惘。







狗生 四

Tino之后的狗生,轮回成了Buddy。在离开一对不负责任的夫妇以后,Buddy凭着身为Ellie时的搜寻本领,寻着前世熟悉的气味,一路来到了“Bailey”所生活过的地方,他遇到了曾经魂牵梦绕的主人Ethan。Ethan的母亲,祖父母早已不在,Buddy还是一眼就认出了他!经过了几世轮回,Buddy终于回到了原点。他感知Ethan的不开心,像曾为青年Ethan做的那样,找到Ethan的少时情人Hanna。年逾古稀的情人冰释前嫌,终于走在一起。Ethan回归到那个开心的Ethan,Buddy想,下一步是要让Ethan知道他就是他幼时一起成长的伙伴“Bailey”!当老年Ethan和Buddy重演那个幼时Ethan最钟爱的fetch,Buddy使出全身力气,ready,奔跑,jump,接住!他叼着球摇着尾巴走到Ethan旁边时,Ethan终于发现,这个突然出现的朋友不是别的buddy,他就是Bailey!这个时候他们对视,老年Ethan的眼里噙着泪水,他抚摸着他,无言。洗尽铅华的老朋友啊,转了好几世,Ethan,我终于再遇见你。






故事到这里结束了,镜头从高处看到Ethan,Hanna和Bailey在农场里玩fetch。独白里Bailey说,他终于明白他生存的意义:If I can get you licking and loving, I have my purpose. 赚了我一把老泪的电影,be here二字真是重重一击啊。隔壁老太太递给我一张纸巾:We should grow up。我破涕为笑,自嘲完后,用那句老套的话来为这篇影评作总结:陪伴是最长情的告白。简单的狗狗尚知此道理,况我们人类乎?
 版权归作者所有,任何形式转载请联系作者。
作者:六月小姐(来自豆瓣)
来源:https://movie.douban.com/review/8322878/ 查看全部
写在前面: 在电影院里哭得稀里哗啦,好在隔壁的白人老太太投入更多,抽泣声显然盖过我的,才不至于那么尴尬。看完后才发现在拍摄期间,拍摄片场有虐狗视频流出,热门网站上的评分也因此被刷得很低。如果你正犹豫是否该去看这部电影,这里有一篇GQ出的相关报道,我认为比较中肯,你不妨先读读再决定是否要抵制该片。请戳:GQ - What, exactly is a dog's purpose? 

狗生 一

小Bailey还不叫Bailey,在车里几乎要闷死的时候,我心都悬到了嗓子眼。遇到小男孩Ethan,它有了名字“Bailey Bailey Bailey Bailey”。之后的岁月,它与teen Ethan一起作伴,玩耍,在被子里听Ethan讲故事,帮Ethan撩喜欢的女孩的裙底。。这个犯了错摇着尾巴,一脸呆萌不知道错在哪里的小家伙,好几次让人忍俊不禁啊~真想抱着这只红毛猎犬,好好亲一亲。在他的这个轮回里,他的使命就是Ethan。Ethan酗酒的父亲,在饭桌上莫名谈论政治;在和老板夫妇的饭桌上,准备显摆他收藏的rare coin;。。这些沉闷的成人细节里,Bailey的陪伴,捣蛋,为Ethan本该有些阴郁的童年,增添了诸多绚烂美妙的色彩。成年的Ethan求学远去,Bailey叼着球一路追赶Ethan乘坐的车时,我听到影院有断断续续抽泣的声音。可我眼眶的湿润还没缓过劲来,在等待中老去的Bailey就生了病。混沌中Ethan终于回来了,Bailey眼里,我的Ethan你正值青春,我却垂垂老矣。。在Ethan的注视下他视线越来越模糊,Bailey走向了死亡。

p539960.jpg


狗生 二

Bailey之后的轮回,他变成了威风凛凛的警犬Ellie。在这个狗生里,她被赋予的使命是协助人类破案。smell,find,and show,她总是陪伴在主人身边,站在领奖台上接受荣誉。在主人孤单只影的夜里,睡在狗窝的Ellie总是摇晃着尾巴蹭进主人房里。她多么期待能睡在主人身边,默默彼此陪伴,而主人总是冷冷的说no。Ellie眨着一对双眼,头耷拉在床榻,主人终于说了yes!她跃上主人的床,高兴的躺在主人身边,她夜晚终于不用夹着尾巴落寞回窝。主人接到营救人质的任务,Ellie在执行任务时表现勇猛,成功救起掉入湍急河流的人质。(这也是虐狗视频流出的镜头起因,狗狗因为恐惧不敢跳入水中,而视频中见到的工作人员多少有些强迫的意思,后来片方解释是为了训练,真相到底是如何这就得见仁见智了。)在关键的一刻,Ellie扑向绑匪,为了保护主人时不幸中枪。主人眼眶含泪,抚摸着濒死的Ellie,说:Ellie,you are a good dog, you are a good dog. 正如这张“好狗卡”,在Ellie的这一生里,就像人类的青年时期,她付出了她对工作的热情,履行了对主人对社会的责任。


p539983.jpg


狗生 三

这只萌翻人的小短腿叫“Tino”,在这个轮回里,他的主人是个不爱社交的吃货姑娘。Tino最擅长的是读懂这个姑娘的饮食喜好,姑娘说你猜我想要什么时,他们总能在美食面前想法一致。他总能在姑娘孤单寂寞冷的时候,在她身边陪她疯逗她笑。有一幕很日常的桥段,姑娘在泡澡,自卑孤独啜泣。生活在城市森林的寂寞心情,观众情绪秒被代入,大屏幕上小短腿呆萌加点人性的眼神,影院里此起彼伏的“soooo cute”,对tino的爱意溢于言表。小短腿tino成了寂寞女孩疗愈的存在。不仅如此,Tino把妹技术一流,小短腿竟然邂逅了大长腿狗,俘获妹心,改写狗生,走向狗生巅峰~ 大长腿狗的男主是个羞涩的小胖子,小tino再次成就一对害羞腼腆的男女。从此他的主人不再寂寞有了另一个害羞男人的陪伴,而Tino也有了大长腿狗的相守。这个狗生里,Tino过得波澜不惊,像人生来到了中年,已经懂了更多的人世,明白了无常。他的死亡少了很多怅惘。


p539963.jpg


狗生 四

Tino之后的狗生,轮回成了Buddy。在离开一对不负责任的夫妇以后,Buddy凭着身为Ellie时的搜寻本领,寻着前世熟悉的气味,一路来到了“Bailey”所生活过的地方,他遇到了曾经魂牵梦绕的主人Ethan。Ethan的母亲,祖父母早已不在,Buddy还是一眼就认出了他!经过了几世轮回,Buddy终于回到了原点。他感知Ethan的不开心,像曾为青年Ethan做的那样,找到Ethan的少时情人Hanna。年逾古稀的情人冰释前嫌,终于走在一起。Ethan回归到那个开心的Ethan,Buddy想,下一步是要让Ethan知道他就是他幼时一起成长的伙伴“Bailey”!当老年Ethan和Buddy重演那个幼时Ethan最钟爱的fetch,Buddy使出全身力气,ready,奔跑,jump,接住!他叼着球摇着尾巴走到Ethan旁边时,Ethan终于发现,这个突然出现的朋友不是别的buddy,他就是Bailey!这个时候他们对视,老年Ethan的眼里噙着泪水,他抚摸着他,无言。洗尽铅华的老朋友啊,转了好几世,Ethan,我终于再遇见你。

p477412.jpg


故事到这里结束了,镜头从高处看到Ethan,Hanna和Bailey在农场里玩fetch。独白里Bailey说,他终于明白他生存的意义:If I can get you licking and loving, I have my purpose. 赚了我一把老泪的电影,be here二字真是重重一击啊。隔壁老太太递给我一张纸巾:We should grow up。我破涕为笑,自嘲完后,用那句老套的话来为这篇影评作总结:陪伴是最长情的告白。简单的狗狗尚知此道理,况我们人类乎?
 版权归作者所有,任何形式转载请联系作者。
作者:六月小姐(来自豆瓣)
来源:https://movie.douban.com/review/8322878/

搭建ELK过程中遇到的问题记录

总结zkbhj 发表了文章 • 0 个评论 • 1473 次浏览 • 2017-03-07 14:36 • 来自相关话题

一、安装elasticsearch 5.2.2后,启动报错:





 
问题原因:elasticsearch版本和安装的Java版本不兼容,请教运维朋友后,建议安装elasticsearch 2.4版本,比较成熟稳定。目前市场上用的比较多。
 
二、安装elasticsearch 2.4.4后,启动报错:





 
问题原因:明显是目录权限不足。分配可写权限后解决。
 
三、再次启动,报错:





 
问题原因:输入switch java,显示:/usr/bin/java
解决方法:启动命令/etc/init.d/elasticsearch start
  查看全部
一、安装elasticsearch 5.2.2后,启动报错:

问题1.png

 
问题原因:elasticsearch版本和安装的Java版本不兼容,请教运维朋友后,建议安装elasticsearch 2.4版本,比较成熟稳定。目前市场上用的比较多。
 
二、安装elasticsearch 2.4.4后,启动报错:

问题2.png

 
问题原因:明显是目录权限不足。分配可写权限后解决。
 
三、再次启动,报错:

问题3.png

 
问题原因:输入switch java,显示:/usr/bin/java
解决方法:启动命令/etc/init.d/elasticsearch start
 

集中式日志系统 ELK 协议栈的安装及配置

工具软件zkbhj 发表了文章 • 0 个评论 • 1534 次浏览 • 2017-03-06 17:01 • 来自相关话题

这一部分,我将描述一下如何安装配置 ELK 协议栈。

选取的实验平台为
 
Ubuntu 14.04Centos 7.1

其中用到的软件如下
 
Elasticsearch 使用的是 2.1.0Logstash 使用的是 2.1.1Kibana 使用的是 4.3.0
 除此之外,还需要用到以下软件,Nginx,Logstash-forwarder 以及 JDK。

实验系统架构见图1。





 
值得注意的是,在我们的实验中,使用了 Nginx 的反向代理,使得用户可以从外部访问到 Kibana,并且它本身具有负载均衡的作用,也能够提高性能。

特别还提到一下 Logstash-forwarder,这是一款使用 Go 语言编写的日志传输工具。由于 Logstash 是使用 Java 来运行,为了提升网络传输效率,我们并不在客户系统上面使用 Logstash 来传输数据。这款软件就是原来的 Lumberjack,今后慢慢将被 Elastic.co 公司的另外一款产品 Beat 吸收合并到 Filebeat 中,这个超出本文叙述的范畴,就不在这里详细讨论了。
 
具体安装过程如下 
步骤 1,安装 JDK步骤 2,安装 Elasticsearch步骤 3,安装 Kibana步骤 4,安装 Nginx步骤 5,安装 Logstash步骤 6,配置 Logstash步骤 7,安装 Logstash-forwarder步骤 8,最终验证
 
安装前的准备
 
两台 64 位虚拟机,操作系统是 Ubuntu 14.04,2 CPU,4G 内存,30G 硬盘两台 64 位虚拟机,操作系统是 CentOS 7.1,2 CPU,4G 内存,30G 硬盘创建用户 elk 和组 elk,以下所有的安装均由这个用户操作,并授予 sudo 权限如果是 CentOS,还需要配置官方 YUM 源,可以访问 CentOS 软件包

注意:以下所有操作都是在两个平台上完成。
 
步骤 1,安装 JDK

Elasticsearch 要求至少 Java 7。一般推荐使用 Oracle JDK 1.8 或者 OpenJDK 1.8。我们这里使用 OpenJDK 1.8。
 
Ubuntu 14.04

加入 Java 软件源(Repository)
$ sudo add-apt-repository ppa:openjdk-r/ppa更新系统并安装 JDK
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk验证 Java
$ java -version
openjdk version "1.8.0_45-internal"
OpenJDK Runtime Environment (build 1.8.0_45-internal-b14)
OpenJDK 64-Bit Server VM (build 25.45-b02, mixed mode)CentOS 7.1

配置 YUM 源
$ cd /etc/yum.repos.d
$ sudo vi centos.repo加入以下内容
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7安装 JDK
$ sudo yum install java-1.8.0-openjdk验证Java
$ java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)步骤 2,安装 Elasticsearch

Ubuntu 14.04

下载 Elasticsearch 软件
$ wget https://download.elasticsearch ... ar.gz解压
$ tar xzvf elasticsearch-2.1.0.tar.gz文件目录结构如下:
$ pwd
/home/elk/elasticsearch-2.1.0
$ ls
bin config lib LICENSE.txt NOTICE.txt README.textile修改配置文件
$ cd config
$ vi elasticsearch.yml找到 # network.host 一行,修改成以下:
network.host: localhost启动 elasticsearch
$ cd ../bin
$ ./elasticsearch验证 elasticsearch
$ curl 'localhost:9200/'
{
"name" : "Surge",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.1.0",
"build_hash" : "72cd1f1a3eee09505e036106146dc1949dc5dc87",
"build_timestamp" : "2015-11-18T22:40:03Z",
"build_snapshot" : false,
"lucene_version" : "5.3.1"
},
"tagline" : "You Know, for Search"
}CentOS 7.1

步骤和上述 Ubuntu 14.04 安装完全一致
 
步骤 3,安装 Kibana

Ubuntu 14.04

下载 Kibana 安装软件
$ wget https://download.elastic.co/ki ... ar.gz解压
$ tar xzvf kibana-4.3.0-linux-x64.tar.gz文件目录结构如下:
$ pwd
/home/elk/kibana-4.3.0-linux-x64
$ ls
bin config installedPlugins LICENSE.txt node node_modules optimize
package.json README.txt src webpackShims修改配置文件
$ cd config
$ vi kibana.yml找到 # server.host,修改成以下:
server.host:“localhost”启动 Kibana
$ cd ../bin
$ ./kibana
[…]
log [07:50:29.926] [info][listening] Server running at http://localhost:5601
[…]验证 Kibana

由于我们是配置在 localhost,所以是无法直接访问 Web 页面的。

可以使用 netstat 来检查缺省端口 5601,或者使用 curl:
$ curl localhost:5601
<script>var hashRoute = '/app/kibana';
var defaultRoute = '/app/kibana';

var hash = window.location.hash;
if (hash.length) {
window.location = hashRoute + hash;
} else {
window.location = defaultRoute;
}</script>CentOS 7.1

步骤和上述 Ubuntu 14.04 安装完全一致。
 
步骤 4,安装 Nginx

Nginx 提供了反向代理服务,可以使外面的请求被发送到内部的应用上。

Ubuntu 14.04

安装软件
$ sudo apt-get install nginx apache2-utils修改 Nginx 配置文件
$ sudo vi /etc/nginx/sites-available/default

找到 server_name,修改成正确的值。或者使用 IP,或者使用 FQDN。 然后在加入下面一段内容:server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;

}注意:建议使用 IP。

重启 Nginx 服务
$ sudo service nginx restart验证访问

http://FQDN 或者 http://IP
 
CentOS 7.1

配置 Nginx 官方 yum 源$ sudo vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1安装软件
$ sudo yum install nginx httpd-tools修改 Nginx 配置文件
$ sudo vi /etc/nginx/nginx.conf检查是否 http 块(http{...})含有下面这一行:
include /etc/nginx/conf.d/*conf为 Kibana 创建一个配置文件
$ sudo vi /etc/nginx/conf.d/kibana.conf加入以下这一段内容:
server {
listen 80;

server_name example.com;

location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}注意:建议使用 IP。

启动 Nginx 服务
$ sudo systemctl enable nginx
$ sudo systemctl start nginx验证访问

http://FQDN 或者 http://IP
 
步骤 5,安装 Logstash

Ubuntu 14.04

下载 Logstash 安装软件
$ wget https://download.elastic.co/lo ... ar.gz解压
$ tar xzvf logstash-2.1.1.tar.gz文件目录结构如下:
$ pwd
/home/elk/logstash-2.1.1

$ ls
bin CHANGELOG.md CONTRIBUTORS Gemfile Gemfile.jruby-1.9.lock lib LICENSE NOTICE.TXT vendor验证 Logstash
$ cd bin
$ ./logstash -e 'input { stdin { } } output { stdout {} }'
Settings: Default filter workers: 1
Logstash startup completed显示如下:
hello elk stack
2015-12-14T01:17:24.104Z 0.0.0.0 hello elk stack说明 Logstash 已经可以正常工作了。按CTRL-D 退出
 
CentOS 7.1
步骤和上述 Ubuntu 14.04 安装完全一致。

步骤 6,配置 Logstash

我们需要配置 Logstash 以指明从哪里读取数据,向哪里输出数据。这个过程我们称之为定义 Logstash 管道(Logstash Pipeline)。

通常一个管道需要包括必须的输入(input),输出(output),和一个可选项目 Filter。见图2。





 
标准的管道配置文件格式如下:
# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
}
# The filter part of this file is commented out to indicate that it is
# optional.
#filter {
#}
output {
}每一个输入/输出块里面都可以包含多个源。Filter 是定义如何按照用户指定的格式写数据。

由于我们这次是使用 logstash-forwarder 从客户机向服务器来传输数据,作为输入数据源。所以,我们首先需要配置 SSL 证书(Certification)。用来在客户机和服务器之间验证身份。
 
Ubuntu 14.04

配置 SSL
$ sudo mkdir -p /etc/pki/tls/certs etc/pki/tls/private
$ sudo vi /etc/ssl/openssl.cnf找到 [v3_ca] 段,添加下面一行,保存退出。
subjectAltName = IP: logstash_server_ip执行下面命令:
$ cd /etc/pki/tls
$ sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout
private/logstash-forwarder.key -out certs/logstash-forwarder.crt这里产生的 logstash-forwarder.crt 文件会在下一节安装配置 Logstash-forwarder 的时候使用到。

配置 Logstash 管道文件
$ cd /home/elk/logstash-2.1.1
$ mkdir conf
$ vi simple.conf添加以下内容:
input {
lumberjack {
port => 5043
type => "logs"
ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}启动 Logstsh
$ cd /home/elk/logstash-2.1.1/bin
$ ./logstash -f ../conf/simple.confCentOS 7.1

在 CentOS 7.1 上配置 Logstash,只有一步配置 SSL 是稍微有点不同,其他全部一样。
$ sudo vi /etc/pki/tls/openssl.cnf找到 [v3_ca] 段,添加下面一行,保存退出。
subjectAltName = IP: logstash_server_ip

$ cd /etc/pki/tls
$ sudo openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey
rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt这里产生的 logstash-forwarder.crt 文件会在下一节安装配置 Logstash-forwarder 的时候使用到。

步骤 7,安装 Logstash-forwarder

注意:Logstash-forwarder 也是一个开源项目,最早是由 lumberjack 改名而来。在作者写这篇文章的时候,被吸收合并到了 Elastic.co 公司的另外一个产品 Beat 中的 FileBeat。如果是用 FileBeat,配置稍微有些不一样,具体需要去参考官网。

Ubuntu14.04

安装 Logstash-forwarder 软件

注意:Logstash-forwarder 是安装在另外一台机器上。用来模拟客户机传输数据到 Logstash 服务器。

配置 Logstash-forwarder 安装源

执行以下命令:
$ echo 'deb http://packages.elastic.co/log ... ebian
stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list
​$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -安装软件包$ sudo apt-get update
$ sudo apt-get install Logstash-forwarder配置 SSL
$ sudo mkdir -p /etc/pki/tls/certs把在步骤六中在 Logstash 服务器上产生的 ssl 证书文件拷贝到刚刚创建出来的目录下:
$ sudo scp user@logstash_server:/etc/pki/tls/certs/logstash_forwarder.crt /etc/pki/tls/certs/配置 Logstash-forwarder
$ sudo vi /etc/logstash-forwarder.conf在 network 段("network": {),修改如下:
"servers": [ "logstash_server_private_address:5043" ],
"ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt",
"timeout": 15在 files 段("files": [),修改如下:
{
"paths": [
"/var/log/syslog",
"/var/log/auth.log"
],
"fields": { "type": "syslog" }
}启动 Logstash-forwarder
$ sudo service logstash-forwarder start验证 Logstash-forwarder
$ sudo service logstash-forwarder status
logstash-forwarder is running如果有错误,则需要去/var/log/logstash-forwarder 目录下面检查。

CentOS 7.1

配置 Logstash-forwarder 安装源

执行以下命令:
$ sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

$ sudo vi /etc/yum.repos.d/logstash-forwarder.repo加入以下内容:
[logstash-forwarder]
name=logstash-forwarder repository
baseurl=http://packages.elastic.co/log ... entos
gpgcheck=1
gpgkey=http://packages.elasticsearch. ... earch
enabled=1存盘退出。

安装软件包
$ sudo yum -y install logstash-forwarder剩余步骤和上述在 Ubuntu 14.04 上面的做法完全一样。

步骤 8,最后验证

在前面安装 Kibana 的时候,曾经有过验证。不过,当时没有数据,打开 Web 页面的时候,将如下所示:

图3. 无数据初始页面





 
现在,由于 logstash-forwarder 已经开始传输数据了,再次打开 Web 页面,将如下所示:

图4. 配置索引页面





 
点击创建按钮(Create),在选择 Discover,可以看到如下画面:

图5. 数据展示页面





 
至此,所有部件的工作都可以正常使用了。关于如何具体使用 Kibana 就不在本文中加以描述了,有兴趣的同学可以参考官网。 查看全部
这一部分,我将描述一下如何安装配置 ELK 协议栈。

选取的实验平台为
 
  • Ubuntu 14.04
  • Centos 7.1


其中用到的软件如下
 
  • Elasticsearch 使用的是 2.1.0
  • Logstash 使用的是 2.1.1
  • Kibana 使用的是 4.3.0

 除此之外,还需要用到以下软件,Nginx,Logstash-forwarder 以及 JDK。

实验系统架构见图1。

img006.png

 
值得注意的是,在我们的实验中,使用了 Nginx 的反向代理,使得用户可以从外部访问到 Kibana,并且它本身具有负载均衡的作用,也能够提高性能。

特别还提到一下 Logstash-forwarder,这是一款使用 Go 语言编写的日志传输工具。由于 Logstash 是使用 Java 来运行,为了提升网络传输效率,我们并不在客户系统上面使用 Logstash 来传输数据。这款软件就是原来的 Lumberjack,今后慢慢将被 Elastic.co 公司的另外一款产品 Beat 吸收合并到 Filebeat 中,这个超出本文叙述的范畴,就不在这里详细讨论了。
 
具体安装过程如下 
  1. 步骤 1,安装 JDK
  2. 步骤 2,安装 Elasticsearch
  3. 步骤 3,安装 Kibana
  4. 步骤 4,安装 Nginx
  5. 步骤 5,安装 Logstash
  6. 步骤 6,配置 Logstash
  7. 步骤 7,安装 Logstash-forwarder
  8. 步骤 8,最终验证

 
安装前的准备
 
  • 两台 64 位虚拟机,操作系统是 Ubuntu 14.04,2 CPU,4G 内存,30G 硬盘
  • 两台 64 位虚拟机,操作系统是 CentOS 7.1,2 CPU,4G 内存,30G 硬盘
  • 创建用户 elk 和组 elk,以下所有的安装均由这个用户操作,并授予 sudo 权限
  • 如果是 CentOS,还需要配置官方 YUM 源,可以访问 CentOS 软件包


注意:以下所有操作都是在两个平台上完成。
 
步骤 1,安装 JDK

Elasticsearch 要求至少 Java 7。一般推荐使用 Oracle JDK 1.8 或者 OpenJDK 1.8。我们这里使用 OpenJDK 1.8。
 
Ubuntu 14.04

加入 Java 软件源(Repository)
$ sudo add-apt-repository ppa:openjdk-r/ppa
更新系统并安装 JDK
$ sudo apt-get update 
$ sudo apt-get install openjdk-8-jdk
验证 Java
$ java -version
openjdk version "1.8.0_45-internal"
OpenJDK Runtime Environment (build 1.8.0_45-internal-b14)
OpenJDK 64-Bit Server VM (build 25.45-b02, mixed mode)
CentOS 7.1

配置 YUM 源
$ cd /etc/yum.repos.d
$ sudo vi centos.repo
加入以下内容
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
安装 JDK
$ sudo yum install java-1.8.0-openjdk
验证Java
$ java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
步骤 2,安装 Elasticsearch

Ubuntu 14.04


下载 Elasticsearch 软件
$ wget https://download.elasticsearch ... ar.gz
解压
$ tar xzvf elasticsearch-2.1.0.tar.gz
文件目录结构如下:
$ pwd
/home/elk/elasticsearch-2.1.0
$ ls
bin config lib LICENSE.txt NOTICE.txt README.textile
修改配置文件
$ cd config
$ vi elasticsearch.yml
找到 # network.host 一行,修改成以下:
network.host: localhost
启动 elasticsearch
$ cd ../bin
$ ./elasticsearch
验证 elasticsearch
$ curl 'localhost:9200/'
{
"name" : "Surge",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.1.0",
"build_hash" : "72cd1f1a3eee09505e036106146dc1949dc5dc87",
"build_timestamp" : "2015-11-18T22:40:03Z",
"build_snapshot" : false,
"lucene_version" : "5.3.1"
},
"tagline" : "You Know, for Search"
}
CentOS 7.1

步骤和上述 Ubuntu 14.04 安装完全一致
 
步骤 3,安装 Kibana

Ubuntu 14.04

下载 Kibana 安装软件
$ wget https://download.elastic.co/ki ... ar.gz
解压
$ tar xzvf kibana-4.3.0-linux-x64.tar.gz
文件目录结构如下:
$ pwd
/home/elk/kibana-4.3.0-linux-x64
$ ls
bin config installedPlugins LICENSE.txt node node_modules optimize
package.json README.txt src webpackShims
修改配置文件
$ cd config
$ vi kibana.yml
找到 # server.host,修改成以下:
server.host:“localhost”
启动 Kibana
$ cd ../bin
$ ./kibana
[…]
log [07:50:29.926] [info][listening] Server running at http://localhost:5601
[…]
验证 Kibana

由于我们是配置在 localhost,所以是无法直接访问 Web 页面的。

可以使用 netstat 来检查缺省端口 5601,或者使用 curl:
$ curl localhost:5601
<script>var hashRoute = '/app/kibana';
var defaultRoute = '/app/kibana';

var hash = window.location.hash;
if (hash.length) {
window.location = hashRoute + hash;
} else {
window.location = defaultRoute;
}</script>
CentOS 7.1

步骤和上述 Ubuntu 14.04 安装完全一致。
 
步骤 4,安装 Nginx

Nginx 提供了反向代理服务,可以使外面的请求被发送到内部的应用上。

Ubuntu 14.04

安装软件
$ sudo apt-get install nginx apache2-utils
修改 Nginx 配置文件
$ sudo vi /etc/nginx/sites-available/default

找到 server_name,修改成正确的值。或者使用 IP,或者使用 FQDN。 然后在加入下面一段内容:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;

}
注意:建议使用 IP。

重启 Nginx 服务
$ sudo service nginx restart
验证访问

http://FQDN 或者 http://IP
 
CentOS 7.1

配置 Nginx 官方 yum 源
$ sudo vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
安装软件
$ sudo yum install nginx httpd-tools
修改 Nginx 配置文件
$ sudo vi /etc/nginx/nginx.conf
检查是否 http 块(http{...})含有下面这一行:
include /etc/nginx/conf.d/*conf
为 Kibana 创建一个配置文件
$ sudo vi /etc/nginx/conf.d/kibana.conf
加入以下这一段内容:
server {
listen 80;

server_name example.com;

location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
注意:建议使用 IP。

启动 Nginx 服务
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
验证访问

http://FQDN 或者 http://IP
 
步骤 5,安装 Logstash

Ubuntu 14.04

下载 Logstash 安装软件
$ wget https://download.elastic.co/lo ... ar.gz
解压
$ tar xzvf logstash-2.1.1.tar.gz
文件目录结构如下:
$ pwd
/home/elk/logstash-2.1.1

$ ls
bin CHANGELOG.md CONTRIBUTORS Gemfile Gemfile.jruby-1.9.lock lib LICENSE NOTICE.TXT vendor
验证 Logstash
$ cd bin
$ ./logstash -e 'input { stdin { } } output { stdout {} }'
Settings: Default filter workers: 1
Logstash startup completed
显示如下:
hello elk stack
2015-12-14T01:17:24.104Z 0.0.0.0 hello elk stack
说明 Logstash 已经可以正常工作了。按CTRL-D 退出
 
CentOS 7.1
步骤和上述 Ubuntu 14.04 安装完全一致。

步骤 6,配置 Logstash

我们需要配置 Logstash 以指明从哪里读取数据,向哪里输出数据。这个过程我们称之为定义 Logstash 管道(Logstash Pipeline)。

通常一个管道需要包括必须的输入(input),输出(output),和一个可选项目 Filter。见图2。

img007.png

 
标准的管道配置文件格式如下:
# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
}
# The filter part of this file is commented out to indicate that it is
# optional.
#filter {
#}
output {
}
每一个输入/输出块里面都可以包含多个源。Filter 是定义如何按照用户指定的格式写数据。

由于我们这次是使用 logstash-forwarder 从客户机向服务器来传输数据,作为输入数据源。所以,我们首先需要配置 SSL 证书(Certification)。用来在客户机和服务器之间验证身份。
 
Ubuntu 14.04

配置 SSL
$ sudo mkdir -p /etc/pki/tls/certs etc/pki/tls/private
$ sudo vi /etc/ssl/openssl.cnf
找到 [v3_ca] 段,添加下面一行,保存退出。
subjectAltName = IP: logstash_server_ip
执行下面命令:
$ cd /etc/pki/tls
$ sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout
private/logstash-forwarder.key -out certs/logstash-forwarder.crt
这里产生的 logstash-forwarder.crt 文件会在下一节安装配置 Logstash-forwarder 的时候使用到。

配置 Logstash 管道文件
$ cd /home/elk/logstash-2.1.1
$ mkdir conf
$ vi simple.conf
添加以下内容:
input {
lumberjack {
port => 5043
type => "logs"
ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
启动 Logstsh
$ cd /home/elk/logstash-2.1.1/bin
$ ./logstash -f ../conf/simple.conf
CentOS 7.1

在 CentOS 7.1 上配置 Logstash,只有一步配置 SSL 是稍微有点不同,其他全部一样。
$ sudo vi /etc/pki/tls/openssl.cnf
找到 [v3_ca] 段,添加下面一行,保存退出。
subjectAltName = IP: logstash_server_ip

$ cd /etc/pki/tls
$ sudo openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey
rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
这里产生的 logstash-forwarder.crt 文件会在下一节安装配置 Logstash-forwarder 的时候使用到。

步骤 7,安装 Logstash-forwarder

注意:Logstash-forwarder 也是一个开源项目,最早是由 lumberjack 改名而来。在作者写这篇文章的时候,被吸收合并到了 Elastic.co 公司的另外一个产品 Beat 中的 FileBeat。如果是用 FileBeat,配置稍微有些不一样,具体需要去参考官网。

Ubuntu14.04

安装 Logstash-forwarder 软件

注意:Logstash-forwarder 是安装在另外一台机器上。用来模拟客户机传输数据到 Logstash 服务器。

配置 Logstash-forwarder 安装源

执行以下命令:
$ echo 'deb http://packages.elastic.co/log ... ebian 
stable main' | sudo tee /etc/apt/sources.list.d/logstashforwarder.list
​$ wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
安装软件包
$ sudo apt-get update
$ sudo apt-get install Logstash-forwarder
配置 SSL
$ sudo mkdir -p /etc/pki/tls/certs
把在步骤六中在 Logstash 服务器上产生的 ssl 证书文件拷贝到刚刚创建出来的目录下:
$ sudo scp user@logstash_server:/etc/pki/tls/certs/logstash_forwarder.crt /etc/pki/tls/certs/
配置 Logstash-forwarder
$ sudo vi /etc/logstash-forwarder.conf
在 network 段("network": {),修改如下:
"servers": [ "logstash_server_private_address:5043" ],
"ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt",
"timeout": 15
在 files 段("files": [),修改如下:
{
"paths": [
"/var/log/syslog",
"/var/log/auth.log"
],
"fields": { "type": "syslog" }
}
启动 Logstash-forwarder
$ sudo service logstash-forwarder start
验证 Logstash-forwarder
$ sudo service logstash-forwarder status
logstash-forwarder is running
如果有错误,则需要去/var/log/logstash-forwarder 目录下面检查。

CentOS 7.1

配置 Logstash-forwarder 安装源

执行以下命令:
$ sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

$ sudo vi /etc/yum.repos.d/logstash-forwarder.repo
加入以下内容:
[logstash-forwarder]
name=logstash-forwarder repository
baseurl=http://packages.elastic.co/log ... entos
gpgcheck=1
gpgkey=http://packages.elasticsearch. ... earch
enabled=1
存盘退出。

安装软件包
$ sudo yum -y install logstash-forwarder
剩余步骤和上述在 Ubuntu 14.04 上面的做法完全一样。

步骤 8,最后验证

在前面安装 Kibana 的时候,曾经有过验证。不过,当时没有数据,打开 Web 页面的时候,将如下所示:

图3. 无数据初始页面

img008.png

 
现在,由于 logstash-forwarder 已经开始传输数据了,再次打开 Web 页面,将如下所示:

图4. 配置索引页面

img009.png

 
点击创建按钮(Create),在选择 Discover,可以看到如下画面:

图5. 数据展示页面

img010.png

 
至此,所有部件的工作都可以正常使用了。关于如何具体使用 Kibana 就不在本文中加以描述了,有兴趣的同学可以参考官网。

集中式日志系统 ELK 协议栈详解

工具软件zkbhj 发表了文章 • 0 个评论 • 1500 次浏览 • 2017-03-06 16:34 • 来自相关话题

本文分两大部分来对集中式日志系统 ELK 协议栈做详细探讨,第一部分详细介绍了 ELK 协议栈出现的背景、主要组成部分及其体系结构;第二部分详细描述了在 Ubuntu 和 CentOS 上面的安装配置过程。两相结合,帮助开发人员理解 ELK 协议栈。
 
简介
 
在我们日常生活中,我们经常需要回顾以前发生的一些事情;或者,当出现了一些问题的时候,可以从某些地方去查找原因,寻找发生问题的痕迹。无可避免需要用到文字的、图像的等等不同形式的记录。用计算机的术语表达,就是 LOG,或日志。

日志,对于任何系统来说都是及其重要的组成部分。在计算机系统里面,更是如此。但是由于现在的计算机系统大多比较复杂,很多系统都不是在一个地方,甚至都是跨国界的;即使是在一个地方的系统,也有不同的来源,比如,操作系统,应用服务,业务逻辑等等。他们都在不停产生各种各样的日志数据。根据不完全统计,我们全球每天大约要产生 2EB(1018)的数据。

面对如此海量的数据,又是分布在各个不同地方,如果我们需要去查找一些重要的信息,难道还是使用传统的方法,去登陆到一台台机器上查看?看来传统的工具和方法已经显得非常笨拙和低效了。于是,一些聪明人就提出了建立一套集中式的方法,把不同来源的数据集中整合到一个地方。

一个完整的集中式日志系统,是离不开以下几个主要特点的。 
收集-能够采集多种来源的日志数据传输-能够稳定的把日志数据传输到中央系统存储-如何存储日志数据分析-可以支持 UI 分析警告-能够提供错误报告,监控机制
 
市场上的产品

基于上述思路,于是许多产品或方案就应运而生了。比如,简单的 Rsyslog,Syslog-ng;商业化的 Splunk ;开源的有 FaceBook 公司的 Scribe,Apache 的 Chukwa,Linkedin 的 Kafak,Cloudera 的 Fluentd,ELK 等等。

在上述产品中,Splunk 是一款非常优秀的产品,但是它是商业产品,价格昂贵,让许多人望而却步。

直到 ELK 的出现,让大家又多了一种选择。相对于其他几款开源软件来说,本文重点介绍 ELK。
 
ELK 协议栈介绍及体系结构

ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash 和 Kibana。这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,故被简称为 ELK 协议栈,见图 1。





 
Elasticsearch

Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。目前,最新的版本是 2.1.0。

主要特点
实时分析分布式实时文件存储,并将每一个字段都编入索引文档导向,所有的对象全部是文档高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)。见图 2 和图 3接口友好,支持 JSON
 










 
Logstash

Logstash 是一个具有实时渠道能力的数据收集引擎。使用 JRuby 语言编写。其作者是世界著名的运维工程师乔丹西塞 (JordanSissel)。目前最新的版本是 2.1.1。

主要特点
几乎可以访问任何数据可以和多种外部应用结合支持弹性扩展

它由三个主要部分组成,见图 4:




Shipper-发送日志数据
Broker-收集数据,缺省内置 Redis
Indexer-数据写入
 
Kibana

Kibana 是一款基于 Apache 开源协议,使用 JavaScript 语言编写,为 Elasticsearch 提供分析和可视化的 Web 平台。它可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度的表图。目前最新的版本是 4.3,简称 Kibana 4。

ELK 协议栈体系结构

完整的 ELK 协议栈体系结构见图 5。基本流程是 Shipper 负责从各种数据源里采集数据,然后发送到 Broker,Indexer 将存放在 Broker 中的数据再写入 Elasticsearch,Elasticsearch 对这些数据创建索引,然后由 Kibana 对其进行各种分析并以图表的形式展示。





 
ELK 三款软件之间互相配合使用,完美衔接,高效的满足了很多场合的应用,并且被很多用户所采纳,诸如路透社,脸书(Facebook),StackOverFlow 等等。
 
ELK的安装请移步:https://ask.zkbhj.com/?/article/84 
https://segmentfault.com/a/1190000007728789
  查看全部
本文分两大部分来对集中式日志系统 ELK 协议栈做详细探讨,第一部分详细介绍了 ELK 协议栈出现的背景、主要组成部分及其体系结构;第二部分详细描述了在 Ubuntu 和 CentOS 上面的安装配置过程。两相结合,帮助开发人员理解 ELK 协议栈。
 
简介
 
在我们日常生活中,我们经常需要回顾以前发生的一些事情;或者,当出现了一些问题的时候,可以从某些地方去查找原因,寻找发生问题的痕迹。无可避免需要用到文字的、图像的等等不同形式的记录。用计算机的术语表达,就是 LOG,或日志。

日志,对于任何系统来说都是及其重要的组成部分。在计算机系统里面,更是如此。但是由于现在的计算机系统大多比较复杂,很多系统都不是在一个地方,甚至都是跨国界的;即使是在一个地方的系统,也有不同的来源,比如,操作系统,应用服务,业务逻辑等等。他们都在不停产生各种各样的日志数据。根据不完全统计,我们全球每天大约要产生 2EB(1018)的数据。

面对如此海量的数据,又是分布在各个不同地方,如果我们需要去查找一些重要的信息,难道还是使用传统的方法,去登陆到一台台机器上查看?看来传统的工具和方法已经显得非常笨拙和低效了。于是,一些聪明人就提出了建立一套集中式的方法,把不同来源的数据集中整合到一个地方。

一个完整的集中式日志系统,是离不开以下几个主要特点的。 
  • 收集-能够采集多种来源的日志数据
  • 传输-能够稳定的把日志数据传输到中央系统
  • 存储-如何存储日志数据
  • 分析-可以支持 UI 分析
  • 警告-能够提供错误报告,监控机制

 
市场上的产品

基于上述思路,于是许多产品或方案就应运而生了。比如,简单的 Rsyslog,Syslog-ng;商业化的 Splunk ;开源的有 FaceBook 公司的 Scribe,Apache 的 Chukwa,Linkedin 的 Kafak,Cloudera 的 Fluentd,ELK 等等。

在上述产品中,Splunk 是一款非常优秀的产品,但是它是商业产品,价格昂贵,让许多人望而却步。

直到 ELK 的出现,让大家又多了一种选择。相对于其他几款开源软件来说,本文重点介绍 ELK。
 
ELK 协议栈介绍及体系结构

ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash 和 Kibana。这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,故被简称为 ELK 协议栈,见图 1。

img001.png

 
Elasticsearch

Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。目前,最新的版本是 2.1.0。

主要特点
  • 实时分析
  • 分布式实时文件存储,并将每一个字段都编入索引
  • 文档导向,所有的对象全部是文档
  • 高可用性,易扩展,支持集群(Cluster)、分片和复制(Shards 和 Replicas)。见图 2 和图 3
  • 接口友好,支持 JSON

 

img002.png


img003.png

 
Logstash

Logstash 是一个具有实时渠道能力的数据收集引擎。使用 JRuby 语言编写。其作者是世界著名的运维工程师乔丹西塞 (JordanSissel)。目前最新的版本是 2.1.1。

主要特点
  • 几乎可以访问任何数据
  • 可以和多种外部应用结合
  • 支持弹性扩展


它由三个主要部分组成,见图 4:
img004.png

Shipper-发送日志数据
Broker-收集数据,缺省内置 Redis
Indexer-数据写入
 
Kibana

Kibana 是一款基于 Apache 开源协议,使用 JavaScript 语言编写,为 Elasticsearch 提供分析和可视化的 Web 平台。它可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度的表图。目前最新的版本是 4.3,简称 Kibana 4。

ELK 协议栈体系结构

完整的 ELK 协议栈体系结构见图 5。基本流程是 Shipper 负责从各种数据源里采集数据,然后发送到 Broker,Indexer 将存放在 Broker 中的数据再写入 Elasticsearch,Elasticsearch 对这些数据创建索引,然后由 Kibana 对其进行各种分析并以图表的形式展示。

img005.png

 
ELK 三款软件之间互相配合使用,完美衔接,高效的满足了很多场合的应用,并且被很多用户所采纳,诸如路透社,脸书(Facebook),StackOverFlow 等等。
 
ELK的安装请移步:https://ask.zkbhj.com/?/article/84 
https://segmentfault.com/a/1190000007728789
 

PHP如何防止SQL注入?

回复

数据库zkbhj 发起了问题 • 1 人关注 • 0 个回复 • 4243 次浏览 • 2017-03-06 16:25 • 来自相关话题

nginx 配置之 proxy_pass 神器

服务器zkbhj 发表了文章 • 0 个评论 • 1604 次浏览 • 2017-03-03 10:00 • 来自相关话题

proxy 模块是 nginx 中最碉堡的模块之一。就是有了 proxy 模块,nginx 才能和其它 http 服务器关联起来,极大程度地提高了 nginx 的可用性。proxy 这个模块比较大,光是指令就有一大堆。这里我们只是简单地介绍一下它最核心的指令 —— proxy_pass 。

当我们遇到跨域问题,而且客户端无法支持 CORS 时,最好的办法就是让服务器来做代理。在前端页面所在的服务器 nginx 配置上开一个路由,然后使用 proxy 去请求另一个域名下的资源。如果跨域资源也部署在同一台机器上,我们甚至可以 proxy 到 127.0.0.1,比如:location /api { proxy_pass http://127.0.0.1:1234; }
当客户端请求 /api 这个路径下的资源时服务器就会帮助我们去 127.0.0.1 的 1234 端口上取资源,解决了跨域的问题。proxy_pass 会将当前的 $uri 带过去,所以如果 /api 这个路由是我们擅自加的,在发送到目标服务前可以使用 rewrite 来处理掉这个多余的路由,比如:location /api/ { rewrite ^/api/(.*) /$1 break; proxy_pass http://127.0.0.1:1234; }
rewrite 的作用是修改 $uri,但要注意 rewrite 要有个重新匹配 location 的副作用。由于 proxy_pass 的处理阶段比 location 处理更晚,所以这里需要 break 掉,以防止 rewrite 进入下一次 location 匹配而丢失 proxy_pass。

另外还有一个值得注意的地方,proxy_pass 后面的 host 如果填写一个域名的话,这个域名将会在 nginx 启动时解析。如果 nginx 启动时域名无法解析将会抛出异常无法启动,比如: location /api { proxy_pass http://xxx; } nginx: [emerg] host not found in upstream "xxx"
而且由于 nginx 解析域名是在启动时做的,所以在 nginx 启动之后修改域名的解析对 nginx 是不会生效的。

如果觉得让 nginx 启动时去查询 DNS 这件事不靠谱(我就不推荐这么做,因为 DNS 确实是不可控的),那么可以在 proxy_pass 时到某个 IP 上,hostname 可以通过 porxy_set_header 指令强制设置 proxy 的 HTTP 请求中的 Host 字段来修改它,比如:location /api { proxy_set_header Host api.web-tinker.com; proxy_pass http://127.0.0.1:8080; } 
除了设置 Host 这个请求头之外,proxy_set_header 还能设置别的头,只要你的脑洞够大就可以用它来做更多奇怪的事情!

另外还有个要注意的点。proxy_pass 默认使用的是 http 1.0,可以通过 proxy_http_version 指令让它使用 http 1.1,以便开启 keepalive 之类的功能。location /api { proxy_http_version 1.1; proxy_pass http://127.0.0.1:8080; } 查看全部
proxy 模块是 nginx 中最碉堡的模块之一。就是有了 proxy 模块,nginx 才能和其它 http 服务器关联起来,极大程度地提高了 nginx 的可用性。proxy 这个模块比较大,光是指令就有一大堆。这里我们只是简单地介绍一下它最核心的指令 —— proxy_pass 。

当我们遇到跨域问题,而且客户端无法支持 CORS 时,最好的办法就是让服务器来做代理。在前端页面所在的服务器 nginx 配置上开一个路由,然后使用 proxy 去请求另一个域名下的资源。如果跨域资源也部署在同一台机器上,我们甚至可以 proxy 到 127.0.0.1,比如:
location /api { proxy_pass http://127.0.0.1:1234; } 

当客户端请求 /api 这个路径下的资源时服务器就会帮助我们去 127.0.0.1 的 1234 端口上取资源,解决了跨域的问题。proxy_pass 会将当前的 $uri 带过去,所以如果 /api 这个路由是我们擅自加的,在发送到目标服务前可以使用 rewrite 来处理掉这个多余的路由,比如:
location /api/ { rewrite ^/api/(.*) /$1 break; proxy_pass http://127.0.0.1:1234; } 

rewrite 的作用是修改 $uri,但要注意 rewrite 要有个重新匹配 location 的副作用。由于 proxy_pass 的处理阶段比 location 处理更晚,所以这里需要 break 掉,以防止 rewrite 进入下一次 location 匹配而丢失 proxy_pass

另外还有一个值得注意的地方,proxy_pass 后面的 host 如果填写一个域名的话,这个域名将会在 nginx 启动时解析。如果 nginx 启动时域名无法解析将会抛出异常无法启动,比如:
 location /api { proxy_pass http://xxx; } nginx: [emerg] host not found in upstream "xxx" 

而且由于 nginx 解析域名是在启动时做的,所以在 nginx 启动之后修改域名的解析对 nginx 是不会生效的

如果觉得让 nginx 启动时去查询 DNS 这件事不靠谱(我就不推荐这么做,因为 DNS 确实是不可控的),那么可以在 proxy_pass 时到某个 IP 上,hostname 可以通过 porxy_set_header 指令强制设置 proxy 的 HTTP 请求中的 Host 字段来修改它,比如:
location /api { proxy_set_header Host api.web-tinker.com; proxy_pass http://127.0.0.1:8080; }
 
除了设置 Host 这个请求头之外,proxy_set_header 还能设置别的头,只要你的脑洞够大就可以用它来做更多奇怪的事情!

另外还有个要注意的点。proxy_pass 默认使用的是 http 1.0,可以通过 proxy_http_version 指令让它使用 http 1.1,以便开启 keepalive 之类的功能。
location /api { proxy_http_version 1.1; proxy_pass http://127.0.0.1:8080; }

yum方式安装PHP比较齐全的安装方式

PHPzkbhj 发表了文章 • 0 个评论 • 1171 次浏览 • 2017-03-02 14:15 • 来自相关话题

yum install php70w.x86_64 php70w-bcmath.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-dba.x86_64 php70w-devel.x86_64 php70w-embedded.x86_64 php70w-enchant.x86_64 php70w-fpm.x86_64 php70w-gd.x86_64 php70w-imap.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-mysqlnd.x86_64 php70w-odbc.x86_64 php70w-opcache.x86_64 php70w-pdo.x86_64 php70w-pdo_dblib.x86_64 php70w-pear.noarch php70w-pecl-apcu.x86_64 php70w-pecl-apcu-devel.x86_64 php70w-pecl-imagick.x86_64 php70w-pecl-imagick-devel.x86_64 php70w-pecl-mongodb.x86_64 php70w-pecl-redis.x86_64 php70w-pecl-xdebug.x86_64 php70w-pgsql.x86_64 php70w-xml.x86_64 php70w-xmlrpc.x86_64 nginx php70w-intl -y

php70w-mysqlnd.x86_64 查看全部
yum install php70w.x86_64 php70w-bcmath.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-dba.x86_64 php70w-devel.x86_64 php70w-embedded.x86_64 php70w-enchant.x86_64 php70w-fpm.x86_64 php70w-gd.x86_64 php70w-imap.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-mysqlnd.x86_64 php70w-odbc.x86_64 php70w-opcache.x86_64 php70w-pdo.x86_64 php70w-pdo_dblib.x86_64 php70w-pear.noarch php70w-pecl-apcu.x86_64 php70w-pecl-apcu-devel.x86_64 php70w-pecl-imagick.x86_64 php70w-pecl-imagick-devel.x86_64 php70w-pecl-mongodb.x86_64 php70w-pecl-redis.x86_64 php70w-pecl-xdebug.x86_64 php70w-pgsql.x86_64 php70w-xml.x86_64 php70w-xmlrpc.x86_64 nginx php70w-intl -y

php70w-mysqlnd.x86_64