0x00 前言
0x01 验证
按照如下组成一个raft集群:
| raft节点 | 端口 | peer端口 | 存储目录 |
|---|---|---|---|
| Node-1 | 6000 |
7000 |
node0 |
| Node-2 | 6001 |
7001 |
node1 |
| Node-3 | 6002 |
7002 |
node2 |
1、启动集群,并成为leader
[root@VM_120_245_centos ~/stcache]# ./stcached --http=127.0.0.1:6000 --raft=127.0.0.1:7000 --node=./node0 -bootstrap=true
stCached: 2022/07/29 18:08:53 http server listen:127.0.0.1:6000
2022-07-29T18:08:53.158+0800 [INFO] raft: initial configuration: index=0 servers=[]
2022-07-29T18:08:53.158+0800 [INFO] raft: entering follower state: follower="Node at 127.0.0.1:7000 [Follower]" leader-address= leader-id=
2022-07-29T18:08:54.395+0800 [WARN] raft: heartbeat timeout reached, starting election: last-leader-addr= last-leader-id=
2022-07-29T18:08:54.396+0800 [INFO] raft: entering candidate state: node="Node at 127.0.0.1:7000 [Candidate]" term=2
2022-07-29T18:08:54.413+0800 [DEBUG] raft: votes: needed=1
2022-07-29T18:08:54.413+0800 [DEBUG] raft: vote granted: from=127.0.0.1:7000 term=2 tally=1
2022-07-29T18:08:54.413+0800 [INFO] raft: election won: tally=1
2022-07-29T18:08:54.413+0800 [INFO] raft: entering leader state: leader="Node at 127.0.0.1:7000 [Leader]"
stCached: 2022/07/29 18:08:54 become leader, enable write api #成为leader
2、启动第2个节点
[root@VM_120_245_centos ~/blog_backup/stcache/stcache]# ./stcached --http=127.0.0.1:6001 --raft=127.0.0.1:7001 --node=./node1 --join=127.0.0.1:6000
stCached: 2022/07/29 18:10:35 http server listen:127.0.0.1:6001
2022-07-29T18:10:35.580+0800 [INFO] raft: initial configuration: index=0 servers=[]
2022-07-29T18:10:35.580+0800 [INFO] raft: entering follower state: follower="Node at 127.0.0.1:7001 [Follower]" leader-address= leader-id=
2022-07-29T18:10:35.592+0800 [WARN] raft: failed to get previous log: previous-index=3 last-index=0 error="log not found"
2022-07-29T18:11:08.417+0800 [ERROR] raft: failed to take snapshot: error="nothing new to snapshot"
3、启动第3个节点
[root@VM_120_245_centos ~/blog_backup/stcache/stcache]# ./stcached --http=127.0.0.1:6002 --raft=127.0.0.1:7002 --node=./node2 --join=127.0.0.1:6000
stCached: 2022/07/29 18:10:55 http server listen:127.0.0.1:6002
2022-07-29T18:10:55.231+0800 [INFO] raft: initial configuration: index=0 servers=[]
2022-07-29T18:10:55.231+0800 [INFO] raft: entering follower state: follower="Node at 127.0.0.1:7002 [Follower]" leader-address= leader-id=
2022-07-29T18:10:55.239+0800 [WARN] raft: failed to get previous log: previous-index=4 last-index=0 error="log not found"
节点2、节点3加入集群后,leader日志:

4、写入/读取数据:
[root@VM_120_245_centos ~]# curl "http://127.0.0.1:6000/set?key=abc&value=efg"
ok
[root@VM_120_245_centos ~]# curl "http://127.0.0.1:6000/get?key=abc"
efg
[root@VM_120_245_centos ~]# curl "http://127.0.0.1:6001/get?key=abc"
efg
[root@VM_120_245_centos ~]# curl "http://127.0.0.1:6002/get?key=abc"
efg
[root@VM_120_245_centos ~]#
5、不可以向非leader写入数据
[root@VM_120_245_centos ~]# curl "http://127.0.0.1:6001/set?key=abc&value=efg"
write method not allowed
[root@VM_120_245_centos ~]# curl "http://127.0.0.1:6002/set?key=abc&value=efg"
write method not allowed
6、写入数据时leader/follower的状态变化
leader写入数据

节点2(follower1)

节点3(follower2)

7、关闭leader节点
关闭节点1后,节点3通过选举成为了新的leader

节点3可写:
[root@VM_120_245_centos ~]# curl "http://127.0.0.1:6002/set?key=cba&value=gfe"
ok
8、查询follower变迁及数据
[root@VM_120_245_centos ~]# curl "http://127.0.0.1:6001/get?key=cba"
gfe
9、将节点1重启,再加入集群,自动变为follower

leader状态:

再查询节点1的数据:
[root@VM_120_245_centos ~]# curl "http://127.0.0.1:6000/get?key=cba"
gfe
参考
- 基于hashicorp/raft的分布式一致性实战教学
- Golang implementation of the Raft consensus protocol
- 使用开源技术构建有赞分布式KV存储服务
- 深入分布式缓存-Raft & Lease机制
FEATURED TAGS
Latex
gRPC
负载均衡
OpenSSH
Authentication
Consul
Etcd
Kubernetes
性能优化
Python
分布式锁
WebConsole
后台开发
Golang
OpenSource
Nginx
Vault
网络安全
Perl
分布式理论
Raft
正则表达式
Redis
分布式
限流
go-redis
微服务
反向代理
ReverseProxy
Cache
缓存
连接池
OpenTracing
GOMAXPROCS
GoMicro
微服务框架
日志
zap
Pool
Kratos
Hystrix
熔断
并发
Pipeline
证书
Prometheus
Metrics
PromQL
Breaker
定时器
Timer
Timeout
Kafka
Xorm
MySQL
Fasthttp
bytebufferpool
任务队列
队列
异步队列
GOIM
Pprof
errgroup
consistent-hash
Zinx
网络框架
设计模式
HTTP
Gateway
Queue
Docker
网关
Statefulset
NFS
Machinery
Teleport
Zero Trust
Oxy
存储
Confd
热更新
OAuth
SAML
OpenID
Openssl
AES
微服务网关
IM
KMS
安全
数据结构
hashtable
Sort
Asynq
基数树
Radix
Crontab
热重启
系统编程
sarama
Go-Zero
RDP
VNC
协程池
UDP
hashmap
网络编程
自适应技术
环形队列
Ring Buffer
Circular Buffer
InnoDB
timewheel
GroupCache
Jaeger
GOSSIP
CAP
Bash
websocket
事务
GC
TLS
singleflight
闭包
Helm
network
iptables
MITM
HTTPS
Tap
Tun
路由
wireguard
gvisor
Git
NAT
协议栈
Envoy
FRP
DPI
gopacket
Cgroup
Namespace
DNS
eBPF
GoZero
Gost
Clash
Tracee
gopsutil
Linux
HIDS
ELKEID
XDP
TC
Systemd
netlink
Kernel
BCC
rootkit
bpftrace