Centos使用keepalived配置MySQL双主热备集群
安装MySQL
下载安装包
# 进入软件下载目录
cd /root/
mkdir software
cd software
# 当前软件目录:/root/software
# 如果本地有软件安装包,则直接上传
# RPM包下载地址:https://dev.mysql.com/doc/refman/5.7/en/linux-installation-rpm.html
# 下载地址:https://dev.mysql.com/downloads/mysql/
# 默认时mysql8版本,下载版本号:(mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar)
# https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar
# 确认安装包
ll /root/software
# 解压安装包
tar xf mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar
# 确认rpm包文件
-rw-r--r--. 1 root root 312968 Apr 28 15:10 00-net-tools-2.0-0.25.20131004git.el7.x86_64.rpm
-rw-r--r--. 1 root root 15733676 Aug 9 2012 00-perl-5.16.1.tar.gz
-rw-r--r--. 1 root root 543856640 Apr 28 14:34 mysql-5.7.34-1.el7.x86_64.rpm-bundle.tar
-rw-r--r--. 1 7155 31415 26597364 Mar 27 00:49 mysql-community-client-5.7.34-1.el7.x86_64.rpm
-rw-r--r--. 1 7155 31415 317444 Mar 27 00:49 mysql-community-common-5.7.34-1.el7.x86_64.rpm
-rw-r--r--. 1 7155 31415 4119104 Mar 27 00:49 mysql-community-devel-5.7.34-1.el7.x86_64.rpm
-rw-r--r--. 1 7155 31415 47479092 Mar 27 00:49 mysql-community-embedded-5.7.34-1.el7.x86_64.rpm
-rw-r--r--. 1 7155 31415 23264364 Mar 27 00:49 mysql-community-embedded-compat-5.7.34-1.el7.x86_64.rpm
-rw-r--r--. 1 7155 31415 131605536 Mar 27 00:49 mysql-community-embedded-devel-5.7.34-1.el7.x86_64.rpm
-rw-r--r--. 1 7155 31415 2472844 Mar 27 00:49 mysql-community-libs-5.7.34-1.el7.x86_64.rpm
-rw-r--r--. 1 7155 31415 1262704 Mar 27 00:49 mysql-community-libs-compat-5.7.34-1.el7.x86_64.rpm
-rw-r--r--. 1 7155 31415 181833876 Mar 27 00:50 mysql-community-server-5.7.34-1.el7.x86_64.rpm
-rw-r--r--. 1 7155 31415 124888148 Mar 27 00:50 mysql-community-test-5.7.34-1.el7.x86_64.rpm
卸载mariadb-lib
# 检查是否安装mariadb
rpm -qa|grep mariadb
# 卸载
rpm -e --nodeps mariadb-libs-5.5.65-1.el7.x86_64
安装依赖
安装gcc
# 确认是否已安装
gcc -V
# 下载安装包
# 下载地址:http://vault.centos.org/7.0.1406/os/x86_64/Packages/
# 进入rpm包目录
cd /root/software/00-gcc
# 将依赖使用的安装包复制到上面目录,复制后如下:
-rw-r--r--. 1 root root 6215884 Apr 28 15:37 cpp-4.8.2-16.el7.x86_64.rpm
-rw-r--r--. 1 root root 16823176 Apr 28 15:38 gcc-4.8.2-16.el7.x86_64.rpm
-rw-r--r--. 1 root root 3741952 Apr 28 15:38 glibc-2.17-55.el7.x86_64.rpm
-rw-r--r--. 1 root root 11730016 Apr 28 15:38 glibc-common-2.17-55.el7.x86_64.rpm
-rw-r--r--. 1 root root 1063840 Apr 28 15:38 glibc-devel-2.17-55.el7.x86_64.rpm
-rw-r--r--. 1 root root 665640 Apr 28 15:38 glibc-headers-2.17-55.el7.x86_64.rpm
-rw-r--r--. 1 root root 1574948 Apr 28 15:38 glibc-static-2.17-55.el7.x86_64.rpm
-rw-r--r--. 1 root root 197596 Apr 28 15:39 glibc-utils-2.17-55.el7.x86_64.rpm
-rw-r--r--. 1 root root 1489100 Apr 28 15:39 kernel-headers-3.10.0-123.el7.x86_64.rpm
-rw-r--r--. 1 root root 51732 Apr 28 15:39 libmpc-1.0.1-3.el7.x86_64.rpm
-rw-r--r--. 1 root root 208316 Apr 28 15:39 mpfr-3.1.1-4.el7.x86_64.rpm
# 执行安装操作
rpm -Uvh *.rpm --nodeps --force
# 确认是否安装成功
gcc -V
安装perl
# 进入安装目录
cd /root/software
# 下载
wget http://www.cpan.org/src/5.0/perl-5.16.1.tar.gz
# 解压缩
tar zxf 00-perl-5.16.1.tar.gz
# 配置安装路径
cd perl-5.16.1
./Configure -des -D -prefix=/usr/local/
# 编译
make check
# 安装
make install
# 确认是否已安装
perl -v
永久关闭selinux
# 先临时关闭
setenforce 0
# 备份配置文件
cp -r /etc/selinux/config /etc/selinux/config.bak
# 修改状态
sed -i 's/SELINUX=enforcing/\SELINUX=disabled/' /etc/selinux/config
# 确认
cat /etc/selinux/config
# SELINUX=disabled
安装
# 进入软件下载目录
cd /root/software
# 安装net-tools
rpm -ivh 00-net-tools-2.0-0.25.20131004git.el7.x86_64.rpm
# 按照下面顺序安装rpm软件包
rpm -ivh mysql-community-common-5.7.34-1.el7.x86_64.rpm
rpm -ivh mysql-community-common-5.7.34-1.el7.x86_64.rpm mysql-community-libs-5.7.34-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.34-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.34-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.34-1.el7.x86_64.rpm --nodeps
# 确认是否安装成功,可查看对应服务
systemctl status mysqld
配置
创建mysql数据库管理用户和组
# 添加用户组
groupadd mysql
# 添加用户
useradd -g mysql -s /bin/false -M mysql
创建数据目录
# 创建数据目录
mkdir /root/data/program/mysql/data/
# 修改数据目录所属的用户组
chown -vR mysql:mysql /root/data/program/mysql/data
# 修改数据目录权限
chmod 755 /root/data/program/mysql/data/
chmod 755 /root
修改my.cnf配置文件
# 编辑文件
vim /etc/my.cnf
# 编辑文件内容如下:
# 在文件标签[mysqld]上部添加下面内容,修改编码格式
[client] # 添加
default-character-set=utf8 # 添加
##########################################
# [mysqld]节点下添加或修改内容:
datadir=/root/data/program/mysql/data
user=mysql # 添加
character-set-server=utf8 # 添加
collation-server=utf8_general_ci # 添加
default-storage-engine=INNODB # 添加
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" # 添加
##########################################
[msyql] # 添加
default-character-set=utf8 # 添加
启动
# 设置开机启动
systemctl enable mysqld
# 查看服务状态
systemctl status mysqld
# 启动
systemctl start mysqld
初始化数据库
# 查找初始化root账号对应的初始密码
grep "password" /var/log/mysqld.log
# 执行结果中,最后一行包含密码数据如下:
2021-04-28T09:38:04.548398Z 1 [Note] A temporary password is generated for root@localhost: b<;#qNCJs2xw
# 初始密码为:b<;#qNCJs2xw
# 使用初始化密码登录数据库
mysql -u root -p
# 修改初始化密码
# 注意:密码设置必须要大小写字母数字和特殊符号(,/';:等)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'T**********t20210428';
# 更新配置
flush privileges;
开启远程访问
# 以下命令在mysql内执行,可以使用下面命令进入mysql
mysql -u root -p
# 开启root用户的所有远程访问
grant all privileges on *.* to 'root'@'%' identified by 'T*********0428' with grant option;
# 更新配置
flush privileges;
# 退出
exit
开放端口
# 添加防火墙开放端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重新加载防火墙配置
firewall-cmd --reload
测试远程连接
# 至此就可以使用客户端连接MySQL服务,连接相关信息如下
# host:192.168.110.130
# port:3306
# username:root
配置MySQL互为主从
环境说明
现将下表中的A、B两个服务器上面的MySQL配置为双主双活集群,即双方互为主从结构,B为A的从节点,同时,A为B的从节点。
使用主主前提:表的主键自增。
序号 | IP地址 | 说明 |
---|---|---|
1 | 192.168.110.129 | 机器名称:A |
2 | 192.168.110.130 | 机器名称:B |
修改配置文件
在A服务器上执行
修改配置文件内容:
# 创建log-bin存放目录
cd /root/data/program/mysql/
mkdir mysql-bin
cd mysql-bin
# 修改数据目录所属的用户组
chown -vR mysql:mysql /root/data/program/mysql/mysql-bin
# 修改数据目录权限
chmod 755 /root/data/program/mysql/mysql-bin
# 打开配置文件
vim /etc/my.cnf
# 配置文件中添加内容如下,添加在[mysqld]节点下:
log-bin=/root/data/program/mysql/mysql-bin/mysql-bin #开启二进制日志,最后面的[mysql-bin]是文件名的前缀
server-id=129 #不同机器不一样,2到232–1之间的一个正整数值,唯一,默认是1,建议使用ip的最后一段
auto_increment_offset=1 #不同机器不一样,自增id起始值为1
auto_increment_increment=2 #自增基数为2,保证id为奇数
#skip-slave-start #手动启动同步服务,复制进程就不会随着数据库的启动而启动
log-slave-updates=true #互为主从必要
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
binlog_format=row
master_info_repository = "TABLE"
relay_log_info_repository = "TABLE"
relay_log_recovery = 1
# 重新启动MySQL服务
systemctl restart mysqld
# 确认服务启动状态
systemctl status mysqld
创建用于同步的用户账号
两台机器上面的账号可以配置为一致。
# 进入MySQL命令行
mysql -u root -p
# 创建用于同步的账号,命令中的IP地址为另外一台的IP地址
CREATE USER 'replication'@'192.168.110.130' IDENTIFIED BY 'Test@12345';
# 对帐号授权
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.110.130';
# 刷新权限
flush privileges;
初始化bin-log日志
# 进入MySQL命令行
mysql -u root -p
# 重置
reset master;
# 查看日志状态
show master status;
# 执行结果如下:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
到此主机A配置完毕,切记为了保持主从的一致性,先不要操作主机A mysql数据库,待所有主机此部门配置完成且设置同步后才可以进行操作。
在B服务器上执行
修改配置文件内容:
# 创建log-bin存放目录
cd /root/data/program/mysql/
mkdir mysql-bin
cd mysql-bin
# 修改数据目录所属的用户组
chown -vR mysql:mysql /root/data/program/mysql/mysql-bin
# 修改数据目录权限
chmod 755 /root/data/program/mysql/mysql-bin
# 打开配置文件
vim /etc/my.cnf
# 配置文件中添加内容如下,添加在[mysqld]节点下:
log-bin=/root/data/program/mysql/mysql-bin/mysql-bin #开启二进制日志,最后面的[mysql-bin]是文件名的前缀
server-id=130 #不同机器不一样,2到232–1之间的一个正整数值,唯一,默认是1,建议使用ip的最后一段
auto_increment_offset=2 #不同机器不一样,自增id起始值为1
auto_increment_increment=2 #自增基数为2,保证id为奇数
#skip-slave-start #手动启动同步服务,避免突然宕机导致的数据日志不同步
log-slave-updates=true #互为主从必要
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
binlog_format=row
master_info_repository = "TABLE"
relay_log_info_repository = "TABLE"
relay_log_recovery = 1
# 重新启动MySQL服务
systemctl restart mysqld
# 确认服务启动状态
systemctl status mysqld
创建用于同步的用户账号
两台机器上面的账号可以配置为一致。
# 进入MySQL命令行
mysql -u root -p
# 创建用于同步的账号,命令中的IP地址为另外一台的IP地址
CREATE USER 'replication'@'192.168.110.129' IDENTIFIED BY 'Test@12345';
# 对帐号授权
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.110.129';
# 刷新权限
flush privileges;
初始化bin-log日志
# 进入MySQL命令行
mysql -u root -p
# 重置
reset master;
# 查看日志状态
show master status;
# 执行结果如下:
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
到此主机B配置完毕,切记为了保持主从的一致性,先不要操作操作mysql数据库,待所有主机此部门配置完成且设置同步后才可以进行操作。
同步配置
待所有主机对应的配置文件均已配置完成后,方可执行后续操作。
在A服务器上执行
配置B服务器为主节点,A服务器为从节点。
# 进入MySQL命令行
mysql -u root -p
# 设置B服务器(192.168.110.130)为主节点,命令中的参数均为B服务器中配置产生的参数
# 同步bin-log相关信息在B服务器上使用命令show master status;查看
change master to master_host='192.168.110.130',master_user='replication',master_password='Test@12345',master_log_file='mysql-bin.000001',master_log_pos=154;
# 开启同步
start slave;
# 查看是否成功
show slave status\G;
执行结果如下:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.110.130
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: local-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 527
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 130
Master_UUID: 6dafb92b-a805-11eb-b5a0-000c2905cabc
Master_Info_File: /root/data/program/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
在B服务器上执行
配置A服务器为主节点,B服务器为从节点。
# 进入MySQL命令行
mysql -u root -p
# 设置A服务器(192.168.110.129)为主节点,命令中的参数均为B服务器中配置产生的参数
# 同步bin-log相关信息在B服务器上使用命令show master status;查看
change master to master_host='192.168.110.129',master_user='replication',master_password='Test@12345',master_log_file='mysql-bin.000001',master_log_pos=154;
# 开启同步
start slave;
# 查看是否成功
show slave status\G;
执行结果如下:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.110.129
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 531
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 129
Master_UUID: 756f8cd8-a88b-11eb-b8e3-000c298a244d
Master_Info_File: /root/data/program/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
验证
至此,互为主从的MySQL数据集群已经配置完成,可以在其中一个服务器上面创建数据库,另外一个服务器上面添加数据,可以看到两边的数据库结构和数据都是一致的。
# 也可以执行下面的语句查看对应状态
show slave STATUS;
# 主要查看指标Slave_IO_Running、Slave_SQL_Running均为Yes即可
注意:服务重启后操作步骤
使用条件:更换服务器、更换IP地址时,如果是宕机则宕机的服务器会自动同步对应的主库数据,不用人工介入。
如果其中一个服务器宕机,或者服务停止,则需要对该服务器重新执行主从相关的配置。
在宕机期间,如果有新的数据进入数据库,启动宕机的服务后,此部分数据不会自动进行同步,需要在确保在用数据库无数据进入的前提下恢复数据到已宕机的服务,然后再重新关联主服务器,否则会导致数据不一致的情况。
查看从库上mysql的错误日志,里面有记录主从挂掉时的binlog信息,则再启动时master_log_pos的参数设置对应值即可,然后执行下面的命令:
# 1、进入宕机服务器节点,查看最后一次同步的日志文件和数据位置,确定宕机时master_log_pos的参数值
vim /var/log/mysqld.log
# 2、在重启服务的服务器上面重新关联主服务器,下面的IP为主服务器的IP地址及配置数据
change master to master_host='192.168.110.129',master_user='replication',master_password='Test@12345',master_log_file='mysql-bin.000001',master_log_pos=2140;
# 3、在重启服务的服务器上面执行,开启同步
start slave;
# 4、在重启服务的服务器上面执行,查看是否成功
show slave status\G;
如果上面操作不能成功,则重新恢复数据库,步骤如下:
# 1、进入主服务器节点,查看bin-log相关信息
show master status;
# 2、确保目前数据库没有数据进入或修改,否则会影响数据一致性,最好是停止Web应用,或者让数据库脱机;
# https://www.cnblogs.com/guantou1992/p/9729465.html
# 3、进入主服务器节点,通知从节点复制,防止再宕机库恢复时从新添加数据,造成数据重复,此命令需进入数据库中执行;
stop slave;
# 4、将目前在用数据库中最新的数据恢复到宕机的服务器上面,然后执行下面的操作;
# 5、在重启服务的服务器上面重新关联主服务器,下面的IP为主服务器的IP地址及配置数据
change master to master_host='192.168.110.129',master_user='replication',master_password='Test@12345',master_log_file='mysql-bin.000001',master_log_pos=2140;
# 6、在重启服务的服务器上面执行,开启同步
start slave;
# 7、在重启服务的服务器上面执行,查看是否成功
show slave status\G;
配置Keepalived
keepalived是vrrp协议的实现,原生设计目的是为了高可用ipvs服务,keepalived能够配置文件中的定义生成ipvs规则,并能够对各RS的健康状态进行检测;通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器宕机,其虚拟IP地址将会被其他服务器接替(优先级决定接替顺序),实现高可用为后端主机提供服务。
安装依赖
编译安装zlib
# 源码包拷贝到/usr/local/src/目录下,
# 编译安装zlib
# 官网地址:http://www.zlib.net/
# 进入源码目录
cd /usr/local/src/
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
./configure --prefix=/usr/local/zlib
make
make check
make install
echo "/usr/local/zlib/lib" >> /etc/ld.so.conf
# 完成安装
ldconfig -v
编译安装openssl
# 源码包拷贝到/usr/local/src/目录下,
# 编译安装openssl
cd /usr/local/src/
tar xvf openssl-1.1.0j.tar.gz
cd /usr/local/src/openssl-1.1.0j
# 编译安装
./config shared zlib
make depend
make && make install
# 创建软连接
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
# 验证OpenSSL
openssl version
安装Keepalived
# 下载rpm安装包
cd /root/data/software
wget http://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/keepalived-1.3.5-19.el7.x86_64.rpm
# 安装依赖net-snmp
rpm -ivh 00-01-net-snmp-libs-5.7.2-49.el7.x86_64.rpm 00-02-net-snmp-agent-libs-5.7.2-49.el7.x86_64.rpm 00-03-net-snmp-5.7.2-49.el7.x86_64.rpm 00-04-lm_sensors-libs-3.4.0-8.20160601gitf9185e5.el7.x86_64.rpm --nodeps --force
# 安装
rpm -ivh keepalived-1.3.5-19.el7.x86_64.rpm
# 查看软件状态
systemctl status keepalived
# 设置开机启动
systemctl enable keepalived
配置
# 备份默认配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
# 编辑配置文件
vim /etc/keepalived/keepalived.conf
# 根据不同机器进行不同配置:
A服务器
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_script chk_msql {
script "/etc/keepalived/check_mysql.sh"
interval 3
timeout 9
fall 2
rise 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33 # 需调整
virtual_router_id 158
unicast_src_ip 192.168.110.129 # 需调整
unicast_peer {
192.168.110.130 # 需调整,对端ip
}
priority 100 # 需调整
advert_int 1
authentication {
auth_type PASS
auth_pass T*****nki # 需调整
}
track_script {
chk_msql
}
virtual_ipaddress {
192.168.110.150 # 需调整
}
}
B服务器
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_script chk_msql {
script "/etc/keepalived/check_mysql.sh"
interval 3
timeout 9
fall 2
rise 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33 # 需调整
virtual_router_id 158
unicast_src_ip 192.168.110.130 # 需调整
unicast_peer {
192.168.110.129 # 需调整,对端ip
}
priority 90 # 需调整
advert_int 1
authentication {
auth_type PASS
auth_pass T******nki # 需调整
}
track_script {
chk_msql
}
virtual_ipaddress {
192.168.110.150 # 需调整
}
}
检测MySQL状态脚本
# 创建检测脚本
vim /etc/keepalived/check_mysql.sh
# 文件内容如下:
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl stop keepalived
fi
# 添加脚本的执行权限
chmod 755 /etc/keepalived/check_mysql.sh
启动服务
# 先启动高优先级的keepalived
# 在两台服务器上启动keepalived服务
systemctl start keepalived
# 查看服务启动状态
systemctl status keepalived
验证
# 查看日志
vim /var/log/messages
# 在A服务器上查看绑定IP地址
ip a
#########################################
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:8a:24:4d brd ff:ff:ff:ff:ff:ff
inet 192.168.110.129/24 brd 192.168.110.255 scope global noprefixroute dynamic ens33
valid_lft 1265sec preferred_lft 1265sec
inet 192.168.110.150/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::db5:aabd:4f54:af5f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
#########################################
# 在B服务器上查看绑定IP地址
ip a
#########################################
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:05:ca:bc brd ff:ff:ff:ff:ff:ff
inet 192.168.110.130/24 brd 192.168.110.255 scope global noprefixroute dynamic ens33
valid_lft 1273sec preferred_lft 1273sec
inet6 fe80::db5:aabd:4f54:af5f/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::efa5:e03e:a436:c9b2/64 scope link noprefixroute
valid_lft forever preferred_lft forever
#########################################
# 验证其中一台服务器宕机的应用场景
# 1、停止A服务器上面的MySQL服务
systemctl stop mysqld
# 2、查看A服务器上面keepalived服务状态及虚拟IP地址绑定,发现MySQL服务停止后keepalived执行监听较后里面的命令,停止对应服务,其虚拟IP地址取消绑定
systemctl status keepalived
ip a
# 3、查看B服务器上面的虚拟IP地址绑定,发现IP地址已绑定在此服务器上面,使用客户端连接MySQL可以正常提供服务
ip a
# 4、启动A服务器上面的MySQL、keepalived
systemctl start mysqld
systemctl start keepalived
# 5、查看A服务器上面的IP地址绑定,发现虚拟IP地址未绑定,仍然在B服务器上面,MySQL服务可提供正常访问,由于我们前面配置了双主热备,因此数据同步正常,具有强一致性
ip a
# 验证完成
注意事项
- 启动keepalived服务时,优先启动优先级较高服务器的服务;
- 其中一台服务器宕机后,恢复启动MySQL服务后,要启动keepalived服务,命令为
systemctl start keepalived
,否则keepalive将不会注册到对应的配置中。
附录一:MySQL双主配置文件示例
A服务器
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[client] # 添加
default-character-set=utf8 # 添加
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/root/data/program/mysql/data
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
user=mysql # 添加
character-set-server=utf8 # 添加
collation-server=utf8_general_ci # 添加
default-storage-engine=INNODB # 添加
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" # 添加
log-bin=/root/data/program/mysql/mysql-bin/mysql-bin #开启二进制日志
server-id=129 #不同机器不一样,2到232–1之间的一个正整数值,唯一,默认是1,建议使用ip的最后一段
auto_increment_offset=1 #不同机器不一样,自增id起始值为1
auto_increment_increment=2 #自增基数为2,保证id为奇数
#skip-slave-start #手动启动同步服务,避免突然宕机导致的数据日志不同步
log-slave-updates=true #互为主从必要
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
binlog_format=row
master_info_repository = "TABLE"
relay_log_info_repository = "TABLE"
relay_log_recovery = 1
[msyql] # 添加
default-character-set=utf8 # 添加
B服务器
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[client] # 添加
default-character-set=utf8 # 添加
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/root/data/program/mysql/data
socket=/var/lib/mysql/mysql.sock
user=mysql # 添加
character-set-server=utf8 # 添加
collation-server=utf8_general_ci # 添加
default-storage-engine=INNODB # 添加
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" # 添加
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin=/root/data/program/mysql/mysql-bin/mysql-bin #开启二进制日志,最后面的[mysql-bin]是文件名的前缀
server-id=130 #不同机器不一样,2到232–1之间的一个正整数值,唯一,默认是1,建议使用ip的最后一段
auto_increment_offset=2 #不同机器不一样,自增id起始值为1
auto_increment_increment=2 #自增基数为2,保证id为奇数
#skip-slave-start #手动启动同步服务,避免突然宕机导致的数据日志不同步
log-slave-updates=true #互为主从必要
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
binlog_format=row
master_info_repository = "TABLE"
relay_log_info_repository = "TABLE"
relay_log_recovery = 1
[msyql] # 添加
default-character-set=utf8 # 添加
附录二:keepalived配置文件示例
A服务器
! Configuration: command not found
global_defs {
router_id lb01
}
vrrp_script chk_msql {
script "/etc/keepalived/check_mysql.sh"
interval 3
timeout 9
fall 2
rise 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33 # 需调整
virtual_router_id 158
unicast_src_ip 192.168.110.129 # 需调整
unicast_peer {
192.168.110.130 # 需调整,对端ip
}
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass T******nki # 需调整
}
track_script {
chk_msql
}
virtual_ipaddress {
192.168.110.150 # 需调整
}
}
B服务器
! Configuration: command not found
global_defs {
router_id lb01
}
vrrp_script chk_msql {
script "/etc/keepalived/check_mysql.sh"
interval 3
timeout 9
fall 2
rise 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33 # 需调整
virtual_router_id 158
unicast_src_ip 192.168.110.130 # 需调整
unicast_peer {
192.168.110.129 # 需调整,对端ip
}
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass T******nki # 需调整
}
track_script {
chk_msql
}
virtual_ipaddress {
192.168.110.150 # 需调整
}
}
检测脚本
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl stop keepalived
fi
附录三:keepalived配置文件参数说明
!Configuration File for keepalived #这是keepalived的配置文件
global_defs { #全局配置
notification_email { #通知邮件的收件人
root@localhost #收件人邮箱
failover@firewall.loc #收件人邮箱
sysadmin@firewall.loc #收件人邮箱
}
notification_email_from sendmail@local.loc #通知邮件的发件人邮箱
smtp_server 127.0.0.1 #邮件服务器地址
smtp_connect_timeout 30 #和邮件服务器连接的超时时间
router_id LVS_DEVEL #路由器标识
}
vrrp_instance VI_1 { #虚拟路由的标识符
state MASTER #状态为主节点
interface eth0 #通信所使用的网络接口
virtual_router_id 51 #虚拟路由的ID号,是虚拟路由MAC的最后一位地址
priority 100 #此节点的优先级,主节点的优先级需要比其他节点高
advert_int 1 #通告的间隔时间
authentication { #认证配置
auth_type PASS #认证机制,默认是明文
auth_pass 1111 #随机字符串
}
virtual_ipaddress { #虚拟IP地址,VIP
192.168.200.16
192.168.200.17
192.168.200.18
}
virtual_server 192.168.200.100 443 { #集群所使用的VIP和端口
delay_loop 6 #
lb_algo rr #使用的负载均衡算法
lb_kind NAT #类型
nat_mask 255.255.255.0 #VIP掩码
persistence_timeout 50 #持久连接时间
protocol TCP #使用的协议
real_server 192.168.201.100 443 { #节点服务器使用的IP及端口
weight 1 #权重
HTTP_GET { #健康检测方式,可选有 SSL_GET、TCP_CHECK
url { #基于url检查
path / #检查的url路径
digest ff20ad2481f97b1754ef3e12ecd3a9cc #需要检查到的内容
status_code 200 #需要返回的状态码
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #连接超时时间
nb_get_retry 3 #检测尝试几次
delay_before_retry 3 #检测的时间间隔
}
}
}