简介
ETCD
是用于共享配置和服务发现的分布式,一致性的KV存储系统。ETCD是CoreOS公司发起的一个开源项目,授权协议为Apache。
ETCD 使用场景
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; @BeforeAll static 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