写点什么

GCE+ 辅助 IP,实现基于 Keepalived 和 MySQL 的高可用集群

2020 年 3 月 06 日

GCE+辅助 IP,实现基于 Keepalived 和 MySQL 的高可用集群

数据中心常常通过 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 wgetwget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpmyum install mysql-community-release-el7-5.noarch.rpm -yyum makecacheyum install mysql-community-server -y
systemctl enable mysqlsystemctl 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 -ycd /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 bincd bin
#在本机keepalived成为Master时,给本机添加Alias IPtouch 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/bashMYSQL_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 1if [ "$mysql_status" == "1" ]; then                   exit 0else  exit 1fi
复制代码


Notification Script:


vim keepalived-action.sh


#!/bin/bash
TYPE=$1NAME=$2STATE=$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/bashtime=$(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`
#添加Logif [ "$adda" == "1" ]; then echo $time "add alias IP to vm1 success" >> /tmp/keepalived.logelse echo $time "add alias IP to vm1 fail" >> /tmp/keepalived.logfi
if [ "$rma" == "0" ]; then echo $time "remove alias IP from vm2 success" >> /tmp/keepalived.logelse echo $time "remove alias IP from vm2 fail" >> /tmp/keepalived.logfi
复制代码


删除 Alias IP 脚本


vim rm_alias.sh


#!/bin/bashtime=$(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`
#添加Logif [ "$adda" == "1" ]; then echo $time "add alias IP to vm2 success" >> /tmp/keepalived.logelse echo $time "add alias IP to vm2 fail" >> /tmp/keepalived.logfi
if [ "$rma" == "0" ]; then echo $time "remove alias IP from vm1 success" >> /tmp/keepalived.logelse echo $time "remove alias IP from vm1 fail" >> /tmp/keepalived.logfi
复制代码


Cluster-VM2 脚本与 Cluster-VM1 类似,只需将 IP 和 VM 名称交换。


5 启动 Keepalived


systemctl enable keepalivedsystemctl 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.200PING 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 ms64 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 2009msrtt min/avg/max/mdev = 0.308/0.786/1.725/0.664 ms
[root@testcentos7 bin]# mysql -h10.1.1.200 -uroot -predhatWarning: 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。


文章版权归作者所有,未经许可不得转载


2020 年 3 月 06 日 21:50402

评论

发布
暂无评论
发现更多内容

架构师训练营-第一周学习总结

戚伟

架构师

Week_01学习总结

golangboy

极客大学架构师训练营

第一周 UML图

mm马

Week 1 學習總結

Christy LAW

极客食堂就餐卡系统设计

IT老兵重开始

极客大学架构师训练营 第一周命题作业

食堂就餐卡系统设计

行者

UML学习总结

行者

# 架构师训练营Week1作业

lggl

极客大学架构师训练营

极客时间架构1期:第1周架构方法-学习总结

Null

架构师训练营 - week1 - 学习总结

month

极客大学架构师训练营

架构师方法论

wing

极客大学架构师训练营

第一周命题作业

BOBBB

UML for Cafeteria System

架构师训练营 第一周作业

haha

极客大学架构师训练营

第一周学习总结

饭桶

初学架构方法

Zzzz

极客大学架构师训练营

架构师训练营第一期第一周总结

cyningchen

极客大学架构师训练营

第一周总结

_

极客时间 架构师 极客大学架构师训练营 第一周总结

「架构师训练营第 1 期」第一周作业(作业一)

Geek_83908e

极客大学架构师训练营

架构师第一周

Geek_Gu

极客大学架构师训练营

ARTS Week17

时之虫

极客时间架构 1 期:第 1 周架构方法 - 命题作业

Null

食堂就餐卡系统设计

饭桶

第一周课程学习总结

Meow

极客大学架构师训练营 第一周总结

独孤求败的五把剑,三个人生阶段 -Week1- 学习总结

小粽

第一周学习总结

jizhi7

极客大学架构师训练营

「架构师训练营第 1 期」第一周作业 (作业二)

Geek_83908e

极客大学架构师训练营

week-1-part1 食堂就餐卡系统设计

陈龙

极客大学架构师训练营

就餐卡系统设计

golangboy

极客大学架构师训练营

极客时间-架构师一期-第一周作业

_

极客时间 架构师 极客大学架构师训练营 第一周命题作业

架构师训练营学习笔记

Erwa

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

GCE+辅助 IP,实现基于 Keepalived 和 MySQL 的高可用集群-InfoQ