etcd集群搭建使用

简介

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

猜你喜欢

转载自blog.csdn.net/robinhunan/article/details/128071243