openstack高可用

openstack ha

基础知识

高可用 (High Availability,简称 HA)

  高可用性是指提供在本地系统单个组件故障情况下,能继续访问应用的能力,无论这个故障是业务流程、物理设施、IT软/硬件的故障。最好的可用性, 就是你的一台机器宕机了,但是使用你的服务的用户完全感觉不到。你的机器宕机了,在该机器上运行的服务肯定得做故障切换(failover),切换有两个维度的成本:RTO (Recovery Time Objective)和 RPO(Recovery Point Objective)。RTO 是服务恢复的时间,最佳的情况是 0,这意味着服务立即恢复;最坏是无穷大意味着服务永远恢复不了;RPO 是切换时向前恢复的数据的时间长度,0 意味着使用同步的数据,大于 0 意味着有数据丢失,比如 ” RPO = 1 天“ 意味着恢复时使用一天前的数据,那么一天之内的数据就丢失了。因此,恢复的最佳结果是 RTO = RPO = 0,但是这个太理想,或者要实现的话成本太高,全球估计 Visa 等少数几个公司能实现,或者几乎实现。

  对 HA 来说,往往使用共享存储,这样的话,RPO =0 ;同时往往使用 Active/Active (双活集群) HA 模式来使得 RTO 几乎0,如果使用 Active/Passive 模式的 HA 的话,则需要将 RTO 减少到最小限度。HA 的计算公式是[ 1 - (宕机时间)/(宕机时间 + 运行时间)],我们常常用几个 9 表示可用性:

  • 2 个9:99% = 1% * 365 = 3.65 * 24 小时/年 = 87.6 小时/年的宕机时间
  • 4 个9: 99.99% = 0.01% * 365 * 24 * 60 = 52.56 分钟/年
  • 5 个9:99.999% = 0.001% * 365 = 5.265 分钟/年的宕机时间,也就意味着每次停机时间在一到两分钟。
  • 11 个 9:几乎就是几年才宕机几分钟。 据说 AWS S3 的设计高可用性就是 11 个 9。

服务的分类

HA 将服务分为两类:

有状态服务:后续对服务的请求依赖于之前对服务的请求。
OpenStack有状态的服务包括OpenStack数据库和消息队列。
无状态服务:对服务的请求之间没有依赖关系,是完全独立的。
OpenStack无状态的服务包括nova-api、nova-conductor、glance-api、keystone-api、neutron-api、nova-scheduler。

HA 的种类

HA 需要使用冗余的服务器组成集群来运行负载,包括应用和服务。这种冗余性也可以将 HA 分为两类:

Active/Passive HA:集群只包括两个节点简称主备。在这种配置下,系统采用主和备用机器来提供服务,系统只在主设备上提供服务。在主设备故障时,备设备上的服务被启动来替代主设备提供的服务。典型地,可以采用 CRM 软件比如 Pacemaker 来控制主备设备之间的切换,并提供一个虚机 IP 来提供服务。
Active/Active HA:集群只包括两个节点时简称双活,包括多节点时成为多主(Multi-master)。在这种配置下,系统在集群内所有服务器上运行同样的负载。以数据库为例,对一个实例的更新,会被同步到所有实例上。这种配置下往往采用负载均衡软件比如 HAProxy 来提供服务的虚拟 IP。

1、主动/被动(Active/Passive)配置
主备概念,主节点出问题时,备节点顶上。一般用VIP实现,使用Pacemaker和Corosync。

2、主动/主动(Active/Active)配置
无状态使用VIP进行负载平衡,可以使用HAProxy软件。

Openstack controller ha实现方案

本次的ha测试环境采用五台物理机,其中三台为controller节点,一台为compute ,一台为network
controller节点上,整体的架构图如下:


三台物理服务器组成 pacemaker 集群,创建多个虚机,安装各种应用,具体如下:

Service Process Mode HA stragegy
keystone httpd AA 负载均衡+多实例
glance openstack-glance-api AA 负载均衡+多实例
glance openstack-glance-registry AA 负载均衡+多实例
nova openstack-nova-api AA 负载均衡+多实例
nova openstack-nova-conductor AA AMQP+多实例
nova openstack-nova-scheduler AA AMQP+多实例
nova openstack-nova-consoleauth AA AMQP+多实例
nova openstack-nova-novncproxy AA 负载均衡+多实例
neutron neutron-server AA 负载均衡+多实例
cinder openstack-cinder-api AA 负载均衡+多实例
cinder openstack-cinder-scheduler AA AMQP+多实例
cinder openstack-cinder-volume AA 主备+pacemaker切换
mysql Mariadb-server AA Galera cluster
rabbitmq rabbitmq-server AA cluster + mirror queue
haproxy haproxy AP 多实例+pacemaker切换VIP
memcache memcached AA 负载均衡+多实例

具体的配置过程如下:

