開發(fā)網(wǎng)站賺錢今日關(guān)鍵詞
前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。
簡介
在許多情況下,您可能需要將數(shù)據(jù)和操作需求從一個(gè)服務(wù)器遷移到另一個(gè)服務(wù)器。您可能需要在新的數(shù)據(jù)中心實(shí)施解決方案,升級(jí)到更大的機(jī)器,或者過渡到新的硬件或新的 VPS 提供商。
無論您的原因是什么,在從一個(gè)系統(tǒng)遷移到另一個(gè)系統(tǒng)時(shí),您應(yīng)該考慮許多不同的因素。如果您沒有使用 Chef、Puppet 或 Ansible 等配置管理解決方案,要獲得功能上等效的配置可能會(huì)很困難。您不僅需要傳輸數(shù)據(jù),還需要配置您的服務(wù)在新機(jī)器上以相同的方式運(yùn)行。
在本指南中,您將了解如何準(zhǔn)備源系統(tǒng)和目標(biāo)系統(tǒng)進(jìn)行遷移。這將包括讓您的兩臺(tái)機(jī)器使用 SSH 密鑰進(jìn)行通信,并調(diào)查需要轉(zhuǎn)移的組件。您將在本系列的下一篇文章中開始實(shí)際遷移。
步驟 1 – 創(chuàng)建備份
執(zhí)行任何可能具有破壞性的操作時(shí),首先要采取的步驟是創(chuàng)建全新的備份。您不希望在替換正在運(yùn)行的生產(chǎn)機(jī)器之前,某個(gè)命令在當(dāng)前生產(chǎn)機(jī)器上出現(xiàn)故障。
有許多不同的方法可以備份服務(wù)器。您的選擇將取決于對(duì)您的情況有意義的選項(xiàng)以及您最熟悉的選項(xiàng)。
如果您可以訪問物理硬件并有備份空間(磁盤驅(qū)動(dòng)器、USB 等),您可以使用許多可用的鏡像備份解決方案之一來克隆磁盤。在處理云服務(wù)器時(shí),功能上等效的方法是在控制面板界面內(nèi)拍攝快照或鏡像。
完成備份后,您就可以繼續(xù)進(jìn)行下一步了。在本指南的其余部分,您將需要以 root 用戶身份運(yùn)行許多命令,或者使用 sudo
。
步驟 2 – 收集有關(guān)源系統(tǒng)的信息
在開始遷移之前,您應(yīng)該配置目標(biāo)系統(tǒng)以匹配源系統(tǒng)。
您將希望在當(dāng)前服務(wù)器和計(jì)劃遷移到的服務(wù)器之間盡可能匹配。您可能希望在遷移到較新的目標(biāo)系統(tǒng)之前升級(jí)當(dāng)前服務(wù)器,并在此之后再次進(jìn)行備份。重要的是,當(dāng)開始實(shí)際遷移時(shí),它們盡可能匹配。
大部分可以幫助您決定為新機(jī)器創(chuàng)建哪種服務(wù)器系統(tǒng)的信息可以使用 uname
命令檢索:
uname -r
5.4.0-26-generic
這是您當(dāng)前系統(tǒng)正在運(yùn)行的內(nèi)核版本。為了使事情順利進(jìn)行,最好嘗試在目標(biāo)系統(tǒng)上匹配它。
您還應(yīng)該嘗試匹配源服務(wù)器的發(fā)行版和版本。如果您不知道在源機(jī)器上安裝的發(fā)行版版本,可以通過輸入以下命令來查找:
cat /etc/issue
Ubuntu 20.04.3 LTS \n \l
如果可能的話,您應(yīng)該使用相同的參數(shù)創(chuàng)建新服務(wù)器。在這種情況下,您將創(chuàng)建一個(gè) Ubuntu 20.04 系統(tǒng)。您還應(yīng)盡量匹配內(nèi)核版本。通常情況下,這應(yīng)該是來自您的 Linux 發(fā)行版存儲(chǔ)庫的最新內(nèi)核。
步驟 3 – 在源和目標(biāo)服務(wù)器之間設(shè)置 SSH 密鑰訪問
您需要讓您的服務(wù)器能夠通信以便傳輸文件。為了做到這一點(diǎn),您應(yīng)該在它們之間交換 SSH 密鑰。您可以學(xué)習(xí)如何在 Linux 服務(wù)器上配置 SSH 密鑰。
您需要在目標(biāo)服務(wù)器上創(chuàng)建一個(gè)新密鑰,以便將其添加到現(xiàn)有服務(wù)器的 authorized_keys
文件中。這比另一種方式更清晰,因?yàn)檫@樣,當(dāng)遷移完成時(shí),新服務(wù)器的 authorized_keys
文件中就不會(huì)有多余的密鑰。
首先,在目標(biāo)機(jī)器上,通過輸入以下命令檢查您的 root 用戶是否已經(jīng)擁有 SSH 密鑰:
ls ~/.ssh
authorized_keys
如果您看到名為 id_rsa.pub
和 id_rsa
的文件,則表示您已經(jīng)擁有密鑰,您只需要將它們傳輸過去。
如果您沒有看到這些文件,可以使用 ssh-keygen
創(chuàng)建新的密鑰對(duì):
ssh-keygen -t rsa
按照提示按下 “Enter” 鍵以接受默認(rèn)值。
現(xiàn)在,您可以通過 ssh
將密鑰傳輸?shù)皆捶?wù)器:
cat ~/.ssh/id_rsa.pub | ssh other_server_ip "cat >> ~/.ssh/authorized_keys"
現(xiàn)在,您應(yīng)該能夠在目標(biāo)系統(tǒng)上自由地通過 SSH 連接到源服務(wù)器,而無需提供密碼:
ssh other_server_ip
這將使任何進(jìn)一步的遷移步驟更加順利。
步驟 4 – 創(chuàng)建需求清單
現(xiàn)在你將進(jìn)行系統(tǒng)的深入分析。
在運(yùn)營過程中,你的軟件需求可能會(huì)發(fā)生變化。有時(shí)舊服務(wù)器上可能存在一些曾經(jīng)需要的服務(wù)和軟件,但已經(jīng)被替換。
一般來說,不需要的服務(wù)可以被禁用,如果完全不需要,也可以被卸載,但是清點(diǎn)它們可能會(huì)耗費(fèi)時(shí)間。你需要發(fā)現(xiàn)在源服務(wù)器上正在使用的服務(wù),然后決定這些服務(wù)是否應(yīng)該存在于新服務(wù)器上。
你發(fā)現(xiàn)服務(wù)和運(yùn)行級(jí)別的方式取決于服務(wù)器所采用的“init”系統(tǒng)的類型。init 系統(tǒng)負(fù)責(zé)在用戶命令或自動(dòng)啟動(dòng)和停止服務(wù)。從 2014 年開始,幾乎所有主要的 Linux 發(fā)行版都采用了一個(gè)名為 Systemd 的 init 系統(tǒng),本指南將反映 Systemd。
為了列出已注冊(cè)到 Systemd 的服務(wù),你可以使用 systemctl
命令:
systemctl list-units -t service
UNIT LOAD ACTIVE SUB DESCRIPTION >accounts-daemon.service loaded active running Accounts Service >apparmor.service loaded active exited Load AppArmor profiles >apport.service loaded active exited LSB: automatic crash repor>atd.service loaded active running Deferred execution schedul>blk-availability.service loaded active exited Availability of block devi>cloud-config.service loaded active exited Apply the settings specifi>cloud-final.service loaded active exited Execute cloud user/final s>cloud-init-local.service loaded active exited Initial cloud-init job (pr>cloud-init.service loaded active exited Initial cloud-init job (me>console-setup.service loaded active exited Set console font and keyma>containerd.service loaded active running containerd container runti>
…
Systemd 通過“targets”實(shí)現(xiàn)服務(wù)管理。傳統(tǒng) init 系統(tǒng)的系統(tǒng)一次只能處于一個(gè)“運(yùn)行級(jí)別”,而使用 Systemd 的服務(wù)器可以同時(shí)達(dá)到多個(gè) targets。這在實(shí)踐中更加靈活,但確定哪些服務(wù)是活動(dòng)的可能更加困難。
你可以通過輸入以下命令來查看當(dāng)前活動(dòng)的 targets:
systemctl list-units -t target
UNIT LOAD ACTIVE SUB DESCRIPTIONbasic.target loaded active active Basic Systemcloud-config.target loaded active active Cloud-config availabilitycloud-init.target loaded active active Cloud-init targetcryptsetup.target loaded active active Local Encrypted Volumesgetty.target loaded active active Login Promptsgraphical.target loaded active active Graphical Interfacelocal-fs-pre.target loaded active active Local File Systems (Pre)local-fs.target loaded active active Local File Systemsmulti-user.target loaded active active Multi-User Systemnetwork-online.target loaded active active Network is Online
…
你可以通過輸入以下命令來列出所有可用的 targets:
systemctl list-unit-files -t target
UNIT FILE STATE VENDOR PRESET
basic.target static enabled
blockdev@.target static enabled
bluetooth.target static enabled
boot-complete.target static enabled
cloud-config.target static enabled
cloud-init.target enabled-runtime enabled
cryptsetup-pre.target static disabled
cryptsetup.target static enabled
ctrl-alt-del.target disabled enabled
…
從這里,你可以找出每個(gè) target 關(guān)聯(lián)的服務(wù)。Targets 可以有服務(wù)或其他 targets 作為依賴項(xiàng),因此你可以通過輸入以下命令來查看每個(gè) target 實(shí)施的策略:
systemctl list-dependencies target_name.target
multi-user.target
是 Systemd 服務(wù)器上常用的一個(gè) target,在啟動(dòng)過程中達(dá)到該目標(biāo)時(shí),用戶可以登錄。例如,你可以輸入以下命令:
systemctl list-dependencies multi-user.target
multi-user.target
● ├─apport.service
● ├─atd.service
● ├─console-setup.service
● ├─containerd.service
● ├─cron.service
● ├─dbus.service
● ├─dmesg.service
● ├─docker.service
● ├─grub-common.service
● ├─grub-initrd-fallback.service
…
這將列出該目標(biāo)的依賴樹,給出當(dāng)達(dá)到該目標(biāo)時(shí)啟動(dòng)的服務(wù)和其他 targets 的列表。
通過其他方法檢查服務(wù)
雖然大多數(shù)由軟件包管理器配置的服務(wù)將被注冊(cè)到 init 系統(tǒng)中,但一些其他軟件,如 Docker 部署,可能不會(huì)。
你可以嘗試通過查看這些服務(wù)使用的網(wǎng)絡(luò)端口和 Unix 套接字來找到這些其他服務(wù)和進(jìn)程。在大多數(shù)情況下,服務(wù)以某種方式相互通信或與外部實(shí)體通信。服務(wù)器上只有一定數(shù)量的接口可以用于服務(wù)通信,檢查這些接口是發(fā)現(xiàn)其他服務(wù)的好方法。
你可以使用 netstat
工具來發(fā)現(xiàn)正在使用的網(wǎng)絡(luò)端口和 Unix 套接字。你可以使用 -nlp
標(biāo)志運(yùn)行 netstat
以獲得概述:
netstat -nlp
-n
指定輸出中應(yīng)顯示數(shù)字 IP 地址,而不是主機(jī)名或用戶名。在檢查本地服務(wù)器時(shí),這通常更加信息豐富。-l
指定netstat
只顯示活動(dòng)監(jiān)聽套接字。-p
顯示每個(gè)使用端口或套接字的進(jìn)程 ID(PID)和名稱。
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8200 0.0.0.0:* LISTEN 104207/vault
tcp 0 0 0.0.0.0:1935 0.0.0.0:* LISTEN 3691671/nginx: mast
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 3691671/nginx: mast
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3691671/nginx: mast
tcp 0 0 0.0.0.0:1936 0.0.0.0:* LISTEN 197885/stunnel4
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 162540/systemd-reso
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 129518/sshd: /usr/s
tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN 99465/node /root/he
tcp 0 0 0.0.0.0:8088 0.0.0.0:* LISTEN 3691671/nginx: mast
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 3691671/nginx: mast
tcp 0 0 0.0.0.0:56733 0.0.0.0:* LISTEN 170269/docker-proxy
tcp6 0 0 :::80 :::* LISTEN 3691671/nginx: mast
tcp6 0 0 :::22 :::* LISTEN 129518/sshd: /usr/s
tcp6 0 0 :::443 :::* LISTEN 3691671/nginx: mast
tcp6 0 0 :::56733 :::* LISTEN 170275/docker-proxy
udp 0 0 127.0.0.53:53 0.0.0.0:* 162540/systemd-reso
raw6 0 0 :::58 :::* 7 162524/systemd-netw
raw6 0 0 :::58 :::* 7 162524/systemd-netw
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 5313074 1/systemd /run/systemd/userdb/io.systemd.DynamicUser
unix 2 [ ACC ] SEQPACKET LISTENING 12985 1/systemd /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 12967 1/systemd /run/lvm/lvmpolld.socket
unix 2 [ ACC ] STREAM LISTENING 12980 1/systemd /run/systemd/journal/stdout
unix 2 [ ACC ] STREAM LISTENING 16037236 95187/systemd /run/user/0/systemd/private
…
netstat
輸出包含兩個(gè)獨(dú)立的塊 —— 一個(gè)用于網(wǎng)絡(luò)端口,一個(gè)用于套接字。如果你在這里看到了通過 init 系統(tǒng)沒有信息的服務(wù),你將不得不弄清楚原因,并確定是否打算遷移這些服務(wù)。
你可以使用 lsof
命令獲取關(guān)于服務(wù)提供的端口的類似信息:
lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node\x20/ 99465 root 20u IPv4 16046039 0t0 TCP 127.0.0.1:3000 (LISTEN)
vault 104207 vault 8u IPv4 1134285 0t0 TCP *:8200 (LISTEN)
sshd 129518 root 3u IPv4 1397496 0t0 TCP *:22 (LISTEN)
sshd 129518 root 4u IPv6 1397507 0t0 TCP *:22 (LISTEN)
systemd-r 162540 systemd-resolve 12u IPv4 5313507 0t0 UDP 127.0.0.53:53
systemd-r 162540 systemd-resolve 13u IPv4 5313508 0t0 TCP 127.0.0.53:53 (LISTEN)
docker-pr 170269 root 4u IPv4 1700561 0t0 TCP *:56733 (LISTEN)
docker-pr 170275 root 4u IPv6 1700573 0t0 TCP *:56733 (LISTEN)
stunnel4 197885 stunnel4 9u IPv4 1917328 0t0 TCP *:1936 (LISTEN)
sshd 3469804 root 4u IPv4 22246413 0t0 TCP 159.203.102.125:22->154.5.29.188:36756 (ESTABLISHED)
nginx 3691671 root 7u IPv4 2579911 0t0 TCP *:8080 (LISTEN)
nginx 3691671 root 8u IPv4 1921506 0t0 TCP *:80 (LISTEN)
nginx 3691671 root 9u IPv6 1921507 0t0 TCP *:80 (LISTEN)
nginx 3691671 root 10u IPv6 1921508 0t0 TCP *:443 (LISTEN)
nginx 3691671 root 11u IPv4 1921509 0t0 TCP *:443 (LISTEN)
nginx 3691671 root 12u IPv4 2579912 0t0 TCP *:8088 (LISTEN)
nginx 3691671 root 13u IPv4 2579913 0t0 TCP *:1935 (LISTEN)
nginx 3691674 www-data 7u IPv4 2579911 0t0 TCP *:8080 (LISTEN)
nginx 3691674 www-data 8u IPv4 1921506 0t0 TCP *:80 (LISTEN)
nginx 3691674 www-data 9u IPv6 1921507 0t0 TCP *:80 (LISTEN)
nginx 3691674 www-data 10u IPv6 1921508 0t0 TCP *:443 (LISTEN)
nginx 3691674 www-data 11u IPv4 1921509 0t0 TCP *:443 (LISTEN)
nginx 3691674 www-data 12u IPv4 2579912 0t0 TCP *:8088 (LISTEN)
nginx 3691674 www-data 13u IPv4 2579913 0t0 TCP *:1935 (LISTEN)
netstat
和 lsof
都是核心 Linux 進(jìn)程管理工具,在各種其他情境中都很有用。
第五步 – 收集軟件包版本
此時(shí),你應(yīng)該已經(jīng)對(duì)源服務(wù)器上運(yùn)行的服務(wù)有了一個(gè)很好的了解,你應(yīng)該在目標(biāo)服務(wù)器上實(shí)施這些服務(wù)。
你應(yīng)該有一個(gè)服務(wù)列表,你知道你需要在新服務(wù)器上實(shí)施這些服務(wù)。為了順利過渡,重要的是盡可能匹配版本。
你不一定要審查源系統(tǒng)上安裝的每個(gè)軟件包,并嘗試在新系統(tǒng)上復(fù)制它,但你應(yīng)該檢查對(duì)你的需求重要的軟件組件,并嘗試找到它們的版本號(hào)。
你可以嘗試從軟件本身獲取版本號(hào),有時(shí)通過向每個(gè)命令傳遞 -v
或 --version
標(biāo)志,但通過你的軟件包管理器更加直接。如果你使用基于 Ubuntu/Debian 的系統(tǒng),你可以使用 dpkg
命令查看安裝的軟件包版本:
dpkg -l | grep package_name
如果你使用基于 Rocky Linux、RHEL 或 Fedora 的系統(tǒng),你可以使用 rpm
來實(shí)現(xiàn)相同的目的:
rpm -qa | grep package_name
這將讓你對(duì)要匹配的軟件包版本有一個(gè)很好的了解。確保保留任何相關(guān)軟件的版本號(hào)。
結(jié)論
現(xiàn)在,你應(yīng)該已經(jīng)很清楚源服務(wù)器上需要遷移到新機(jī)器的進(jìn)程和服務(wù)。你還應(yīng)該已經(jīng)完成了允許你的兩臺(tái)服務(wù)器相互通信的初步步驟。
你的遷移基礎(chǔ)現(xiàn)在已經(jīng)完成。在本系列的下一篇文章中,你將開始實(shí)際的遷移過程。