keepalive+mysql8双主

1.概述
利用keepalived实现Mysql数据库的高可用,Keepalived+Mysql双主来实现MYSQL-HA,我们必须保证两台Mysql数据库的数据完全一致,实现方法是两台Mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台Mysql数据库宕机后,应用能够自动切换到另外一台Mysql数据库上去,保证系统的高可用。

2.实验环境
操作系统 Red Hat 4.8.5
MySQL版本 mysql 8.0.28
Keepalived版本 keepalibed-2.2.8
Mysql-master-1 192.168.15.94
Mysql-master-2 192.168.15.92
Mysql-VIP 192.168.15.100

3.相关配置
3.1 关闭防火墙
两台机器安装mysql,关闭firewalld。

[root@skymachine ~]# systemctl stop firewalld
[root@skymachine ~]# systemctl disable firewalld
[root@skymachine ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (dead)Docs: man:firewalld(1

3.2 修改master-1配置文件
MySQL 搭建主主需要配置 my.cnf ,在master-1库 my.cnf 的 [mysqld] 段落下添加如下内容:

vi /etc/my.cnf [mysqld]log-bin=mysql-bin                               #开启主从binlog(二进制日志),主库必须开启
binlog_format=mixed                             #指定二进制日志格式为mixed,即在语句和行两种模式之间自动切换
server-id=1                                     #配置server-id(唯一)标识主机,必须与从库不一致
relay-log=relay-bin                             #指定中继日志文件的名称为relay-bin,用于在主从复制中传输数据
relay-log-index=slave-relay-bin.index           #指定中继日志索引文件的名称,用于记录中继日志文件的位置。
auto_increment_increment=2                      #指定自增长ID的增量为2,用于在主从复制中避免ID冲突。
auto_increment_offset=1                         #指定自增长ID的起始值为1,用于在主从复制中避免ID冲突。##保存退出,并重启MySQL服务
[root@skymachine ~]# service mysql restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS

3.3 修改master-2配置文件

vi /etc/my.cnf 
​
[mysqld]
​
log-bin=mysql-bin                               #开启主从binlog(二进制日志),主库必须开启
binlog_format=mixed                             #指定二进制日志格式为mixed,即在语句和行两种模式之间自动切换
server-id=2                                    #配置server-id(唯一)标识主机,必须与从库不一致
relay-log=relay-bin                             #指定中继日志文件的名称为relay-bin,用于在主从复制中传输数据
relay-log-index=slave-relay-bin.index           #指定中继日志索引文件的名称,用于记录中继日志文件的位置。
auto_increment_increment=2                      #指定自增长ID的增量为2,用于在主从复制中避免ID冲突。
auto_increment_offset=2                         #指定自增长ID的起始值为2,用于在主从复制中避免ID冲突。
​
##保存退出,并重启MySQL服务
[root@skymachine ~]# service mysql restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS!
  1. 配置双主模式
    4.1 在两台节点分别创建同步用户
    以root用户登录mysql
create user 'test'@'192.168.15.%' identified by 'Test12#$';grant replication slave on *.* to 'test'@'192.168.15.%';flush privileges; select user,host from mysql.user;

以下为运行结果

mysql> create user 'test'@'192.168.15.%' identified by 'Test12#$';
Query OK, 0 rows affected (0.20 sec)
​
mysql> grant replication slave on *.* to 'test'@'192.168.15.%';
Query OK, 0 rows affected (0.03 sec)
​
mysql> flush privileges; 
Query OK, 0 rows affected (0.03 sec)
​
mysql> select user,host from mysql.user;
+------------------+--------------+
| user             | host         |
+------------------+--------------+
| user01           | %            |
| test             | 192.168.15.% |
| mysql.infoschema | localhost    |
| mysql.session    | localhost    |
| mysql.sys        | localhost    |
| root             | localhost    |
+------------------+--------------+
6 rows in set (0.00 sec)

4.2 在master-1上配置主服务器
在master-1上配置主服务器,需要先获取master-2的用户名、密码、ip、port、master_log_file、file,master_log_pos及get_master_public_key

4.2.1 获取master-2配置信息
在master-2服务器mysql命令行下,输入

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      960 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)获取file和Position内容

4.2.2 配置主服务器
返回master-1服务器mysql命令行下,输入以下命令

stop slave;
​
reset slave;
​
change master to master_host='192.168.15.92',
master_port=3306,master_user='test',
master_password='Test12#$',
master_log_file='mysql-bin.000003',
master_log_pos=960,
get_master_public_key=1;
​
start slave;
​
show slave status\G;

以下为运行结果,供参考

mysql> stop slave;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
​
mysql> reset slave;
Query OK, 0 rows affected, 1 warning (0.07 sec)
​
mysql> change master to master_host='192.168.15.92',-> master_port=3306,master_user='test',-> master_password='Test12#$',-> master_log_file='mysql-bin.000003',-> master_log_pos=960,-> get_master_public_key=1;
Query OK, 0 rows affected, 10 warnings (0.08 sec)
​
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.04 sec)
​
mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.15.92Master_User: testMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000003Read_Master_Log_Pos: 960Relay_Log_File: relay-bin.000002Relay_Log_Pos: 326Relay_Master_Log_File: mysql-bin.000003Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 960Relay_Log_Space: 530Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_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: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2Master_UUID: 820016c0-131c-11ee-895a-00505682d637Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_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: Master_public_key_path: Get_master_public_key: 1Network_Namespace: 
1 row in set, 1 warning (0.01 sec)