# 在所有lb节点,安装pacemaker组件,启动pcsd服务,并配置hacluster账户
$ yum install -y pacemaker pcs psmisc policycoreutils-python
$ systemctl start pcsd.service
$ systemctl enable pcsd.service
$ echo <some_password> | passwd hacluster --stdin

# 在任意一个节点初始化lb集群
$ pcs cluster auth ip1 ip2 ip3
Username: hacluster
Password:
server-33: Authorized
server-34: Authorized
server-35: Authorized
$ pcs cluster setup --name lb_cluster ip1 ip2 ip3

# 在所有lb节点,启动corosync & pacemaker服务
$ systemctl start corosync.service
$ systemctl enable corosync.service
$ systemctl start pacemaker.service
$ systemctl enable pacemaker.service


# 配置lb集群的特性
$ pcs property set stonith-enabled=false
$ pcs property set no-quorum-policy=ignore
$ pcs property set start-failure-is-fatal=false
$ pcs resource defaults resource-stickiness=10


# 创建vip与haproxy资源,并添加限制,确保p_vip运行在haproxy服务正常的节点
$ pcs resource create p_vip ocf:heartbeat:IPaddr2 ip=ip4 cidr_netmask=24 op monitor interval=2s
$ pcs resource create p_haproxy systemd:haproxy op monitor interval=2s --clone
$ pcs constraint colocation add p_vip with p_haproxy-clone --force
$ pcs resource meta p_vip migration-threshold=3 failure-timeout=60s
# 下面是pacemaker+corosync+galera的安装过程
# 在此之前先创建集群,创建方法参考pacemaker+corosync+haproxy
# 安装必要的包
$ yum install -y MariaDB-server MariaDB-client percona-xtrabackup socat #MariaDB的版本不要是5.0.x  ,使用10.1.x,否则会报错
$ yum install -y pacemaker pcs psmisc policycoreutils-python
$ yum install -y openstack-resource-agent


# 创建用户wsrep_sst
$ mysql -e 'grant all on *.* to "wsrep_sst"@"%" identified by "DJ1JAs8z"'
$ mysql -e 'grant all on *.* to "wsrep_sst"@"localhost" identified by "DJ1JAs8z"'


# 写入配置 /etc/my.cnf.d/wsrep.cnf,注意后缀是cnf,完成garela集群的配置
[mysqld]
binlog_format=row
wsrep_on=ON
wsrep_cluster_address="gcomm://ip1,ip2,ip3?pc.wait_prim=no"  # 三台 MariaDB 的 IP
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name="openstack"
wsrep_slave_threads=4
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=wsrep_sst:DJ1JAs8z
wsrep_node_address=ip1      # 本机的地址
[xtrabackup]
parallel=2
[sst]
streamfmt=xbstream
transferfmt=socat
sockopt=,nodelay,sndbuf=1048576,rcvbuf=1048576


# 配置pacemaker管理Galera集群
$ pcs resource create p_mysql ocf:mysql-wss binary=/usr/sbin/mysqld test_passwd=DJ1JAs8z test_user=wsrep_sst socket=/var/lib/mysql/mysql.sock --disabled --clone
# 注意,这一步的mysql-wss可以在github上搜到,需要在/usr/lib/ocf/resource.d/放入mysql-wss
$ pcs resource update p_mysql op monitor interval=90 timeout=300
$ pcs resource update p_mysql op stop interval=0 timeout=120
$ pcs resource update p_mysql op start interval=0 timeout=300

# 启动数据库服务
$ pcs resource enable p_mysql

使用 HAProxy 的反向代理功能代理后端的 Galera 集群

# 在galera 节点安装xinetd服务,并在/etc/xinetd.d/目录下创建galeracheck:


service galeracheck
{
        port            = 49000
        disable        = no
        socket_type    = stream
        protocol        = tcp
        wait            = no
        user            = nobody
        group          = nobody
        groups          = yes
        server          = /usr/bin/galeracheck
        bind            = 0.0.0.0
        only_from      = 0.0.0.0
        per_source      = UNLIMITED
        cps            = 512 10
        flags          = IPv4
        instances      = UNLIMITED
}

# galeracheck的来源及配置项:https://github.com/olafz/percona-clustercheck

# 最后 /etc/haproxy/haproxy.cfg:
listen mysql
  bind 0.0.0.0:3307
  mode tcp
  balance source
  option tcplog
  option clitcpka
  option srvtcpka
  option httpchk
  timeout client 48h
  timeout server 48h
  server mysql-2 192.168.0.7:3306 check port 49000 inter 5000 rise 2 fall 3 backup
  server mysql-3 192.168.0.8:3306 check port 49000 inter 5000 rise 2 fall 3 backup
  server mysql-1 192.168.0.6:3306 check port 49000 inter 10s fastinter 2s downinter 3s rise 3 fall 2s

参考:
世民谈云计算

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容