数据中心常常通过 Keepalived 来实现 MySQL 的 cluster。但在公有云上,由于不支持组播和广播,Keepalived 的 cluster IP 并不能被其他主机识别,传统配置方法并不适用。
Google Cloud Computer Engine 具有 Alias IP 功能,该功能可为 VM 增加第二个 IP 地址,其他 VM 可通过这个 IP 地址连接 GCE。
借此,可将 Alias IP 作为 Cluster IP,配合 Keepalived,进而实现高可用的 Cluster:
通过共有云 VPC 系统路由,向其他 VM 宣告该 alias IP 的存在
通过 Keepalived 的服务检测机制和选举机制,实现浮动 IP 对应 Alias IP,同时利用脚本控制 alias IP 所关联的 VM
两台 MySQL 服务器配置为 HA 模式,本文不做赘述。
一 Alias IP 功能
如下图所示:
可通过 Google Cloud SDK 设置 VM alias IP。
二 实现方法
1 Google Cloud VM 创建
创建两台 CentOS7 VM:
鉴于需要控制 alias IP,所以需要 Compuyte Engine 的权限:
其他部分为常规配置。
2 安装 MySQL
yum install -y wget
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
yum install mysql-community-release-el7-5.noarch.rpm -y
yum makecache
yum install mysql-community-server -y
systemctl enable mysql
systemctl start mysqld
关闭 Selinux,selinux 会造成 keepalived 脚本运行 gcloud 命令失败。
vim /etc/sysconfig/selinux
SELINUX=disabled
MySQL 中创建密码和授权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'redhat' WITH GRANT OPTION;
FLUSH PRIVILEGES;
3 安装 keepalived
yum install keepalived -y
cd /etc/keepalived
Cluster-VM1 的配置
vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id mysql-1
}
vrrp_script chk_appsvc {
#检查服务状态脚本
script /etc/keepalived/bin/keepalived-check-appsvc.sh
interval 2 #检查周期
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER #初始状态
interface eth0
virtual_router_id 51
priority 100 #优先级
#keepalived多台机器间通讯采用单播方式,这个是本机地址
unicast_src_ip 10.1.1.11
#keepalived多台机器间通讯采用单播方式,这个是对端地址
unicast_peer {
10.1.1.12
}
track_script { #检查本节点的状态
chk_appsvc
}
advert_int 1
nopreempt
authentication { #keepalived间的认证
auth_type PASS
auth_pass 1111
}
#Keepalived的浮动IP
virtual_ipaddress {
10.1.1.200
}
#Keepalived选举后的脚本
notify /etc/keepalived/bin/keepalived-action.sh
}
Cluster-VM2 的配置与 VM1 类似,只需要修改优先级、本机和对端 IP 地址。
4 Keepalived 脚本
在 Cluster-VM1 上创建 keepalived 相关脚本:
mkdir bin
cd bin
#在本机keepalived成为Master时,给本机添加Alias IP
touch add_alias.sh
#notification script,根据keepalived的状态执行不同的脚本
touch keepalived-action.sh
#检查本机服务状态
touch keepalived-check-appsvc.sh
#在本机keepalived成为Backup或其他状态时,删除Alias IP
touch rm_alias.sh
#log文件,显示状态
touch /tmp/keepalived.log
chmod +x *
chmod 777 /tmp/keepalived.log
Tracking Script:
vim keepalived-check-appsvc.sh
#!/bin/bash
MYSQL_PWD="redhat" #MySQL登录信息
MYSQL_USERNAME="root"
MYSQL_HOST="10.1.1.11"
。
#检查MySQL的databases,如果能够查询到performance_schema,
#说明MySQL工作正常
mysql_status=`mysql -h$MYSQL_HOST -u$MYSQL_USERNAME -p$MYSQL_PWD -s -e "show databases;" 2>&1 | grep performance_schema | wc -l`
#如果MySQL正常,正常退出,否则exit 1
if [ "$mysql_status" == "1" ]; then
exit 0
else
exit 1
fi
Notification Script:
vim keepalived-action.sh
#!/bin/bash
TYPE=$1
NAME=$2
STATE=$3
#如果Keepalived状态成为Master,运行add_alias脚本
case $STATE in
"MASTER") /etc/keepalived/bin/add_alias.sh
exit 0
;;
#如果Keepalived状态成为其他,运行rm_alias脚本
"BACKUP"|"STOP") /etc/keepalived/bin/rm_alias.sh $STATE
exit 0
;;
"FAULT")
/etc/keepalived/bin/rm_alias.sh $STATE
exit 0
;;
*)
/etc/keepalived/bin/rm_alias.sh $STATE
exit 1
;;
esac
添加 Alias IP 脚本:
vim add_alias.sh
#!/bin/bash
time=$(TZ=Asia/Shanghai date "+%Y-%m-%d %H:%M:%S")
#记录keepalived状态
echo $time "vm1 become master" >> /tmp/keepalived.log
#删除Cluster-VM2的Alias IP
/usr/bin/gcloud compute instances network-interfaces update cluster-vm2 --zone asia-east1-b --aliass ""
#添加Alias IP给Cluster-VM1
/usr/bin/gcloud compute instances network-interfaces update cluster-vm1 --zone asia-east1-b --aliass "10.1.1.200/32"
#检测是否成功
adda=`/usr/bin/gcloud compute instances describe cluster-vm1 --zone asia-east1-b | grep ipCidrRange | wc -l`
rma=`/usr/bin/gcloud compute instances describe cluster-vm2 --zone asia-east1-b | grep ipCidrRange | wc -l`
#添加Log
if [ "$adda" == "1" ]; then
echo $time "add alias IP to vm1 success" >> /tmp/keepalived.log
else
echo $time "add alias IP to vm1 fail" >> /tmp/keepalived.log
fi
if [ "$rma" == "0" ]; then
echo $time "remove alias IP from vm2 success" >> /tmp/keepalived.log
else
echo $time "remove alias IP from vm2 fail" >> /tmp/keepalived.log
fi
删除 Alias IP 脚本
vim rm_alias.sh
#!/bin/bash
time=$(TZ=Asia/Shanghai date "+%Y-%m-%d %H:%M:%S")
#记录keepalived状态
echo $time "vm1 become" $1 >> /tmp/keepalived.log
#删除本机Alias IP
/usr/bin/gcloud compute instances network-interfaces update cluster-vm1 --zone asia-east1-b --aliass ""
#检查状态
adda=`/usr/bin/gcloud compute instances describe cluster-vm2 --zone asia-east1-b | grep ipCidrRange | wc -l`
rma=`/usr/bin/gcloud compute instances describe cluster-vm1 --zone asia-east1-b | grep ipCidrRange | wc -l`
#添加Log
if [ "$adda" == "1" ]; then
echo $time "add alias IP to vm2 success" >> /tmp/keepalived.log
else
echo $time "add alias IP to vm2 fail" >> /tmp/keepalived.log
fi
if [ "$rma" == "0" ]; then
echo $time "remove alias IP from vm1 success" >> /tmp/keepalived.log
else
echo $time "remove alias IP from vm1 fail" >> /tmp/keepalived.log
fi
Cluster-VM2 脚本与 Cluster-VM1 类似,只需将 IP 和 VM 名称交换。
5 启动 Keepalived
systemctl enable keepalived
systemctl start keepalived
启动 keepalived 后,通过以下命令查看状态:
ip a #查看Keepalived的floating IP是否添加成功
ip route list table local #查看Alias IP是否添加成功
cat /tmp/keepalived.log #查看keepalived的日志状态
6 检查
通过 ping 以及 mysql 客户端连接 alias IP:
[root@testcentos7 bin]# ping 10.1.1.200
PING 10.1.1.200 (10.1.1.200) 56(84) bytes of data.
64 bytes from 10.1.1.200: icmp_seq=1 ttl=64 time=1.72 ms
64 bytes from 10.1.1.200: icmp_seq=2 ttl=64 time=0.326 ms
^[c64 bytes from 10.1.1.200: icmp_seq=3 ttl=64 time=0.308 ms
^C
--- 10.1.1.200 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2009ms
rtt min/avg/max/mdev = 0.308/0.786/1.725/0.664 ms
[root@testcentos7 bin]# mysql -h10.1.1.200 -uroot -predhat
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
mysql> show variables where Variable_name like '%hostname%';
+---------------+-------------+
| Variable_name | Value |
+---------------+-------------+
| hostname | cluster-vm2 |
+---------------+-------------+
1 row in set (0.00 sec)
在 VM2 上关闭 mysqld:
systemctl stop mysqld
会看到 VM2 状态转为 Fail:
在 VM1 上,keepalived 转为 Master 状态:
同时在客户端重新连接 MySQL 服务器,并检测:
可以看到,已经切换至 VM1 上了。
三 总结
Keepalived 和 Google Cloud Alias IP 配合,可以非常便捷地实现主备 Cluster。
文章版权归作者所有,未经许可不得转载
更多内容推荐
在 Kubernetes 上运行高可用的 WordPress 和 MySQL
本文来自RancherLabs微信公众号
构建健壮的混合云网络——BJS VPN 篇
越来越多的用户选择利用公有云在弹性、灵活性等方面的优势
带着问题了解 Openstack Neutron 安全组(上)
Group和一般网络问题的解决思路吧。Neutron安全组的问题。Server是由Hulk云平台创建的Openstack虚拟机。
SD-WAN 和专线混合组网中的高可用设计(二)
主要会讲解针对之前的架构,如何实施高可用。
Github 工程师为 MySQL 高可用性采用了新架构
Github.com使用MySQL作为其许多关键服务的主干,如对外API,身份验证和Github.com网站本身。 Github的工程师团队用基于Orchestrator,Consul和Github负载均衡器的设置替换了之前基于DNS和VIP的设置以脑裂和DNS缓存问题。
Kubernetes 应用动态配置实验
2019 年 9 月 25 日
优步工程团队对容器化 MySQL 的应用
优步工程团队的Schemaless存储系统驱动着优步内部一些最大规模的服务,例如Mezzanine。Schemaless是一种基于MySQL集群的可缩放、高可用数据存储。当我们最初只有16个集群时,这些集群的管理工作相当简单,但是目前我们有超过1000个集群,其中承载了超过4000个数据库服务器,我们的管理工具也需要与时俱进了。
第 25 讲 | 软件定义网络:共享基础设施的小区物业管理办法
这节我介绍SDN、SDN的开源实现方式,两个解析OpenvSwitch的实验,以及在云计算中使用OpenvSwitch。
2018 年 7 月 13 日
Docker 1.12.0 改进了服务的负载均衡参数
在最新发布的 1.12.0 版本中,当在集群中启动服务时,Docker 通过 DNS 和 IP 虚拟服务器(IPVS)为服务的负载均衡引入了新的参数。
深入理解 StatefulSet(一):拓扑状态
StatefulSet的作用之一,就在是使用Pod模板创建Pod时,对它们进行编号,并且按照编号顺序逐一完成创建工作。
2018 年 10 月 3 日
基于 Keepalived 实现京东云接入服务组件高可用
京东云命令行简介
PostgreSQL、Neo4J 进入云端领域
PostgreSQL和Neo4J,分别为关系型数据库和图形数据库,这两者最近都做出了进军云领域的举措。
使用 Velostrata 从 AWS/Azure 迁移 VM 到 GCP
从AWS/Azure迁移VM到GCP到GCE,可以采用Google到VM迁移工具Velostrata
云环境下的授权该怎么做?
今天,我们来聊一聊Kafka的授权机制。希望你能将这两讲内容结合起来学习,打造一个超级安全的Kafka集群。
2019 年 8 月 20 日
开普勒云平台:如何安装依赖(一)
本文介绍开普勒云平台如何安装依赖。
《Kubernetes 与云原生应用》系列之实践案例“单节点多容器模式”
《Kubernetes与云原生应用》专栏是InfoQ向轻元科技首席架构师王昕约稿的系列文章。本专栏包含8篇内容,本文是该专栏的第四篇,阅读本系列全部内容请在细说云计算微信公众号(CloudNote)回复K8s。
Spotify 开源其 Cassandra 编排工具 cstar
Spotify最近开源了其Cassandra编排工具cstar。Cstar是一个命令行工具,用于在Cassandra集群中的所有主机上运行脚本。
Google 提供 Cloud SQL,借此扩展云服务
Google目前正在把MySQL做成全面管理的服务纳入云中,其中包括一套用编程方式管理MySQL的JSON API。
谈谈 Service 与 Ingress
在实际的生产环境中,Ingress带来的灵活度和自由度,对于使用容器的用户来说,其实是非常有意义的。
2018 年 11 月 21 日
协议专栏特别福利 | 答疑解惑第五期
最后一期答疑涵盖第22讲至第36讲的内容。欢迎你继续提问!
2018 年 8 月 29 日
推荐阅读
手把手教你搭建 Kubernetes 1.4 集群
第 40 讲 | 搭建一个网络实验环境:授人以鱼不如授人以渔
2018 年 8 月 17 日
第 24 讲 | 云中网络:自己拿地成本高,购买公寓更灵活
2018 年 7 月 11 日
Vmware+Ubuntu 配置静态 IP
2020 年 12 月 31 日
dba+ 开源工具:面向开发的 MongoDB 图形可视化监控
CentOS 7 实战 Kubernetes 部署
从外界连通 Service 与 Service 调试“三板斧”
2018 年 11 月 19 日
电子书
大厂实战PPT下载
换一换 杨钦民 | 唯品会 企业应用架构部架构师
张宏伟 | 美菜网 中台研发中心交易平台部技术专家
张宗红 | 陆金所 架构专家,框架中间件负责人
评论