当下面两个配置出现YES是代表配置成功

Slave_IO_Running:  Yes
Slave_SQL_Running: Yes

4.3 在master-2上配置主服务器
在master-2上配置主服务器,需要先获取master-1的用户名、密码、ip、port、master_log_file、file,master_log_pos及get_master_public_key
4.3.1 获取master-1配置信息
在master-1服务器mysql命令行下,输入

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      157 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
取file和Position内容

4.3.2 配置主服务器
返回master-2服务器mysql命令行下,输入以下命令

stop slave;
​
reset slave;
​
change master to master_host='192.168.15.94',
master_port=3306,master_user='test',
master_password='Test12#$',
master_log_file='mysql-bin.000002',
master_log_pos=157,
get_master_public_key=1;
​
start slave;
​
show slave status\G;

以下为运行结果,供参考

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
​
mysql> reset slave all;
Query OK, 0 rows affected, 1 warning (0.26 sec)
​
mysql> change master to master_host='192.168.15.94',-> master_port=3306,master_user='test',-> master_password='Test12#$',-> master_log_file='mysql-bin.000002',-> master_log_pos=157,-> get_master_public_key=1;
Query OK, 0 rows affected, 10 warnings (0.12 sec)
​
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.05 sec)
​
mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.15.94Master_User: testMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 157Relay_Log_File: relay-bin.000002Relay_Log_Pos: 326Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 157Relay_Log_Space: 530Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_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: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1Master_UUID: b5609587-1307-11ee-96e9-00505682d2a5Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 1Network_Namespace: 
1 row in set, 1 warning (0.01 sec)当下面两个配置出现YES是代表配置成功
Slave_IO_Running:  Yes
Slave_SQL_Running: Yes
  1. 测试双主同步
    5.1 在master-1主机上创建同步数据库
    例如创建abcd,并在abcd中创建一张测试表如t1
mysql> CREATE DATABASE IF NOT EXISTS abcd DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.04 sec)
​
mysql> use abcd;
Database changed
​
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| abcd               |
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
​
​
mysql> create table t1(id int,name varchar(20));
Query OK, 0 rows affected (0.30 sec)
​
​
mysql> show tables;
+----------------+
| Tables_in_abcd |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)
​
mysql> select * from t1;
Empty set (0.01 sec)

5.2 在master-2上查看是否同步了master-1的变化

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| abcd               |
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.01 sec)
​
mysql> use abcd;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
​
Database changed
mysql> show tables;
+----------------+
| Tables_in_abcd |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)

5.3 在master-2上插入一条数据查看master-1上是否同步更新
master-2

 mysql> insert into t1 (id,name) values (3,'李四');
Query OK, 1 row affected (0.01 sec)
​
mysql> select * from t1;
+------+--------+
| id   | name   |
+------+--------+
|    3 | 李四   |
+------+--------+
1 row in set (0.00 sec)

master1

mysql> select * from t1;
+------+--------+
| id   | name   |
+------+--------+
|    3 | 李四   |
+------+--------+
1 row in set (0.00 sec)
查询出数据代表主主配置同步成功!

6.主备库都关机后重新开启同步
若双主都关机后需要重新配置第4步

7.配置主主参数说明
7.1 状态参数说明
Slave_IO_state 显示当前IO线程的状态,一般情况下就是显示等待主服务器发送二进制日志。
Master_log_file 显示当前同步的主服务器的二进制日志。
Read_master_log_pos 显示当前同步到主服务器上二进制日志的偏移量位置。
Relay_master_log_file 当前中继日志同步的二进制日志。
Relay_log_file 显示当前写入的中继日志。
Relay_log_pos 显示当前执行到中继日志的偏移量位置。
Slave_IO_running 从服务器中IO线程的运行状态,yes代表正常
Slave_SQL_running 从服务器中sql线程的运行状态,YES代表正常
Exec_Master_log_pos 表示同步到主服务器的二进制日志的偏移量位置。

