大数据集群安装学习笔记

 

目录

1 安装部署........................................................................... 4

1.1 solr单节点安装部署................................................................. 4

1.1.1 下载................................................................................ 4

1.1.2 部署................................................................................ 4

1.2 Solr集群安装部署.................................................................... 6

1.2.1 准备工作......................................................................... 6

1.2.2 配置主机......................................................................... 6

1.2.3 配置免登录ssh公钥........................................................ 6

1.2.4 配置zookeeper集群..................................................... 8

1.2.5 配置solr集群............................................................... 10

1.3 Hadoop2.4集群安装部署...................................................... 13

1.3.1 准备工作....................................................................... 13

1.3.2 配置免登录ssh公钥...................................................... 13

1.3.3 配置zookeeper集群................................................... 15

1.3.4 配置hadoop集群........................................................ 17

1.4 HBase集群部署.................................................................... 25

1.4.1 配置环境变量................................................................. 26

1.4.2 配置hbase-env.sh..................................................... 26

1.4.3 配置 hbase-site.xml.................................................. 26

1.4.4 配置regionservers.................................................... 27

1.4.5 替换lib包..................................................................... 27

1.4.6 启动hbase.................................................................. 28

1.4.7 Hbase部署异常问题总结.............................................. 28

1.5 Spark集群安装部署.............................................................. 30

1.5.1 准备工作....................................................................... 30

1.5.2 安装scala................................................................... 31

1.5.3 安装spark................................................................... 32

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1    安装部署

1.1     solr单节点安装部署

本文使用SOLR 4.4.0版本作为研究对象,要求JDK 1.6,tomcat 6。

1.1.1  下载

下载地址http://archive.apache.org/dist/lucene/solr/4.4.0/,分别下载linux版本和windows版本,区别只是打包的方式不一样。

1.1.2  部署

1.1.2.1         Windows环境部署
1.1.2.1.1     Jetty

使用自带的jetty中间件部署solr。

1、解压文件

解压文件至j:\盘,solr目录是:J:\solr-4.4.0,文件目录如下。

 

contrib有一些功能模块是需要的jar包

dist是打包发布好的工程war包

docs是帮助文档

example是示例,里面有打包部署好的solr工程示例和servlet容器jetty。如果你没有tomcat可以直接使用Jetty服务器部署你的solr示例。

2、使用命令行,进入j:\solr\solr-4.4.0\example目录。运行start.jar文件。

#  cd  j:\solr\solr-4.4.0\example

#  j:

#  java –jar start.jar                                 

3、登陆地址http://localhost:8983/solr/

1.1.2.1.2     Tomcat

1、  解压出solr-4.4.0

2、  复制solr-4.4.0\example\webapps中的solr.war文件到tomcat安装目录中的webapps文件夹下

3、  运行tomcat。(忽略怎么运行tomcat),tomcat会自动解压solr.war文件。

4、  删除solr.war文件。(不然每次启动tomcat都会发布一次)

5、  回到tomcat的webapps目录下,记事本打开solr\WEB-INF\web.xml文件。

加入如下代码:在<web-app />节点内的最后。

<env-entry>

   <env-entry-name>solr/home</env-entry-name>

   <env-entry-value>j:\solrhome</env-entry-value>

   <env-entry-type>java.lang.String</env-entry-type>

</env-entry>

如上代码,需要在J盘新建一个文件夹:solrhome

6、  回到解压的solr-4.4.0目录,打开文件夹:solr-4.4.0\example\solr,复制所有内容到J:\solrhome

7、  打开文件夹:solr-4.4.0\example\lib\ext,复制所有jar包到tomcat的webapps\solr\WEB-INF\lib下。

8、  运行web:http://localhost:8080/solr

注意solr 4.4只支持IE8以上浏览器版本。

1.1.2.2         Linux环境部署

同windows环境部署方法

1.2     Solr集群安装部署

SolrCloud通过ZooKeeper集群来进行协调,使一个索引进行分片,各个分片可以分布在不同的物理节点上,多个物理分片组成一个完成的索引Collection。SolrCloud自动支持Solr Replication,可以同时对分片进行复制,冗余存储。

1.2.1  准备工作

下载solr 4.4.0和zookeeper-3.4.5版本, 3台Redhat 6.1操作系统的虚拟机。其中三台安装搭建zookeeper集群,5台机器上都部署solr应用。

1.2.2  配置主机

更改各个主机的hosts文件,在文件末尾添加:

10.128.90.45 zk1

10.128.90.46 zk2

10.128.90.47 zk3

重启系统。(如果和其他应用冲突,可以更改成其他的主机名称)

1.2.3  配置免登录ssh公钥

三台主机

ip地址       机器名简称

10.128.90.45 zk1

10.128.90.46 zk2

10.128.90.47 zk3

1、修改三台服务器机器名, 修改方式如下

       vi /etc/sysconfig/network

       [root@zk1 was]# cat /etc/sysconfig/network

       NETWORKING=yes

       HOSTNAME=zk1

2、配置hosts文件

vi /etc/hosts

后面加三行

10.128.90.45 zk1

10.128.90.46 zk2

10.128.90.47 zk3

重启后生效

3、配置jdk

vi /etc/profile

 

export JAVA_HOME=/usr/java/jdk1.7.0_71

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

 

配置后执行以下语句才能生效

source /etc/profile

 

4、ssh免登陆

三台服务器分别执行该语句

 ssh-keygen -t rsa

生成的文件目录通过显示日志可以找到在哪

查看生成的文件

cd /root/.ssh

执行以下语句

cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

将其他两台生成的id_rsa.pub重命令后,分别为id_rsa.pub.zk2,id_rsa.pub.zk3

都放到第一台服务器的/root/.ssh上,

然后执行以下语句把这两台服务器生成的公钥加到第一台上去

cat id_rsa.pub.zk2 >> authorized_keys

cat id_rsa.pub.zk3 >> authorized_keys

然后将生成的总的authorized_keys分别放到其他两台的/root/.ssh上去

配置完成,验证,

Zk1服务器上执行ssh命令,确保3台服务器通过ssh都能相互免密码进去

如下图是我在第一台主机上登录其他服务器,并且相互切换的列子

 

1.2.4  配置zookeeper集群

以zk1主机为例:

1、下载zookeeper-3.4.5.tar文件,解压文件生成zookeeper-3.4.5

[root@zk1]# tar -zxvf  zookeeper-3.4.5.tar

2、更改zoo.cfg配置文件

[root@zk1]# cd /zookeeper-3.4.5/conf

[root@zk1]# vi zoo.cfg

文件内容是:

tickTime=2000

initLimit=10

syncLimit=5

dataLogDir=/zookeeper/log/

dataDir=/zookeeper/data/

clientPort=2181

server.1=zk1:2888:3888

server.2=zk2:2888:3888

server.3=zk3:2888:3888

如果该目录中没有这个文件,则创建一个新的文件。注意每一个配置项的后面不要有空格,否则会报错。

3、配置myid文件

创建zoo.cfg文件中配置的dataLogDir和dataDir文件夹:

进入解压缩的zookeeper-3.4.5目录下执行如下命令

[root@zk1]#mkdir data

[root@zk1]#mkdir  log

在dataDir指向的文件夹中创建myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字,例如当前主机zk1,在zoo.cfg文件中对应的是server.1,所以myid文件中的值应该是1。

4、启动zookeeper

进入/zookeeper/bin文件夹,执行zkServer.sh文件

[root@zk1]#./zkServer.sh start

查看状态

[root@zk1]#./zkServer.sh status

查看启动日志

[root@zk1] #tail –f zookeeper.out

以zk1为案例配置其他两个节点。三个节点全部启动之后,zookeeper会根据选举算法选出一个leader,系统运行正常。

5、常见错误

#Cannot open channel to 2 at election address slave-02/192.168.0.178:3888 java.net.ConnectException: Connection refused  

这是因为集群中的某一个节点没有启动完成,导致已经启动的节点无法连接该节点。这个错误在所有节点都启动成功之后消失。

#Cannot open channel to 1 at election address zk1/192.168.1.201:3888

java.net.NoRouteToHostException: No route to host

这是因为防火墙问题,关闭防火墙或开放相应端口

1.2.5  配置solr集群

     说明:先在一台主节点服务器上安装好一个solr单节点环境,测试成功后直接拖多其它服务器上去,改下相关配置就行了,为了方便安装文件管理,建议将zookeeper,tomcat,solr都放到同一个文件夹下。

 

1)新建solrcloud文件并授予权限

[was@zk1 ~]$ mkdir solrcloud

[was@zk1 ~]$ chmod 777 solrcloud

[was@zk1 ~]$ cd /home/was/solrcloud

在solrcloud新建solrhome文件

[was@zk1 ~]$ midkr solrhome

 

2)将上传的solr.4.4.0压缩包解压缩,

