Mysql主从之keepalived保证高可用搭建详细教程

简介

在很早之前搭建过Mysql的主从,但是当时年幼无知,没有想到过高可用怎么保证,这两天在复习以前的笔记的时候,无意中看到了Mysql之keepalived的文章,自己就想着实践一下,于是就有了这篇文章。

文章大体分为两部分:1.主从搭建,2.keepalived集成。

搭建条件

两台机器:
10.211.55.5-master
10.211.55.6-slave

mysql镜像:arm64v8/mysql
版本:8.0.32(推荐用5.x的版本)

注意点: 作者的电脑是mac os m1 pro,和windows的芯片架构完全不一致,这里用的是 arm64V8,读者是windows的话请去hub.docker下载对应的镜像。

条件
  • 会使用docker以及docker-compose。
目标

小白也能看懂!

废话不多说,下面就正式开始!

1.主从搭建

10.211.55.5-master 机器下面的 docker-compose.yaml

version: '2'
services:
  mysql5:
    image: arm64v8/mysql
    container_name: mysql8
    restart: always
    volumes:
      - /root/docker/mysql/8.x/conf:/etc/mysql/conf.d 
      - /root/docker/mysql/8.x/data:/var/lib/mysql
      - /root/docker/mysql/8.x/my.cnf:/etc/mysql/my.cnf # 映射配置文件
    environment:
      MYSQL_ROOT_PASSWORD: "721000"
    ports:
      - 3306:3306

10.211.55.6-slave 机器下面的 docker-compose.yaml

version: '2'
services:
  mysql5:
    image: arm64v8/mysql
    container_name: mysql8
    restart: always
    volumes:
      - /root/docker/mysql/8.x/conf:/etc/mysql/conf.d 
      - /root/docker/mysql/8.x/data:/var/lib/mysql
      - /root/docker/mysql/8.x/my.cnf:/etc/mysql/my.cnf  # 映射配置文件
    environment:
      MYSQL_ROOT_PASSWORD: "721000"
    ports:
      - 3306:3306

两者的配置文件是相同的,因为为了方便后续操作。

注意点:

  • docker-compose up 启动过后观察请有无报错。
  • 虚拟机暴露3306的端口,这点一定不要忘记了。

启动完成后使用navicate进行尝试连接,是完全可以的
在这里插入图片描述

尝试启动成功后接下来进行主从复制搭建,需要更改对应的mysql配置文件
10.211.55.5-master

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]

skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

pid-file=/var/run/mysqld/mysqld.pid

# 下面的这几个是需要我们手动配置的
log-error=/var/lib/mysql/mysql_log/error.log  # mysql的日志
log-bin=mysql-bin  # 配置binlog,通过binlog将两个mysql同步
server-id=1  # 配置本台机器mysql的id,必须要唯一
max_connections=1000

[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/

配置了 log-error,log-bin,server-id,上面也有对应的解释。

10.211.55.6-slave

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]

skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

pid-file=/var/run/mysqld/mysqld.pid

binlog_do_db=test # 需要同步的数据库名字,这个数据库要提前建好
log-error=/var/lib/mysql/mysql_log/error.log  # mysql的日志
log-bin=mysql-bin  # 配置binlog,通过binlog将两个mysql同步
server-id=2  # 配置本台机器mysql的id
max_connections=1000

