欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL双主+keepalived实现高可用

程序员文章站 2024-03-20 15:12:52
...

一、环境准备

操作系统:CentOS 7.6
数据库:MySQL 5.7.26社区版
keepalived:1.4.5
Service1:192.168.5.130 安装MySQL+keepalived
Service2:192.168.5.131 安装MySQL+keepalived
VIP:192.168.5.125
MySQL双主+keepalived实现高可用

时钟同步

//1.下载安装时钟同步依赖包
# yum install ntp
//2.将ntp设置为默认启动
# systemctl enable ntpd
//3.修改启动参数,允许ntp在系统时间误差较大时仍能工作
# vi /etc/sysconfig/ntpd
	# Command line options for ntpd
	OPTIONS="-g"
	修改为:
	OPTIONS="-g -x"
//4.将系统时间设置为上海时区
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
//5.查看时间
# date

二、环境部署–MySQL

1.解压MySQL安装包

下载的MySQL 5.7.26社区版安装包是tar文件,解压

# tar vxf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

MySQL双主+keepalived实现高可用

2.检查MariaDB

//在安装MySQL数据库之前先检查CentOS是否自带MariaDB
# rpm -qa|grep maria*
//存在即卸载
# yum -y remove maria*
//如果不是root权限用户登录,执行上面方法时会提示请使用root权限操作
//删除完成后再次查看,已经没有了
//如果yum命令卸载失败,可以直接使用rpm命令强制删除
# rpm -e -nodeps mariadb-libs-5.5.60-1.el7_5.x86_64	

MySQL双主+keepalived实现高可用
MySQL双主+keepalived实现高可用

3.安装MySQL

先安装MySQL需要的依赖

# yum install net-tools
# yum install -y gcc* make automake ncurses-devel cmake

安装完依赖后安装MySQL(之前解压的rpm文件)

# rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
# rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
# rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
# rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm

4.检查安装

启动MySQL,查看是否安装成功

// 启动server mysqld start 或 systemctl start mysqld
# server mysqld start
// 查看状态 server mysqld status 或 systemctl status mysqld
# server mysqld status
// 停止 server mysqld stop 或 systemctl stop mysqld

MySQL双主+keepalived实现高可用
MySQL双主+keepalived实现高可用

5.配置双主

先将MySQL进程停止 server mysqld stop ,并在130和131两个服务下修改/etc/my.cnf 文件 vi /etc/my.cnf
server1:

		server_id = 1
		binlog-ignore-db = mysql
		log-bin = mysql-bin
		binlog_cache_size = 1M
		binlog_format = mixed
		expire_logs_days = 7
		slave_skip_errors = 1062
		relay_log = edu.mysql-relay-bin
		log_slave_updates = 1
		auto_increment_increment	 = 2
		auto_increment_offset = 1

MySQL双主+keepalived实现高可用
server2:

		server_id = 2
		binlog-ignore-db = mysql
		log-bin = mysql-bin
		binlog_cache_size = 1M
		binlog_format = mixed
		expire_logs_days = 7
		slave_skip_errors = 1062
		relay_log = edu.mysql-relay-bin
		log_slave_updates = 1
		auto_increment_increment = 2
		auto_increment_offset = 2

MySQL双主+keepalived实现高可用
修改完成后重启MySQL

6.修改密码

安装完成MySQL后,会在 /var/log/mysqld.log文件中生成一个随机的初始密码

# cat /var/log/mysqld.log|grep -n password

MySQL双主+keepalived实现高可用
如图所示,mQgtTJhmf5.9就是生成的初始密码

// 使用初始密码进入sql命令
# mysql -uroot -p
Enter password: {将随机密码复制粘贴进来}
mysql>
// 修改root账号的密码
mysql> alter user 'root'@'localhost' identified by '123456';
ERROR 1819(HY000): Your password does not satisfy the current policy requirements
// 报错提示:密码强度不符合校验规则(必须要包含数字、大小写字母和特殊字符)
// 可以按照检验规则修改密码或者修改密码的校验规则
mysql> set global validate_password_policy=0;  // 0代表不做校验,默认值为1
mysql> set global validate_password_length=4;  // 指定密码长度
//设置完成校验规则后再次修改密码

MySQL双主+keepalived实现高可用

7.创建用户并赋予远程权限

// username和password替换为创建的用户和密码
mysql> grant all privileges on *.* to 'slave'@'%' identified by '123456';
mysql> flush privileges;

