大數據集羣安裝學習筆記

 

大數據集羣安裝學習筆記html

 

目錄java

1 安裝部署........................................................................... 4node

1.1 solr單節點安裝部署................................................................. 4mysql

1.1.1 下載................................................................................ 4linux

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

1.2 Solr集羣安裝部署.................................................................... 6redis

1.2.1 準備工做......................................................................... 6算法

1.2.2 配置主機......................................................................... 6spring

1.2.3 配置免登陸ssh公鑰........................................................ 6sql

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。

一、解壓文件

解壓文件至j:\盤,solr目錄是:J:\solr-4.4.0,文件目錄以下。

 

contrib有一些功能模塊是須要的jar包

dist是打包發佈好的工程war包

docs是幫助文檔

example是示例,裏面有打包部署好的solr工程示例和servlet容器jetty。若是你沒有tomcat能夠直接使用Jetty服務器部署你的solr示例。

二、使用命令行,進入j:\solr\solr-4.4.0\example目錄。運行start.jar文件。

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

#  j:

#  java –jar start.jar                                 

三、登錄地址http://localhost:8983/solr/

1.1.2.1.2     Tomcat

一、  解壓出solr-4.4.0

二、  複製solr-4.4.0\example\webapps中的solr.war文件到tomcat安裝目錄中的webapps文件夾下

三、  運行tomcat。(忽略怎麼運行tomcat),tomcat會自動解壓solr.war文件。

四、  刪除solr.war文件。(否則每次啓動tomcat都會發布一次)

五、  回到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

六、  回到解壓的solr-4.4.0目錄,打開文件夾:solr-4.4.0\example\solr,複製全部內容到J:\solrhome

七、  打開文件夾:solr-4.4.0\example\lib\ext,複製全部jar包到tomcat的webapps\solr\WEB-INF\lib下。

八、  運行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

一、修改三臺服務器機器名, 修改方式以下

       vi /etc/sysconfig/network

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

       NETWORKING=yes

       HOSTNAME=zk1

二、配置hosts文件

vi /etc/hosts

後面加三行

10.128.90.45 zk1

10.128.90.46 zk2

10.128.90.47 zk3

重啓後生效

三、配置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

 

四、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主機爲例:

一、下載zookeeper-3.4.5.tar文件,解壓文件生成zookeeper-3.4.5

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

二、更改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

若是該目錄中沒有這個文件,則建立一個新的文件。注意每個配置項的後面不要有空格,不然會報錯。

三、配置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。

四、啓動zookeeper

進入/zookeeper/bin文件夾,執行zkServer.sh文件

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

查看狀態

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

查看啓動日誌

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

以zk1爲案例配置其餘兩個節點。三個節點所有啓動以後,zookeeper會根據選舉算法選出一個leader,系統運行正常。

五、常見錯誤

#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

一、修改三臺服務器機器名, 修改方式以下

       vi /etc/sysconfig/network

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

       NETWORKING=yes

       HOSTNAME=Master

二、配置hosts文件

vi /etc/hosts

後面加三行

10.128.90.45 Master

10.128.90.46 Slave1

10.128.90.47 Slave2

重啓後生效

三、配置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

 

四、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主機爲例:

一、下載zookeeper-3.4.5.tar文件,解壓文件生成zookeeper-3.4.5

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

二、更改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

若是該目錄中沒有這個文件,則建立一個新的文件。注意每個配置項的後面不要有空格,不然會報錯。

六、配置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。

七、啓動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,系統運行正常。

八、常見錯誤

#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,有幾個監控

 

二、檢測

(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、Slave一、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

相關文章
相關標籤/搜索