一.方案选型

ETCD官网提供了一种实时镜像同步数据的工具mirror-maker,如果出现主机房服务挂掉可以通过切换域名的形式切换到灾备机房,这个过程数据是可以保持一致的。

注意:make-mirror 的使用需要依赖于API版本3, 使用API2的无法通过该工具做数据同步。

1.1 原理图

1.2 命令行语法

ETCDCTL_API=3 etcdctl make-mirror [options] <destination> [flags]

其中[options]主要是配置源集群和目的集群证书信息,以及源集群的客户端地址等。``是目的集群的客户端地址。该命令是单向的,目的集群的变化不会影响源集群。

二.部署实现

这里需要部署好两套etcd集群,这里采用TLS证书对通信进行加密,并开启即与CA根证书签名签名的双向认证。

2.1 部署etcd集群

这里由于设备限制,我们采用单节点部署etcd集群。

2.1.1 安装操作系统及相关配置

这里我们安装centos7.6的操作系统,并进行相关配置

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
setenforce 0
# 配置selinux的配置文件
[root@k8s001 ansible]# cat /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
# 配置无秘钥访问
ssh-keygen
ssh-copy-id root@192.168.1.1

2.2.2 安装etcd二进制文件和证书生成工具

这里我们安装etcd 3.3.10版本和cfssl 1.2.0版本,下载完毕后将二进制文件复制到/usr/bin目录下,并给与755权限。

cp etcd etcdctl cfssl cfssljson /usr/bin
chmod -R 755 /usr/bin/{etcd,etcdctl,cfssl,cfssljson}

2.2.3 创建CA证书和私钥

  • 创建CA证书存放目录
mkdir -p /etc/kubernetes/ssl
  • 创建CA配置文件
[root@k8s001 ~]# mkdir /etc/cert
[root@k8s001 ~]# cat /etc/cert/ca-config.json
{
"signing": {
"default": {
"expiry": "438000h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "438000h"
}
}
}
}
  • 创建CA签名请求文件
[root@k8s001 templates]# cat /etc/cert/ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "HangZhou",
"L": "XS",
"O": "k8s",
"OU": "System"
}
],
"ca": {
"expiry": "876000h"
}
}
  • 生成CA证书和私钥
[root@k8s001 ~]#cd /etc/cert
[root@k8s001 cert]#/usr/bin/cfssl gencert -initca ca-csr.json | /usr/bin/cfssljson -bare ca
# 这里会生成ca.pem和ca-key.pem文件
  • 复制CA证书和私钥到/etc/kubernetes/ssl目录
[root@k8s001 cert]# cp ca.pem ca-key.pem /etc/kubernetes/ssl/

2.2.4 创建etcd证书和私钥

  • 创建etcd证书私钥存放目录和etcd数据存放目录
[root@k8s001 ~]# mkdir -p /etc/etcd/ssl
[root@k8s001 ~]# mkdir -p /var/lib/etcd
  • 创建etcd证书请求文件
[root@k8s001 ~]# cd /etc/cert
[root@k8s001 cert]# cat etcd-csr.json
{
"CN": "etcd",
"hosts": [
# 这里记录etcd集群左右主机的IP
"192.168.1.1",
"127.0.0.1"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "HangZhou",
"L": "XS",
"O": "k8s",
"OU": "System"
}
]
}
  • 生成etcd证书和私钥
[root@k8s001 cert]# /usr/bin/cfssl gencert  -ca=/etc/kubernetes/ssl/ca.pem -ca-key=/etc/kubernetes/ssl/ca-key.pem -config=/etc/cert/ca-config.json -profile=kubernetes etcd-csr.json |/usr/bin/cfssljson -bare etcd
# 这里会生成etcd.pem和etcd-key.pem
  • 复制etcd证书和私钥到etcd证书目录
[root@k8s001 cert]# cp etcd.pem etcd-key.pem /etc/etcd/ssl/

2.2.5 创建etcd的unit文件