7.2 slave启停常用命令
STOP SLAVE IO_THREAD; 停止IO进程
STOP SLAVE SQL_THREAD; 停止SQL进程
STOP SLAVE; 停止IO和SQL进程
START SLAVE IO_THREAD; 启动IO进程
START SLAVE SQL_THREAD; 启动SQL进程
START SLAVE; 启动IO和SQL进程
RESET SLAVE; 用于让从属服务器忘记其在主服务器的二进制日志中的复制位置, 它会删除master.info和relay-log.info文件,以及所有的中继日志,并启动一个新的中继日志,当你不需要主从的时候可以在从上执行这个操作。
SHOW SLAVE STATUS; 查看MySQL同步状态
STOP SLAVE;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;START SLAVE; 经常会朋友mysql主从同步遇到错误的时候,比如一个主键冲突等,那么我就需要在确保那一行数据一致的情况下临时的跳过这个错误,那就需要使用SQL_SLAVE_SKIP_COUNTER = n命令了,n是表示跳过后面的n个事件
CHANGE MASTER TO MASTER_HOST=‘10.1.1.75’, MASTER_USER=‘replication’, MASTER_PASSWORD=‘123456’, MASTER_LOG_FILE=‘mysql-bin.000006’, MASTER_LOG_POS=106; START SLAVE; 从指定位置重新同步

8.keepalived安装部署
在master-1、master-2服务器分别安装keepalived,安装步骤相同,配置文件不同,下面有介绍。
8.1 安装依赖包,下载keepalived
安装插件依赖包,下载keepalived2.2.8版本至/opt目录下并解压

yum -y install gcc openssl-devel popt-devel psmisc
​
yum install wget
Is this ok [y/d/N]: y              #安装wget提示,输入y
​
cd /opt/
​
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
​
ll
​
tar -zxvf keepalived-2.2.8.tar.gz

以下为运行结果,供参考

