数据中心常常通过 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 -ysystemctl enable mysqlsystemctl start mysqld
复制代码
关闭 Selinux,selinux 会造成 keepalived 脚本运行 gcloud 命令失败。
vim /etc/sysconfig/selinuxSELINUX=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 keepalivedglobal_defs {router_id mysql-1}vrrp_script chk_appsvc {#检查服务状态脚本script /etc/keepalived/bin/keepalived-check-appsvc.shinterval 2 #检查周期fall 2rise 2}vrrp_instance VI_1 {state MASTER #初始状态interface eth0virtual_router_id 51priority 100 #优先级#keepalived多台机器间通讯采用单播方式,这个是本机地址unicast_src_ip 10.1.1.11#keepalived多台机器间通讯采用单播方式,这个是对端地址unicast_peer {10.1.1.12}track_script { #检查本节点的状态chk_appsvc}advert_int 1nopreemptauthentication { #keepalived间的认证auth_type PASSauth_pass 1111}#Keepalived的浮动IPvirtual_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.logchmod +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" ]; thenexit 0elseexit 1fi
复制代码
Notification Script:
vim keepalived-action.sh
#!/bin/bashTYPE=$1NAME=$2STATE=$3#如果Keepalived状态成为Master,运行add_alias脚本case $STATE in"MASTER") /etc/keepalived/bin/add_alias.shexit 0;;#如果Keepalived状态成为其他,运行rm_alias脚本"BACKUP"|"STOP") /etc/keepalived/bin/rm_alias.sh $STATEexit 0;;"FAULT")/etc/keepalived/bin/rm_alias.sh $STATEexit 0;;*)/etc/keepalived/bin/rm_alias.sh $STATEexit 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" ]; thenecho $time "add alias IP to vm1 success" >> /tmp/keepalived.logelseecho $time "add alias IP to vm1 fail" >> /tmp/keepalived.logfiif [ "$rma" == "0" ]; thenecho $time "remove alias IP from vm2 success" >> /tmp/keepalived.logelseecho $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" ]; thenecho $time "add alias IP to vm2 success" >> /tmp/keepalived.logelseecho $time "add alias IP to vm2 fail" >> /tmp/keepalived.logfiif [ "$rma" == "0" ]; thenecho $time "remove alias IP from vm1 success" >> /tmp/keepalived.logelseecho $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:
会看到 VM2 状态转为 Fail:
在 VM1 上,keepalived 转为 Master 状态:
同时在客户端重新连接 MySQL 服务器,并检测:
可以看到,已经切换至 VM1 上了。
三 总结
Keepalived 和Google Cloud Alias IP 配合,可以非常便捷地实现主备 Cluster。