Open wuyongxiu opened 8 years ago
安装运行ETCD本来应该是一件挺简单的事情,但是由于我对Linux系统的不熟悉,所以总是遇到各种各样问题,搞了2天(2天啊!!!是有多笨),好歹可以在一台Linux上启动一部etcd,并能在其它主机上访问这个etcd。 以下是我在一台啥都没有的 Linux环境上用业余的手法搭建 etcd 的过程,步骤和方法过两天还需要继续优化并看看能不能像辉哥他们那样搞一个.sh文件来完成这一切。
以下分为三步: 1 配置go语言开发环境 2 安装etcd 3 修改etcd配置
\ 1 配置go语言开发环境**
① 下载解压go包 推荐无闻的安装指南(https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/02.3.md)
我的安装步骤: wget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz// 这个版本的不需要编译 (不要下载低于1.5的版本,无法编译etcd,也不要下载后面不是纯数字的,例如go1.7rc5.linux-amd64.tar.gz,编译无法通过 ) 解压文件 tar -zxvf go1.6.linux-amd64.tar.gz
修改文件来配置环境变量(永久更改) sudo vi /etc/profile 在profile文件末尾加入以下内容 export GOROOT=/usr/local/go export GOPATH=/home/kduser/go export GOBIN=/usr/local/go export PATH=$PATH:$GOROOT/bin
文件修改过后重启终端(配置信息生效,或者直接在终端通过export先设置临时配置来使用) 移动go包到GOROOT路径下 sudo mv go $GOROOT
② 安装git 安装git便于以后利用 git clone等命令将github上的项目拷下来 使用 sudo yum install git (原谅我没有su权限) (参考https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git)
_2. 安装etcd _ etcd官方有简易的linux安装步骤(https://github.com/coreos/etcd/releases/)
宝宝开始没看见(没前途了),宝宝心里苦啊,宝宝是自己下载源码编译的,以下阔以不看了 (参照这篇https://github.com/coreos/etcd/blob/master/Documentation/dl_build.md#build-the-latest-version) ① 下载编译etcd git clone https://github.com/coreos/etcd.git cd etcd ./build
PS: 一些编译的问题 a 在./build的时候,我的总是无法build成功,显示找不到各个包。 原因是GOPATH里面的文件夹都没有被授权创建文件夹删除文件夹之类的,在go自动编译源码的过程中,它需要创建或者删除文件夹,因为没有权限,所以这些都无法执行成功,显示出来的错误就是找不到这些包。 于是我用了sudo chmod 777 /home/kduser/* (无奈了,不喜欢权限管那么紧的)。 stackoverflow最高票回答有2句万能修改权限(http://stackoverflow.com/questions/3740152/how-to-set-chmod-for-a-folder-and-all-of-its-subfolders-and-files-in-linux-ubunt) find /opt/lampp/htdocs -type d -exec chmod 755 {} \; find /opt/lampp/htdocs -type f -exec chmod 644 {} \;
b 另外,如果在编译过程中,遇到显示 build文件里 第13,33,34行错误 这一般都是因为go环境没有配好,或者安装Go环境时的环境变量没有配置好(因为go build没有用)。可以用echo $GOPATH 等命令查看下这些环境变量配了没
c 编译过程中,可能会提示 build 文件第25行有问题 25行说的是 判断go version是否大于4(go1.4),好像只有1.4版以后的才能用build文件编译成功,可以用go version查看一下版本。如果是版本问题,就要升级版本了(我们部门确实是1.4,出现了这个问题)。
② 运行etcd 在编译成功之后,bin目录里就会生成一个etcd文件,运行这个etcd文件就可以启动etcd服务了 cd bin ./etcd
检测一下: curl http://localhost:2379/v2/keys 就有结果了
PS: etcd启动后,当关闭终端(我这里是SecureCRT)后,etcd服务也随之关闭了,下次重启时,仍然要重新运行很是麻烦。可以利用nohup命令,让程序在后台运行,即使退出终端,程序也仍然运行着。 nohup ./etcd & 用以上命令代替 ./etcd命令。 (参考http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html)
3. 修改etcd 配置,远程访问etcd 完成以上步骤之后,就已经能在本机上玩起 etcd了。 可是,如果我想在其它主机访问这台主机上的etcd怎么办呢? 例如,我的部署了etcd的主机是 xx.xx.176.36 我在此主机上可以用 curl http://localhost:2379/v2/keys 命令访问etcd 我还有一台机器 xx.xx.176.37 ,curl http://xx.xx.176.36:2379/v2/keys 就会显示couldn't connect to host。而curl http://xx.xx.176.36:80 就能成功,所以是和端口相关的。 用netstat -an命令查看 可以看到 127.0.0.1:2379 127.0.0.1:2380 而80端口是 0.0.0.0:80 (参考http://serverfault.com/questions/78048/whats-the-difference-between-ip-address-0-0-0-0-and-127-0-0-1) 而etcd官方issues里也有这个问题(https://github.com/coreos/etcd/issues/4377)
解决方法:设置环境变量 vi /etc/profile export ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 export ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379
然后reboot终端之后,重新编译执行etcd。 这下,我在37这台机器上也可以访问36的etcd了。
4. 总结 多看官方文档!多看官方文档!多看官方文档!
安装运行ETCD本来应该是一件挺简单的事情,但是由于我对Linux系统的不熟悉,所以总是遇到各种各样问题,搞了2天(2天啊!!!是有多笨),好歹可以在一台Linux上启动一部etcd,并能在其它主机上访问这个etcd。 以下是我在一台啥都没有的 Linux环境上用业余的手法搭建 etcd 的过程,步骤和方法过两天还需要继续优化并看看能不能像辉哥他们那样搞一个.sh文件来完成这一切。
以下分为三步:
1 配置go语言开发环境
2 安装etcd
3 修改etcd配置
\ 1 配置go语言开发环境**
① 下载解压go包
推荐无闻的安装指南(https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/02.3.md)
我的安装步骤:
wget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz// 这个版本的不需要编译
(不要下载低于1.5的版本,无法编译etcd,也不要下载后面不是纯数字的,例如go1.7rc5.linux-amd64.tar.gz,编译无法通过 )
解压文件
tar -zxvf go1.6.linux-amd64.tar.gz
修改文件来配置环境变量(永久更改)
sudo vi /etc/profile
在profile文件末尾加入以下内容
export GOROOT=/usr/local/go
export GOPATH=/home/kduser/go
export GOBIN=/usr/local/go
export PATH=$PATH:$GOROOT/bin
文件修改过后重启终端(配置信息生效,或者直接在终端通过export先设置临时配置来使用)
移动go包到GOROOT路径下
sudo mv go $GOROOT
② 安装git
安装git便于以后利用 git clone等命令将github上的项目拷下来
使用 sudo yum install git
(原谅我没有su权限)
(参考https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git)
_2. 安装etcd _
etcd官方有简易的linux安装步骤(https://github.com/coreos/etcd/releases/)
宝宝开始没看见(没前途了),宝宝心里苦啊,宝宝是自己下载源码编译的,以下阔以不看了
(参照这篇https://github.com/coreos/etcd/blob/master/Documentation/dl_build.md#build-the-latest-version)
① 下载编译etcd
git clone https://github.com/coreos/etcd.git
cd etcd
./build
PS: 一些编译的问题
a 在./build的时候,我的总是无法build成功,显示找不到各个包。
原因是GOPATH里面的文件夹都没有被授权创建文件夹删除文件夹之类的,在go自动编译源码的过程中,它需要创建或者删除文件夹,因为没有权限,所以这些都无法执行成功,显示出来的错误就是找不到这些包。
于是我用了sudo chmod 777 /home/kduser/* (无奈了,不喜欢权限管那么紧的)。
stackoverflow最高票回答有2句万能修改权限(http://stackoverflow.com/questions/3740152/how-to-set-chmod-for-a-folder-and-all-of-its-subfolders-and-files-in-linux-ubunt)
find /opt/lampp/htdocs -type d -exec chmod 755 {} \;
find /opt/lampp/htdocs -type f -exec chmod 644 {} \;
b 另外,如果在编译过程中,遇到显示 build文件里 第13,33,34行错误
这一般都是因为go环境没有配好,或者安装Go环境时的环境变量没有配置好(因为go build没有用)。可以用echo $GOPATH 等命令查看下这些环境变量配了没
c 编译过程中,可能会提示 build 文件第25行有问题
25行说的是 判断go version是否大于4(go1.4),好像只有1.4版以后的才能用build文件编译成功,可以用go version查看一下版本。如果是版本问题,就要升级版本了(我们部门确实是1.4,出现了这个问题)。
② 运行etcd
在编译成功之后,bin目录里就会生成一个etcd文件,运行这个etcd文件就可以启动etcd服务了
cd bin
./etcd
检测一下:
curl http://localhost:2379/v2/keys
就有结果了
PS: etcd启动后,当关闭终端(我这里是SecureCRT)后,etcd服务也随之关闭了,下次重启时,仍然要重新运行很是麻烦。可以利用nohup命令,让程序在后台运行,即使退出终端,程序也仍然运行着。
nohup ./etcd &
用以上命令代替 ./etcd命令。
(参考http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html)
3. 修改etcd 配置,远程访问etcd
完成以上步骤之后,就已经能在本机上玩起 etcd了。
可是,如果我想在其它主机访问这台主机上的etcd怎么办呢?
例如,我的部署了etcd的主机是 xx.xx.176.36 我在此主机上可以用 curl http://localhost:2379/v2/keys 命令访问etcd
我还有一台机器 xx.xx.176.37 ,curl http://xx.xx.176.36:2379/v2/keys 就会显示couldn't connect to host。而curl http://xx.xx.176.36:80 就能成功,所以是和端口相关的。
用netstat -an命令查看
可以看到 127.0.0.1:2379 127.0.0.1:2380
而80端口是 0.0.0.0:80
(参考http://serverfault.com/questions/78048/whats-the-difference-between-ip-address-0-0-0-0-and-127-0-0-1)
而etcd官方issues里也有这个问题(https://github.com/coreos/etcd/issues/4377)
解决方法:设置环境变量
vi /etc/profile
export ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
export ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379
然后reboot终端之后,重新编译执行etcd。
这下,我在37这台机器上也可以访问36的etcd了。
4. 总结
多看官方文档!多看官方文档!多看官方文档!