MySQL双主+keepalived实现高可用

8.配置主服务器

// 在server1上执行
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 |      154 |              | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
// 记录下File和Position的内容
// File -- mysql-bin.000005    Position -- 154
// 在server2中执行如下语句配置主服务
mysql> change master to master_host='192.168.5.130',  //server1的IP
     > master_user='slave',master_password='123456',  //server1中建立的用户和密码
     > master_log_file='mysqld-bin.000005',mysql_log_pos='154';  //之前记录的File和Position内容
mysql> slave start;

//同理,在server2中执行上述内容
//并在server1中配置主服务(注意替换成server2中查询到的乃荣)

9.验证设置

双主设置完成后,分别在server1和server2中执行:

mysql> show slave status\G

MySQL双主+keepalived实现高可用
当Slave_SQL_Running和Slave_IO_Running都为Yes的时候,代表双主配置成功。
如果Slave_SQL_Running为Connecting时,检查3306默认端口是否开放。

10.设置开机启动

// 退出sql命令
mysql> exit;
//设置开机启动
# systemctl enable mysqld
# systemctl daemon-reload

三、环境部署–keepalived

1.下载文件

登录keepalived官网下载1.4.5版本文件 keepalvied-1.4.5.tar.gz
官网地址:https://www.keepalived.org/download.html

2.解压

将文件上传到 /usr/local/src 目录下并解压

# tar -zxvf keepalived-1.4.5.tar.gz

MySQL双主+keepalived实现高可用

3.安装keepalived

// 进入解压后的文件夹
# cd /usr/local/src/keepalived1.4.5
// 通过yum安装依赖文件
# yum install gcc-c++ -y //安装MySQL后可不用执行该依赖
# yum -y install gcc //安装MySQL后可不用执行该依赖
# yum -y install openssl-devel
# yum -y install libnl libnl-devel
# yum -y install libnfnetlink-devel
# yum -y install net-tools //安装MySQL后可不用执行该依赖
# yum -y install vim
// 安装keepalived
// 生成makefile文件
# ./configure --prefix=/usr/local/keepalived
// 安装
# make && make install

4.配置文件

//keepalived启动脚本变量引用文件,默认文件路径是/etc/sysconfig/,也可以不做软链接,直接修改启动脚本中文件路径即可(安装目录下)
# cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/keepalived

//将keepalived主程序加入到环境变量(安装目录下)
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

//keepalived启动脚本(源码目录下),放到/etc/init.d/目录下就可以使用server命令便捷调用
# cp /usr/local/src/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/keepalived

//将配置文件放到默认路径下
# mkdir /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

5.设置开机启动

// 将keepalived设置为系统服务
# chkconfig -add keepalived
# chkconfig keepalived on

MySQL双主+keepalived实现高可用
MySQL双主+keepalived实现高可用

6.启动验证

# server keepalived start
Starting keepalived (via systemctl):                     [ 确定 ]

MySQL双主+keepalived实现高可用

7.配置VIP

两个server都需要修改文件 /etc/keepalived/keepalived.conf
Server1:

! Configuration File for keepalived

global_defs {
   router_id 1 #ID 两个服务器配置不一样的
}

vrrp_instance VI_1 {
    state BACKUP #类型 都配置BACKUP即可 若配置为MASTER,后续的优先级即无用
    interface ens33 #网卡
    virtual_router_id 60 #vrid 默认51 建议修改一下,但两个server配置要相同
    priority 100 #优先级 配置BACKUP是通过这个进行VIP漂移
    #nopreempt #配置该属性,即为不抢占模式(即宕机重启后不会根据优先级抢夺回VIP)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.5.125 # 虚拟IP 
    }
}

virtual_server 192.168.5.125 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    real_server 192.168.5.130 3306  { # 真实IP 端口
        weight 1
        notify_down /etc/keepalived/shutdown.sh # 检查脚本
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

MySQL双主+keepalived实现高可用
Server2:

! Configuration File for keepalived

global_defs {
   router_id 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 60
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.5.125
    }
}

