数据中心常常通过 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:


systemctl stop mysqld
复制代码


会看到 VM2 状态转为 Fail:



在 VM1 上,keepalived 转为 Master 状态:



同时在客户端重新连接 MySQL 服务器,并检测:



可以看到,已经切换至 VM1 上了。


三 总结


Keepalived 和Google Cloud Alias IP 配合,可以非常便捷地实现主备 Cluster。



相关推荐