[root@skymachine ~]# yum -y install gcc openssl-devel popt-devel psmisc
已加载插件:fastestmirror
Determining fastest mirrors
base                                                                                                                                                 | 1.8 kB  00:00:00     
docker-ce-stable                                                                                                                                     | 1.4 kB  00:00:00     
epel                                                                                                                                                 | 1.8 kB  00:00:00     
extras                                                                                                                                               | 1.4 kB  00:00:00     
...中间省略安装过程代码
作为依赖被安装:cpp.x86_64 0:4.8.5-44.el7                  glibc-devel.x86_64 0:2.17-326.el7_9    glibc-headers.x86_64 0:2.17-326.el7_9     kernel-headers.x86_64 0:3.10.0-1160.90.1.el7  keyutils-libs-devel.x86_64 0:1.5.8-3.el7   krb5-devel.x86_64 0:1.15.1-55.el7_9    libcom_err-devel.x86_64 0:1.42.9-19.el7   libkadm5.x86_64 0:1.15.1-55.el7_9             libmpc.x86_64 0:1.0.1-3.el7                libselinux-devel.x86_64 0:2.5-15.el7   libsepol-devel.x86_64 0:2.5-10.el7        libverto-devel.x86_64 0:0.2.5-4.el7           mpfr.x86_64 0:3.1.1-4.el7                  pcre-devel.x86_64 0:8.32-17.el7        zlib-devel.x86_64 0:1.2.7-21.el7_9       
​
作为依赖被升级:e2fsprogs.x86_64 0:1.42.9-19.el7        e2fsprogs-libs.x86_64 0:1.42.9-19.el7      glibc.x86_64 0:2.17-326.el7_9              glibc-common.x86_64 0:2.17-326.el7_9     krb5-libs.x86_64 0:1.15.1-55.el7_9      libcom_err.x86_64 0:1.42.9-19.el7          libgcc.x86_64 0:4.8.5-44.el7               libgomp.x86_64 0:4.8.5-44.el7            libss.x86_64 0:1.42.9-19.el7            openssl.x86_64 1:1.0.2k-26.el7_9           openssl-libs.x86_64 1:1.0.2k-26.el7_9      zlib.x86_64 0:1.2.7-21.el7_9             
​
完毕!
​
[root@skymachine opt]# yum install wget
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
正在解决依赖关系
--> 正在检查事务
---> 软件包 wget.x86_64.0.1.14-18.el7_6.1 将被 安装
--> 解决依赖关系完成
​
依赖关系解决
​
============================================================================================================================================================================Package                               架构                                    版本                                             源                                     大小
============================================================================================================================================================================
正在安装:wget                                  x86_64                                  1.14-18.el7_6.1                                  base                                  547 k
​
事务概要
============================================================================================================================================================================
安装  1 软件包
​
总下载量:547 k
安装大小:2.0 M
Is this ok [y/d/N]: y
Downloading packages:
wget-1.14-18.el7_6.1.x86_64.rpm                                                                                                                      | 547 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction正在安装    : wget-1.14-18.el7_6.1.x86_64                                                                                                                             1/1 验证中      : wget-1.14-18.el7_6.1.x86_64                                                                                                                             1/1 
​
已安装:wget.x86_64 0:1.14-18.el7_6.1                                                                                                                                             
​
完毕!
[root@skymachine ~]# cd /opt/
​
[root@skymachine opt]# wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
​
--2023-06-27 09:32:19--  https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
正在解析主机 www.keepalived.org (www.keepalived.org)... 91.121.30.175, 2001:41d0:1:71af::1
正在连接 www.keepalived.org (www.keepalived.org)|91.121.30.175|:443... 已连接。
警告: 无法验证 www.keepalived.org 的由 “/C=US/O=Let's Encrypt/CN=R3” 颁发的证书:颁发的证书已经过期。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1202602 (1.1M) [application/octet-stream]
正在保存至: “keepalived-2.2.8.tar.gz”
​
100%[==================================================================================================================================>] 1,202,602    868KB/s 用时 1.4s   
​
2023-06-27 09:32:21 (868 KB/s) - 已保存 “keepalived-2.2.8.tar.gz” [1202602/1202602])
​
[root@skymachine opt]# ll
总用量 1180
-rw-r--r--  1 root root 1202602 5月  31 18:37 keepalived-2.2.8.tar.gz
drwxr-xr-x  3 root root      75 6月  25 13:49 software
​
[root@skymachine opt]# tar -zxvf keepalived-2.2.8.tar.gz 
keepalived-2.2.8/
keepalived-2.2.8/tools/
keepalived-2.2.8/tools/timed_reload
keepalived-2.2.8/Dockerfile.in
keepalived-2.2.8/Makefile.in
keepalived-2.2.8/build-aux/
...中间省略安装过程代码
keepalived-2.2.8/keepalived/check/check_file.c
keepalived-2.2.8/keepalived/check/check_tcp.c
keepalived-2.2.8/keepalived/check/libipvs.c
keepalived-2.2.8/configure.ac
keepalived-2.2.8/aclocal.m4

8.2 配置keepalived并编译

cd keepalived-2.2.8
​./configure --prefix=/opt/keepalived-2.2.8
​
make && make install

以下为运行结果,供参考

[root@skymachine opt]# cd keepalived-2.2.8
​
[root@skymachine keepalived-2.2.8]#   ./configure --prefix=/opt/keepalived-2.2.8
​
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a race-free mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports nested variables... (cached) yes
​
...中间省略安装过程代码
​
Strict config checks     : No
Build documentation      : No
Default runtime options  : -D
​
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
​
[root@skymachine keepalived-2.2.8]#  make && make install
Making all in lib
make[1]: 进入目录“/opt/keepalived-2.2.8/lib”
make  all-am
make[2]: 进入目录“/opt/keepalived-2.2.8/lib”CC       memory.oCC       utils.o
utils.c: 在函数‘dump_buffer’中:
utils.c:106:5: 警告:无法优化可能无穷的循环 [-Wunsafe-loop-optimizations]for (j = i - 15; j <= i; j++)^...中间省略安装过程代码
​
make[3]: 对“install-data-hook”无需做任何事。
make[3]: 离开目录“/opt/keepalived-2.2.8”
make[2]: 离开目录“/opt/keepalived-2.2.8”
make[1]: 离开目录“/opt/keepalived-2.2.8”

8.3 将文件复制到对应目录下

[root@128 keepalived-2.2.7]# mkdir /etc/keepalived
[root@128 keepalived-2.2.7]# cp keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
[root@128 keepalived-2.2.7]# cp keepalived/etc/init.d/keepalived /etc/init.d/
[root@128 keepalived-2.2.7]# cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@128 keepalived-2.2.7]# cp bin/keepalived /usr/sbin/

8.4 新建shutdown.sh文件