virtual_server 192.168.5.125 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.5.131 3306  {
        weight 1
        notify_down /etc/keepalived/shutdown.sh
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

MySQL双主+keepalived实现高可用

8.创建脚本

// 建立MySQL方式失败脚本:MySQL访问失败时,keepalived进程自动结束
// 建立脚本的目录和上面配置keepalived.conf中的检查脚本目录要一致
# vim /etc/keepalived/shutdown.sh
	#! /bin/bash

	pkill keepalived
// 执行启动权限命令
# chmod +x /etc/keepalived/shutdown.sh

9.开启vrrp协议

// 开启防火墙vrrp协议,防止双主两台服务器同时抢夺VIP
# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0  --protocol vrrp -j ACCEPT
# firewall-cmd --reload 

MySQL双主+keepalived实现高可用

四、漂移测试

1.通过mysql验证

// 使用除130和131以外的一台服务器访问VIP验证
# mysql -h 192.168.5.125 -uslave -p123456
// 若能够登陆成功,则说明配置VIP成功
// 执行如下sql,查看当前VIP连接的是哪台服务器的mysql
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.01 sec)
// 当前连接的server_id为1,server_id是在/etc/my.cnf中配置的

MySQL双主+keepalived实现高可用
断开server1服务器上的MySQL、keepalived或者网络,再次查看server_id变为2
重启后,由于配置的keepalived.conf中未设置非抢占模式,且由于server1的优先级高,因此查询到的server_id又会变成1

2.通过ip验证

分别在两台服务器上查询ip信息

# ip addr
或
# ip a l

server1:
MySQL双主+keepalived实现高可用
server2:
MySQL双主+keepalived实现高可用
设置的VIP出现在server1的ip中,说明当前的Master是server1服务器
断开server1服务器上的MySQL、keepalived或者网络,再次查看ip信息时VIP出现在server2中
重启后,由于配置的keepalived.conf中未设置非抢占模式,且由于server1的优先级高,因此查询到的VIP又回到server1中

3.通过抓包验证

需要先下载抓包工具

//  下载并安装抓过工具
# yum install tcpdump
// 查询抓包信息
# tcpdump -i ens33 vrrp -n

MySQL双主+keepalived实现高可用
每1秒,作为Master的服务器发送vrrp消息;断开服务后则发送IP变为另外一台服务器

4.通过日期验证

日志文件的目录 /var/log/message
先将两个服务器的keepalived断开并清除日志信息
完成日志信息清理后首先启动优先级(在keepalived.conf文件中配置)低的keepalived服务,查看message
MySQL双主+keepalived实现高可用
由于配置文件中默认为BACKUP,所以启动时首先将自己默认设置为BACKUP,然而不存在MASTER发送消息,则将自己转换为Master并使用VIP。
启动另外一台优先级高的keepalived,查看message
MySQL双主+keepalived实现高可用
虽然已经存在Master,但由于优先级关系,自动抢夺VIP。
再查看优先级低的message
MySQL双主+keepalived实现高可用
由于优先级低,将自己转为BACKUP并交出VIP。

以上4种验证方式,均可通过停止MySQL服务、断网操作模拟服务器宕机,来验证VIP漂移。

五、注意事项

1.安装MySQL前要注意卸载CentOS自带的数据库,防止安装时发生冲突导致安装失败。
2.配置MySQL双主时,Slave_IO_Running和Slave_SQL_Running都为Yes时才表示配置成功。若有No或者Slave_IO_Running为Connecting时配置双主失败。
3.Keepalived要从官网下载源码包进行安装,不要通过yum安装。否则会造成keepalived报错自动停止。
4.Keepalived源码包上传至/usr/local/src 目录下进行解压,若放在其他位置下解压会造成启动失败,需要根据实际解压目录修改启动文件keepalived.server中的配置目录.
5.一定要开放防火墙的vrrp协议,否则会造成两台服务器同时对外发布VIP。
6.实际下载的keepalived版本为1.4.5,而图中部分截图中使用的是2.0.20版本。由于使用2.0.20版本的keepalived会造成脑裂,无法解决,因此转为更加稳定的1.4.5.

搭建过程就是上面这些了,在网上找了很多资料,看了好多的搭建文档,然后自己进行尝试,整理出上述内容。
如下内容是搭建过程中部分参考网站:
https://blog.csdn.net/yiyuf/article/details/40340895
https://blog.csdn.net/stubborn_cow/article/details/48155081
https://blog.csdn.net/u011409801/article/details/80521711
https://blog.csdn.net/m0_37328475/article/details/82684699
https://blog.csdn.net/nimasike/article/details/52463806

相关标签: linux mysql