Etcd分布式键值存储实战指南

Etcd的介绍与安装

Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统,用于配置共享和服务发现等。它使用 Raft 一致性算法来保持集群数据的一致性,且客户端通过长连接watch 功能,能够及时收到数据变化通知,相较于 Zookeeper 框架更加轻量化。以下是关于 etcd 的安装与使用方法的详细介绍。

安装 Etcd

首先,需要在你的系统中安装 Etcd。Etcd 是一个分布式键值存储,通常用于服务发现和配置管理。以下是在 Linux 系统上安装 Etcd 的基本步骤:

ubuntu

sudo apt-get install etcd

启动 Etcd 服务

sudo systemctl start etcd

设置 Etcd 开机自启

sudo systemctl enable etcd

[hdp@VM-12-6-centos ~]$ sudo systemctl start etcd
[hdp@VM-12-6-centos ~]$ sudo systemctl enable etcd
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.

节点配置

如果是单节点集群其实就可以不用进行配置,默认 etcd 的集群节点通信端口为 2380,客户端访问端口为 2379.

若需要修改,则可以配置:/etc/default/etcd

#节点名称,默认为 "default"
ETCD_NAME="etcd1"
#数据目录,默认为 "${name}.etcd"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#用于客户端连接的 URL。
ETCD_LISTEN_CLIENT_URLS="http://192.168.65.132:2379,http://127.0.0
.1:2379"
#用于客户端访问的公开,也就是提供服务的 URL
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.65.132:2379,http://127.
0.0.1:2379"
#用于集群节点间通信的 URL。
ETCD_LISTEN_PEER_URLS="http://192.168.65.132:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.65.132:2380"
#心跳间隔时间-毫秒
ETCD_HEARTBEAT_INTERVAL=100
#选举超时时间-毫秒
ETCD_ELECTION_TIMEOUT=1000

#以下为集群配置,若无集群则需要注销
#初始集群状态和配置--集群中所有节点
#ETCD_INITIAL_CLUSTER="etcd1=http://192.168.65.132:2380,etcd2=http
://192.168.65.132:2381,etcd3=http://192.168.65.132:2382"
#初始集群令牌-集群的 ID
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"


#以下为安全配置,如果要求 SSL 连接 etcd 的话,把下面的配置启用,并修改文件
路径
#ETCD_CERT_FILE="/etc/ssl/client.pem"
#ETCD_KEY_FILE="/etc/ssl/client-key.pem"
#ETCD_CLIENT_CERT_AUTH="true"
#ETCD_TRUSTED_CA_FILE="/etc/ssl/ca.pem"
#ETCD_AUTO_TLS="true"
#ETCD_PEER_CERT_FILE="/etc/ssl/member.pem"
#ETCD_PEER_KEY_FILE="/etc/ssl/member-key.pem"
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE="/etc/ssl/ca.pem"
#ETCD_PEER_AUTO_TLS="true"

单节点运行示例

etcd --name etcd1 --initial-advertise-peer-urls 
http://192.168.65.132:2380 \ 
 --listen-peer-urls http://192.168.65.132:2380 \ 
 --listen-client-urls http://192.168.65.132:2379 \
 --advertise-client-urls http://192.168.65.132:2379 \
 --initial-cluster-token etcd-cluster \ 
 --initial-cluster 
etcd1=http://192.168.65.132:2380,etcd2=http://192.168.65.132:2381,
etcd3=http://192.168.65.132:2382 \ 
 --initial-cluster-state new &> nohup1.out &

运行验证

etcdctl put key "value"

如果出现报错:

[hdp@VM-12-6-centos ~]$ etcdctl put key "value"
No help topic for 'put'

则 sudo vi /etc/profile 在末尾声明环境变量 ETCDCTL_API=3 以确定 etcd 版本。

export ETCDCTL_API=3

完毕后,加载配置文件,并重新执行测试指令

[hdp@VM-12-6-centos ~]$ etcdctl put key "value"
OK
[hdp@VM-12-6-centos ~]$ etcdctl get key
key
value
[hdp@VM-12-6-centos ~]$ etcdctl del key
1

搭建服务注册发现中心

使用 Etcd 作为服务注册发现中心,你需要定义服务的注册和发现逻辑。这通常涉及到以下几个操作:

1.服务注册:服务启动时,向 Etcd 注册自己的地址和端口。

2.服务发现:客户端通过 Etcd 获取服务的地址和端口,用于远程调用。

3.健康检查:服务定期向 Etcd 发送心跳,以维持其注册信息的有效性。

etcd 采用 golang 编写,v3 版本通信采用 grpc API,即(HTTP2+protobuf),官方只维护了 go 语言版本的 client 库, 因此需要找到 C/C++ 非官方的 client 开发库:

etcd-cpp-apiv3

etcd-cpp-apiv3 是一个 etcd 的 C++版本客户端 API。它依赖于 mipsasm, boost, protobuf, gRPC, cpprestsdk 等库。

etcd-cpp-apiv3 的 GitHub 地址是:etcd-cpp-apiv3/etcd-cpp-apiv3: The etcd-cpp-apiv3 is a C++ library for etcd’s v3 client APIs, i.e., ETCDCTL_API=3.

依赖安装:

ubuntu

sudo apt-get install libboost-all-dev libssl-dev
sudo apt-get install libprotobuf-dev protobuf-compiler-grpc
sudo apt-get install libgrpc-dev libgrpc++-dev 
sudo apt-get install libcpprest-dev

api 框架安装

git clone https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3.git
cd etcd-cpp-apiv3
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
make -j$(nproc) && sudo make install

客户端类与接口介绍

//pplx::task 并行库异步结果对象
//阻塞方式 get(): 阻塞直到任务执行完成,并获取任务结果
//非阻塞方式 wait(): 等待任务到达终止状态,然后返回任务状态
#include <string>
#include <vector>
#include <functional

namespace etcd
{
   
   
    class Value
    {
   
   
        bool is_dir();                  // 判断是否是一个目录
        std::string const &key();       // 键值对的 key 值
        std::string const &as_string(); // 键值对的 val 值

        int64_t lease(); // 用于创建租约的响应中,返回租约 ID
    };
    // etcd 会监控所管理的数据的变化,一旦数据产生变化会通知客户端
    // 在通知客户端的时候,会返回改变前的数据和改变后的数据
    class Event
    {
   
   
        enum class EventType
        {
   
   
            PUT,     // 键值对新增或数据发生改变
            DELETE_, // 键值对被删除
            INVALID,
        };
        enum EventType event_type();
        const Value &kv();
        const Value &prev_kv();
    };
    class Response
    {
   
   
        bool is_ok();
        std::string const &error_message();
        Value const &value();               // 当前的数值 或者 一个请求的处理结果
        Value const &prev_value();          // 之前的数值
        Value const &value(int index);      //
        std::vector<Event> const &events(); // 触发的事件
    };
    class KeepAlive
    {
   
   
        KeepAlive(Client const &client, int ttl, int64_t lease_id = 0);
        // 返回租约 ID
        int64_t Lease();
        // 停止保活动作
        void Cancel();
    };
    class Client
    {
   
   
        // etcd_url: "http://127.0.0.1:2379"
        Client(std::string const &etcd_url,
               std::string const &load_balancer = "round_robin");
        // Put a new key-value pair 新增一个键值对
        pplx::task<Response> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椿融雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值