3)将solr.4.4.0/dist/solr-4.4.0.war 复制到/home/was/solrcloud/solrhome 并重命为solr.war

   cp /home/was/solrcloud/solr-4.4.0/dist/solr-4.4.0.war /home/was/solrcloud/solrhome/solr.war

4)将上传的tomcat解压缩

  tar -zxvf apache-tomcat-6.0.44.tar.gz

5)进入tomcat bin目录,启动tomcat

   cd /solrcloud/apache-tomcat-6.0.29/bin 进入bin目录

   ./startup.sh 启动tomcat 此时会在tomcat下的conf文件夹下多出一个目录Catalina

   cd /home/was/solrcloud/apache-tomcat-6.0.29/conf/Catalina/localhost

   在该目录下新建solr.xml内容如下

       <?xml version="1.0" encoding="UTF-8" ?>

              <Context docBase="/home/was/solrcloud/solrhome/solr.war" debug="0" crossContext="false" > <Environment name="solr/home"

              type="java.lang.String"

              value="/home/was/solrcloud/solrhome"

              override="true" />

       </Context>

 

   docBase="/home/was/solrcloud/solrhome/solr.war" 指定为solrcloud/solrhome下复制出来solr的war包

6)启动tomcat, tomcat的webapps 下边多了解压出来的solr文件夹

进入solr/WEB-INF/ 下修改web.xml

<!--

<env-entry>

<env-entry-name>solr/home</env-entry-name>

<env-entry-value>/put/your/solr/home/here</env-entry-value> <env-entry-type>java.lang.String</env-entry-type>

</env-entry>

-->

改为 :

<env-entry>

<env-entry-name>solr/home</env-entry-name>

<env-entry-value>/home/was/solrcloud/solrhome</env-entry-value>

<env-entry-type>java.lang.String</env-entry-type>

</env-entry>