[root@k8s001 tasks]# cat /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos [Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
ExecStart=/usr/bin/etcd \
--name=k8s001.wf \
--cert-file=/etc/etcd/ssl/etcd.pem \
--key-file=/etc/etcd/ssl/etcd-key.pem \
--peer-cert-file=/etc/etcd/ssl/etcd.pem \
--peer-key-file=/etc/etcd/ssl/etcd-key.pem \
--trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
--peer-client-cert-auth=true \
--client-cert-auth=true \
--initial-advertise-peer-urls=https://192.168.1.1:2380 \
--listen-peer-urls=https://192.168.1.1:2380 \
--listen-client-urls=https://192.168.1.1:2379,http://127.0.0.1:2379 \
--advertise-client-urls=https://192.168.1.1:2379 \
--initial-cluster-token=etcd-cluster-0 \
--initial-cluster=k8s001.wf=https://192.168.1.1:2380 \
--initial-cluster-state=new \
--data-dir=/var/lib/etcd
Restart=always
RestartSec=5
LimitNOFILE=65536 [Install]
WantedBy=multi-user.target
  • 开机启动etcd
[root@k8s001 ~]#systemctl enable etcd
  • 启动etcd
[root@k8s001 ~]#systemctl daemon-reload && systemctl restart etcd

2.2 参考2.1部署好另外一套etcd集群

这里部署好两套etcd集群分别为192.168.1.1,192.168.1.2

  • 分别在这两套集群创建对应的证书存放目录
[root@k8s001 ~]# mkdir -p /etc/kubernetes/etcd
[root@k8s002 ~]# mkdir -p /etc/kubernetes/etcd
  • 复制集群的CA证书和etcd证书私钥到对方集群的/etc/kubernetes/etcd目录下
[root@k8s001 ~]# scp -p /etc/kubernetes/ssl/ca.pem /etc/etcd/ssl/{etcd.pem,etcd-key.pem} root@192.168.1.2:/etc/kubernetes/etcd
[root@k8s002 ~]# scp -p /etc/kubernetes/ssl/ca.pem /etc/etcd/ssl/{etcd.pem,etcd-key.pem} root@192.168.1.1:/etc/kubernetes/etcd

三.测试验证

这里我们选择192.168.1.1集群作为主集群,向集群写入数据:

[root@k8s001 ~]#ETCDCTL_API=3 etcdctl put 1 2 --endpoints=https://192.168.1.1:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem
# 查看数据是否写入成功
[root@k8s001 ~]#etcdctl get 1 --endpoints=https://192.168.1.1:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem
1
2
  • 执行make-mirror同步数据
[root@k8s001 ~]#ETCDCTL_API=3 etcdctl make-mirror --no-dest-prefix=true https://192.168.1.2:2379 --endpoints=https://192.168.1.1:2
379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --dest-cacert=/etc/kubernetes/backup/ca.pem --dest-cert=/etc/kubernetes/backup/etcd.pem --dest-key=/etc/kubernetes/backup/etcd-key.pem
  • 查看备集群数据是否同步成功
#可以看出etcd主集群数据已经同步到备集群中
[root@k8s002 ~]# ETCDCTL_API=3 etcdctl get 1 --endpoints=https://192.168.1.2:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem
1
2

说明:etcdctl make-mirror 代码里面数据同步打印的周期是30s一次。主集群挂掉后,可以通过切换域名的形式到备集群中,主集群恢复后,可以执行make-mirror从备集群向主集群同步数据。保证两个集群的数据一致。

说明:etcdctl make-mirror 代码里面数据同步打印的周期是30s一次。主集群挂掉后,可以通过切换域名的形式到备集群中,主集群恢复后,可以执行make-mirror从备集群向主集群同步数据。保证两个集群的数据一致。

