大数据集群安装学习笔记
目录
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
本文使用SOLR 4.4.0版本作为研究对象,要求JDK 1.6,tomcat 6。
下载地址http://archive.apache.org/dist/lucene/solr/4.4.0/,分别下载linux版本和windows版本,区别只是打包的方式不一样。
使用自带的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、 解压出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以上浏览器版本。
同windows环境部署方法
SolrCloud通过ZooKeeper集群来进行协调,使一个索引进行分片,各个分片可以分布在不同的物理节点上,多个物理分片组成一个完成的索引Collection。SolrCloud自动支持Solr Replication,可以同时对分片进行复制,冗余存储。
下载solr 4.4.0和zookeeper-3.4.5版本, 3台Redhat 6.1操作系统的虚拟机。其中三台安装搭建zookeeper集群,5台机器上都部署solr应用。
更改各个主机的hosts文件,在文件末尾添加:
10.128.90.45 zk1
10.128.90.46 zk2
10.128.90.47 zk3
重启系统。(如果和其他应用冲突,可以更改成其他的主机名称)
三台主机
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都能相互免密码进去
如下图是我在第一台主机上登录其他服务器,并且相互切换的列子
以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
这是因为防火墙问题,关闭防火墙或开放相应端口
说明:先在一台主节点服务器上安装好一个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均可访问,页面如下:
下载hadoop-2.5.2.tar.gz和jdk7版本, 3台Redhat 操作系统的虚拟机。其中三台安装搭建zookeeper集群
三台主机
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都能相互免密码进去
如下图是我在第一台主机上登录其他服务器,并且相互切换的列子
以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
以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
这是因为防火墙问题,关闭防火墙或开放相应端口
说明:先在一台主节点服务器上安装好一个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
涉及到的配置文件有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文件获得。
[root@Master hadoop]# vihadoop-env.sh
配置 JAVA_HOME export JAVA_HOME=/usr/java/jdk1.7.0_71
|
配置JAVA_HOME export JAVA_HOME=/usr/java/jdk1.7.0_71
|
在<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> |
在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> |
在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> |
在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> |
slaves内容如下:
Master Slave1 SLave2 |
1:创建目录
在/home/was/hadoop/hadoop-2.5.2目录下新建文件并受权
Chmod 777
[root@Masterhadoop-2.5.2]# mkdir data
[root@Masterhadoop-2.5.2]# mkdir name
[root@Masterhadoop-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 格式化日志内容就直接截了张其他服务器上的命令截图如下
|
进入/home/was/hadoop/hadoop-2.5.2/sbin目录
[root@Mastersbin]#./start-dfs.sh
[root@Mastersbin]#./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 |
在hadoop环境基础上配置
将hbase-0.98.6-hadoop2-bin.tar.gz上传到/home/was/hadoop目录,解压,
重命名为hbase
[root@Master hadoop]# mvhbase-0.98.6-hadoop2-bin hbase
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实例 |
在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> |
Master Slave1 Slave2 |
将hbase中的lib下面hadoop开头的包替换成与之关联的hadoop的包。
Hadoop包位置在/home/was/hadoop/hadoop-2.5.2/share/hadoop目录下面,有几个文件夹,根据hbase中的lib包的名称及版本来对比替换然后删除旧版本,其中hadoop-client-2.2.0.jar可以不用替换,因为hadoop中没找到这个包,直接放到那不动。
|
启动hbase
进入bin目录下输入: ./start-hbase.sh
查看
[root@Master bin]# jps
出现HMaster、HRegionServer
Shell验证 进入/home/was/hadoop/hbase/bin
|
如果遇到进入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,千万不要忽视了哦! |
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切换,减少业务影响时间。
n 持久化策略:Master采用快照方式生成RDB文件,Slave采用快照方式生成RDB文件的同时利用增加AOF策略。
n 虚拟内存:关闭
n 最大内存:60%~80%物理内存
n 持久化策略:关闭
n 虚拟内存:关闭
n 最大内存:60%~80%物理内存
对于一组主备redis,将配置启动三个哨兵对其进行监控,以下是详细配置步骤:
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、启动 (先切换至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-slaveslave 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
由于使用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连接示例如下:
<beanid="jedisPoolConfig"class="redis.clients.jedis.JedisPoolConfig">
<propertyname="maxTotal"value="100"/>
<propertyname="minIdle"value="10"/>
<propertyname="maxIdle"value="20"/>
<propertyname="maxWaitMillis"value="1000"/>
<propertyname="testOnBorrow"value="true"/>
<propertyname="testOnReturn"value="true"/>
<propertyname="testWhileIdle"value="true"/>
</bean>
<bean id="redisSentinelConfiguration"
class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
<propertyname="master">
<bean class="org.springframework.data.redis.connection.RedisNode">
<propertyname="name"value="mymaster"></property>
</bean>
</property>
<propertyname="sentinels">
<set>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-argindex="0"value="10.45.47.35"/>
<constructor-argindex="1"value="16379"/>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-argindex="0"value="10.45.47.36"/>
<constructor-argindex="1"value="16379"/>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-argindex="0"value="10.45.47.36"/>
<constructor-argindex="1"value="26379"/>
</bean>
</set>
</property>
</bean>
<bean id="jedisConnFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<constructor-argname="sentinelConfig"ref="redisSentinelConfiguration"/>
<constructor-argname="poolConfig"ref="jedisPoolConfig"/>
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<propertyname="connectionFactory"ref="jedisConnFactory"/>
</bean>
l
l
以激活为例,目前共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内容的彻底清理。
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 |
将下载好的scala-2.10.5.tgz和spark-1.3.0-bin-hadoop2.4上传到osspfc2bsp1节点/home/was上
解压文件
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, Java1.7.0_51).
Type in expressions to have them evaluated.
Type :help for more information.
scala> 9*9
res0: Int = 81
说明:该列子安装步骤为测试环境安装步骤,生产环境参考以下测试环境安装步骤就可以了。
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 集群搭建成功
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节点仅用于数据查询,不支持数据写入和更改操作。
为了配合mysql复制实现应用的高可用性,还需要借助其他的HA软件,推荐使用keepalived,这是一款成熟的开源HA软件,简单易用、稳定性好。Keepalived的作用是提供一个浮动IP供应用短程序访问mysql,keepalived周期性检测主机硬件和mysql服务器的状态,如果有一台服务器出现故障,Keepalived将检测到,并将浮动IP切到正常的mysql服务器上,这将保证发生单机故障情况下业务的连续性。
确认一下系统中是否有MySQL极其相关的RPM安装包。如果有,则先删除。
rpm -qa | grep -i mysql
执行完上述命令后,返回空数据,则可进行第二步。否则,执行下面的命令删除MySQL的相关包文件。
yum -y remove mysql-libs*
将安装文件拷贝到服务器上,然后执行下述安装命令。
rpm -ivhMySQL-server-advanced-5.6.20-1.el6.i686.rpm
rpm -ivhMySQL-devel-advanced-5.6.20-1.el6.i686.rpm
rpm -ivhMySQL-client-advanced-5.6.20-1.el6.i686.rpm
执行下述命令,将MySQL的配置文件拷贝到/etc目录下。
cp /usr/share/mysql/my-default.cnf/etc/my.cnf
分别运行下述命令,初始化MySQL及设置密码。
/usr/bin/mysql_install_db #初始化MySQL
service mysql start #启动MySQL
cat /root/.mysql_secret #查看root账号的初始密码,会出现下述所示信息
# The random password set for the root userat Mon Aug 25 10:26:57 2014 (local time): ZFRmqNPoFH3aO5PU
mysql -uroot -pZFRmqNPoFH3aO5PU #使用root账号登陆MySQL
set password=password('123456'); #更改MySQL密码,注意;不可少
exit #退出
mysql -uroot -p123456 #使用新密码登陆
use mysql;
mysql> select host,user,password fromuser;
+-----------+------+-------------------------------------------+
| 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 setpassword=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='%' whereuser='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
[root@favccxxlocal]# chkconfig mysql on
[root@favccxxlocal]# chkconfig --list | grep mysql
mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off
修改/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
/var/lib/mysql/ #数据库目录
/usr/share/mysql #配置文件目录
/usr/bin #相关命令目录
#启动脚本
[root@favccxxlocal]# service mysql restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
服务器名 | 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为主从模式
在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 replicationslave 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)
修改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 #过滤掉一些没啥大问题的错误
在M1上操作
Service mysql restart
在M2上操作
Service mysql restart
在M3上操作
Service mysql restart
在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)
在M1上操作
mysql> change master tomaster_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 tomaster_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 tomaster_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)
在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
在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 |
+--------------------+
2rows in set (0.00 sec)
mysql>select * from water;
+------+
| id|
+------+
| 1 |
+------+
1 rowin 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安装配置
Keepalived是一个开源的高性能HA双机软件。用于实现Redis缓存服务的Master-Slaver模式下的主备双机。主用模式下,Keepalived生成的虚拟IP会指向Master所部属的主机上。
把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 filename... 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 Ccompiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISOC89... 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 linesand -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/wait.h that is POSIX.1compatible... 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 isdeclared... 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 bebuilt 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 mayboth 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: creatingkeepalived/core/Makefile
config.status: creatingkeepalived/include/config.h
config.status: creating keepalived.spec
config.status: creating keepalived/Makefile
config.status: creating lib/Makefile
config.status: creatingkeepalived/vrrp/Makefile
config.status: creatingkeepalived/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 -Rweblogic:bea /etc/init.d/keepalived
[root@lteapp1 keepalived-1.2.7]# chown -Rweblogic:bea /usr/local/etc/rc.d/init.d/keepalived
[root@lteapp1 keepalived-1.2.7]# chown -Rweblogic:bea /usr/local/etc/sysconfig/keepalived
[root@lteapp1 keepalived-1.2.7]# chown -Rweblogic:bea /etc/sysconfig/keepalived
[root@lteapp1 keepalived-1.2.7]# chown -Rweblogic:bea /usr/local/sbin/keepalived
[root@lteapp1 keepalived-1.2.7]# chown -Rweblogic:bea /usr/sbin/keepalived
运行过程可以查看log:
tail -f /var/log/message
启动脚本:servicekeepalived start
Starting keepalived: [ OK ]
停止脚本:servicekeepalived stop
Stopping keepalived: [ OK ]
两台应用主机
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
首先,在mysqlMaster上创建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 >> $LOGFILE2>&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
接着,在mysqlSlave上创建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 >> $LOGFILE2>&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
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。