7)将/home/was/solrcloud/solr-4.4.0/example/solr 文件夹下所有东西复制到 /home/was/solrcloud/solrhome

 cp -r /home/was/solrcloud/solr-4.4.0/example/solr/* /home/was/solrcloud/solrhome

8)复制/home/was/solrcloud/solr-4.4.0/example/lib/ext下所有jar包到tomcat 下的webapps/solr/WEB-INF/lib下

   cp -r /home/was/solrcloud/solr-4.4.0/example/lib/ext/* /home/was/solrcloud/apache-tomcat-6.0.44/webapps/solr/WEB-INF/lib/

 复制 /home/was/solrcloud/solr-4.4.0/example/resources/log4j.properties 到solr/WEB-INF/class 如果没有class先创建class文件夹,并赋于写权限

     cp /home/was/solrcloud/solr-4.4.0/example/resources/log4j.properties /home/was/solrcloud/apache-tomcat-6.0.44/webapps/solr/WEB-INF/class/

9)启动tomcat 访问 http://localhost:8080/solr 如图,至此单机版solr配制完成

  进入 cd /home/was

  通过scp命令同步到其他两台机器上去,命令如下:

    scp -r solrcloud was@zk2:/home/was/

    scp -r solrcloud was@zk3:/home/was/

  并授予权限: chmod 777 solrcloud

 

 

10)配制集群

将zookeeper和tomcat关联

10.128.90.45(zk1)台主机修改tomcat 的 bin目录下catalina.sh文件在第二行加入

JAVA_OPTS="-Dbootstrap_confdir=/home/was/solrcloud/solrhome/collection1/conf -Dcollection.configName=myconf

-DzkHost=10.128.90.45:2181,10.128.90.46:2181,10.128.90.47:2181 -DnumShards=3"

 

10.128.90.46(zk2)10.128.90.47(zk3)台主机修改tomcat 的 bin目录下catalina.sh文件在第二行加入

JAVA_OPTS="-DzkHost=10.128.90.45:2181,10.128.90.46:2181,10.128.90.47:2181 -DnumShards=3"

 

 

http://10.128.90.45:8080/solr/

http://10.128.90.46:8080/solr/

http://10.128.90.47:8080/solr/

任何一个IP均可访问,页面如下:

 

1.3     Hadoop2.4集群安装部署

1.3.1  准备工作

下载hadoop-2.5.2.tar.gz和jdk7版本, 3台Redhat 操作系统的虚拟机。其中三台安装搭建zookeeper集群

1.3.2  配置免登录ssh公钥

三台主机

ip地址       机器名简称

10.128.90.42 Master

10.128.90.43 Slave1

10.128.90.44 Slave2

1、修改三台服务器机器名, 修改方式如下

       vi /etc/sysconfig/network

       [root@Master was]# cat /etc/sysconfig/network

       NETWORKING=yes

       HOSTNAME=Master

2、配置hosts文件

vi /etc/hosts

后面加三行

10.128.90.45 Master

10.128.90.46 Slave1

10.128.90.47 Slave2

重启后生效

3、配置jdk

vi /etc/profile

 

export JAVA_HOME=/usr/java/jdk1.7.0_71

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

 

配置后执行以下语句才能生效

source /etc/profile

 

4、ssh免登陆

三台服务器分别执行该语句

 ssh-keygen -t rsa

生成的文件目录通过显示日志可以找到在哪

查看生成的文件

cd /root/.ssh

执行以下语句

cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

将其他两台生成的id_rsa.pub重命令后,分别为id_rsa.pub.zk2,id_rsa.pub.zk3

都放到第一台服务器的/root/.ssh上,

然后执行以下语句把这两台服务器生成的公钥加到第一台上去

cat id_rsa.pub.zk2 >> authorized_keys

cat id_rsa.pub.zk3 >> authorized_keys

然后将生成的总的authorized_keys分别放到其他两台的/root/.ssh上去

配置完成,验证,

Master服务器上执行ssh命令,确保3台服务器通过ssh都能相互免密码进去

如下图是我在第一台主机上登录其他服务器,并且相互切换的列子

 

1.3.3  配置zookeeper集群

以zk1主机为例:

1、下载zookeeper-3.4.5.tar文件,解压文件生成zookeeper-3.4.5

[root@Master]# tar -zxvf  zookeeper-3.4.5.tar

2、更改zoo.cfg配置文件

[root@Master]# cd /zookeeper-3.4.5/conf

[root@Master]# vi zoo.cfg

文件内容是:

tickTime=2000

initLimit=10

syncLimit=5

dataLogDir=/zookeeper/log/

dataDir=/zookeeper/data/

clientPort=2181

(是不是写错了?)

server.1=zk1:2888:3888

server.2=zk2:2888:3888

server.3=zk3:2888:3888

(应该是这个吧)

server.1=Master:2888:3888

server.2=Slave1:2888:3888

server.3=Slave2:2888:3888

如果该目录中没有这个文件,则创建一个新的文件。注意每一个配置项的后面不要有空格,否则会报错。

6、配置myid文件

创建zoo.cfg文件中配置的dataLogDir和dataDir文件夹:

进入解压缩的zookeeper-3.4.5目录下执行如下命令

[root@zk1]#mkdir data

[root@zk1]#mkdir  log

在dataDir指向的文件夹中创建myid文件,里面内容为一个数字,用来标识当前主机,conf/zoo.cfg文件中配置的server.X中X为什么数字,则myid文件中就输入这个数字,例如当前主机zk1,在zoo.cfg文件中对应的是server.1,所以myid文件中的值应该是1。

7、启动zookeeper

进入/zookeeper/bin文件夹,执行zkServer.sh文件

[root@Master]#./zkServer.sh start

查看状态

[root@Master]#./zkServer.sh status

查看启动日志

[root@Master] #tail –f zookeeper.out

 

  • 1. 启动ZK服务:./zkServer.sh start
  • 2. 查看ZK服务状态./zkServer.sh status
  • 3. 停止ZK服务./zkServer.sh stop
  • 4. 重启ZK服务./zkServer.sh restart

以Master为案例配置其他两个节点。三个节点全部启动之后,zookeeper会根据选举算法选出一个leader,系统运行正常。

8、常见错误

#Cannot open channel to 2 at election address slave-02/192.168.0.178:3888 java.net.ConnectException: Connection refused  

这是因为集群中的某一个节点没有启动完成,导致已经启动的节点无法连接该节点。这个错误在所有节点都启动成功之后消失。

#Cannot open channel to 1 at election address zk1/192.168.1.201:3888

java.net.NoRouteToHostException: No route to host

这是因为防火墙问题,关闭防火墙或开放相应端口

1.3.4  配置hadoop集群

     说明:先在一台主节点服务器上安装好一个hadoop单节点环境,测试成功后直接拖多其它服务器上去,改下相关配置就行了,为了方便安装文件管理,

 

在/home/was/目录下新建hadoop文件并授予权限,将hadoop-2.5.2.tar.gz压缩包上传进hadoop文件夹下并解压

A 创建目录

  [root@Master hadoop-2.5.2]#mkdir data

  [root@Master hadoop-2.5.2]#mkdir name

  [root@Master hadoop-2.5.2]#mkdir tmp

1.3.4.1         第一步配置

 

 

涉及到的配置文件有7个,在hadoop-2.5.2的目录下:
/etc/hadoop/hadoop-env.sh
/etc/hadoop/yarn-env.sh
/etc/hadoop/slaves
/etc/hadoop/core-site.xml
/etc/hadoop/hdfs-site.xml
/etc/hadoop/mapred-site.xml
/etc/hadoop/yarn-site.xml
以上个别文件默认丌存在的,可以复制相应的template文件获得。

1.3.4.1.1     配置hadoop-env.sh

[root@Master hadoop]# vi hadoop-env.sh

配置 JAVA_HOME

export JAVA_HOME=/usr/java/jdk1.7.0_71

 

 

1.3.4.1.2     配置yarn-env.sh

配置JAVA_HOME

export JAVA_HOME=/usr/java/jdk1.7.0_71

 

 

1.3.4.1.3     配置core-site.xml

在<configuration></configuration>中加上下面这行代码

<property>

<name>fs.defaultFS</name>

<value>hdfs://Master:9000</value>

</property>

<property>

<name>io.file.buffer.size</name>

<value>131072</value>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>/home/was/hadoop/hadoop-2.5.2/tmp</value>

</property>

<property>

<name>hadoop.proxyuser.hduser.hosts</name>

<value>*</value>

</property>

<property>

<name>hadoop.proxyuser.hduser.groups</name>

<value>*</value>

</property>

<property>

<name>ha.zookeeper.quorum</name>

<value>Master:2181,Slave1:2181,Slave2:2181</value>

 </property>

<property>

<name>io.native.lib.available</name>

<value>true</value>

</property>

 

1.3.4.1.4     配置hdfs-site.xml

在hdfs-site.xml中<configuration></configuration>中加上下面这行代码

<property>

<name>dfs.namenode.secondary.http-address</name>

<value>Master:9001</value>

</property>

<property>

<name>dfs.namenode.name.dir</name>

<value>file:/home/was/hadoop/hadoop-2.5.2/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>file:/home/was/hadoop/hadoop-2.5.2/data</value>

</property>

<property>

<name>dfs.replication</name>

<value>1</value>

</property>

<property>

<name>dfs.webhdfs.enabled</name>

<value>true</value>

 

1.3.4.1.5     配置mapred-site.xml

在mapred-site.xml中<configuration></configuration>中加上下面这行代码

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

<property>

<name>mapreduce.jobhistory.address</name>

<value>Master:10020</value>

</property>

<property>

<name>mapreduce.jobhistory.webapp.address</name>

<value>Master:19888</value>

</property>

 

1.3.4.1.6     配置yarn-site.xml

在yarn-site.xml中<configuration></configuration>中加上下面这行代码

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

<property>

<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>

<value>org.apache.hadoop.mapred.ShuffleHandler</value>

</property>

<property>

<name>yarn.resourcemanager.address</name>

<value>Master:8032</value>

</property>

<property>

<name>yarn.resourcemanager.scheduler.address</name>

<value>Master:8030</value>

</property>

<property>

<name>yarn.resourcemanager.resource-tracker.address</name>

<value>Master:8031</value>

</property>

<property>

<name>yarn.resourcemanager.admin.address</name>

<value>Master:8033</value>

</property>

<property>

<name>yarn.resourcemanager.webapp.address</name>

<value>Master:8088</value>

</property>

 

1.3.4.1.7     配置slaves

slaves内容如下:

Master

Slave1

SLave2

 

 

1.3.4.2         第二步其他

 1:创建目录

在/home/was/hadoop/hadoop-2.5.2目录下新建文件并受权

Chmod 777

[root@Master hadoop-2.5.2]#  mkdir data

[root@Master hadoop-2.5.2]#  mkdir name

[root@Master hadoop-2.5.2]#  mkdir tmp

2:将Master节点上配置的hadoop迁到其它两台Slave1,Slave2两台服务器上去,最好其它两台服务器的hadoop文件位置跟Master节点的位置一样。

进入Master服务器上/home/was目录输入如下命令

[root@Master was]# scp -r hadoop was@Slare1:/home/was

[root@Master was]# scp -r hadoop was@Slare2:/home/was

 

3:格式化分布式文件系统

进入/home/was/hadoop/hadoop-2.5.2/bin目录下输入如下命令:

[root@Master bin]#./hdfs namenode -format

格式化日志内容就直接截了张其他服务器上的命令截图如下

 

 

1.3.4.3         启动hadoop

进入/home/was/hadoop/hadoop-2.5.2/sbin目录

[root@Master sbin]#./start-dfs.sh

[root@Master sbin]#./start-yarn.sh

 

如下图:输入jps命令查看进程(该截图是我安装了zookeeper,hbase,spark,hadoop,的Master节点上的进程)

 

此时在Master上面运行的迕程有:datanode,namenode,secondarynamenode

Slave1和Slave2上面运行的迕程有:datanode

启劢yarn: ./sbin/start-yarn.sh

此时在Master上运行的迕程有:datanode,namenode,secondarynamenode,resourcemanager

Slave1和Slave2上面运行的迕程有:datanode,nodemanager

浏览器上输入如下命令查看是否能够访问,其中master是我配置在我windows上的host文件中

http://master:50070/dfshealth.html#tab-overview

 

1.4     HBase集群部署

在hadoop环境基础上配置

将hbase-0.98.6-hadoop2-bin.tar.gz上传到/home/was/hadoop目录,解压,

重命名为hbase

[root@Master hadoop]# mv hbase-0.98.6-hadoop2-bin hbase

 

1.4.1  配置环境变量

 

1.4.2  配置hbase-env.sh

export JAVA_HOME=/usr/java/jdk1.7.0_71

#hadoop的配置目录

export HBASE_CLASSPATH=/home/was/hadoop/hadoop-2.5.2/etc/hadoop

和最后一行

export HBASE_MANAGES_ZK=false

#true:表示zookeeper交给hbase管理,启动hbase时,会自动启动hbase-site.xml里的hbase.zookeeper.quorum属性中的所有zookeeper实例

#false:表示启动hbase时,要手动启动所有zookeeper实例

 

1.4.3  配置 hbase-site.xml

在hbase-site.xml中<configuration></configuration>中加上下面这行代码

<property>

  <name>hbase.rootdir</name>

  <value>hdfs://Master:9000/hbase</value>

</property>

<property>

  <name>hbase.cluster.distributed</name>

  <value>true</value>

</property>

<property>   

   <name>hbase.master</name>   

   <value>Master:60000</value>    

 </property>

<property>

  <name>hbase.zookeeper.quorum</name>

  <value>Master,Slave1,Slave2</value>

</property>

<property>

  <name>dfs.replication</name>

  <value>1</value>

</property>

 

1.4.4  配置regionservers

 Master

 Slave1

 Slave2

 

1.4.5  替换lib包

将hbase中的lib下面hadoop开头的包替换成与之关联的hadoop的包。

Hadoop包位置在/home/was/hadoop/hadoop-2.5.2/share/hadoop目录下面,有几个文件夹,根据hbase中的lib包的名称及版本来对比替换然后删除旧版本,其中hadoop-client-2.2.0.jar可以不用替换,因为hadoop中没找到这个包,直接放到那不动。

 

 

1.4.6  启动hbase

启动hbase

进入bin目录下输入: ./start-hbase.sh

查看

[root@Master bin]# jps

出现HMaster、HRegionServer

 

 

Shell验证

进入/home/was/hadoop/hbase/bin

 

1.4.7  Hbase部署异常问题总结

如果遇到进入shell之后HMaster自动挂掉的问题,并且master的log里出现“TableExistsException: hbase:namespace”字样,

很可能是更换了Hbase的版本过后zookeeper还保留着上一次的Hbase设置,所以造成了冲突。

解决方案:

1.切换到zookeeper的bin目录;

2.执行$sh zkCli.sh

输入‘ls /’

4.输入‘rmr /hbase’

5.退出

重启hbase即可。

 

4.错误解决及排除

 

(1)zookeeper遇到的问题:

 

1)Error contactiong service. It is probably not runnin

 

查看zookeeper状态时出现:Error contactiong service. It is probably not running

 

先使用jps查看是否有QuorumPeerMain;

 

再查看2181端口是否开启:   netstat -an | grep 2181

 

如果这2项都没有问题,原因可能是你只是单机启动,集群中其他计算机并没有启动zookeeper,

把集群中其他的启动后再使用此命令。而且此命令功能太过单一,反馈信息也不准确。

 

 

(2)Hbase遇到的问题

 

ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times

 

问题发生在list 查看表时,通过查看 logs/ 下的日子信息:

 

stopping hbasecat: /tmp/hbase-mango-master.pid: No such file or directory 

 

发现是HBASE_PID_DIR 没有配置,使用的是默认配置,但是默认配置会在下次启动后自动清除,所以需要手动配置并创建相应的文件。(参考:hbase-env.sh) 

 

(3)hadoop遇到的问题

 

All directories in dfs.data.dir are invalid

 

这个问题以前没有遇到过,而且在之前节点启动正常,但这次不知道是何原因。

 

通过:hadoop dfsadmin -report 发现一个节点没有启动,通过查看此节点的logs信息,发现是文件权限引起的:Invalid directory in dfs.data.dir: Incorrect permission for /hadoop/hadoop-data, expected: rwxr-xr-x, while actual: rwxrwxr-x

 

更改权限,文件解决:chmod g-w /hadoop/hadoop-data/    (其他节点权限和以前一样却没有出现这问题,好奇怪~~)

 

Ps:最有效、快速定位错误的方法是看logs,千万不要忽视了哦!

 

 

1.5Redis部署

1.1.1     总体部署架构

Redis缓存服务采用Master-Slaver模式,Master节点负责读写操作,Slaver节点负责从Master节点上做Replication的复制。Master和Slaver节点分别部署在不同主机上,组成一组Redis服务。Redis组内采用Redis官方提供的Sentinel(哨兵)机制做failover,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决。

基于Sentinel的主从切换方案,Sentinel用于管理多个Redis服务器实例,主要负责三个方面的任务:

 1. 监控(Monitoring: Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。每个sentinel会向其它sentinal、master、slave定时发送消息,以确认对方是否“活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂(所谓的“主观认为宕机” Subjective Down,简称SDOWN)。若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master"彻底死亡"(即:客观上的真正down机,Objective Down,简称ODOWN)。
    2. 提醒(Notification: 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
    3. 自动故障迁移(Automatic failover: 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会通过一定的vote算法,从失效主服务器的其中一个从服务器升级为新的主服务器, 并自动修改相关配置,让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。当失效的Master恢复后,Redis Sentinel会自动识别,将Master自动转换为Slave并完成数据同步。通过Redis Sentinel可以实现Redis零手工干预并且短时间内进行M-S切换,减少业务影响时间。

 

1.4.7.1         缓存主要设置

n  持久化策略:Master采用快照方式生成RDB文件,Slave采用快照方式生成RDB文件的同时利用增加AOF策略。

n  虚拟内存:关闭

n  最大内存:60%~80%物理内存

1.4.7.2         队列主要设置

n  持久化策略:关闭

n  虚拟内存:关闭

n  最大内存:60%~80%物理内存

 

1.1.2     Redis Sentinel 安装配置

对于一组主备redis,将配置启动三个哨兵对其进行监控,以下是详细配置步骤:

1.4.7.3         安装配置

1>   10.45.47.35  master    redis.conf

先在redis根目录下创建conf子目录,把默认的redis.conf文件复制进来,重命名为redis-6379.conf,并修改以下配置信息:

##redis-6379.conf 

##redis-35-M,默认为master 

port 6379 

## daemonize默认为no,修改为yes,启用后台运行

daemonize yes

##Redis 默认pid 文件位置redis.pid,当运行多个 redis 服务时,需要指定不同的 pid 文件和端口

pidfile redis-35-M.pid

##日志刷新策略(Master禁用)

#save 900 1

#save 300 10

#save 60 10000

#镜像备份文件的文件名

dbfilename redis-35-M_dump.rdb

##启用增量(Master禁用)

appendonly no

##slaveof no one 

slave-read-only yes 

 

2>   10.45.47.36  slaver      redis.conf

先在redis根目录下创建conf子目录,把默认的redis.conf文件复制进来,重命名为redis-6379.conf,并修改以下配置信息:

##redis.conf 

##redis-36-S,Slave

port 6379 

##Redis 默认pid 文件位置redis.pid,当运行多个 redis 服务时,需要指定不同的 pid 文件和端口

pidfile redis-36-S.pid

##日志刷新策略(Master禁用)

save 900 1

save 300 10

save 60 10000

#镜像备份文件的文件名

dbfilename redis-36-S_dump.rdb

##启用增量(Master禁用)

appendonly yes

##设置该数据库为其他数据库的从数据库,主库无需设置

slaveof 10.45.47.35 6379 

##-----------其他配置和master保持一致-----------##

 

3>   10.45.47.35      sentinel.conf

先在redis根目录下创建conf子目录,把默认的sentinel.conf文件复制进来,重命名为sentinel-16379.conf,并修改以下配置信息:

##sentinel-16379.conf

##sentinel实例之间的通讯端口 

port 16379 

##指定工作目录

dir /app/redis-2.8.17/tmp

##显示监控master节点10.45.47.35,master节点使用端口6379,最后一个数字表示投票需要的"最少法定人数",比如有10个sentinal哨兵都在监控某一个master节点,如果需要至少6个哨兵发现master挂掉后,才认为master真正down掉,那么这里就配置为6,最小配置1台master,1台slave,在二个机器上都启动sentinal的情况下,哨兵数只有2个,如果一台机器物理挂掉,只剩一个sentinal能发现该问题,所以这里配置成1,至于mymaster只是一个名字,可以随便起,但要保证下面使用同一个名字

sentinel monitor mymaster 10.45.47.35 6379 1  

##表示如果10s内mymaster没响应,就认为SDOWN

sentinel down-after-milliseconds mymaster 10000 

##表示如果master重新选出来后,其它slave节点能同时并行从新master同步缓存的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保定的设置为1,只同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。

sentinel parallel-syncs mymaster 1 

##表示如果15秒后,mysater仍没活过来,则启动failover,从剩下的slave中选一个升级为master

sentinel failover-timeout mymaster 15000   

##当failover时,指定一个“通知”脚本用来告知系统管理员,当前集群的情况。脚本被允许执行的最大时间为60秒,如果超时,脚本将会被终止(KILL)  脚本执行的结果:  1:稍后重试,最大重试次数为10; 2: 执行结束,无需重试

sentinel notification-script mymaster /app/redis-2.8.17/conf/notify.sh

 

4>   10.45.47.36      sentinel.conf

先在redis根目录下创建conf子目录,把默认的sentinel.conf文件复制进来,重命名为sentinel-16379.conf,并修改以下配置信息:

##sentinel-16379.conf

##sentinel实例之间的通讯端口 

port 16379

##-----------其他配置和上面保持一致-----------##


5>   10.45.47.38      sentinel.conf

先在redis根目录下创建conf子目录,把默认的sentinel.conf文件复制进来,重命名为sentinel-26379.conf,并修改以下配置信息:

##sentinel-26379.conf

##sentinel实例之间的通讯端口 

port 26379

##-----------其他配置和上面保持一致-----------##

 

以上是10.45.47.45作为主redis节点,10.45.47.36作为备redis节点的redis sentinel相关配置。

 

1.4.7.4         启动与检测

1、启动 (先切换至redis根目录下)

##启动redis进

 10.45.47.35/36机器--

$ redis-server  ./conf/redis.conf  &

##启动sentinel组件 

 10.45.47.35/36/38机器--

$ nohup  ./src/redis-sentinel  ./conf/sentinel-16379.conf  &

$ nohup  ./src/redis-sentinel  ./conf/sentinel-26379.conf  &

(对于一组Redis master和slave上都启用sentinel,及另外一台机器上再额外启动一个,即最终有三个哨兵)

redis-cli -p 16379 sentinel masters 可通过该命令查看当前的master节点情况

redis-cli -p 16379 info 可通过该命令查看master地址,有几个slave,有几个监控

 

2、检测

(1) 在master上,redis-cli -p 6379 shutdown ,手动把master停掉,tail -f nohup.out观察sentinel的输出:

[9427] 28 Apr 15:59:02.976 # Sentinel runid is c6552685654378a954bfcafebb85b66e2f240665

[9427] 28 Apr 15:59:02.977 # +monitor master mymaster 10.45.47.35 6379 quorum 1

[9427] 28 Apr 15:59:03.978 * +slave slave 10.45.47.36:6379 10.45.47.36 6379 @ mymaster 10.45.47.35 6379

[9427] 28 Apr 15:59:04.432 * +sentinel sentinel 10.45.47.35:16379 10.45.47.35 16379 @ mymaster 10.45.47.35 6379

[9427] 28 Apr 16:15:23.699 # +new-epoch 1

[9427] 28 Apr 16:15:23.749 # +vote-for-leader 75baef80724fc558eaa5a418d4f179934035d00f 1

[9427] 28 Apr 16:15:23.750 # +sdown master mymaster 10.45.47.35 6379

[9427] 28 Apr 16:15:23.750 # +odown master mymaster 10.45.47.35 6379 #quorum 1/1

[9427] 28 Apr 16:15:23.750 # Next failover delay: I will not start a failover before Tue Apr 28 16:15:54 2015

[9427] 28 Apr 16:15:24.856 # +config-update-from sentinel 10.45.47.35:16379 10.45.47.35 16379 @ mymaster 10.45.47.35 6379

[9427] 28 Apr 16:15:24.856 # +switch-master mymaster 10.45.47.35 6379 10.45.47.36 6379

[9427] 28 Apr 16:15:24.856 * +slave slave 10.45.47.35:6379 10.45.47.35 6379 @ mymaster 10.45.47.36 6379

[9427] 28 Apr 16:15:34.899 # +sdown slave 10.45.47.35:6379 10.45.47.35 6379 @ mymaster 10.45.47.36 6379

[9427] 28 Apr 16:22:26.423 # -sdown slave 10.45.47.35:6379 10.45.47.35 6379 @ mymaster 10.45.47.36 6379

[9427] 28 Apr 16:22:36.385 * +convert-to-slave slave 10.45.47.35:6379 10.45.47.35 6379 @ mymaster 10.45.47.36 6379

 

从红色部分可以看出,master发生了迁移,等刚才停掉的master再重启后,可以观察到它将被当作slave加入,类似以下输出

[9427] 28 Apr 16:22:36.385 * +convert-to-slave slave 10.45.47.35:6379 10.45.47.35 6379 @ mymaster 10.45.47.36 6379

在10.45.47.36上执行redis-cli -p 6379 info命令可发现,该redis已被切换为主:

# Replication

role:master

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

在10.45.47.35上执行redis-cli -p 6379 info命令可发现,该redis已被切换为备:

# Replication

role:slave

master_host:10.45.47.36

master_port:6379

master_link_status:up

master_last_io_seconds_ago:1

master_sync_in_progress:0

slave_repl_offset:1311

slave_priority:100

slave_read_only:1

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

 

(2) 再测试,shutdown 10.45.47.36上的redis,观察日志可看到10.45.47.35的redis被切回了主。启动10.45.47.36上的redis,角色转成了备。

(3) 直接down掉10.45.47.35主机,此时10.45.47.36又被切回主。

 

注意事项:发生master迁移后,如果遇到运维需要,想重启所有redis,必须最先重启“新的”master节点,否则sentinel会一直找不到master。

日常运维可使用redis自带的info命令和monitor命令获取相关信息,监控redis的运行情况。也可用redis-live、redis-stat第三方工具对redis进行监控,既有命令行也有web界面。

l      

1.4.7.5         应用侧配置Redis连接方式

由于使用Sentinel作高可用架构,应用侧使用Sentinel模式来配置redis连接。该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在Redis2.4中,Redis2.8中Sentinel更加稳定)。在Jedis2.2.2中新增了对Sentinel的支持,当故障发生进行主从切换后,应用通过redis.clients.jedis.JedisSentinelPool.getResource()取得的Jedis实例会及时更新到新的主实例地址。

若使用spring-redis-data,则使用1.2.x以上版本,JDK使用1.6以上版本,Spring Framework使用3.2.8以上版本。

使用spring-redis-data以Sentinel模式来配置redis连接示例如下:

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">

     <property name="maxTotal" value="100" />

      <property name="minIdle" value="10" /> 

     <property name="maxIdle" value="20" />

      <property name="maxWaitMillis" value="1000" />

      <property name="testOnBorrow" value="true" />

      <property name="testOnReturn" value="true" />

      <property name="testWhileIdle" value="true" />

</bean>

<bean id="redisSentinelConfiguration"

         class="org.springframework.data.redis.connection.RedisSentinelConfiguration">

     <property name="master">

     <bean class="org.springframework.data.redis.connection.RedisNode">

         <property name="name" value="mymaster"></property>

     </bean>

     </property>

     <property name="sentinels">

         <set>

              <bean class="org.springframework.data.redis.connection.RedisNode">

                   <constructor-arg index="0" value="10.45.47.35" />

                   <constructor-arg index="1" value="16379" />

              </bean>

              <bean class="org.springframework.data.redis.connection.RedisNode">

                   <constructor-arg index="0" value="10.45.47.36" />

                   <constructor-arg index="1" value="16379" />

              </bean>

              <bean class="org.springframework.data.redis.connection.RedisNode">

                   <constructor-arg index="0" value="10.45.47.36" />

                   <constructor-arg index="1" value="26379" />

              </bean>

         </set>

     </property>

</bean>

<bean id="jedisConnFactory"

         class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">

     <constructor-arg name="sentinelConfig" ref="redisSentinelConfiguration" />

     <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>

</bean>

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">

     <property name="connectionFactory" ref="jedisConnFactory" />

</bean>

l      

l      

1.1.3     详细部署与具体缓存列队配置

以激活为例,目前共2台Redis主机,可以采用两两互备,共5个Redis组,每组1个Master与1个Slave。其中2组用于缓存序列化的DTO对象,Master(RDB方式),Slave(RDB+AOF),关闭虚拟内存,另外2组用于缓存队列消息,不持久化,关闭虚拟内存,剩下一组用于公用Redis服务,不持久化,关闭虚拟内存。每台主机上的redis节点共占用60%~80%的特理内存,分配大小100G的文件目录存放RDB同步文件。如下图所示:

 

如下列表所示:

名称

Master

Slave

存放内容

持久化策略

虚拟内存

内存

缓存1

主机1

主机2

缓存Dto

主:RDB

备:RDB+AOF

关闭

30G

缓存2

主机2

主机1

缓存Dto

主:RDB

备:RDB+AOF

关闭

30G

队列1

主机2

主机1

队列

关闭

关闭

10G

队列2

主机1

主机2

队列

关闭

关闭

10G

公用

主机1

主机2

队列

关闭

关闭

20G


Redis存放主要分两大类内容:序列化的DTO对象和队列消息。

以激活为例,Redis存放的序列化的DTO对象及队列消息如下:

ü  序列化的DTO对象:

由于是一个Key-Value数据库,因此在存放不同类别DTO对象时,约定在key定义上加上前缀,避免自增key值相同时,遭遇内容覆盖的情况。序列化的DTO对象包括:

名称

Key

Value

清除时间

默认清除时间

服开工单报文

UUID_${UUID}

服开工单报文

工单有回单结果后删除

3天

工单对象

ORDER_${工单GID序列}

序列化工单对象

工单回单后删除

3天

子工单对象

NE_${子工单GID序列}

序列化子工单对象

子工单完成后删除

3天

指令日志对象

CMD_LOG_${指令GID序列}

序列化指令日志对象

指令完成后删除

3天

NPI回单对象

FD_${子工单流水/工单流水}

序列化NPI回单对象

ODC处理完后删除

3天

异步流水对象

ASYN_LOG_${异步流水GID序列}

序列化异步流水对象

NPI处理完后删除

3天

子工单回单控制结构体对象

OCTL_${工单流水}

序列化子工单回单控制结构体对象

工单回单后删除

3天

外部工单与工单关联对象

OUT_ORDER_${外部工单流水}

序列化外部工单与工单关联对象

EVT处理完后删除

3天

 

 

ü  队列消息:

队列消息存于Redis的list集合结构,包括:

名称

Key

Value

入单通知消息

PF_TO_ISAP_QUEUE

List{UUID_${UUID},...}

NPI子工单扫单通知消息

NPIP_TO_NE_QUEUE_{ND_CODE}

List{NE_${子工单GID序列},...}

NPI回单通知消息

NPIP_TO_ODC_QUEUE

List{NE_${子工单流水}/NE_${工单流水},...}

 

Redis内容清除策略:

Redis中序列化DTO对象的内容由应用作持久化处理,服开工单报文会持久化到磁盘文件/或Hbase中保存,其他对象则持久至Mysql数据库表中,持久化完成即由应用从Redis删除,队列消息则无需持久,应用pop完即删除。

对于写进Redis里的对象消息统一设置最大超时时间,默认为三天,超过时限的对象缓存将会由redis自动删除,确保Redis内容的彻底清理。

 

1.6Spark集群安装部署

SPARK服务器

osspfc2bsp1

bond0

10.128.68.XX

固定

10.128.68.1

osspfc2bsp2

bond0

10.128.68.XX

固定

10.128.68.1

osspfc2bsp3

bond0

10.128.68.XX

固定

10.128.68.1

osspfc2bsp4

bond0

10.128.68.XX

固定

10.128.68.1

 

1.6.1准备工作

   将下载好的scala-2.10.5.tgz和spark-1.3.0-bin-hadoop2.4上传到osspfc2bsp1节点/home/was上

 

 

 

1.6.2安装scala

解压文件
tar -zxvf scala-2.10.5.tgz

(3)配置环境变量
#vi/etc/profile
#SCALA VARIABLES START
export SCALA_HOME=/home/was/scala-2.10.5
export PATH=$PATH:$SCALA_HOME/bin
#SCALA VARIABLES END

$ source /etc/profile
$ scala -version
Scala code runner version 2.10.5 -- Copyright 2002-2013, LAMP/EPFL

(4)验证scala
$ scala
Welcome to Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_51).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 9*9
res0: Int = 81

 

1.6.3安装spark

说明:该列子安装步骤为测试环境安装步骤,生产环境参考以下测试环境安装步骤就可以了。

 

   Master、Slave1、Slave2 这三台机器上均需要安装 Spark。

首先在 Master 上安装 Spark,具体步骤如下:

第一步:把 Master 上的 Spark   解压:我们直接解压到当前目录下:

[root@Master was]#tar -zxvf  spark-1.3.0-bin-hadoop2.4.tar

 

第二步:配置环境变量

进入配置文件:

 

在配置文件中加入“SPARK_HOME”并把 spark 的 bin 目录加到 PATH  中:

 

配置后保存退出,然后使配置生效:

 

第三步:配置  Spark

进入 Spark 的 conf  目录:

 

把 spark-env.sh.template 拷贝到 spark-env.sh:

 

使用 vim 打开 spark-env.sh:

使用 vim 打开 spark-env.sh:

 

在配置文件中添加如下配置信息:

 

其中:

JAVA_HOME:指定的是 Java  的安装目录;

SCALA_HOME:指定的是 Scala  的安装目录;

SPARK_MASTER_IP:指定的是 Spark 集群的 Master 节点的 IP  地址;

SPARK_WORKER_MEMOERY:指定的 Worker 节点能够最大分配给 Excutors  的内存大小,

因为我们的三台机器配置都是 2g,为了最充分的使用内存,这里设置为了 2g;

HADOOP_CONF_DIR:指定的是我们原来的 Hadoop  集群的配置文件的目录;

 

保存退出。

接下来配置 Spark 的 conf 下的 slaves 文件,把 Worker  节点都添加进去:

 

 

可以看出我们把三台机器都设置为了 Worker 节点,也就是我们的主节点即是 Master  又是

Worker  节点。

保存退出。

上述就是 Master 上的 Spark  的安装。

第四步:Slave1 和 Slave2  采用和 Master  完全一样的 Spark  安装配置,在此不再赘述。

 

第四步启动spark集群

在  Hadoop 集群成功启动的基础上,启动   Spark 集群需要使用  Spark  的  sbin  目录下

“start-all.sh”:

读者必须注意的是此时必须写成“ ./start-all.sh”来表明是当前目录下的“ start-all.sh”,

因为我们在配置 Hadoop 的 bin 目录中也有一个“start-all.sh”文件!

此时使用 jps 发现我们在主节点正如预期一样出现了“Master”和“Worker”两个新进程!

 

此时的 Slave1 和 Slave2 会出现新的进程“Worker”:

此时,我们可以进入 Spark 集群的 Web 页面,访问“http://Master:8080”:  如下所示:

 

 

从页面上我们可以看到我们有三个 Worker  节点及这三个节点的信息。

此时,我们进入 Spark 的 bin 目录,使用“spark-shell”控制台:

 

 

 

此 时 我 们 进 入 了  Spark 的  shell   世 界 , 根 据 输 出 的 提 示 信 息 , 我 们 可 以 通 过

“http://Master:4040”  从 Web 的角度看一下 SparkUI  的情况,如下图所示:

 

至此,我们  的 Spark 集群搭建成功

 

1.7主备Mysql安装

1.7.1MySQL高可用方案

1.7.1.1MySQL复制方案

Mysql自带复制功能,可用于高可用性、读书分离、容灾等应用场景。Mysql复制拓扑结构有多级复制、一主多从、一主一从等。如果仅用于高可用性,一般采用一主一从架构,从一主一从架构演变而来的一种架构是双向一主一从。双向一主一从的好处是当发生故障切换后,当故障机器恢复后,原硬盘数据没有丢失的情况下不需要重建主从关系,维护简单、对业务影响小。双向一主一从的拓扑结构如下:

 

MySQL复制默认是异步复制,Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。如果master故障,Slave可能会丢失事务。

MySQL复制的另一种模式是半同步,一个线程在Master上提交事务将受到阻塞,直到一个已开启半同步复制功能的Slave已收到此事务的所有事件(事件都已写入其relay-log中且已刷新到磁盘上)。如果master故障,Slave不会丢失事务,但事务处理可能会有延时。开启半同步保证数据安全的代价是牺牲了部分性能。

在途库考虑OSD同步数据需要,新增一个slave。拓扑架构如下:

  

A和B节点采用主主模式。C节点用于ODS数据同步使用,C节点从B节点同步数据,C节点仅用于数据查询,不支持数据写入和更改操作。

 

1.7.1.2MySQL高可用性

为了配合mysql复制实现应用的高可用性,还需要借助其他的HA软件,推荐使用keepalived,这是一款成熟的开源HA软件,简单易用、稳定性好。Keepalived的作用是提供一个浮动IP供应用短程序访问mysql,keepalived周期性检测主机硬件和mysql服务器的状态,如果有一台服务器出现故障,Keepalived将检测到,并将浮动IP切到正常的mysql服务器上,这将保证发生单机故障情况下业务的连续性。

 

1.7.1.3MySQL整体拓扑

 

 

1.7.2MySQL实施部署方案

1.7.2.1mysql安装

1.7.2.1安装环境确认

确认一下系统中是否有MySQL极其相关的RPM安装包。如果有,则先删除。

rpm -qa | grep -i mysql

执行完上述命令后,返回空数据,则可进行第二步。否则,执行下面的命令删除MySQL的相关包文件。

yum -y remove mysql-libs*

1.4.7.6         mysql安装

将安装文件拷贝到服务器上,然后执行下述安装命令。

rpm -ivh MySQL-server-advanced-5.6.20-1.el6.i686.rpm

rpm -ivh MySQL-devel-advanced-5.6.20-1.el6.i686.rpm

rpm -ivh MySQL-client-advanced-5.6.20-1.el6.i686.rpm

1.4.7.7         设置mysql配置文件

执行下述命令,将MySQL的配置文件拷贝到/etc目录下。

cp /usr/share/mysql/my-default.cnf /etc/my.cnf

1.4.7.8         初始化mysql及设置密码

分别运行下述命令,初始化MySQL及设置密码。

/usr/bin/mysql_install_db  #初始化MySQL

service mysql start   #启动MySQL

cat /root/.mysql_secret #查看root账号的初始密码,会出现下述所示信息

# The random password set for the root user at Mon Aug 25 10:26:57 2014 (local time): ZFRmqNPoFH3aO5PU

mysql -uroot -pZFRmqNPoFH3aO5PU #使用root账号登陆MySQL

set password=password('123456');  #更改MySQL密码,注意;不可少

exit  #退出

mysql -uroot -p123456 #使用新密码登陆

1.4.7.9         配置允许远程登陆。

use mysql;

mysql> select host,user,password from user;

+-----------+------+-------------------------------------------+

| host | user | password |

+-----------+------+-------------------------------------------+

| localhost | root | *DFEB299B8A17E376E7804A115F471149953B5645 |

| chenxu | root | *6E4C48EDF3CC66BC5F6E6C0980935C8ED660EFAA |

| 127.0.0.1 | root | *6E4C48EDF3CC66BC5F6E6C0980935C8ED660EFAA |

| ::1 | root | *6E4C48EDF3CC66BC5F6E6C0980935C8ED660EFAA |

+-----------+------+-------------------------------------------+

4 rows in set (0.00 sec)

 

mysql> update user set password=password('root') where user='root';

Query OK, 3 rows affected (0.00 sec)

Rows matched: 4 Changed: 3 Warnings: 0

 

mysql> update user set host='%' where user='root' and host='localhost';

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

 

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> exit

Bye

1.4.7.10     设置开机启动

[root@favccxx local]# chkconfig mysql on

[root@favccxx local]# chkconfig --list | grep mysql

mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off

1.4.7.11     修改参数文件

修改/etc/my.cnf,设置MySQL的字符集,配置MySQL表明不区分大小写(默认情况下,MySQL对表名区分大小写,列名不区分大小写)。在[mysqld]下面加入如下内容:

character_set_client=utf8

character_set_server = utf8

collation-server=utf8_general_ci

lower_case_table_names=1

max_connections=1000

1.4.7.12     MySQL的默认文件路径

/var/lib/mysql/ #数据库目录

/usr/share/mysql #配置文件目录

/usr/bin #相关命令目录

#启动脚本

1.4.7.13     重启MySQL

[root@favccxx local]# service mysql restart

Shutting down MySQL.. SUCCESS!

Starting MySQL. SUCCESS!

1.7.2.2Mysql两主一从模式配置

服务器名

IP

系统

MySQL

MySQL-M1

192.168.1.116

rhel-6.2

5.6.22

MySQL-M2

192.168.1.115

rhel-6.2

5.6.22

MySQL-M3

192.168.1.114

rhel-6.2

5.6.22

配置 MySQL-M1 和 MySQL-M2 主主模式,MySQL-M2和MySQL-M3为主从模式

1.4.7.14     创建同步用户 

M1上执行

mysql> grant replication slave on *.* to 'water'@'192.168.1.115' identified by 'cdio2010';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave on *.* to 'ods'@'192.168.1.115' identified by 'cdio2010';

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)


M2上执行

mysql> grant replication slave on *.* to 'water'@'192.168.1.116' identified by 'cdio2010';

Query OK, 0 rows affected (0.11 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

1.4.7.15     参数文件配置

修改M1 的/etc/my.cnf 文件,添加如下内容

[mysqld]

binlog-do-db=db_rocky #需要记录进制日志的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项

binlog-ignore-db=mysql #不需要记录进制日志的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项

replicate-do-db=db_rocky #需要进行同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个replicate-do-db选项

replicate-ignore-db=mysql,information_schema #不需要同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db选项

#同步参数:

#保证slave挂在任何一台master上都会接收到另一个master的写入信息

log-slave-updates

sync_binlog=1

auto_increment_offset=1

auto_increment_increment=2

slave-skip-errors=all #过滤掉一些没啥大问题的错误

 

修改M2 的/etc/my.cnf 文件,添加如下内容

[mysqld]

server-id=2 #设置一个不同的id、注意这里在my.cnf里面有个默认值是 1 、把默认值改掉、而不能新增一个server-id

binlog-do-db=db_rocky #需要记录二进制日志的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项

binlog-ignore-db=mysql #不需要记录进制日志的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-ignore-db选项

#需要同步的数据库

replicate-do-db=db_rocky #需要进行同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项

replicate-ignore-db=mysql,information_schema #不需要同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项

#同步参数:

#保证slave挂在任何一台master上都会接收到另一个master的写入信息

log-slave-updates

sync_binlog=1

auto_increment_offset=2

auto_increment_increment=2

slave-skip-errors=all #过滤掉一些没啥大问题的错误

 

修改M3 的/etc/my.cnf 文件,添加如下内容

[mysqld]

server-id=3 #设置一个不同的id、注意这里在my.cnf里面有个默认值是 1 、把默认值改掉、而不能新增一个server-id

binlog-do-db=db_rocky #需要记录二进制日志的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项

binlog-ignore-db=mysql #不需要记录进制日志的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-ignore-db选项

#需要同步的数据库

replicate-do-db=db_rocky #需要进行同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项

replicate-ignore-db=mysql,information_schema #不需要同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个binlog-do-db选项

#同步参数:

#保证slave挂在任何一台master上都会接收到另一个master的写入信息

log-slave-updates

sync_binlog=1

auto_increment_offset=2

auto_increment_increment=2

slave-skip-errors=all #过滤掉一些没啥大问题的错误

 

1.4.7.16     重启各主机上的mysql

在M1上操作

Service mysql restart

 

在M2上操作

Service mysql restart

 

在M3上操作

Service mysql restart

 

1.4.7.17     查看各节点主服务器状态

在M1上操作

mysql> flush tables with read lock;#防止进入新的数据

Query OK, 0 rows affected (0.00 sec)

mysql> show master status\G;

*************************** 1. row ***************************

File: mysql-bin.000007

Position: 438

Binlog_Do_DB: db_rocky

Binlog_Ignore_DB: mysql

1 row in set (0.00 sec)

 

在M2上操作

mysql> flush tables with read lock;

Query OK, 0 rows affected (0.00 sec)

mysql> show master status\G;

*************************** 1. row ***************************

File: mysql-bin.000008

Position: 107

Binlog_Do_DB: db_rocky

Binlog_Ignore_DB: mysql

1 row in set (0.01 sec)

1.4.7.18     指定各节点同步位置

在M1上操作

mysql> change master to master_host='192.168.1.115',master_user='water',master_password='cdio2010',

-> master_log_file='mysql-bin.000008',master_log_pos=107;

Query OK, 0 rows affected (0.05 sec)

 

在M2上操作

mysql> change master to master_host='192.168.1.116',master_user='water',master_password='cdio2010',

-> master_log_file='mysql-bin.000007',master_log_pos=438;

Query OK, 0 rows affected (0.15 sec)

 

在M3上操作

mysql> change master to master_host='192.168.1.115',master_user='ods',master_password='cdio2010',

-> master_log_file='mysql-bin.000007',master_log_pos=438;

Query OK, 0 rows affected (0.15 sec)

 

注:master_log_file,master_log_pos由上面主服务器查出的状态值中确定master_log_file对应File,master_log_pos对应Position

 

在M1和M2上操作

mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)

1.4.7.19     启动各节点从服务器线程

在M1,M2和M3上操作

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

 

在M1上操作

mysql> show slave status\G;

*************************** 1. row ***************************

主要关注以下 2 个参数:

...

...

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

...

...

 

 

在M2上操作

mysql> show slave status\G;

*************************** 1. row ***************************

主要关注以下 2 个参数:

...

...

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

...

...

 

 

在M3上操作

mysql> show slave status\G;

*************************** 1. row ***************************

主要关注以下 2 个参数:

...

...

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

 

 

1.4.7.20     测试验证

在M1上

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| db_rocky |

| mysql |

| performance_schema |

| test |

+--------------------+

5 rows in set (0.00 sec)

mysql> use db_rocky;

Database changed

mysql> show tables;

Empty set (0.00 sec)

mysql> create table water (id int);

Query OK, 0 rows affected (0.04 sec)

mysql> insert into water values(1);

Query OK, 1 row affected (0.01 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

在M2上

mysql> show tables;

+--------------------+

| Tables_in_db_rocky |

+--------------------+

| t_rocky |

| water |

+--------------------+

2 rows in set (0.00 sec)

mysql> select * from water;

+------+

| id |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

 

 

在M3上

mysql> show tables;

+--------------------+

| Tables_in_db_rocky |

+--------------------+

| t_rocky |

| water |

+--------------------+

2 rows in set (0.00 sec)

mysql> select * from water;

+------+

| id |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

 

 

 

 

 

 

 

 

 

1.7.3Keepalived安装配置

1.4.7.21     Keepalived作用说明

Keepalived是一个开源的高性能HA双机软件。用于实现Redis缓存服务的Master-Slaver模式下的主备双机。主用模式下,Keepalived生成的虚拟IP会指向Master所部属的主机上。

1.4.7.22     Keepalived安装

把keepalived-1.2.7.tar.gz传上到应用服务器上(Master和Slaver服务器上),使用root用户账号进行安装。

安装依赖的lib包

yum -y install openssl-devel 

开始安装keepalived

 

tar -xvf keepalived-1.2.7.tar.gz  

cd keepalived-1.2.7

./configure

输出如下信息

[root@lteapp1 keepalived-1.2.7]# ./configure

checking for gcc... gcc

checking whether the C compiler works... yes

checking for C compiler default output file name... a.out

checking for suffix of executables...

checking whether we are cross compiling... no

checking for suffix of object files... o

checking whether we are using the GNU C compiler... yes

checking whether gcc accepts -g... yes

checking for gcc option to accept ISO C89... none needed

checking for a BSD-compatible install... /usr/bin/install -c

checking for strip... strip

checking how to run the C preprocessor... gcc -E

checking for grep that handles long lines and -e... /bin/grep

checking for egrep... /bin/grep -E

checking for ANSI C header files... yes

checking for sys/wait.h that is POSIX.1 compatible... yes

checking for sys/types.h... yes

checking for sys/stat.h... yes

checking for stdlib.h... yes

checking for string.h... yes

checking for memory.h... yes

checking for strings.h... yes

checking for inttypes.h... yes

checking for stdint.h... yes

checking for unistd.h... yes

checking fcntl.h usability... yes

checking fcntl.h presence... yes

checking for fcntl.h... yes

checking syslog.h usability... yes

checking syslog.h presence... yes

checking for syslog.h... yes

checking for unistd.h... (cached) yes

checking sys/ioctl.h usability... yes

checking sys/ioctl.h presence... yes

checking for sys/ioctl.h... yes

checking sys/time.h usability... yes

checking sys/time.h presence... yes

checking for sys/time.h... yes

checking openssl/ssl.h usability... yes

checking openssl/ssl.h presence... yes

checking for openssl/ssl.h... yes

checking openssl/md5.h usability... yes

checking openssl/md5.h presence... yes

checking for openssl/md5.h... yes

checking openssl/err.h usability... yes

checking openssl/err.h presence... yes

checking for openssl/err.h... yes

checking whether ETHERTYPE_IPV6 is declared... yes

checking for MD5_Init in -lcrypto... yes

checking for SSL_CTX_new in -lssl... yes

checking for poptGetContext in -lpopt... yes

checking for nl_socket_modify_cb in -lnl... no

configure: WARNING: keepalived will be built without libnl support.

checking for kernel version... 2.6.32

checking for IPVS syncd support... yes

checking for kernel macvlan support... yes

checking for an ANSI C-conforming const... yes

checking for pid_t... yes

checking whether time.h and sys/time.h may both be included... yes

checking whether gcc needs -traditional... no

checking for working memcmp... yes

checking return type of signal handlers... void

checking for gettimeofday... yes

checking for select... yes

checking for socket... yes

checking for strerror... yes

checking for strtol... yes

checking for uname... yes

configure: creating ./config.status

config.status: creating Makefile

config.status: creating genhash/Makefile

config.status: creating keepalived/core/Makefile

config.status: creating keepalived/include/config.h

config.status: creating keepalived.spec

config.status: creating keepalived/Makefile

config.status: creating lib/Makefile

config.status: creating keepalived/vrrp/Makefile

config.status: creating keepalived/check/Makefile

config.status: creating keepalived/libipvs-2.6/Makefile

 

Keepalived configuration

------------------------

Keepalived version       : 1.2.7

Compiler                 : gcc

Compiler flags           : -g -O2

Extra Lib                : -lpopt -lssl -lcrypto

Use IPVS Framework       : Yes

IPVS sync daemon support : Yes

IPVS use libnl           : No

Use VRRP Framework       : Yes

Use VRRP VMAC            : Yes

SNMP support             : No

Use Debug flags          : No

 

最后执行下面两个命令

make

make install

 

编译成功后

 

cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/

chmod 755 /etc/init.d/keepalived

cp /usr/local/sbin/keepalived /usr/sbin/

cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

 

[root@lteapp1 keepalived-1.2.7]# chown -R weblogic:bea /etc/init.d/keepalived

[root@lteapp1 keepalived-1.2.7]# chown -R weblogic:bea /usr/local/etc/rc.d/init.d/keepalived

[root@lteapp1 keepalived-1.2.7]# chown -R weblogic:bea /usr/local/etc/sysconfig/keepalived

[root@lteapp1 keepalived-1.2.7]# chown -R weblogic:bea /etc/sysconfig/keepalived

[root@lteapp1 keepalived-1.2.7]# chown -R weblogic:bea /usr/local/sbin/keepalived

[root@lteapp1 keepalived-1.2.7]# chown -R weblogic:bea /usr/sbin/keepalived

 

运行过程可以查看log:

tail -f /var/log/message 

 

启动脚本:service keepalived start

Starting keepalived: [  OK  ]

 

停止脚本:service keepalived stop

Stopping keepalived: [  OK  ]

 

1.4.7.23     通过Keepalived实现mysql故障自动切换

两台应用主机

134.96.100.77  mysql的Master 主机名称为 lteapp1

134.96.100.78  mysql的Slaver  主机名称为 lteapp2 Slaver日常负责同步Master节点的消息

134.96.100.79   虚拟的浮动IP

 

修改Master和Slave的/etc/hosts文件

[root@lteapp1 linux]# cat /etc/hosts

134.96.100.77   lteapp1

134.96.100.78   lteapp2

 

Master上是

[root@lteapp1 linux]# cat /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=lteapp1

 

Slave上是

[root@lteapp2 linux]# cat /etc/sysconfig/network

NETWORKING=yes

HOSTNAME=lteapp2

修改完主机名重启机器生效

 

 

默认安装完成keepalived之后是没有配置文件的,因此我们需要手动创建:

首先,在Master上创建如下配置文件:

[root@lteapp1 linux]#mkdir /etc/keepalived

[root@lteapp1 linux]# vi /etc/keepalived/keepalived.conf

global_defs {

   router_id  lteapp1  <----注意!!应用主机的名称

}

 

vrrp_script chk_mysql {

    script "/etc/keepalived/scripts/mysql_check.sh"

    interval 1

}

 

vrrp_instance mes_mysql {

    state MASTER   <--- 注意:双机的主用节点要填写 MASTER模式

    interface eth0    <----注意:物理网卡绑定了物理IP,如果做了双网卡绑定,则用绑定的名字

    garp_master_delay 10

    virtual_router_id 3   <--- 注意:HA集群的唯一ID,默认就写3

    priority 100

    nopreempt

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        134.96.100.79  <-- 浮动IP

    }

    track_script {

        chk_mysql

    }

    notify_master /etc/keepalived/scripts/mysql_master.sh

    notify_backup /etc/keepalived/scripts/mysql_slave.sh

    notify_fault  /etc/keepalived/scripts/mysql_fault.sh

    notify_stop   /etc/keepalived/scripts/mysql_stop.sh

}

 

 

然后,在Slave上创建如下配置文件:

[root@lteapp1 linux]#mkdir /etc/keepalived

[root@mysql-slave linux]# vi /etc/keepalived/keepalived.conf

global_defs {

   router_id mysql-salve

}

 

vrrp_script chk_mysql {

    script "/etc/keepalived/scripts/mysql_check.sh"

    interval 1

}

 

vrrp_instance mes_mysql {

    state BACKUP    <--- 注意:双机的备用节点要填写BACKUP模式

    interface eth0   <----注意:物理网卡绑定了物理IP,如果做了双网卡绑定,则用绑定的名字

    garp_master_delay 10

    virtual_router_id 3

    priority 90

    nopreempt

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        134.96.100.79

    }

    track_script {

        chk_mysql

    }

    notify_master /etc/keepalived/scripts/mysql_master.sh

    notify_backup /etc/keepalived/scripts/mysql_slave.sh

    notify_fault  /etc/keepalived/scripts/mysql_fault.sh

    notify_stop   /etc/keepalived/scripts/mysql_stop.sh

}

 

 

在Master和Slave上创建监控mysql的脚本

mkdir /etc/keepalived/scripts

vi /etc/keepalived/scripts/mysql_check.sh

#!/bin/bash

ALIVE=`/usr/local/bin/mysql-cli PING`

if [ "$ALIVE" == "PONG" ]; then

  echo $ALIVE

  exit 0

else

  echo $ALIVE

  exit 1

fi

 

编写以下负责运作的关键脚本:

 notify_master /etc/keepalived/scripts/mysql_master.sh

 notify_backup /etc/keepalived/scripts/mysql_slave.sh

 notify_fault /etc/keepalived/scripts/mysql_fault.sh

 notify_stop /etc/keepalived/scripts/mysql_stop.sh

 

因为Keepalived在转换状态时会依照状态来呼叫:

 当进入Master状态时会呼叫notify_master

 当进入Backup状态时会呼叫notify_backup

 当发现异常情况时进入Fault状态呼叫notify_fault

 当Keepalived程序终止时则呼叫notify_stop

 

首先,在mysql Master上创建notity_master与notify_backup脚本:

vi /etc/keepalived/scripts/mysql_master.sh

#!/bin/bash

 

mysqlCLI="/usr/local/bin/mysql-cli"

LOGFILE="/var/log/keepalived-mysql-state.log"

 

echo "[master]" >> $LOGFILE

date >> $LOGFILE

echo "Being master...." >> $LOGFILE 2>&1

 

echo "Run SLAVEOF cmd ..." >> $LOGFILE

$mysqlCLI SLAVEOF 134.96.100.78 6379 >> $LOGFILE  2>&1

sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态

 

echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE

$mysqlCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

 

vi /etc/keepalived/scripts/mysql_slave.sh

#!/bin/bash

 

mysqlCLI="/usr/local/bin/mysql-cli"

LOGFILE="/var/log/keepalived-mysql-state.log"

 

echo "[backup]" >> $LOGFILE

date >> $LOGFILE

echo "Being slave...." >> $LOGFILE 2>&1

 

sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色

echo "Run SLAVEOF cmd ..." >> $LOGFILE

$mysqlCLI SLAVEOF 134.96.100.78 6379 >> $LOGFILE  2>&1

 

 

接着,在mysql Slave上创建notity_master与notify_backup脚本:

 

vi /etc/keepalived/scripts/mysql_master.sh

#!/bin/bash

 

mysqlCLI="/usr/local/bin/mysql-cli"

LOGFILE="/var/log/keepalived-mysql-state.log"

 

echo "[master]" >> $LOGFILE

date >> $LOGFILE

echo "Being master...." >> $LOGFILE 2>&1

 

echo "Run SLAVEOF cmd ..." >> $LOGFILE

$mysqlCLI SLAVEOF 134.96.100.77 6379 >> $LOGFILE  2>&1

sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态

 

echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE

$mysqlCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

 

vi /etc/keepalived/scripts/mysql_slave.sh

#!/bin/bash

 

mysqlCLI="/usr/local/bin/mysql-cli"

LOGFILE="/var/log/keepalived-mysql-state.log"

 

echo "[backup]" >> $LOGFILE

date >> $LOGFILE

echo "Being slave...." >> $LOGFILE 2>&1

 

sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色

echo "Run SLAVEOF cmd ..." >> $LOGFILE

$mysqlCLI SLAVEOF 134.96.100.77 6379 >> $LOGFILE  2>&1

 

然后在Master与Slave创建如下相同的脚本:

vi /etc/keepalived/scripts/mysql_fault.sh

#!/bin/bash

 

LOGFILE=/var/log/keepalived-mysql-state.log

 

echo "[fault]" >> $LOGFILE

date >> $LOGFILE

 

vi /etc/keepalived/scripts/mysql_stop.sh

#!/bin/bash

 

LOGFILE=/var/log/keepalived-mysql-state.log

 

echo "[stop]" >> $LOGFILE

date >> $LOGFILE

 

 

在Master与Slave给脚本都加上可执行权限:

chmod +x /etc/keepalived/scripts/*.sh