etcd启动命令:
name必须设置,否则会用default,集群内不同etcd实例的名字应该是唯一的,因为他会有一个map(name->ip)。如果initial-cluster-state设置为new,那么他会创建一个新的clusterid。需要在initial-cluster中指定集群所有节点,否则会报错。然后把一个节点加入到已有的etcd集群则initial-cluster-state要设置为existing,这样就会从集群获取cluster-id,如果设置为new,那么就会创建一个新的clusterid,然后加入的时候就会因为cluster-id不匹配而导致申请加入得到信息被集群忽略掉。加入一个节点必须先调用member add告知集群有一个节点要加入集群,因为源代码中有一个exist集合和local集合,会检测已存在的集群和目标集群数是否相等即检测len(exist)==len(local),不相等则会拒绝该实例的加入.
个人建议是:最好配一个二节点集群,这样的话更加方便的调试leader/follwer:比如leader不动,然后给follower打断点来debug stepFollower函数
go run ./etcdctl/main.go --endpoints 192.168.129.129:2379,30.128.101.96:2379,30.128.101.96:12379 endpoint status --write-out=table
go run ./etcdctl/main.go --endpoints 30.128.101.96:2379 put x z
步骤:
1:git 拉取代码,用goland打开,然后设置go版本,等待goland更新索引
2:启动etcdserver,下面是启动参数,自己搭建的话更换两台机器的ip就行
etcd-1: #假设本机IP是30.128.101.96
--advertise-client-urls=http://30.128.101.96:2379
--initial-advertise-peer-urls=http://30.128.101.96:2380
--listen-client-urls=http://30.128.101.96:2379
--listen-peer-urls=http://30.128.101.96:2380
--initial-cluster-state=new
--initial-cluster=centos=http://192.168.129.129:2380,windows=http://30.128.101.96:2380
--name=windows
etcd-2: #假设本机ip是192.168.129.129 (我用虚拟机搭建的第二台机器)
--advertise-client-urls=http://192.168.129.129:2379
--initial-advertise-peer-urls=http://192.168.129.129:2380
--listen-client-urls=http://192.168.129.129:2379
--listen-peer-urls=http://192.168.129.129:2380
--initial-cluster=centos=http://192.168.129.129:2380,windows=http://30.128.101.96:2380
--name=centos
--initial-cluster-state=new
#goland里直接把上面的启动参数配置到程序的命令行参数中就行了,然后就可以愉快的debug了
goland etcdserver启动流程:
图中的–auto-compact-retention=1是用来激活compact线程的,如果没设置此参数,etcd就不会开启compact,从而无法debugcompact
etcdctl启动流程:(!!goland可以同时启动多个程序)
因为是代码启动,所以命令行参数不需要写etcdctl
一些杂记:
etcd put流程:https://juejin.cn/post/7253020765312860216
client通过grpc来和server通信,put操作就是client调用grpcclient的Put方法,然后服务端server再调用对应的put方法
!!!记得在centenos里关闭防火墙,否则外面是连不上2379/2380端口的
不知道为什么,启动三台就不行,启动一台就行。windows启动一台,虚拟机启动一台可以,但是windows同时启动两台在启动虚拟机里的就不行,莫名其妙