Etcd异地容灾方案的更多相关文章

  1. [Hbase]Hbase容灾方案

    介绍两种HBase的数据备份或者容灾方案:Snapshot,Replication: 一.Snapshot 开启快照功能,在hbase-site.xml文件中添加如下配置项: <property ...

  2. 双机热备(准)-->RAC(夭折)-->DG(异地容灾)

    以下有的地方为oracle专业术语,非懂勿喷.前段时间某项目负责人告知,他们应用需要一套oracle数据库环境运行模式为双机热备.简单了解下对于现在已经非常成熟的RAC再合适不过了.详细问了问当前服务 ...

  3. Always on (HA 负载均衡 异地容灾 一体化 )

    Sqlserver 2012 开始,以往困扰我们的三个棘手问题:可扩展性.数据保护.异地容灾可以统一通过alwayson 来实现.2014  支持secondary 节点更是达到8个.在硬件调配方面比 ...

  4. hbase数据备份或者容灾方案

    HBase的数据备份或者容灾方案有这几种:Distcp,CopyTable,Export/Import,Snapshot,Replication,以下分别介绍(以下描述的内容均是基于0.94.20版本 ...

  5. Hbase数据备份&&容灾方案

    Hbase数据备份&&容灾方案 标签(空格分隔): Hbase 一.Distcp 在使用distcp命令copy hdfs文件的方式实现备份时,需要禁用备份表确保copy时该表没有数据 ...

  6. 利用HDFS实现ElasticSearch7.2容灾方案

    利用HDFS实现ElasticSearch7.2容灾方案 目录 利用HDFS实现ElasticSearch7.2容灾方案 前言 快照版本兼容 备份集群 HDFS文件系统 软件下载 JDK环境 配置系统 ...

  7. mysql 架构 ~异地容灾

    一 简介 我们来探讨下多机房下的mysql架构二 目的:    首先要清楚你的目的     1 实现异地机房的容灾备份      2 实现异地机房的双活 三 叙说     1 实现异地机房的容灾备份  ...

  8. MongDB集群容灾方案步骤

    MongoDB复制集优/特点支持大数据量.高扩展性.高性能.灵活数据模型.高可用性.同步机制数据复制的目的是使数据得到最大的可用性,避免单点故障引起的整站不能访问的情况的发生,Mongodb的副本集在 ...

  9. 【亲述】Uber容错设计与多机房容灾方案 - 高可用架构系列

    此文是根据赵磊在[QCON高可用架构群]中的分享内容整理而成.转载请事先联系赵磊及相关编辑. 赵磊,Uber高级工程师,08年上海交通大学毕业,曾就职于微软,后加入Facebook主要负责Messen ...

  10. keepalived容灾方案,实现nginx负载均衡主从架构(1)

    一:环境准备:4台nginx服务器,两台用yum安装,两台使用源码安装 第一步:使用yum安装nginx服务器,在浏览器输入ip,可以显示以下内容,这步比较简单,安装好修改/usr/share/ngi ...

随机推荐

  1. mac更新本地时间

    前言 选取苹果菜单 >"系统偏好设置",然后点按"日期与时间". 点按窗口角落处的锁形图标 ,然后输入您的管理员密码以解锁设置. 在"日期与时 ...

  2. linux的zip命令详解 | Linux文件打包成Zip的命令和方法

    zip 命令用来压缩文件 参数: -A:调整可执行的自动解压缩文件: -b<工作目录>:指定暂时存放文件的目录: -c:替每个被压缩的文件加上注释: -d:从压缩文件内删除指定的文件: - ...

  3. MFC非模态对话框的关闭

    如果要在点击按钮的情况下,销毁非模态对话框,只需要把按钮的事件映射到OnCancel函数, 里面调用DestroyWindow(), 然后重写PostNCDestroy(), delete 指针. 另 ...

  4. JAVA调用Python脚本执行

    SpringBoot-web环境 <dependency> <groupId>org.springframework.boot</groupId> <arti ...

  5. 几款ZooKeeper可视化工具,最后一个美炸了~

    首发于公众号:BiggerBoy 欢迎关注,查看更多技术文章 ZooKeeper是我们工作中常用一个开源的分布式协调服务,提供分布式数据一致性解决方案,分布式应用程序可以实现数据发布订阅.负载均衡.命 ...

  6. Python进阶知识:多进程/多线程/装饰器

    本文写作于2025.3.20,恰好作者正好在外面实习,于此同时在实际工作中遇到这些知识点,因此就进行一个简短汇总方便后续回顾,内容同步更新(显示问题可以直接看):https://www.big-yel ...

  7. 【长知识】BIOS

    设置最新UEFI BIOS 本章导读 BIOS是电脑启动和操作的基础,若电脑系统中没有BIOS,则所有硬件设备都不能正常使用.UEFI是目前最新的BIOS类型,以后会逐渐取代传统的BIOS.本章将认识 ...

  8. 【Maven】在 Eclipse 中使用 Maven

    在 Eclipse 中使用 Maven 1 安装 Maven 核心程序 下载地址:http://maven.apache.org/ 检查 JAVA_HOME 环境变量.Maven 是使用 Java 开 ...

  9. 如何使用 OpenAI Agents SDK 构建 MCP

    1.概述 OpenAI Agents SDK 现已支持 MCP(模型上下文协议),这是 AI 互操作性的重大变革.这使开发人员能够高效地将 AI 模型连接到外部工具和数据源.本篇博客,笔者将指导使用 ...

  10. 线性判别分析(LDA):降维与分类的完美结合

    在机器学习领域,线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的算法,它在降维和分类任务中都表现出色. LDA通过寻找特征空间中能够最大化类间方差和最小 ...