openstack multi-region管理

openstack多集群管理

 背景介紹

由于有些物理集群處于不同的地點,或者某一些物理集群規模太大,就需要創建多個openstack集群對其進行管理。而每個openstack集群是單獨管理的,這就導致管理入口太多,不方便統一管理。那么就需要一種統一管理的機制。

方案對比

2.1 nova AZ

針對多個集群處于不同地點的情況,這時每個集群可以作為一個(或者多個)AZ,但是由于AZ之間還是會共享很多服務,比如neutron,glance,mariadb,rabbitMQ等,需要跨機房訪問這些服務,時延比較大,也會消耗較多的機房間帶寬,會影響用戶體驗。 當單個物理集群太大時,即使劃分了多個AZ,從邏輯上分割開了,但是rabbitMQ,glance,neutron,mariadb等服務的壓力還是會比較大,同樣會影響用戶體驗,劃分多個AZ是無法解決這類問題的,AZ只是一個邏輯范圍的劃分。

2.2 multi-region

一個region可以對應一個物理集群,region與region可以是不同地點的物理集群,也可以是單個大規模物理機集群分割后的多個物理集群。region之間只共享dashboard service(horizon)和identity service(keystone),也就是說使用統一的管理界面和認證,其他服務(例如,nova,neutron,glance,cinder,mariadb,rabbitMQ等)都是各個region獨立擁有的,這樣可以有效避免region間的交互開銷。 該方案如下圖所示

openstack multi-region管理

在上圖中,左邊的集群是RegionOne,右邊的集群是RegionTwo,可以使用任何一個region的horizon和keystone service來行使dashboard和identity功能。為了便于后面進行說明,需要選定一個region提供dashboard和identity service,這里就選定RegionOne了。

下面對上圖中的幾個關鍵點做下說明,

1)keystone數據庫設置主從

RegionOne中keystone連接的數據庫作為master,RegionTwo中keystone連接的數據庫作為slave,他們之間做主從,以實現keystone數據庫之間的同步。 這么做的目的是當RegionOne的keystone service無法給RegionTwo的各個service提供訪問認證服務時(比如,當RegionOne和RegionTwo之間的網絡中斷時),RegionTwo上的keystone service可以使用slave keystone數據庫中的信息給RegionTwo上的各個service提供訪問認證服務。

2)keystone token driver配置為memcache

keystone除了token對象存放在memcache中,其他對象(例如,user,role,credential,endpoint,service,region等)全都存放在mariadb中。 之所以把token存在memcache中,是因為token是有使用期限的(例如,24h),如果把token存在mariadb中,當RegionOne上的keystone service無法給RegionTwo上的各個service提供訪問認證服務時,這時就要使用RegionTwo上的keystone,那么當slave keystone數據庫中存放的token過期了,就無法把新的token存儲到slave keystone數據庫中,因為slave數據庫不允許寫。那么如果把token存放在memcache中,當RegionOne上的keystone service無法給RegionTwo上的各個service提供訪問認證服務時,RegionTwo上的keystone service只需要把把新生成的token存放到memcache中即可,后面就可以使用memcache中的token進行訪問。

3)RegionOne上的keystone service無法給RegionTwo上的各個service提供訪問認證服務時,RegionTwo仍可以管理

RegionTwo的dashboard和identity service平常不再起作用,其實這時RegionTwo上各個service的訪問認證已經不通過RegionTwo上的keystone了,而是通過RegionOne上的keystone進行認證,上圖的RegionTwo中的兩條虛線就代表這個意思。當RegionOne上的keystone service無法給RegionTwo上的各個service提供訪問認證服務時,就需要使用RegionTwo上的horizon和keystone重新提供dashboard和identity服務。通過修改RegionTwo上各個service的配置使其重新使用RegionTwo上的keystone進行訪問認證。

4)dashboard支持multi-region

openstack dashboard是支持multi-region的,它通過keystone service可以發現所有的Region,然后再界面上提供Region切換功能,如下圖所示

openstack multi-region管理

5)openstack其他組件

region之間只共享horizon和keystone service,其余service(例如nova,neutron,glance,cinder,ceilometer,mariadb,rabbitMQ等),各個region都是用自己的,這些service如果要做HA,那么各個region自己做自己的。

方案實施

通過上面的方案介紹可以知道,該方案總共有四個關鍵點,一是提供dashboard和identity service的Region和其他Region之間,keystone數據庫要做主從;二是各個Region的keystone token driver要使用memcache;三是創建多Region;四是當RegionOne上的dashboard和identity service無法給其他Region提供服務時,要保證其他Region仍可管理。下面就圍繞這四點進行實施。

3.1 多集群環境準備

選用的軟件版本如下