vi /etc/keepalived/keepalived.conf
#!/bin/bash
#该脚本是在mysql服务出现异常时,将keepalived应用停止,从而使虚拟vip主机自动连接到另一台mysql上
killall keepalived
chmod +x /etc/keepalived/shutdown.sh

8.5 ifconfig查看网卡名称
本机网卡名称为ens192

[root@skymachine keepalived-2.2.8]# ifconfig
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.15.94  netmask 255.255.255.0  broadcast 192.168.15.255inet6 fe80::5952:cea:7d3a:9438  prefixlen 64  scopeid 0x20<link>inet6 fe80::e689:8ec0:4cf9:2338  prefixlen 64  scopeid 0x20<link>inet6 fe80::ce71:1610:b52d:de15  prefixlen 64  scopeid 0x20<link>ether 00:50:56:82:d1:76  txqueuelen 1000  (Ethernet)RX packets 737719  bytes 964242277 (919.5 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 398867  bytes 29004910 (27.6 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
​
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 1000  (Local Loopback)RX packets 58  bytes 5076 (4.9 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 58  bytes 5076 (4.9 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

8.6 修改master-1服务器keepalived配置文件
把原有的keepalived.conf更名为keepalived_bak.conf,然后新建keepalived.conf配置文件

cd /etc/keepalived/
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived.conf
[root@skymachine keepalived]# mv keepalived.conf  keepalived_bak.conf
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived_bak.conf
[root@skymachine keepalived]#  vi /etc/keepalived/keepalived.conf把以下内容复制进去
! Configuration File for keepalived
​
#主要配置故障发生时的通知对象及机器标识
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id MYSQL-1                   #主机标识符,唯一即可vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}
​
#用来定义对外提供服务的VIP区域及相关属性
vrrp_instance VI_1 {state BACKUP                     #表示keepalived角色,都是设成BACKUP则以优先级为主要参考interface ens192                 #指定HA监听的网络接口,刚才ifconfig查看的接口名称virtual_router_id 151            #虚拟路由标识,取值0-255,master-1和master-2保持一致priority 100                     #优先级,用来选举master,取值范围1-255advert_int 1                     #发VRRP包时间间隔,即多久进行一次master选举authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {              #虚拟出来的地址192.168.15.100}
}
​
#虚拟服务器定义
virtual_server 192.168.15.100 3306 { #虚拟出来的地址加端口delay_loop 2                     #设置运行情况检查时间,单位为秒lb_algo rr                       #设置后端调度器算法,rr为轮询算法lb_kind DR                       #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选persistence_timeout 50           #会话保持时间,单位为秒protocol TCP                     #指定转发协议,有 TCP和UDP可选
​real_server 192.168.15.94 3306 {          #实际本地ip+3306端口weight=5                      #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大#当该ip 端口连接异常时,执行该脚本notify_down /etc/keepalived/shutdown.sh   #检查mysql服务down掉后执行的脚本TCP_CHECK {#实际物理机ip地址connect_ip 192.168.15.94#实际物理机port端口connect_port 3306connect_timeout 3nb_get_retry 3delay_before_retry 3
​}}
}
​

8.7 修改master-2服务器keepalived配置文件
把原有的keepalived.conf更名为keepalived_bak.conf,然后新建keepalived.conf配置文件

cd /etc/keepalived/
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived.conf
[root@skymachine keepalived]# mv keepalived.conf  keepalived_bak.conf
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived_bak.conf
[root@skymachine keepalived]#  vi /etc/keepalived/keepalived.conf把以下内容复制进去,与master-1的配置不同地方为 router_id、priority、real_server、connect_ip 四个配置
! Configuration File for keepalived
​
#主要配置故障发生时的通知对象及机器标识
global_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id MYSQL-2                   #主机标识符,唯一即可vrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}
​
#用来定义对外提供服务的VIP区域及相关属性
vrrp_instance VI_1 {state BACKUP                     #表示keepalived角色,都是设成BACKUP则以优先级为主要参考interface ens192                 #指定HA监听的网络接口,刚才ifconfig查看的接口名称virtual_router_id 151            #虚拟路由标识,取值0-255,master-1和master-2保持一致priority 40                      #优先级,用来选举master,取值范围1-255advert_int 1                     #发VRRP包时间间隔,即多久进行一次master选举authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {              #虚拟出来的地址192.168.15.100}
}
​
#虚拟服务器定义
virtual_server 192.168.15.100 3306 { #虚拟出来的地址加端口delay_loop 2                     #设置运行情况检查时间,单位为秒lb_algo rr                       #设置后端调度器算法,rr为轮询算法lb_kind DR                       #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选persistence_timeout 50           #会话保持时间,单位为秒protocol TCP                     #指定转发协议,有 TCP和UDP可选
​real_server 192.168.15.92 3306 {          #实际本地ip+3306端口weight=5                      #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大#当该ip 端口连接异常时,执行该脚本notify_down /etc/keepalived/shutdown.sh   #检查mysql服务down掉后执行的脚本TCP_CHECK {#实际物理机ip地址connect_ip 192.168.15.92#实际物理机port端口connect_port 3306connect_timeout 3nb_get_retry 3delay_before_retry 3
​}}
}

8.8 启动keepalived服务
将master-1、master-2服务器keepalived服务启动

[root@skymachine keepalived]# systemctl start keepalived
[root@skymachine keepalived]# systemctl status keepalived
systemctl enable keepalived #开机启动,根据需求设置

8.9 创建虚拟ip登录用户
在两台服务器上新建用户并ssh登录服务器以验证keepalived服务是否配置成功

[root@skymachine ~]# useradd -m keepalived
[root@skymachine ~]# passwd keepalived
更改用户 keepalived 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

8.10 测试keepalived服务
启动后相当于虚拟出一个vip 192.168.15.100,用ssh工具连接服务器,输入ip和用户名及密码,登录至虚拟ip上
在这里插入图片描述

连接进去后使用ifconfig查看该虚拟vip实际上使用的实体服务器是master-1(192.168.15.94)服务器
将master-1(192.168.15.94)服务器的keepalived应用停止,192.168.15.100服务器会断线,重新连接,再次查看192.168.15.100服务ifconfig,可以看到,192.168.15.100服务器自动将实体机ip漂移到了master-2(192.168.15.92)服务器上

  1. Mysql双主双活+keepalived高可用整体测试
    9.1 启动服务(启动过不需要再启动)
    首先将master-1、master-2两台服务器mysql、keepalived应用全部启动,然后新建一个用户,配置权限可以外网访问
mysql> CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.10 sec)
​
mysql> create user 'user01'@'%' identified by 'Mysql12#$';
Query OK, 0 rows affected (0.19 sec)
​
mysql> grant all privileges on `mydb`.* to 'user01'@'%' ;
Query OK, 0 rows affected (0.02 sec)
​
mysql> flush privileges; 
Query OK, 0 rows affected (0.02 sec)
​
mysql> select user,host from mysql.user;
+------------------+--------------+
| user             | host         |
+------------------+--------------+
| user01           | %            |
| test             | 192.168.15.% |
| mysql.infoschema | localhost    |
| mysql.session    | localhost    |
| mysql.sys        | localhost    |
| root             | localhost    |
+------------------+--------------+
6 rows in set (0.00 sec)

9.2 连接keepalived虚拟服务器
用mysql连接工具连接keepalived虚拟出来的192.168.15.100服务器
在这里插入图片描述

9.3 建立测试数据
在192.168.15.100数据库mydb测试库新建一张表,表中插入一些数据

drop table ceshi1;
​
CREATE TABLE ceshi1(ID int,NAME VARCHAR(255),subject VARCHAR(18),score int);
insert into ceshi1  values(1,'张三','数学',90);
insert into ceshi1  values(2,'张三','语文',70);
​
select * from ceshi1;

在这里插入图片描述

9.4 查看master-1、master-2同步情况
此时可以查看master-1、master-2数据库,数据已同步
在这里插入图片描述
在这里插入图片描述

9.5 查看100服务器实际物理机ip
使用ifconfig命令查看实际使用的物理机为192.168.15.94,所以master-1(192.168.15.94)服务器mysql为主数据库。
在这里插入图片描述

9.6 停止物理机mysql服务
此时手动将master-1服务器mysql停止,keepalived检测到192.168.15.94服务3306端口连接失败,会执行/etc/keepalived/shutdown.sh脚本,将192.168.15.94服务器keepalived应用结束

[root@skymachine ~]# service mysql stop
Shutting down MySQL............. SUCCESS! 

9.7 查看漂移ip执行情况
此时再连接192.168.15.100服务下,ifconfig查看,发现已经实际将物理机由master-1(192.168.15.94)到master-2(192.168.15.92)服务器上
在这里插入图片描述

9.8 在新的主服务器插入数据
再使用mysql连接工具连接192.168.15.100的mysql,插入一条数据,测试是否将数据存入master-2(192.168.15.92)服务器mysql中

insert into ceshi1 values(6,'李四','英语',94);

9.9 查看新主服务器数据
查看master-2服务器mysql数据,数据已同步,说明keepalived搭建高可用成功,当master-1服务器mysql出现问题后keepalived自动漂移IP到实体机master-2服务器上,从而使master-2服务器mysql作为主数据库
在这里插入图片描述

9.10 重启master-1服务,查看数据同步情况
此时再启动master-1(192.168.15.94)服务器mysql、keepalived应用

service mysql start
systemctl start keepalived
systemctl status keepalived

查看master-1数据库ceshi1表数据,数据已同步成功
在这里插入图片描述

至此,mysql双主双活+keepalived高可用部署并测试完成。

  1. 总结
    1、 采用keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下相互抢占导致两个节点内写入相同的数据而引发冲突;

2、 把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(字增起始值)设置成不同值,其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原master上冲突,因此一开始就错开;

3、 Slave节点服务器配置不要太差,否则更容易导致复制延迟,作为热备节点的slave服务器,硬件配置不能低于master节点;

如果对延迟很敏感的话,可考虑使用MariaDB分支版本,利用多线程复制的方式可以很大降低复制延迟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884530.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++笔记】容器适配器及deque和仿函数

【C笔记】容器适配器及deque和仿函数 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】容器适配器及deque和仿函数前言一.容器适配器1.1什么是容器适配器1.2 STL标准库中stack和queue的底层结构 二.stack2.1stack类模…

centos7.X zabbix监控参数以及邮件报警和钉钉报警

1&#xff1a;zabbix安装 1.1 zabbix 环境要求 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘&#xff08;最低&#xff09; 操作系统: Linux centos7.2 x86_64 Python 2.7.x Mariadb Server ≥ 5.5.56 httpd-2.4.6-93.el7.centos.x86_64 PHP 5.4.161.2 zabbix安装版本 [rootnod…

基于向量检索的RAG大模型

一、什么是向量 向量是一种有大小和方向的数学对象。它可以表示为从一个点到另一个点的有向线段。例如&#xff0c;二维空间中的向量可以表示为 (&#x1d465;,&#x1d466;) &#xff0c;表示从原点 (0,0)到点 (&#x1d465;,&#x1d466;)的有向线段。 1.1、文本向量 1…

串口屏控制的自动滑轨(未完工)

序言 疫情期间自己制作了一个自动滑轨&#xff0c;基于无线遥控的&#xff0c;但是整体太大了&#xff0c;非常不方便携带&#xff0c;所以重新设计了一个新的&#xff0c;以2020铝型材做导轨的滑轨&#xff0c;目前2020做滑轨已经很成熟了&#xff0c;配件也都非常便宜&#x…

如何使用Get进行状态管理

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 相关组件3. 示例代码4. 内容总结我们在上一章回中介绍了"使用get进行依赖管理"相关的内容,本章回中将介绍如何使用get进行状态管理一.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 在Flutter开发中状态管理…

计算机视觉常用数据集Cityscapes的介绍、下载、转为YOLO格式进行训练

我在寻找Cityscapes数据集的时候花了一番功夫&#xff0c;因为官网下载需要用公司或学校邮箱邮箱注册账号&#xff0c;等待审核通过后才能进行下载数据集。并且一开始我也并不了解Cityscapes的格式和内容是什么样的&#xff0c;现在我弄明白后写下这篇文章&#xff0c;用于记录…

033_Structure_Static_In_Matlab求解结构静力学问题两套方法

结构静力学问题 静力学问现在是已经很简单的问题&#xff0c;在材料各向同性的情况下&#xff0c;对于弹性固体材料&#xff0c;很容易通过有限元求解。特别是线弹性问题&#xff0c;方程的矩阵形式可以很容易的写出&#xff08;准确得说是很容易通过有限元表达&#xff09;&a…

rnn/lstm 项目实战

tip:本项目用到的数据和代码在https://pan.baidu.com/s/1Cw6OSSWJevSv7T1ouk4B6Q?pwdz6w2 1. RNN : 预测股价 任务&#xff1a;基于zgpa_train.csv数据,建立RNN模型,预测股价 1.完成数据预处理&#xff0c;将序列数据转化为可用于RNN输入的数据 2.对新数据zgpa_test.csv进…

jenkins 构建报错 mvn: command not found

首先安装过 maven&#xff0c;并且配置过环境变量 win r ,输入 cmd 键入 mvn -v 出现上图输出&#xff0c;则证明安装成功。 原因 jenkins 没有 maven 配置全局属性, 导致无法找到 mvn 命令。 解决方案 找到全局属性&#xff0c;点击新增&#xff0c;配置 MAVEN_HOME 路…

轮廓图【HTML+CSS+JavaScript】

给大家分享一个很好看的轮播图&#xff0c;这个也是之前看到别人写的效果感觉很好看&#xff0c;所以后面也自己实现了一下&#xff0c;在这里分享给大家&#xff0c;希望大家也可以有所收获 轮播图效果&#xff1a; 视频效果有点浑浊&#xff0c;大家凑合着看&#xff0c;大家…

ChatGPT变AI搜索引擎!以后还需要谷歌吗?

前言 在北京时间11月1日凌晨&#xff0c;正值ChatGPT两岁生日之际&#xff0c;OpenAI宣布推出最新的人工智能搜索体验&#xff01;具备实时网络功能&#xff01;与 Google 展开直接竞争。 ChatGPT搜索的推出标志着ChatGPT成功消除了即时信息这一最后的短板。 这项新功能可供 …

Netty 组件介绍 - ByteBuf

直接内存&堆内存 ByteBuf buffer ByteBufAllocator.DEFAULT.heapBuffer(10);ByteBuf byteBuf ByteBufAllocator.DEFAULT.directBuffer(10); 组成 ByteBuf维护了两个不同的索引&#xff0c;一个用于读取&#xff0c;一个用于写入。 写入 内存回收 堆内存使用的是JVM内…

都快2025年了,来看看哪个编程语言才是时下热门吧

早上好啊&#xff0c;大佬们&#xff0c;今天咱们不讲知识&#xff0c;今天我们来看看时下热门的编程语言都是哪些&#xff0c;大佬们又都是在学哪些语言呢。 最近一些朋友和我在讨论哪个编程语言是现在 最好用 最厉害 的编程语言。 有人说&#xff0c;Python简单好用&#xf…

【雷达信号数据集】雷达脉冲活动分段的多级学习算法【附下载链接】

摘要 无线电信号识别是电子战中的一项重要功能。电子战系统需要精确识别和定位雷达脉冲活动&#xff0c;以产生有效的对抗措施。尽管这些任务很重要&#xff0c;但基于深度学习的雷达脉冲活动识别方法在很大程度上仍未得到充分探索。虽然之前已经探索了用于雷达调制识别的深度…

vscode php Launch built-in server and debug, PHP内置服务xdebug调试,自定义启动参数配置使用示例

在vscode中&#xff0c;当我们安装了插件 PHP Debug&#xff08;xdebug.php-debug&#xff09;或者 xdebug.php-pack 后 我们通过内置默认的 php xdebug配置启动php项目后&#xff0c;默认情况下我们在vscode中设置断点是不会生效的&#xff0c;因为我们的内置php服务默认启动时…

(二 上)VB 2010 设计初步

目录 一、常用类应用 1.Console类控制台 2.窗体基本控件 二、面向对象程序设计 1.类和对象 2.对象的属性、方法、事件属 1.属性 2.方法 3.事件、事件过程 1.事件 2.事件过程 3.对象浏览器 三、.NET类库与命名空间 1.命名空间 常用命名空间 1.System命名空间 2.…

[CARLA系列--01]CARLA 0.9.15 在Windows下的安装教程(一)

Carla是一款开源的自动驾驶仿真器&#xff0c;它基本可以用来帮助训练自动驾驶的所有模块&#xff0c;包括感知系统&#xff0c;Localization, 规划系统等等.Carla这个产品目前已经更新到了最新的0.9.15版本,目前遇到好多人在windows系统上如何安装可编辑版的Carla遇到了好多问…

禾川HCQ1控制器程序编译报错如何解决

1、第一次打开用户程序 2、提示库未安装 3、安装库文件 4、脉冲轴库未安装 5、没有错误 去禾川自动化官网,把可以安装的包和库都安装下,程序编译就没有错误了。 6、下载相关包文件

ubuntu20安装opencv3.2记录

系统环境 ubuntu20安装了ros-noetic&#xff0c;所以系统默认装了opencv4.2.0&#xff0c;但是跑fastlivo推荐的是opencv3.2.0&#xff0c;而且海康相机别人写的ros驱动&#xff08;海康相机ros驱动&#xff09;也是需要opencv3.2.0&#xff0c;最终还是选择安装多版本的openc…

基于NVIDIA NIM平台实现盲人过马路的demo(一)

前言:利用NVIDIA NIM平台提供的大模型进行编辑,通过llama-3.2-90b-vision-instruct模型进行初步的图片检测 step1: 部署大模型到本地,引用所需要的库 import os import requests import base64 import cv2 import time from datetime import datetimestep2: 观看官方使用文…