1、背景說明
在項目上,有個環境,更改了etcd所在主機的IP地址,也就需要使用新的IP,作爲etcd對外提供服務和內部通信的IP地址。
這個時候,發現在etcd中存儲的信息中,有節點成員的IP地址的信息。
那在這種的情況,如何把原來那套etcd裏面的數據,遷移過來?
同時,在etcd使用新的IP地址之後,數據裏面存儲的是新節點的IP地址信息
2、數據備份
爲了達到數據遷移的目的,在遷移之前,對原來的etcd數據進行備份。
使用snapshot save命令
ETCDCTL_API=3 etcdctl \ --endpoints "https://10.91.253.127:2379,https://10.91.253.128:2379,https://10.91.253.129:2379" \ --cert /etc/etcd/ssl/etcd.pem \ --key /etc/etcd/ssl/etcd-key.pem \ --cacert /etc/etcd/ssl/ca.crt \ snapshot save 127data.backup
參數說明:
--endpoints:是etcd節點的客戶端訪問地址,對於3個節點的集羣,連接任何的一個節點都可以,也可以同時指定3個節點的地址
--cert:客戶端證書
--key:客戶端的私鑰
--cacert:ca的證書。
127data.backup : 是快照的名字,可以執行的指定。
這裏面訪問etcd的證書,只要是經過ca證書籤名、認證的就可以。
執行備份之後,出現“Snapshot saved at...”
生成了這個備份文件
OK,這個就進行了數據的備份。
3、數據恢復
3.1、傳送備份文件
將上面備份的數據,傳送到新的etcd集羣裏。
注意:要分別傳送到每個節點上。
3.2、關閉新的集羣
在每個節點執行下面的動作,關閉新的集羣(如果集羣已經安裝好,並且已經正常運行了)
systemctl stop etcd
3.3、刪除現有數據
如果集羣已經運行了。
那麼,在數據目錄裏面,就會存有集羣節點的信息和初始化的數據,導入就會有問題。
所以,先刪除數據目錄。
數據目錄,通過service文件可看到
每個節點都要執行
rm -rf /var/lib/etcd
如果集羣是沒有啓動過,數據目錄還沒有生成,不需要執行這個命令。
3.4、恢復數據
使用snapshot restore命令,進行數據的恢復
在第一個節點執行(在備份文件所在的目錄)
ETCDCTL_API=3 etcdctl --data-dir="/var/lib/etcd" \ --endpoints "https://10.192.121.202:2379,https://10.192.121.203:2379,https://10.192.121.209:2379" \ --cert /etc/etcd/ssl/etcd.pem \ --key /etc/etcd/ssl/etcd-key.pem \ --cacert /etc/etcd/ssl/ca.crt \ snapshot restore 127data.backup \ --name=etcd1 \ --initial-cluster-token=etcd-cluster-0 \ --initial-cluster=etcd1=https://10.192.121.202:2380,etcd2=https://10.192.121.203:2380,etcd3=https://10.192.121.209:2380 \ --initial-advertise-peer-urls=https://10.192.121.202:2380
參數說明:
--data-dir:數據目錄,也就是service中的數據目錄
--name: 當前節點的名字
--initial-cluster-token:集羣的名字
--initial-cluster:集羣節點的信息,列出所有的節點
--initial-advertise-peer-urls:當前節點的集羣的通信地址
其實,從這個命令可看出來,這個就是節點的初始化的過程,恢復的過程,用這個命令,就會把節點和集羣的信息,寫入到本地的數據中。
這些信息,都可以通過service文件中獲得
第二個節點執行
ETCDCTL_API=3 etcdctl --data-dir="/var/lib/etcd" \ --endpoints "https://10.192.121.202:2379,https://10.192.121.203:2379,https://10.192.121.209:2379" \ --cert /etc/etcd/ssl/etcd.pem \ --key /etc/etcd/ssl/etcd-key.pem \ --cacert /etc/etcd/ssl/ca.crt \ snapshot restore 127data.backup \ --name=etcd2 \ --initial-cluster-token=etcd-cluster-0 \ --initial-cluster=etcd1=https://10.192.121.202:2380,etcd2=https://10.192.121.203:2380,etcd3=https://10.192.121.209:2380 \ --initial-advertise-peer-urls=https://10.192.121.203:2380
第三個節點執行
ETCDCTL_API=3 etcdctl --data-dir="/var/lib/etcd" \ --endpoints "https://10.192.121.202:2379,https://10.192.121.203:2379,https://10.192.121.209:2379" \ --cert /etc/etcd/ssl/etcd.pem \ --key /etc/etcd/ssl/etcd-key.pem \ --cacert /etc/etcd/ssl/ca.crt \ snapshot restore 127data.backup \ --name=etcd3 \ --initial-cluster-token=etcd-cluster-0 \ --initial-cluster=etcd1=https://10.192.121.202:2380,etcd2=https://10.192.121.203:2380,etcd3=https://10.192.121.209:2380 \ --initial-advertise-peer-urls=https://10.192.121.209:2380
當在3個節點,都執行數據恢復。
3.5、啓動集羣
在每個節點,都執行下面的命令,啓動etcd實例
systemctl start etcd
啓動之後,查看集羣成員的信息
ETCDCTL_API=3 etcdctl \ --endpoints "https://172.20.59.57:2379,https://172.20.59.238:2379,https://172.20.59.153:2379" \ --cert /etc/ssl/etcd/ssl/member-nccztsjb-node-08.pem \ --key /etc/ssl/etcd/ssl/member-nccztsjb-node-08-key.pem \ --cacert /etc/ssl/etcd/ssl/ca.pem \ member list
查看集羣節點的健康情況
ETCDCTL_API=3 etcdctl \ --endpoints "https://172.20.59.57:2379,https://172.20.59.238:2379,https://172.20.59.153:2379" \ --cert /etc/ssl/etcd/ssl/member-nccztsjb-node-08.pem \ --key /etc/ssl/etcd/ssl/member-nccztsjb-node-08-key.pem \ --cacert /etc/ssl/etcd/ssl/ca.pem \ endpoint health
如果能夠正確的查詢,說明集羣是正常的。
查看節點的數據(查看所有的數據)
ETCDCTL_API=3 etcdctl \ --endpoints "https://172.20.59.57:2379,https://172.20.59.238:2379,https://172.20.59.153:2379" \ --cert /etc/ssl/etcd/ssl/member-nccztsjb-node-08.pem \ --key /etc/ssl/etcd/ssl/member-nccztsjb-node-08-key.pem \ --cacert /etc/ssl/etcd/ssl/ca.pem \ get --prefix ""
可以看到數據,證明數據恢復OK。