OpenStack環境搭建部署
- 環境準備
-
- 虛拟機資源資訊
- 部署思路
- 基礎環境配置
-
- 重新命名
- 防火牆、核心防護
- 免互動
- 基礎環境依賴包
- 時間同步+周期性計劃任務
- 系統環境配置
-
- 安裝、配置MariaDB
- 安裝RabbitMQ
- 安裝memcached
- 安裝etcd
-
- 為什麼需要 Etcd ?
- Etcd 提供什麼能力?
- ETCD-應用場景
環境準備
虛拟機資源資訊
1、控制節點ct(controller)
CPU:雙核雙線程-CPU虛拟化開啟
記憶體:8G 硬碟:40G+300G(CEPH塊存儲)
雙網卡:VM1-(區域網路)192.168.100.80 NAT-192.168.188.80
作業系統:Centos 7.6(1810)-最小化安裝
2、計算節點c1(compute01)
CPU:雙核雙線程-CPU虛拟化開啟
記憶體:8G 硬碟:40G+300G(CEPH塊存儲)
雙網卡:VM1(區域網路)-192.168.100.90 NAT-192.168.188.90
作業系統:Centos 7.6(1810)-最小化安裝
3、計算節點c2(compute02)
CPU:雙核雙線程-CPU虛拟化開啟
記憶體:8G 硬碟:40G+300G(CEPH塊存儲)
雙網卡:VM1(區域網路)-192.168.100.100 NAT-192.168.188.100
作業系統:Centos 7.6(1810)-最小化安裝
PS:最小記憶體6G
部署思路
一、配置作業系統+OpenStack運作環境
二、配置OpenStack平台基礎服務(rabbitmq、mariadb、memcache、Apache)
三、配置OpenStack keystone元件
四、配置OpenStack Glance元件
五、配置placement服務
六、配置OpenStack Nova元件
七、配置OpenStack Neutron元件
八、配置OpenStack dashboard元件
九、配置OpenStack Cinder元件
十、常用雲主機操作