openstack:rdo-liberty

OS:centos-7.2.1511(3.10.0-327.el7.x86_64)

qemu:2.3.0-31.el7_2.7

libvirt:1.2.17-13.el7

總共搭建了兩個openstack集群,每個集群有兩個節點,controller和compute節點,controller同時也作為compute節點,如下表所示

openstack multi-region管理

我是使用packstack部署的openstack,默認都是只有一個RegionOne。下面計劃把cluster-1作為RegionOne,cluster-2作為RegionTwo,然后使用RegionOne上的horizon和keystone service給這兩個Region提供dashboard和identity服務。

3.2 keystone token driver配置為memcache

所有region的token driver都要配置為memcache,默認情況下token driver使用的是sql數據庫。

3.2.1 修改token driver

編輯/etc/keystone/keystone.conf [token] section,將

driver = keystone.token.persistence.backends.sql.Token

修改為

driver = keystone.token.persistence.backends.memcache.Token

并且確認enable caching功能,

caching=true

3.3.2 啟動memcached服務

yum install memcached python-memcached

systemctl enable memcached.service

systemctl start memcached.service

3.3.3 修改keystone [memcache] section配置

先查詢memcache使用的端口,

[root@juanniu032019 ~(keystone_admin)]# netstat -antp | grep memcache

tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 8159/memcached

默認情況下,memcache監聽的端口都是11211,這是在

/etc/sysconfig/memcached配置文件中進行配置的。

然后修改/etc/keystone/keystone.conf的[memcache] sectionservers = localhost:11211

3.3.4 restart keystone service

systemctl restart httpd.service

3.3.5 確認是否修改成功

在確認是否修改成功前,先重新登錄下dashboard,這樣會產生新的token。

有多種方式都可以確認是否修改成功,下面列舉了四種

1)telnet 127.0.0.1 11211

openstack multi-region管理

2)lsof -i :11211

如果輸出中有服務跟memcache建立了連接,如下圖所示

openstack multi-region管理

然后再查詢keystone service使用的port是否可以對上

openstack multi-region管理

3)netstat -antp | grep memcache如果已經有服務跟memcache建立連接,并且建立連接的keystone服務,那么就說明memcache生效了。

openstack multi-region管理

4)不斷的登錄/退出dashboard,然后查看keystone數據中token表中的記錄數是否變化

select count(*) from keystone.token;

不斷的登錄/退出dashboard,如果token表中的記錄數沒有變化,就說明keystone token driver不再使用mysql,此時又可以正常的登錄,間接地說明memcache生效了。

3.3 創建multi-region

3.3.1 備份keystone database

因為后面要修改兩個region的keystone數據庫,為了出現問題后可以恢復,這里先把備份下兩個cluster的keystone數據庫。

cluster-1:

mysqldump -uroot keystone > keystone.cluster-1_bak.sql

cluster-2:

mysqldump -uroot keystone > keystone.cluster-2_bak.sql

3.3.2 修改cluster-2的region name為RegionTwo

1)在region table中插入一個'RegionTwo'記錄

insert into keystone.region(id,extra) values ('RegionTwo','{}');

2)修改endpoint table中的所有記錄的region_id為'RegionTwo'

update keystone.endpoint set region_id='RegionTwo';

3)刪除region table中的'RegionOne'記錄

delete from keystone.region where id='RegionOne';

在驗證是否修改成功之前,需要修改/root/keystonerc_admin,將OS_REGION_NAME修改為RegionTwo,然后重新source /root/keystonerc_admin,

驗證region name是否修改成功,如下圖所示

openstack multi-region管理

3.3.3 備份RegionTwo的endpoint、service table

備份RegionTwo上的keystone數據中的endpoint、service table是為了將這兩個table中的記錄導入到RegionOne上的keystone數據庫中的endpoint、service table。

mysqldump -uroot keystone endpoint > keystone.endpoint_RegionTwo.sql

mysqldump -uroot keystone service > keystone.service_RegionTwo.sql

其實,endpoint table可以不備份,因為在RegionOne上執行以下命令也會在RegionOne的keystone數據中的endpoint table中插入RegionTwo上的各個service的endpoint記錄

openstack endpoint create --publicurl --internalurl --adminurl --region RegionTwo

并且以上命令,還會在RegionOne的keystone數據庫的region table中插入'RegionTwo'記錄。但是由于命令操作比較麻煩,每個service都要創建endpoint,還是直接導數據庫簡單。

另外,需要把導出的endpoint、service table文件中的‘判斷是否存在endpoint(service) table,如果存在就刪除,以及后面緊跟著的創建endpoint(service) table’ 的處理刪除,如下截圖所示(以endpoint table為例)

openstack multi-region管理

