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間的交互開銷。 該方案如下圖所示
在上圖中,左邊的集群是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切換功能,如下圖所示
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節點,如下表所示
我是使用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
2)lsof -i :11211
如果輸出中有服務跟memcache建立了連接,如下圖所示
然后再查詢keystone service使用的port是否可以對上
3)netstat -antp | grep memcache如果已經有服務跟memcache建立連接,并且建立連接的keystone服務,那么就說明memcache生效了。
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是否修改成功,如下圖所示
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為例)
因為這兩個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中是否都已經添加進去
②確認RegionTwo的identity service的三個url是否已經修改成功
3.3.6 修改RegionTwo的所有節點的各個service的authencation endpoint
修改RegionTwo上所有service訪問認證endpoint為RegionOne的keystone service。
默認情況下,keystone service提供服務的兩個端口為5000和35357,可以通過以下命令搜到到修改點
service-auth-endpoint.png
其中,/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
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的空間是否緊張,如下圖所示
如果touchmisses持續增加,可以適當調大memcache size,可以通過編輯/etc/sysconfig/memcached,改大CACHESIZE的值。當調大cache size后,如果發現totalitems, total_connections有所增加,就說明調大cache size是有效果的。