基礎環境配置
重新命名
[[email protected] ~]# hostnamectl set-hostname controller
[[email protected] ~]# su
[[email protected] ~]# hostnamectl set-hostname compute01
[[email protected] ~]# su
[[email protected] ~]# hostnamectl set-hostname compute02
[[email protected] ~]# su
防火牆、核心防護
[[email protected] ~]# systemctl stop firewalld //關閉防火牆
[[email protected] ~]# setenforce 0 //關閉核心防護
[[email protected] ~]# systemctl disable firewalld //開機關閉防火牆
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[[email protected] ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[[email protected] ~]# grep -v "#" /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
免互動
設定映射(内部網址)
在所有節點上
[[email protected] ~]# vi /etc/hosts
末尾添加
192.168.100.80 controller
192.168.100.90 compute01
192.168.100.100 compute02
在所有節點上
[[email protected] ~]# ssh-keygen -t rsa //生成密鑰
[[email protected] ~]# ssh-copy-id controller //傳遞公鑰
[[email protected] ~]# ssh-copy-id compute01
[[email protected] ~]# ssh-copy-id compute02
驗證
在控制節點上
[[email protected] ~]# ssh [email protected]
Last login: Thu Jan 28 17:46:42 2021
[[email protected] ~]# exit
登出
Connection to compute01 closed.
[[email protected] ~]# ssh [email protected]
Last login: Thu Jan 28 17:46:50 2021
[[email protected] ~]# exit
登出
Connection to compute02 closed.
在計算節點01上
[[email protected] ~]# ssh [email protected]
Last login: Thu Jan 28 17:46:34 2021
[[email protected] ~]# exit
登出
Connection to controller closed.
[[email protected] ~]# ssh [email protected]
Last login: Thu Jan 28 17:58:19 2021 from 192.168.100.80
[[email protected] ~]# exit
登出
Connection to compute02 closed.
在計算節點02上
[[email protected] ~]# ssh [email protected]
Last login: Thu Jan 28 18:04:50 2021 from compute01
[[email protected] ~]# exit
登出
Connection to controller closed.
[[email protected] ~]# ssh [email protected]
Last login: Thu Jan 28 17:58:11 2021 from 192.168.100.80
[[email protected] ~]# exit
登出
Connection to compute01 closed.
基礎環境依賴包
面向所有節點
[[email protected] ~]# yum -y install net-tools bash-completion vim gcc gcc-c++ make pcre pcre-devel expat-devel cmake bzip2 lrzsz
net-tools 可以使用ifconfig指令
bash-completion 自動補全
pcre 正則 devel庫
expat-devel:Apache依賴包,C語言開發,解析XML文檔的開發庫
[[email protected] ~]# yum -y install centos-release-openstack-train python-openstackclient openstack-selinux openstack-utils
centos-release-openstack-train 保證安裝更新openstack版本為最新版本t版
python-openstackclient openstack的python用戶端
因為openstack中的API大多數是python編寫的,并且連接配接資料庫,也需要python
openstack-selinux openstack核心安全防護
openstack-utils openstack其它util工具
時間同步+周期性計劃任務
安裝時間同步軟體
[[email protected] ~]# yum -y install chrony
在控制節點上設定為同步源
[[email protected] ~]# vi /etc/chrony.conf
3 #server 0.centos.pool.ntp.org iburst //注釋掉
4 #server 1.centos.pool.ntp.org iburst
5 #server 2.centos.pool.ntp.org iburst
6 #server 3.centos.pool.ntp.org iburst
7 server ntp.aliyun.com iburst //設定時間同步源
27 allow 192.168.100.0/24 //為100網段提供時間同步
[[email protected] ~]# systemctl restart chronyd //重新開機時間同步服務
[[email protected] ~]# systemctl enable chronyd //開機自啟動
[[email protected] ~]# chronyc sources //更新
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 6 17 14 +583us[+1282us] +/- 24ms
[[email protected] ~]#
在計算節點1.2上
[[email protected] ~]# vi /etc/chrony.conf
注釋/添加/修改
3 #server 0.centos.pool.ntp.org iburst
4 #server 1.centos.pool.ntp.org iburst
5 #server 2.centos.pool.ntp.org iburst
6 #server 3.centos.pool.ntp.org iburst
7 server controller iburst //設定時間同步源為控制節點
27 allow 192.168.100.0/24
[[email protected] ~]# systemctl restart chronyd
[[email protected] ~]# systemctl enable chronyd
[[email protected] ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* controller 3 6 17 3 -12us[ -144us] +/- 27ms
[[email protected] ~]#
設定任務計劃
面向所有節點
[[email protected] ~]# crontab -e //配置計劃任務
*/30 * * * * /usr/bin/chronyc sources >> /var/log/chronyc.log
每隔30分鐘同步一次
[[email protected] ~]# crontab -l //設定周期性任務
*/30 * * * * /usr/bin/chronyc sources >> /var/log/chronyc.log
[[email protected] ~]# date
2021年 01月 28日 星期四 18:32:42 CST
系統環境配置
安裝、配置MariaDB
配置服務(控制節點):
[[email protected] ~]# yum -y install mariadb mariadb-server python2-PyMySQL
#此包用于openstack的控制端連接配接mysql所需要的子產品,如果不安裝,則無法連接配接資料庫;此包隻安裝在控制端
[[email protected] ~]# yum -y install libibverbs //底層庫檔案
添加MySQL子配置檔案,增加如下内容
[[email protected] ~]# vi /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address = 192.168.100.80 //控制節點區域網路位址(綁定内網位址)本地資料庫節點ip
default-storage-engine = innodb //預設存儲引擎
innodb_file_per_table = on //每張表獨立表空間檔案(檔案存儲空間)
max_connections = 4096 //最大連接配接數
collation-server = utf8_general_ci //預設字元集(不區分大小寫)
character-set-server = utf8 //字元集utf8_bin區分大小寫
開機自啟動、開啟服務
[[email protected] ~]# systemctl enable mariadb
Created symlink from /etc/systemd/system/mysql.service to /usr/lib/systemd/system/mariadb.service.
Created symlink from /etc/systemd/system/mysqld.service to /usr/lib/systemd/system/mariadb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[[email protected] ~]# systemctl start mariadb
資料庫初始化設定
[[email protected] ~]# mysql_secure_installation
Change the root password? [Y/n] y //是否設定密碼
Remove anonymous users? [Y/n] y //是否移除匿名使用者
Disallow root login remotely? [Y/n] n //不允許root使用者遠端登陸
Remove test database and access to it? [Y/n] y //是否移除test資料庫
Reload privilege tables now? [Y/n] y //是否重置權限清單
[[email protected] ~]# mysql -uroot -p123456 //登陸資料庫
安裝RabbitMQ
所有建立虛拟機的指令,控制端都會發送到rabbitmq,node節點監聽rabbitmq
[[email protected] ~]# yum -y install rabbitmq-server
配置服務,啟動RabbitMQ服務,并設定其開機啟動。
[[email protected] ~]# systemctl enable rabbitmq-server.service
Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
[[email protected] ~]# systemctl start rabbitmq-server.service
建立消息隊列使用者,用于controler和node節點連接配接rabbitmq的認證(關聯)
[[email protected] ~]# rabbitmqctl add_user openstack RABBIT_PASS
Creating user "openstack"
配置openstack使用者的操作權限(正則,配置讀寫權限)
[[email protected] ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user "openstack" in vhost "/"
Nova與Keystone進行通訊
1.rabbidb,把nova請求讀取寫入到本地内部
2.Nova把請求相關寫入到Rabbitmq的内部
3.把消息傳遞過程中,也會進行讀寫操作
授予獨立的使用者身份,讀寫權限
可檢視25672和5672 兩個端口(5672是Rabbitmq預設端口,25672是Rabbit的測試工具CLI的端口)
[[email protected] ~]# netstat -anptu | grep 5672
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 9292/beam.smp
tcp 0 0 192.168.100.80:60299 192.168.100.80:25672 TIME_WAIT -
tcp6 0 0 :::5672 :::* LISTEN 9292/beam.smp
[[email protected] ~]#
檢視rabbitmq插件清單
[[email protected] ~]# rabbitmq-plugins list
Configured: E = explicitly enabled; e = implicitly enabled
| Status: * = running on [email protected]
|/
[ ] amqp_client 3.6.16
[ ] cowboy 1.0.4
[ ] cowlib 1.0.2
[ ] rabbitmq_amqp1_0 3.6.16
[ ] rabbitmq_auth_backend_ldap 3.6.16
[ ] rabbitmq_auth_mechanism_ssl 3.6.16
[ ] rabbitmq_consistent_hash_exchange 3.6.16
[ ] rabbitmq_event_exchange 3.6.16
[ ] rabbitmq_federation 3.6.16
[ ] rabbitmq_federation_management 3.6.16
[ ] rabbitmq_jms_topic_exchange 3.6.16
[ ] rabbitmq_management 3.6.16
[ ] rabbitmq_management_agent 3.6.16
[ ] rabbitmq_management_visualiser 3.6.16
[ ] rabbitmq_mqtt 3.6.16
[ ] rabbitmq_random_exchange 3.6.16
[ ] rabbitmq_recent_history_exchange 3.6.16
[ ] rabbitmq_sharding 3.6.16
[ ] rabbitmq_shovel 3.6.16
[ ] rabbitmq_shovel_management 3.6.16
[ ] rabbitmq_stomp 3.6.16
[ ] rabbitmq_top 3.6.16
[ ] rabbitmq_tracing 3.6.16
[ ] rabbitmq_trust_store 3.6.16
[ ] rabbitmq_web_dispatch 3.6.16
[ ] rabbitmq_web_mqtt 3.6.16
[ ] rabbitmq_web_mqtt_examples 3.6.16
[ ] rabbitmq_web_stomp 3.6.16
[ ] rabbitmq_web_stomp_examples 3.6.16
[ ] sockjs 0.3.4
開啟rabbitmq的web管理界面的插件,端口為15672
[[email protected] ~]# rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
amqp_client
cowlib
cowboy
rabbitmq_web_dispatch
rabbitmq_management_agent
rabbitmq_management
Applying plugin configuration to [email protected]... started 6 plugins.
[[email protected] ~]# netstat -anptu | grep 5672
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 9292/beam.smp
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 9292/beam.smp
tcp 0 0 192.168.100.80:39115 192.168.100.80:25672 TIME_WAIT -
tcp6 0 0 :::5672
浏覽器
http://192.168.100.80:15672/
使用者名和密碼:guest
安裝memcached
作用:
安裝memcached是用來存儲session(會話)資訊;服務身份驗證機制(keystone)使用memched來緩存令牌,在登入openstack的dashboard時,會産生一些session資訊,這些session資訊會存放到memcached中
概念
memcached是一套分布式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但被許多網站使用。這是一套開放源代碼軟體,以BSD license授權釋出。
memcached缺乏認證以及安全管制,這代表應該将memcached伺服器放置在防火牆後。
memcached的API使用三十二比特的循環備援校驗(CRC-32)計算鍵值後,将資料分散在不同的機器上。當表格滿了以後,接下來新增的資料會以LRU機制替換掉。由于memcached通常隻是當作緩存系統使用,是以使用memcached的應用程式在寫回較慢的系統時(像是後端的資料庫)需要額外的代碼更新memcached内的資料。
安裝Memcached
[[email protected] ~]# yum install -y memcached python-memcached
#python-*子產品在OpenStack中起到連接配接資料庫的作用
修改Memcached配置檔案
[[email protected] ~]# vi /etc/sysconfig/memcached
PORT="11211" 預設端口号
USER="memcached" 預設賬戶名
MAXCONN="1024" 最大連接配接數
CACHESIZE="64" 緩存大小
OPTIONS="-l 127.0.0.1,::1,controller"
[[email protected] ~]# systemctl enable memcached //自啟動
Created symlink from /etc/systemd/system/multi-user.target.wants/memcached.service to /usr/lib/systemd/system/memcached.service.
[[email protected] ~]# systemctl start memcached //啟動服務
[[email protected] ~]# netstat -anptu | grep 11211 //檢視端口
tcp 0 0 192.168.100.80:11211 0.0.0.0:* LISTEN 21078/memcached
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 21078/memcached
tcp6 0 0 ::1:11211 :::* LISTEN 21078/memcached
安裝etcd
為什麼需要 Etcd ?
所有的分布式系統,都面臨的一個問題是多個節點之間的資料共享問題,這個和團隊協作的道理是一樣的,成員可以分頭幹活,但總是需要共享一些必須的資訊,比如誰是 leader, 都有哪些成員,依賴任務之間的順序協調等。是以分布式系統要麼自己實作一個可靠的共享存儲來同步資訊(比如 Elasticsearch ),要麼依賴一個可靠的共享存儲服務,而 Etcd 就是這樣一個服務。
Etcd 提供什麼能力?
Etcd 主要提供以下能力,已經熟悉 Etcd 的讀者可以略過本段。
提供存儲以及擷取資料的接口,它通過協定保證 Etcd 叢集中的多個節點資料的強一緻性。用于存儲元資訊以及共享配置。
提供監聽機制,用戶端可以監聽某個key或者某些key的變更(v2和v3的機制不同,參看後面文章)。用于監聽和推送變更。
提供key的過期以及續約機制,用戶端通過定時重新整理來實作續約(v2和v3的實作機制也不一樣)。用于叢集監控以及服務注冊發現。
提供原子的CAS(Compare-and-Swap)和 CAD(Compare-and-Delete)支援(v2通過接口參數實作,v3通過批量事務實作)。用于分布式鎖以及leader選舉。
ETCD-應用場景
場景一:服務發現(Service Discovery)
服務發現要解決的也是分布式系統中最常見的問題之一,即在同一個分布式叢集中的程序或服務,要如何才能找到對方并建立連接配接。本質上來說,服務發現就是想要了解叢集中是否有程序在監聽udp或tcp端口,并且通過名字就可以查找和連接配接。要解決服務發現的問題,需要有下面三大支柱,缺一不可。
一個強一緻性、高可用的服務存儲目錄。基于Raft算法的etcd天生就是這樣一個強一緻性高可用的服務存儲目錄。
一種注冊服務和監控服務健康狀态的機制。使用者可以在etcd中注冊服務,并且對注冊的服務設定key TTL,定時保持服務的心跳以達到監控健康狀态的效果。
一種查找和連接配接服務的機制。通過在etcd指定的主題下注冊的服務也能在對應的主題下查找到。為了確定連接配接,我們可以在每個服務機器上都部署一個Proxy模式的etcd,這樣就可以確定能通路etcd叢集的服務都能互相連接配接。
下面我們來看服務發現對應的具體場景:
微服務協同工作架構中,服務動态添加。随着Docker容器的流行,多種微服務共同協作,構成一個相對功能強大的架構的案例越來越多。透明化的動态添加這些服務的需求也日益強烈。通過服務發現機制,在etcd中注冊某個服務名字的目錄,在該目錄下存儲可用的服務節點的IP。在使用服務的過程中,隻要從服務目錄下查找可用的服務節點去使用即可。
PaaS平台中應用多執行個體與執行個體故障重新開機透明化。PaaS平台中的應用一般都有多個執行個體,通過域名,不僅可以透明的對這多個執行個體進行通路,而且還可以做到負載均衡。但是應用的某個執行個體随時都有可能故障重新開機,這時就需要動态的配置域名解析(路由)中的資訊。通過etcd的服務發現功能就可以輕松解決這個動态配置的問題
場景二:消息釋出與訂閱
在分布式系統中,最适用的一種元件間通信方式就是消息釋出與訂閱。即建構一個配置共享中心,資料提供者在這個配置中心釋出消息,而消息使用者則訂閱他們關心的主題,一旦主題有消息釋出,就會實時通知訂閱者。通過這種方式可以做到分布式系統配置的集中式管理與動态更新。
•應用中用到的一些配置資訊放到etcd上進行集中管理。這類場景的使用方式通常是這樣:應用在啟動的時候主動從etcd擷取一次配置資訊,同時,在etcd節點上注冊一個Watcher并等待,以後每次配置有更新的時候,etcd都會實時通知訂閱者,以此達到擷取最新配置資訊的目的。
•分布式搜尋服務中,索引的元資訊和伺服器叢集機器的節點狀态存放在etcd中,供各個用戶端訂閱使用。使用etcd的key TTL功能可以確定機器狀态是實時更新的。
•分布式日志收集系統。這個系統的核心工作是收集分布在不同機器的日志。收集器通常是按照應用(或主題)來配置設定收集任務單元,是以可以在etcd上建立一個以應用(主題)命名的目錄P,并将這個應用(主題相關)的所有機器ip,以子目錄的形式存儲到目錄P上,然後設定一個etcd遞歸的Watcher,遞歸式的監控應用(主題)目錄下所有資訊的變動。這樣就實作了機器IP(消息)變動的時候,能夠實時通知到收集器調整任務配置設定。
•系統中資訊需要動态自動擷取與人工幹預修改資訊請求内容的情況。通常是暴露出接口,例如JMX接口,來擷取一些運作時的資訊。引入etcd之後,就不用自己實作一套方案了,隻要将這些資訊存放到指定的etcd目錄中即可,etcd的這些目錄就可以通過HTTP的接口在外部通路。
場景三:負載均衡
在場景一中也提到了負載均衡,本文所指的負載均衡均為軟負載均衡。分布式系統中,為了保證服務的高可用以及資料的一緻性,通常都會把資料和服務部署多份,以此達到對等服務,即使其中的某一個服務失效了,也不影響使用。由此帶來的壞處是資料寫入性能下降,而好處則是資料通路時的負載均衡。因為每個對等服務節點上都存有完整的資料,是以使用者的通路流量就可以分流到不同的機器上。
•etcd本身分布式架構存儲的資訊通路支援負載均衡。etcd叢集化以後,每個etcd的核心節點都可以處理使用者的請求。是以,把資料量小但是通路頻繁的消息資料直接存儲到etcd中也是個不錯的選擇,如業務系統中常用的二級代碼表(在表中存儲代碼,在etcd中存儲代碼所代表的具體含義,業務系統調用查表的過程,就需要查找表中代碼的含義)。
•利用etcd維護一個負載均衡節點表。etcd可以監控一個叢集中多個節點的狀态,當有一個請求發過來後,可以輪詢式的把請求轉發給存活着的多個狀态。類似KafkaMQ,通過ZooKeeper來維護生産者和消費者的負載均衡。同樣也可以用etcd來做ZooKeeper的工作。
場景四:分布式通知與協調
這裡說到的分布式通知與協調,與消息釋出和訂閱有些相似。都用到了etcd中的Watcher機制,通過注冊與異步通知機制,實作分布式環境下不同系統之間的通知與協調,進而對資料變更做到實時處理。實作方式通常是這樣:不同系統都在etcd上對同一個目錄進行注冊,同時設定Watcher觀測該目錄的變化(如果對子目錄的變化也有需要,可以設定遞歸模式),當某個系統更新了etcd的目錄,那麼設定了Watcher的系統就會收到通知,并作出相應處理。
•通過etcd進行低耦合的心跳檢測。檢測系統和被檢測系統通過etcd上某個目錄關聯而非直接關聯起來,這樣可以大大減少系統的耦合性。
•通過etcd完成系統排程。某系統有控制台和推送系統兩部分組成,控制台的職責是控制推送系統進行相應的推送工作。管理人員在控制台作的一些操作,實際上是修改了etcd上某些目錄節點的狀态,而etcd就把這些變化通知給注冊了Watcher的推送系統用戶端,推送系統再作出相應的推送任務。
•通過etcd完成工作彙報。大部分類似的任務分發系統,子任務啟動後,到etcd來注冊一個臨時工作目錄,并且定時将自己的進度進行彙報(将進度寫入到這個臨時目錄),這樣任務管理者就能夠實時知道任務進度。
場景五:分布式鎖
因為etcd使用Raft算法保持了資料的強一緻性,某次操作存儲到叢集中的值必然是全局一緻的,是以很容易實作分布式鎖。鎖服務有兩種使用方式,一是保持獨占,二是控制時序。
•保持獨占即所有擷取鎖的使用者最終隻有一個可以得到。etcd為此提供了一套實作分布式鎖原子操作CAS(CompareAndSwap)的API。通過設定prevExist值,可以保證在多個節點同時去建立某個目錄時,隻有一個成功。而建立成功的使用者就可以認為是獲得了鎖。
•控制時序,即所有想要獲得鎖的使用者都會被安排執行,但是獲得鎖的順序也是全局唯一的,同時決定了執行順序。etcd為此也提供了一套API(自動建立有序鍵),對一個目錄建值時指定為POST動作,這樣etcd會自動在目錄下生成一個目前最大的值為鍵,存儲這個新的值(用戶端編号)。同時還可以使用API按順序列出所有目前目錄下的鍵值。此時這些鍵的值就是用戶端的時序,而這些鍵中存儲的值可以是代表用戶端的編号。
場景六:分布式隊列
分布式隊列的正常用法與場景五中所描述的分布式鎖的控制時序用法類似,即建立一個先進先出的隊列,保證順序。
另一種比較有意思的實作是在保證隊列達到某個條件時再統一按順序執行。這種方法的實作可以在/queue這個目錄中另外建立一個/queue/condition節點。
•condition可以表示隊列大小。比如一個大的任務需要很多小任務就緒的情況下才能執行,每次有一個小任務就緒,就給這個condition數字加1,直到達到大任務規定的數字,再開始執行隊列裡的一系列小任務,最終執行大任務。
•condition可以表示某個任務在不在隊列。這個任務可以是所有排序任務的首個執行程式,也可以是拓撲結構中沒有依賴的點。通常,必須執行這些任務後才能執行隊列中的其他任務。
•condition還可以表示其它的一類開始執行任務的通知。可以由控制程式指定,當condition出現變化時,開始執行隊列任務。
場景七:叢集監控與Leader競選
通過etcd來進行監控實作起來非常簡單并且實時性強。
前面幾個場景已經提到Watcher機制,當某個節點消失或有變動時,Watcher會第一時間發現并告知使用者。
節點可以設定TTL key,比如每隔30s發送一次心跳使代表該機器存活的節點繼續存在,否則節點消失。
這樣就可以第一時間檢測到各節點的健康狀态,以完成叢集的監控要求。
另外,使用分布式鎖,可以完成Leader競選。這種場景通常是一些長時間CPU計算或者使用IO操作的機器,隻需要競選出的Leader計算或處理一次,就可以把結果複制給其他的Follower。進而避免重複勞動,節省計算資源。
這個的經典場景是搜尋系統中建立全量索引。如果每個機器都進行一遍索引的建立,不但耗時而且建立索引的一緻性不能保證。通過在etcd的CAS機制同時建立一個節點,建立成功的機器作為Leader,進行索引計算,然後把計算結果分發到其它節點。
安裝etcd
[[email protected] ~]# yum -y install etcd
修改配置檔案
[[email protected] ~]# cd /etc/etcd/
[[email protected] etcd]# ls
etcd.conf
[[email protected] etcd]# vi etcd.conf
3 ETCD_DATA_DIR="/var/lib/etcd/default.etcd" //資料目錄位置
5 ETCD_LISTEN_PEER_URLS="http://192.168.100.80:2380" //監聽其他etcd member的url(2380端口,叢集之間通訊,域名為無效值)
6 ETCD_LISTEN_CLIENT_URLS="http://192.168.100.80:2379" //對外提供服務的位址(2379端口,叢集内部的通訊端口)
9 ETCD_NAME="controller" //叢集中節點辨別(名稱)
20 ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.100.80:2380" //該節點成員的URL位址,2380端口:用于叢集之間通訊。
21 ETCD_ADVERTISE_CLIENT_URLS="http://192.168.100.80:2379"
27 ETCD_INITIAL_CLUSTER="controller=http://192.168.100.80:2380"
28 ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01" //叢集唯一辨別,群集名稱
29 ETCD_INITIAL_CLUSTER_STATE="new"
初始叢集狀态,new為靜态,表示單個節點
若為existing,則表示此ETCD服務将嘗試加入已有的叢集,初始化完成後,會根據自己的叢集名稱自動尋找其它相同叢集名稱的ETCD
若為DNS,則表示此叢集将作為被加入的對象,等待加入狀态
開機自啟動、開啟服務,檢測端口
[[email protected] etcd]# systemctl enable etcd
Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
[[email protected] etcd]# systemctl start etcd
[[email protected] etcd]# systemctl status etcd
● etcd.service - Etcd Server
Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset: disabled)
Active: active (running) since 四 2021-01-28 20:10:25 CST; 14s ago
Main PID: 22110 (etcd)
CGroup: /system.slice/etcd.service
└─22110 /usr/bin/etcd --name=controller --data-dir=/var/lib/etcd/default.etcd --lis...
1月 28 20:10:25 controller etcd[22110]: a803f6966f02f507 received MsgVoteResp from a803f69...m 2
1月 28 20:10:25 controller etcd[22110]: a803f6966f02f507 became leader at term 2
1月 28 20:10:25 controller etcd[22110]: raft.node: a803f6966f02f507 elected leader a803f69...m 2
1月 28 20:10:25 controller etcd[22110]: setting up the initial cluster version to 3.3
1月 28 20:10:25 controller etcd[22110]: set the initial cluster version to 3.3
1月 28 20:10:25 controller etcd[22110]: enabled capabilities for version 3.3
1月 28 20:10:25 controller etcd[22110]: published {Name:controller ClientURLs:[http://192....ec4
1月 28 20:10:25 controller etcd[22110]: ready to serve client requests
1月 28 20:10:25 controller etcd[22110]: serving insecure client requests on 192.168.100.80...ed!
1月 28 20:10:25 controller systemd[1]: Started Etcd Server.
Hint: Some lines were ellipsized, use -l to show in full.
[[email protected] etcd]# netstat -anptu | grep 2379
tcp 0 0 192.168.100.80:2379 0.0.0.0:* LISTEN 22110/etcd
tcp 0 0 192.168.100.80:2379 192.168.100.80:36030 ESTABLISHED 22110/etcd
tcp 0 0 192.168.100.80:36030 192.168.100.80:2379 ESTABLISHED 22110/etcd
[[email protected] etcd]# netstat -anptu | grep 2380
tcp 0 0 192.168.100.80:2380 0.0.0.0:* LISTEN 22110/etcd
[[email protected] etcd]#
C1、C2安裝OpenStack元件
[[email protected] ~]# yum -y install centos-release-openstack-train python-openstackclient openstack-selinux openstack-utils