本章在已了解go-ethruem 单节点搭建基础之上。
单节点集群文章请看 《centos7.3 go-etheruem 安装、搭建私有链 Hello World程序》
集群条件
1. 创世区块一样
2. 网络的id一致
下面通过2个节点做集群
创建2个目录 1 和2
[root@lt-test-mongodb eth]# mkdir eth_cluster
[root@lt-test-mongodb eth]# mkdir eth_
eth_cluster/ eth_output2.log eth_output.log
[root@lt-test-mongodb eth]# mkdir eth_cluster/1
[root@lt-test-mongodb eth]# mkdir eth_cluster/2
创世文件复制到相应目录下
[root@lt-test-mongodb eth]# cp genesis.json eth_cluster/1/
[root@lt-test-mongodb eth]# cp genesis.json eth_cluster/2/
初始化创世区块
# geth init ./1/genesis.json --datadir "./1/chain"
进入geth客户端
# geth --identity "cluster01" --datadir "./1/chain" --networkid 9999 --port 30301 --rpc --rpcport 8551 --rpccorsdomain "*" --rpcapi "db,eth,net,web3" console
> admin.nodeInfo
{
enode: "enode://3401b1ef41dbb49ba18d1bb16609cd27fc996c34ba4e3a87d74cd03e14845c0593e9d078d40125b4483a5eb1854d8f12efd00cb0ffe271eb5fc6021fb2e7caa5@[::]:30301",
id: "3401b1ef41dbb49ba18d1bb16609cd27fc996c34ba4e3a87d74cd03e14845c0593e9d078d40125b4483a5eb1854d8f12efd00cb0ffe271eb5fc6021fb2e7caa5",
ip: "::",
listenAddr: "[::]:30301",
name: "Geth/cluster01/v1.7.2-stable-1db4ecdc/linux-amd64/go1.8.3",
ports: {
discovery: 30301,
listener: 30301
},
protocols: {
eth: {
difficulty: 131072,
genesis: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
network: 9999
}
}
}
创建第二个节点
# geth init ./2/genesis.json --datadir "./2/chain"
# geth --identity "cluster02" --datadir "./2/chain" --networkid 9999 --port 30302 --rpc --rpcport 8552 --rpccorsdomain "*" --rpcapi "db,eth,net,web3" console
> admin.nodeInfo
{
enode: "enode://636471ccb6ad542829f0b14d42cb69d6990954780087c5c68e31f371a406ab6aa58c580b7d25ca2142779d7ba115a84a1a97852c2998b803395b0bb43138e718@[::]:30302",
id: "636471ccb6ad542829f0b14d42cb69d6990954780087c5c68e31f371a406ab6aa58c580b7d25ca2142779d7ba115a84a1a97852c2998b803395b0bb43138e718",
ip: "::",
listenAddr: "[::]:30302",
name: "Geth/cluster02/v1.7.2-stable-1db4ecdc/linux-amd64/go1.8.3",
ports: {
discovery: 30302,
listener: 30302
},
protocols: {
eth: {
difficulty: 131072,
genesis: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
network: 9999
}
}
}
我们看下端口开启情况
[root@lt-test-mongodb ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8551 0.0.0.0:* LISTEN 17079/geth
tcp 0 0 127.0.0.1:8552 0.0.0.0:* LISTEN 17137/geth
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 30793/sshd
tcp6 0 0 :::30301 :::* LISTEN 17079/geth
tcp6 0 0 :::30302 :::* LISTEN 17137/geth
可以看到 第一个节点(30301、8551) 和 第二个节点 (30302、8552) 已经正常启动。
注: windows 端口比较多 可以过滤查看
C:\Users\Administrator>netstat -ano | grep 30303
TCP 0.0.0.0:30303 0.0.0.0:0 LISTENING 39292
TCP 192.168.0.106:30303 52.47.203.210:41542 FIN_WAIT_2 39292
TCP [::]:30303 [::]:0 LISTENING 39292
C:\Users\Administrator>netstat -ano | grep 8545
TCP 127.0.0.1:8545 0.0.0.0:0 LISTENING 39292
TCP 127.0.0.1:48544 127.0.0.1:48545 ESTABLISHED 5224
TCP 127.0.0.1:48545 127.0.0.1:48544 ESTABLISHED 5224
查看第一个节点的网络节点细信息 enode
> net.peerCount
0
> admin.nodeInfo.enode
"enode://3401b1ef41dbb49ba18d1bb16609cd27fc996c34ba4e3a87d74cd03e14845c0593e9d078d40125b4483a5eb1854d8f12efd00cb0ffe271eb5fc6021fb2e7caa5@[::]:30301"
在第二个节点上添加 enode
> admin.addPeer("enode://3401b1ef41dbb49ba18d1bb16609cd27fc996c34ba4e3a87d74cd03e14845c0593e9d078d40125b4483a5eb1854d8f12efd00cb0ffe271eb5fc6021fb2e7caa5@[::]:30301"); # 因为我在一台机器上测试 所以IP没有指名, 如果外网其他机器把[::]改成指定的ip即可
true
我们再执行 net.peerCount
> net.peerCount
1
第二个节点查看 连接节点信息
> admin.peers
[{
caps: ["eth/63"],
id: "3401b1ef41dbb49ba18d1bb16609cd27fc996c34ba4e3a87d74cd03e14845c0593e9d078d40125b4483a5eb1854d8f12efd00cb0ffe271eb5fc6021fb2e7caa5",
name: "Geth/cluster01/v1.7.2-stable-1db4ecdc/linux-amd64/go1.8.3",
network: {
localAddress: "192.168.1.160:34640",
remoteAddress: "47.100.114.xx:30301" # 这里 ip:port就是外网的第一个节点 xx代表了 要不然暴露外网IP了 ^_^
},
protocols: {
eth: {
difficulty: 131072,
head: "0x5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0",
version: 63
}
}
}]
我们还可以 把 新节点加入创建成脚本 ,一下可以保存为 gethcluster.sh
例如 只需要修改 coinbase 和 supernode 即可
echo "init genesis block..."
geth init "/ws/genesis.json" --datadir "/ws/chain"
echo "genesis block init completed..."
echo "geth node starting"
coinbase="0xa1d50aae10a1587638bebb9f17590bdf4bacbe06"
supernode="enode://caa89725768086ae39810dfc60c0f9f5c935f91ea0da7995407e449a154f12444980c13c1e532c7015caa72029384719ba6c653aa4f2396e38527ee4074ddeb3@47.100.170.500:30303"
# get ipaddr
ip=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:")
echo ip:$ip
echo coinbase:$coinbase
echo connect supernode $supernode
nohup geth --datadir "/ws/chain" --rpc --rpcport 8545 --port 30303 --rpcaddr $ip --rpccorsdomain "*" --rpcapi "db,eth,net,web3,admin,personal" --networkid 999 --ipcdisable --etherbase $coinbase --bootnodes $supernode --mine -minerthreads 1 >> "/ws/geth.log"
集群的时候 需要注意时间一定要同步;
设置与网络时间同步
centos 语言区域设置?
localectl status 查看当前区域配置
locale 查看当前区域的变量配置
localectl list-locales | grep CN 查看可用的汉语语言
localectl set-locale LANG=zh_CN.utf-8 设置区域语言
重启生效
centos时区设置
命令 tzselect
最后需要把 TZ='Asia/Shanghai'; export TZ 写入到 /etc/profile
centos设置与网络时间同步?
1. 安装ntpdate工具
# yum -y install ntp ntpdate
2. 设置系统时间与网络时间同步
# ntpdate cn.pool.ntp.org
3. 将系统时间写入硬件时间
# hwclock --systohc
至此 集群搭建成功。