因為這兩個table的導出文件是要導入到RegionOne的keystone的endpoint、service table中的,因為在RegionOne的keystone數據庫中已經有endpoint、service table了,并且也有記錄了,是不可以刪除的,我們只是要合并兩個region的keystone的endpoint、service table。

3.3.4 RegionOne的keystone的region table插入RegionTwo記錄

insert into region(id,extra) values ('RegionTwo','{}');在3.3.3中也注明過,通過openstack endpoint create --region RegionTwo也可以在region table增加'RegionTwo'記錄。

3.3.5 在RegionOne上導入RegionTwo上導出的endpoint、service table

1)將RegionTwo上導出的endpoint、service table拷貝到RegionTwo的controller node上

2)將拷貝的endpoint、service table導入到10.13.32.19的keystone的相應的endpoint service table中

mysql -uroot keystone < keystone.endpoint_RegionTwo.sqlmysql -uroot keystone < keystone.service_RegionTwo.sql

3)修改RegionTwo的identity的三個endpoint(publicurl,internalurl,admin url)

update endpoint set url='http://10.13.32.19:5000/v2.0' where id='6e114696c6464a879d08fef46fd7b9cc';

update endpoint set url='http://10.13.32.19:5000/v2.0' where id='aa5496200239498485257761026e825e';

update endpoint set url='http://10.13.32.19:35357/v2.0' where id='a3b4da535c09421c93f3da257fa2cae5';

其中6e114696c6464a879d08fef46fd7b9cc、aa5496200239498485257761026e825e、a3b4da535c09421c93f3da257fa2cae5對應的是RegionTwo的identity service的 三個endpoint(public,internal,admin)的id

4)驗證是否修改成功

①確認endpoint list中是否都已經添加進去

openstack multi-region管理

②確認RegionTwo的identity service的三個url是否已經修改成功

openstack multi-region管理

3.3.6 修改RegionTwo的所有節點的各個service的authencation endpoint

修改RegionTwo上所有service訪問認證endpoint為RegionOne的keystone service。

默認情況下,keystone service提供服務的兩個端口為5000和35357,可以通過以下命令搜到到修改點

service-auth-endpoint.png

openstack multi-region管理

其中,/etc/openstack-dashboard/local_settings是不需要修改的,因為RegionTwo上的dashboard服務是不需要跟RegionTwo上的keystone service交互的。然后逐個去修改,將10.13.131.137修改為10.13.32.19。另外,上圖中搜索出來的內容之所以被注釋掉了,是因為我已經做了修改。

需要額外注意的就是/etc/cinder/cinder.conf [keymgr] section,

需要將 #encryptionauthurl = http://localhost:5000/v3

修改為

encryptionauthurl = http://10.13.32.19:5000/v3

如果在dashboard上修改project的quota時會報以下錯誤

“Error: Unable to retrieve volume limit information”

請參考

Bug 1272572 - Error: Unable to retrieve volume limit information when accessing System Defaults in Horizon

3.3.9 修改RegionTwo的各個service的admin pass

需要修改RegionTwo上的各個service的admin pass,跟RegionOne上相應service的admin pass保持一致。 可以通過find /etc/ -type f | xargs grep admin_pass搜到相關的修改點,以nova為例進行說明,編輯/etc/nova/nova.conf

openstack multi-region管理

3.3.10 重啟RegionTwo上的各個service

需要重啟RegionTwo上的各個service,讓上面的修改生效。

3.4 keystone數據庫配置master-slave

請參考 Openstack Mysql 主備服務器搭建

3.5 keystone service無法給其他region上的各個service提供訪問認證服務時,其他Region仍可管理

RegionOne上的keystone service無法給RegionTwo上的各個service提供訪問認證服務的場景很多,最典型的就是RegionOne和RegionTwo之間的網絡中斷了,這時就要考慮如何單獨的管理RegionTwo。這時需要revert3.3.6中做的修改,然后重啟各個service,讓RegionTwo上各個service重新使用RegionOne上的keystone service進行訪問認證。這時就可以使用RegionTwo上的dashboard來管理RegionTwo,不過有一點需要注意,由于現在RegionTwo上的keystone數據庫是read-only的,是不可以創建user,project,service等操作的。

遺留問題

4.1 memcache size

可以使用memcached-tool 127.0.0.1:11211 stats來查看memcache的空間是否緊張,如下圖所示

openstack multi-region管理

如果touchmisses持續增加,可以適當調大memcache size,可以通過編輯/etc/sysconfig/memcached,改大CACHESIZE的值。當調大cache size后,如果發現totalitems, total_connections有所增加,就說明調大cache size是有效果的。

來自: http://mogu.io/178-178

 本文由用戶 rxra5030 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!