[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/

配置了 binlog_do_db,log-error,log-bin,server-id,上面也有对应的解释。

配置完成后,直接重启docker容器,验证配置是否生效
分别在两台机器上的mysql中执行:

show variables like '%server_id%';

看一下是不是我们配置中指定的。
mysql启动要是报错了,可以查看指定的error.log文件,看看报错原因是什么,手动解决一下报错。

以上做完后,就可以做主从的配置了:
1.在master上执行:

show master status;

在这里插入图片描述

2.在slave上执行:

change master to master_host='10.211.55.5',master_user='root',master_password='721000',
         master_log_file='mysql-bin.000013',master_log_pos=157;      
  • master_host 是master的地址。
  • master_user,master_password 用户名&密码。
  • master_log_file是上面的file,master_log_pos是上面的position。

然后开始同步:

start slave; # 开始同步master的日志内容
SHOW SLAVE STATUS; # 查看状态

在这里插入图片描述
这两个为Yes就代表配置成功。
测试: 在master test库中建立一张user表,slave上自动就出现了。
在这里插入图片描述
如果你做到了这一步就说明你成功了!

可能遇到的错误:
在这里插入图片描述
同步不成功,可能是master上表里面有数据了,才开始同步。

只需要先将master,slave上的日志进行重置,在重新执行上面的流程一遍即可。

# 重置master上的所有的日志,注意是重置所有的,也可以删除指定的日志
reset master;

# 重置slave上的所有的日志
reset slave

至此主从已经完成,整个流程不算是多麻烦。

2.keepalived集成

Keepalived是Linux下一个轻量级的高可用解决方案。
官网地址:https://www.keepalived.org

安装命令:

yum install -y gcc gcc-c++ wget popt-devel openssl openssl-devel

yum install -y libnl libnl-devel libnl3 libnl3-devel

yum install -y libnfnetlink-devel

./configure --prefix=/usr/local/keepalived --sysconf=/etc

make && make install

配置文件位置:/etc/keepalived
启动位置:/usr/local/keepalived/sbin/keepalived
keepalived 日志: tail -22f /var/log/messages | grep Keepalived

主要是创建 keepalived.conf配置文件
1.master 上配置文件:

global_defs {
   router_id MYSQL-1
}

vrrp_script check_mysql {
    script "/etc/keepalived/bin/check_mysql.sh" 
    interval 22
    weight 2   
} 

vrrp_instance VI_1 {
    state BACKUP
    interface eth0 
    virtual_router_id 51
    priority 100   
    advert_int 1 
    nopreempt 
    authentication {
        
        auth_type PASS
        auth_pass 721000
    }
    virtual_ipaddress {
        10.211.55.8
    }
    track_script {
        check_mysql
    }
}

virtual_server 10.211.55.8 3306 {
    delay_loop 2  
    lb_algo rr   
    lb_kind DR 
    persistence_timeout 50 
    protocol TCP 
    real_server 10.211.55.5 3306 {
        weight 3 
        notify_stop /etc/keepalived/bin/shutdown.sh 
        TCP_CHECK {
            connect_timeout 3 
            nb_get_retry 3 
            delay_before_retry 3 
            connect_port 3306 
        }
    }
}

注释版:

global_defs {
   router_id MYSQL-1 //表示运行keepalived服务器的一个标识
}

// 定义自动核对mysql的脚本
vrrp_script check_mysql {
    script "/etc/keepalived/bin/check_mysql.sh" 
    interval 22
    weight 2   
} 

vrrp_instance VI_1 {
    state BACKUP //指定keepalived的角色, 两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从
    interface eth0 //指定HA监测网络的接口
    virtual_router_id 51 /虚拟路由标识,这个标识是一个数字(取值在0-255之间,用来区分多个instance的VRRP组播),同一个vrrp实例使用唯一的标识,确保和master2相同,同网内不同集群此项必须不同,否则发生冲突。
    priority 100   //用来选举master的,要成为master,该项取值范围是1-255(在此范围之外会被识别成默认值100),此处master2上设置为50
    advert_int 1 //发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)
    nopreempt //不抢占,即允许一个priority比较低的节点作为master,即使有priority更高的节点启动
    authentication {
        //认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)
        auth_type PASS
        auth_pass 721000
    }
    virtual_ipaddress {
        // 指定vip地址
        10.211.55.8
    }
    track_script {
        //指定核对的脚本,check_mysql是上述自定义的
        check_mysql
    }

}

virtual_server 10.211.55.8 3306 {
    delay_loop 2  //设置运行情况检查时间,单位是秒
    lb_algo rr   //设置后端调度算法,这里设置为rr,即轮询算法
    lb_kind DR //设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
    persistence_timeout 50 //会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
    protocol TCP //指定转发协议类型,有TCP和UDP两种

    real_server 10.211.55.5 3306 {
        weight 3 //配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小为了区分不同性能的服务器
        notify_stop /etc/keepalived/bin/shutdown.sh //检测到mysql服务down后执行的脚本,在一些版本中叫notify_down
        TCP_CHECK {
            connect_timeout 3 //连接超时时间
            nb_get_retry 3 //重连次数
            delay_before_retry 3 //重连间隔时间
            connect_port 3306 //健康检查端口
        }
    }
}

不能用注释版,直接用没注释的放在/etc/keepalived目录下面即可。
直接启动 keepalived,ip add 一下就能看到配置的虚拟ip了。
在这里插入图片描述
用navicate去连接也是可以的。
在这里插入图片描述
1.slave 上配置文件:
与master差不多,需要改一点配置:

  • router_id
  • priority
  • real_server
global_defs {
   router_id MYSQL-2 
}

vrrp_script check_mysql {
    script "/etc/keepalived/bin/check_mysql.sh" 
    interval 22
    weight 2   
} 

vrrp_instance VI_1 {
    state BACKUP 
    interface eth0 
    virtual_router_id 51
    priority 50   
    advert_int 1 
    nopreempt 
    authentication {
        auth_type PASS
        auth_pass 721000
    }
    virtual_ipaddress {
        10.211.55.8
    }
    track_script {
        check_mysql
    }
}

virtual_server 10.211.55.8 3306 {
    delay_loop 2  
    lb_algo rr   
    lb_kind DR 
    persistence_timeout 50 
    protocol TCP 

    real_server 10.211.55.6 3306 {
        weight 3 
        notify_stop /etc/keepalived/bin/shutdown.sh 
        TCP_CHECK {
            connect_timeout 3 
            nb_get_retry 3 
            delay_before_retry 3 
            connect_port 3306 
        }
    }
}

注释版:

global_defs {
   router_id MYSQL-2 //表示运行keepalived服务器的一个标识
}

// 定义自动核对mysql的脚本
vrrp_script check_mysql {
    script "/etc/keepalived/bin/check_mysql.sh" 
    interval 22
    weight 2   
} 

vrrp_instance VI_1 {
    state BACKUP //指定keepalived的角色, 两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从
    interface eth0 //指定HA监测网络的接口
    virtual_router_id 51 /虚拟路由标识,这个标识是一个数字(取值在0-255之间,用来区分多个instance的VRRP组播),同一个vrrp实例使用唯一的标识,确保和master2相同,同网内不同集群此项必须不同,否则发生冲突。
    priority 50   //用来选举master的,要成为master,该项取值范围是1-255(在此范围之外会被识别成默认值100),此处master2上设置为50
    advert_int 1 //发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)
    nopreempt //不抢占,即允许一个priority比较低的节点作为master,即使有priority更高的节点启动
    authentication {
        //认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)
        auth_type PASS
        auth_pass 721000
    }
    virtual_ipaddress {
        // 指定vip地址
        10.211.55.8
    }
    track_script {
        //指定核对的脚本,check_mysql是上述自定义的
        check_mysql
    }

}

virtual_server 10.211.55.8 3306 {
    delay_loop 2  //设置运行情况检查时间,单位是秒
    lb_algo rr   //设置后端调度算法,这里设置为rr,即轮询算法
    lb_kind DR //设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
    persistence_timeout 50 //会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
    protocol TCP //指定转发协议类型,有TCP和UDP两种

    real_server 10.211.55.6 3306 {
        weight 3 //配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小为了区分不同性能的服务器
        notify_stop /etc/keepalived/bin/shutdown.sh //检测到mysql服务down后执行的脚本,在一些版本中叫notify_down
        TCP_CHECK {
            connect_timeout 3 //连接超时时间
            nb_get_retry 3 //重连次数
            delay_before_retry 3 //重连间隔时间
            connect_port 3306 //健康检查端口
        }
    }
}

两个脚本:
check_mysql.sh

#!/bin/bash
MYSQL_HOST=127.0.0.1
MYSQL_USER=root
MYSQL_PASSWORD=721000

mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
if [ $? == 0 ] 
then 
    echo " $host mysql login successfully " 
    exit 0 
else 
    service keepalived stop 
    exit 2 
fi

shutdown.sh

echo "MYSQL DOWN..."
service keepalived stop 

注意: 这个脚本的执行是在本机上执行的,而mysql是在容器中运行的,所以我们要在本机上去安装mysql的客户端,yum install mysql 即可。

如果读者是mysql8的话,安装的mysql客户端是5.x的话,登录时会报错加密规则错误,解决办法:
ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘721000’;
flush privileges;

slave配置完成后,也直接启动即可。
在这里插入图片描述
slave这里是看不到虚拟vip的,如果能看到说明失败了,可以尝试把防火墙关闭:systemctl stop firewalld。
ok,到这里 keepalived就搭建完了,下面我们只需要连接这个配置的同一个虚拟ip即可。

mysql测试

在这里插入图片描述
navicate去连接过后,在这个vip上插入一条数据后,slave中也同步到了这条数据。
当停掉一台mysql会自动切换到另外一台mysql上,感兴趣的可以试试。

自此操作完成!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值