ETCD 是用于共享配置和服务发现的分布式,一致性的KV存储系统。ETCD是CoreOS公司发起的一个开源项目,授权协议为Apache。
ETCD 有很多使用场景,包括但不限于:
配置管理
服务注册于发现
选主
应用调度
分布式队列
分布式锁
以centos7为例
这三台主机中都已经安装好了 etcd 服务并能 正常启动,服务器为奇数台
因为机器有限,只使用了2台测试。
| 主机 | ip |
| etcd1 | 192.168.8.31 |
| etcd2 | 192.168.8.32 |
| etcd3 | 192.168.8.33 |
1.安装etcd
yum install -y etcd
2.配置集群参数
首先我们需要构造一个描述集群所有节点的参数,这个参数可以以命令行参数的方式传给 etcd 程序,也可以以环境变量的方式。
推荐使用环境变量的方式,在/etc/etcd/etcd.conf加入如下环境变量:
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.8.31:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.8.31:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://192.168.8.31:2380,etcd2=http://192.168.8.32:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.8.31:2379"
禁用防火墙
systemctl disable firewalld
启动etcd1节点
systemctl start etcd.service
同理在etcd2和etcd3上按上述配置环境变量即可
修改对应的ip地址为etcd2和etcd3所在机器的IP
禁用防火墙
systemctl disable firewalld
启动etcd2节点
systemctl start etcd.service
然后在任意一台机器上写入一个key
比如在etcd1上输入
etcdctl set a test
然后在node2上输入
etcdctl get a
检查集群状态
etcdctl member list
显示test则表示集群创建成功了。
注:修改etcd.conf文件之后要先删除/var/lib/etcd目录下保存的数据,再重新启用服务,不然失败
cd /var/lib/etcd && rm -rf *
java的pom.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>etcd</artifactId><version>1.0-SNAPSHOT</version> <dependencies><dependency><groupId>io.etcd</groupId><artifactId>jetcd-core</artifactId><version>0.3.0</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>RELEASE</version><scope>test</scope></dependency></dependencies></project>
import io.etcd.jetcd.ByteSequence;
import io.etcd.jetcd.Client;
import io.etcd.jetcd.KV;
import io.etcd.jetcd.kv.GetResponse;
import io.etcd.jetcd.kv.PutResponse;
import org.junit.jupiter.api.*;import java.nio.charset.StandardCharsets;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;import static org.junit.jupiter.api.Assertions.assertNotNull;//这个注解配合函数的Order注解,决定测试用例函数的执行顺序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class EtcdTest {private static Client etcdClient;@BeforeAllstatic void init(){etcdClient = Client.builder()//这里的etcd服务列表可以写多个,用逗号分隔.endpoints("http://192.168.8.31:2379,http://192.168.8.32:2379".split(",")).build();}@Test@Order(1)@DisplayName("etcd写配置操作")void putKV() throws ExecutionException, InterruptedException {KV kv = etcdClient.getKVClient();ByteSequence key = ByteSequence.from("key-str", StandardCharsets.UTF_8);ByteSequence value = ByteSequence.from("value-str", StandardCharsets.UTF_8);//put key-value配置信息CompletableFuture<PutResponse> putRsp = kv.put(key,value);assertNotNull(putRsp.get().getHeader());}@Test@Order(2)@DisplayName("etcd读配置操作")void getKV() throws ExecutionException, InterruptedException {KV kv = etcdClient.getKVClient();ByteSequence key = ByteSequence.from("key-str", StandardCharsets.UTF_8);//通过key获取值CompletableFuture<GetResponse> getRsp = kv.get(key);String getBackValue = getRsp.get().getKvs().get(0).getValue().toString(StandardCharsets.UTF_8);System.out.println("从etcd通过key获取value值为:" + getBackValue);}@Test@Order(3)@DisplayName("删除配置操作")void deleteKV() {KV kv = etcdClient.getKVClient();ByteSequence key = ByteSequence.from("key-str", StandardCharsets.UTF_8);//通过key删除数据kv.delete(key);}
}
1. 备份
etc备份在一台机器上执行即可
ETCDCTL_API=3 etcdctl snapshot save /data/etcd-`date +%Y%m%d`.db
2. 恢复
在所有机器上停止etcd
systemctl stop etcd
备份旧目录
mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak
拷贝备份文件到其他机器,执行恢复 操作
在etcd1执行
ETCDCTL_API=3 etcdctl snapshot restore /data/etcd-20221209.db --name etcd1 --initial-cluster "etcd1=http://192.168.8.31:2380,etcd2=http://192.168.8.32:2380" --initial-cluster-token etcd-cluster --initial-advertise-peer-urls http://192.168.8.31:2380 --data-dir=/var/lib/etcd/default.etcd
etcd2执行
ETCDCTL_API=3 etcdctl snapshot restore /data/etcd-20221209.db --name etcd2 --initial-cluster "etcd1=http://192.168.8.31:2380,etcd2=http://192.168.8.32:2380" --initial-cluster-token etcd-cluster --initial-advertise-peer-urls http://192.168.8.32:2380 --data-dir=/var/lib/etcd/default.etcd
如果还有其他机器要修改对应的name和ip地址,集群地址。
在每台机器启动etcd
chown -R etcd.etcd /var/lib/etcd/default.etcd
systemctl start etcd