本文用于在Ubuntu 16.04中配置分布式共识协议 Raft, 运行环境为Java + Maven, 开辟端口为 8051-8080, demon中实际使用端口为8051-8053
Raft软件包下载地址: https://github.com/Limber0117/raft-java
================== 开始配置 ===========
第一步: 配置Java + Maven 运行环境
1. 目前Oracle已经关闭了 Ubuntu16.04 上面Java 8 的下载通道,因此使用 OpenJDK 8来进行安装
sudo apt-get update
sudo apt-get install openjdk-8-jdk
2. 安装完成后验证:
java -version
3. 配置环境变量:将环境变量信息放入到 /etc/environment 文件,注意需要使用sudo
echo "JAVA_HOME=$(which java)" | sudo tee -a /etc/environment
source /etc/environment
echo $JAVA_HOME
4. 安装Maven:
sudo apt-get -y install maven
5. 验证: mvn --version
6. 配置Maven
新建maven的环境变量文件,放在 /etc/profile.d/maven.sh
sudo nano /etc/profile.d/maven.sh
输入下面代码,注意各路径要根据实际情况输入,可以使用 mvn --version java -version来查看具体路径, 等号前后不能有空格。
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export M2_HOME=/usr/share/maven
export MAVEN_HOME=/usr/share/maven
export PATH=${M2_HOME}/bin:${PATH}:${JAVA_HOME}/bin
保存并退出文档
启用环境变量设置
source /etc/profile.d/maven.sh
7. 自动导入环境变量
在用户根目录下修改 .bashrc文件,使每次用户打开shell时都自动更新环境变量
sudo nano ~/.bashrc
在文件末尾输入:
source /etc/environment
source /etc/profile.d/maven.sh
保存并退出 ( ctrl+o ctrl+x)
第二步:安装Raft并修改配置文件
1. 从github上下载Raft源代码到Ubuntu任意位置并解压缩
2. 进入到文件夹中编辑配置文件
cd ...xxx../raft-java-master
cd raft-java-example
修改 deploy.sh,默认会在本机开启三个Raft cluster server (用进程代表),使用 localhost或者127.0.0.1为IP地址,使用端口为 8051-8053
nohup ./bin/run_server.sh ./data "127.0.0.1:8051:1,127.0.0.1:8052:2,127.0.0.1:8053:3" "127.0.0.1:8051:1"
上方代码中, 连续的三个IP地址和端口用来指定Raft Cluster中的三个服务器和对应通讯端口。 最后的IP地址用来指定本机(本进程)使用的地址和端口。
如果需要配置更多服务器,则可以对应修改。
每个IP地址后面的序号为每台服务器的唯一ID,不能重复。
1) 第一次配置Raft
cd raft-java-example
sh deploy.sh
2) 之后运行可以仅执行以下 nohup指令(建议放入sh文件)。
#start up the first server
cd env/example1
nohup ./bin/run_server.sh ./data "127.0.0.1:8051:1,127.0.0.1:8052:2,127.0.0.1:8053:3" "127.0.0.1:8051:1"
cd -
#start up the second server
cd env/example2
nohup ./bin/run_server.sh ./data "127.0.0.1:8051:1,127.0.0.1:8052:2,127.0.0.1:8053:3" "127.0.0.1:8052:2"
cd -
#start up the third server
cd env/example3
nohup ./bin/run_server.sh ./data "127.0.0.1:8051:1,127.0.0.1:8052:2,127.0.0.1:8053:3" "127.0.0.1:8053:3"
cd -
第三步:利用Raft服务读写文件
客户端在向Raft集群读写文件时,需要指定Cluster中现有的服务器。 如果发送的执行仅含有key,则代表读;同时含有key和value,则代表写。
向Raft写数据:
cd env/client ./bin/run_client.sh "list://localhost:8051,localhost:8052,localhost:8053" hell fadfsa
从Raft读数据:
cd env/client ./bin/run_client.sh "list://localhost:8051,localhost:8052,localhost:8053" hell
请注意:
1) 向Raft提交的数据中,key必须唯一
2)从Raft读取数据时,key必须存在
3)由于本Raft程序使用nohup提交到后台执行,在退出terminal之后进程会继续执行,因此需要手动关闭
> 利用top 或者 ps 查询出PID
> 然后使用 #kill -9 PID 逐个关闭