Mysql 高可用解决方案

1.环境说明

操作系统:centos7.7
主服务器:node2(192.168.1.102)
从服务器:node3(192.168.1.103)
keepalived中虚拟ip(VIP):192.168.1.100

2.准备事项

  • 主库和从库数据库的版本一致
  • 把主库的数据同步给从库一份

3.主库配置

3.1 编辑MySQL配置文件,开启二进制日志

Mysql:

[root@node2 /]# vim /etc/my.cnf

Mariadb:

[root@node2 /]# vim /etc/my.cnf.d/server.cnf

在下面添加如下配置

binlog-do-db=testdb
binlog-ignore-db=mysql
#启用二进制日志
log-bin=mysql-bin
#服务器唯一ID,与从数据库不重复即可
server-id=2

说明:binlog-do-db 需要同步的数据库 binlog-ignore-db 忽略同步的数据库

如果需要同步两个库的话,需要在添加一行

binlog-do-db=testdb2

3.2 重启mysql服务

Mysql:

[root@node2 /]# systemctl restart mysqld

Mariadb:

[root@node2 /]# systemctl restart mariadb

3.3 建立帐户并授权slave

[root@node2 /]# mysql -u root -proot

查看mysql的binlog是否开启

mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

赋予用户FILE 权限,FILE 权限允许用户执行文件操作,如导入和导出数据。

mysql> GRANT FILE ON *.* TO 'root'@'%' IDENTIFIED BY 'root';

REPLICATION SLAVE 权限允许用户作为复制从服务器连接到主服务器并读取二进制日志,REPLICATION CLIENT 权限允许用户监控和管理复制过程

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'root'@'%' identified by 'root';

刷新权限

mysql> FLUSH PRIVILEGES;

3.4 查询master的状态

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      863 | testdb       | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

注意:File 与Position参数需要记录下来,从数据库配置需要使用

4.从数据库配置

4.1 添加mysql配置

[root@node3 mysql]# vim /etc/my.cnf

在下面添加如下配置

server-id=3

说明:从数据库只需要配置server-id 即可,从库的server-id和主库的server-id必须不一致

4.2 重启mysql服务

[root@node3 mysql]# systemctl restart mysqld

4.3 配置从库

[root@node3 mysql]# mysql -u root -proot 
mysql>change master to master_host='192.168.1.102',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=863;

说明:
master_port: mysql服务器端口号
master_user: 执行同步操作的数据库账户
master_password: 同步账号的密码
master_log_pos: 863 就是上面3.4中主数据库中 show master status 中的position对应的值
master_log_file: mysql-bin.000001 就是上面3.4中主数据库中 show master status中的file对应的值

4.4 启动从库复制功能

mysql> start slave;

4.5 检查从库复制功能状态

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.102
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 863
               Relay_Log_File: node3-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: 863
              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: 2
                  Master_UUID: 393a9867-cc77-11ed-b111-000c29991e40
             Master_Info_File: /var/lib/mysql/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)

注意:Slave_IO_Running和Slave_SQL_Running这两个服务必须保证正常

至此,Mysql主从复制的配置已完成,可进行测试

5.高可用配置

  引入了keepalived,keepalived通过VIP虚拟IP的漂移实现高可用,在相同集群内发送组播包,master主通过VRRP协议发送组播包,告诉从主的状态。
  当我们通过keepalived虚拟出一个ip服务192.168.1.100,应用服务只需要将mysql配置信息更改为192.168.1.100的配置信息,192.168.1.100实际代理的实体服务器为192.168.1.102192.168.1.103
  当192.168.1.100实际代理192.168.1.102时,192.168.1.102服务出现故障后,keepalived通过自身机制,自动将192.168.1.103作为实际代理主服务器,不需要人工干预去修改mysql配置信息,从而实现了高可用

5.1 keepalived部署安装(主从操作一样)

[root@node2 software]$ wget -q http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
[root@node2 software]$ tar xf keepalived-1.2.13.tar.gz
[root@node2 software]$ yum install -y gcc openssl-devel popt-devel
[root@node2 software]$ cd keepalived-1.2.13
[root@node2 keepalived-1.2.13]# ./configure && make && make install
[root@node2 keepalived-1.2.13]# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
[root@node2 keepalived-1.2.13]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
[root@node2 keepalived-1.2.13]# mkdir /etc/keepalived
[root@node2 keepalived-1.2.13]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
[root@node2 keepalived-1.2.13]# cp /usr/local/sbin/keepalived /usr/sbin/
[root@node2 keepalived-1.2.13]# chkconfig --add keepalived
[root@node2 keepalived-1.2.13]# chkconfig --level 345 keepalived on

5.2 keepalived.conf配置

[root@node2 keepalived-1.2.13]# vim /etc/keepalived/keepalived.conf
5.2.1 主库配置
global_defs {
   router_id Nginx_HA_1
}

vrrp_script check_run {
    script "/home/mysql/mysql_check.sh"
    interval 2
}

vrrp_sync_group VG1 {
    group {
        VI_1
    }
}

vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 12
    priority 100
    advert_int 1
    nopreempt
    #本机ip
unicast_src_ip 192.168.1.102
unicast_peer {
    #对象IP  发送vrrp包给备服务器
    192.168.1.103
}

    authentication {
        auth_type PASS
        auth_pass nginxha
     }
    track_script {
         check_run
    }
    virtual_ipaddress {
        192.168.1.100
    }
}
5.2.2 从库配置
global_defs {
   router_id Nginx_HA_1
}

vrrp_script check_run {
    script "/home/mysql/mysql_check.sh"
    interval 2
}

vrrp_sync_group VG1 {
    group {
        VI_1
    }
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens32
    virtual_router_id 12
    priority 50
    advert_int 1
    nopreempt
    #本机ip
unicast_src_ip 192.168.1.103
unicast_peer {
    #对象IP  发送vrrp包给备服务器
    192.168.1.102
}

    authentication {
        auth_type PASS
        auth_pass nginxha
     }
    track_script {
         check_run
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

说明:
1.interface ens32 ->ens32是linux网卡名称
2.主服务 priority 参数必须大于 从服务
3.script “/home/mysql/mysql_check.sh” mysql_check.sh是检测mysql是否正常的脚本 如果不正常就关闭keepalived;

5.3 编写检查Mysql脚本(mysql_check.sh)

[root@node2 keepalived-1.2.13]# vim /home/mysql/mysql_check.sh
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    service keepalived stop
fi

主服务器和从服务器节点都要一份

#授权与格式转换
[root@node2 ~]# chmod -R 777  /home/mysql/mysql_check.sh    
[root@node2 ~]# sed -i "s/\r//" /home/mysql/mysql_check.sh

5.4 启动并测试

主从都启动

[root@node2 ~]# systemctl start keepalived

启动后可以进行状态查看

[root@node2 ~]# service keepalived status
● keepalived.service - SYSV: Start and stop Keepalived
   Loaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled)
   Active: active (running) since 一 2024-02-26 22:18:06 CST; 14s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2901 ExecStart=/etc/rc.d/init.d/keepalived start (code=exited, status=0/SUCCESS)
 Main PID: 2908 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─2908 keepalived -D
           ├─2910 keepalived -D
           └─2911 keepalived -D

查看vip绑定到哪台机器上

[root@node2 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:99:1e:40 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global noprefixroute ens32
       valid_lft forever preferred_lft forever
    inet 192.168.1.100/32 scope global ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::348f:8ac3:b2c:809d/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@node3 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:8e:59:08 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.103/24 brd 192.168.1.255 scope global noprefixroute ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::d26d:7d7a:6daa:f99b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

至此,MySQL高可用配置完成,现在访问虚拟IP(192.168.1.100)即可访问到MySQL主节点(192.168.1.102)

6.问题点

6.1 在配置mysql从服务器的时候如果出现以下问题

在这里插入图片描述
首先确定两台机器中my.cnf中server-id配置不一样

然后将其中一台机器auto.cnf文件备份
mv auto.cnf auto.cnf.bak
接着重启那台mysql,会自动创建auto.cnf

6.2 在启动keepalived的时候如果启动不起来

在这里插入图片描述
按照提示查看keepalived的状态
在这里插入图片描述
需要给缺失的动态库文件做软连接libssl.so.1.1(openssl组件)
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

6.3 在安装keepalived的时候需要安装openssl-devel这个包,安装的时候可能会出现如下错误

在这里插入图片描述
先按照上述提示执行

yum install -y openssl-devel --setopt=protected_multilib=false

然后再对keepalived进行编译安装
如果出现以下错误
在这里插入图片描述
需要把node2上的openssl-devel这个包以及所有的依赖全部下载下来

yumdownloader --resolve --destdir /root/chrome/  openssl-devel
Yumdownloader:只下载不安装
--resolve :下载需要的依赖
--destdir : 指定下载存放的目录
然后把所有的rpm包拷贝到另一台mysql所在节点
scp -r chrome/ root@node3:/app/module/

在这里插入图片描述
然后在node3上进行安装所有的包

rpm -ivh ./*.rpm --nodeps --force

这样所需要的openssl-devel就已经安装成功
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习:朴素贝叶斯算法(Python)

一、朴素贝叶斯算法的实现 naive_bayes_classifier.py import numpy as np import collections as cc # 集合的计数功能 from scipy.stats import norm # 极大似然估计样本的均值和标准方差 from data_bin_wrapper import DataBinsWrapperclass NaiveBayesClassifier:"…

绝对路径拼接漏洞 [NISACTF 2022]babyupload

打开题目 最开始以为是文件上传的漏洞 结果发现无论我们上传什么文件都会显示bad filename 去网上看了大佬的wp知道 我们直接去看源代码得到提示 /source 那我们去访问一下这个路径看看 得到一个下载文件 用记事本打开得到 源代码如下 from flask import Flask, request, r…

猫头虎分享已解决Bug || ValueError: Unknown label type: ‘continuous‘

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Linux:线程控制

目录 线程的相关知识 线程创建 pthread_create 线程关于进程内部资源问题 线程等待 pthread_join 线程退出 pthread_cancel 线程id的理解 pthread_self 线程分离 pthread_detach 线程的相关知识 首先线程是在进程内部执行的&#xff0c;是OS调度的基本单位 线程的…

JAVA学习笔记12

1.键盘输入语句 1.1 介绍 ​ *在编程中&#xff0c;需要接收用户输入的数据&#xff0c;就可以使用键盘输入语句来获取。 1.2 步骤 ​ 1.导入该类的所在包&#xff0c;java.util.* ​ 2.创建该类对象&#xff08;声明变量&#xff09; ​ 3.调用里面的功能 import java.…

算法打卡day2|数组篇|Leetcode 977.有序数组的平方、 209.长度最小的子数组、59.螺旋矩阵II

算法题 Leetcode 977.有序数组的平方 题目链接: 977.有序数组的平方 大佬视频讲解&#xff1a;977.有序数组的平方 个人思路 第一时间就只想到暴力解法&#xff0c;双重循环一个循环比较一个循环赋值&#xff1b;但这样可能会超时&#xff0c;所以还能用双指针&#xff0…

halcon中的2D测量-椭圆

一、定义 二维测量指的是测量二维几何图形的参数&#xff0c;例如圆、椭圆、圆弧、矩形的相关参数。这里的参数对圆来说可以是半径&#xff1b;椭圆可以是长半轴、短半轴&#xff1b;矩形则包括宽和高。 二、基本步骤 1.创建测量模型 使用算子 create_metrology_model 2.设…

积分商城管理系统的设计与实现

积分商城管理系统的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

设计模式(二)单例模式的七种写法

相关文章设计模式系列 面试的时候&#xff0c;问到许多年轻的Android开发他所会的设计模式是什么&#xff0c;基本上都会提到单例模式&#xff0c;但是对单例模式也是一知半解&#xff0c;在Android开发中我们经常会运用单例模式&#xff0c;所以我们还是要更了解单例模式才对…

【任何电机可使用的七段式s曲线-----包括matlab代码和simulink仿真】

永磁同步电机七段式s曲线 一、前言二、理论分析三、7段式s曲线加减速关系图四、matlab代码代码结果 五、simulink七段式s曲线整体框图simulink结果s-function内嵌代码 六、使用双闭环FOC控制-----simulink仿真示意 一、前言 S形&#xff1a;加加速(T1)→>匀加速(T2)→减加速…

【JVM】StringTable 字符串常量池

参考&#xff1a;javaGuide 字符串常量池 是 JVM 为了提升性能和减少内存消耗针对字符串&#xff08;String 类&#xff09;专门开辟的一块区域&#xff0c;主要目的是为了避免字符串的重复创建 String的不可变性 1.通过字面量的方式&#xff08;区别于new&#xff09;给一个…

Avalonia学习(二十六)-桌面系统界面Ribbon

这个界面是开源项目中拔下来的&#xff0c;我没有全部改完&#xff0c;只能按照我得界面测试。我还有一个bug没有找到&#xff0c;但是解决了一下。这里没有任何和大家说的&#xff0c;给大家看一下界面效果。 另外地图研究了缩放和显示鼠标位置经纬度

https://htmlunit.sourceforge.io/

https://htmlunit.sourceforge.io/ 爬虫 HtmlUnit – Welcome to HtmlUnit HtmlUnit 3.11.0 API https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit/2.70.0 https://s01.oss.sonatype.org/service/local/repositories/releases/content/org/htmlunit…

Java核心知识点常考面试题(持续更新中)

Java核心知识点常考面试题&#xff08;持续更新中&#xff09; 线程与线程池线程线程池 Java锁机制java线程模型java锁分类轻量级锁重量级锁ReentrantLock 底层原理与源码深度解析ReentrantReadWriteLock 深入理解读写锁CountDownLatchsemaphore 实现公平锁与非公平锁线程死锁与…

Android 9.0 禁用插入耳机时弹出的保护听力对话框

1.前言 在9.0的系统rom定制化开发中,在某些产品中会对耳机音量调节过高限制,在调高到最大音量的70%的时候,会弹出音量过高弹出警告,所以产品 开发的需要要求去掉这个音量弹窗警告功能,接下来就来具体实现这个功能 2.禁用插入耳机时弹出的保护听力对话框的核心类 framework…

第六十八天 APP攻防-XposedFridaHook证书校验反代理代理转发

第68天 APP攻防-Xposed&Frida&Hook&证书校验&反代理&代理转发 知识点&#xff1a; 1、APP防代理绕过-应用&转发 2、APP证书校验类型-单向&双向 3、APP证书校验绕过-Frida&XP框架等 章节点&#xff1a; 1、信息收集-应用&资产提取&权…

蓝桥杯-标题统计

知识点: 关键是考察getline的作用 #include <iostream> using namespace std; int main() { string a; int t0; getline(cin,a);//每次读取一整行并把Enter键生成的换行符抛弃 for(int i0;i<a.length();i){ if(a[i]! )t; } cout<<t; return …

【LTSPICE】宏模型中的语法分析(持续更新)

本篇文章用来总结模型文件、仿真文件中的语法&#xff0c;写给自己看的&#xff0c;格式和内容上比较随意 上图是在安森美官网上下载的一款二极管的spice模型文件。 * 字符串&#xff1a;注释&#xff0c;能看到这篇文章的应该都懂啥叫注释.model&#xff1a;.一个词是命令…

如何修改图片尺寸大小不变形?简单的图片改大小的方法

在平时工作或者学习时&#xff0c;有时候需要将图片的大小进行修改&#xff0c;以便于存储、分享或打印&#xff0c;很多人都习惯性的去下载一些图片处理软件&#xff0c;比较麻烦&#xff0c;这里推荐大家使用图片在线处理工具&#xff0c;打开浏览器直接将图片尺寸修改&#…

【Flink】Flink 中的时间和窗口之窗口(Window)

1. 窗口的概念 Flink是一种流式计算引擎&#xff0c;主要是来处理无界数据流&#xff0c;数据流的数据是一直都有的&#xff0c;等待流结束输入数据获取所有的流数据在做聚合计算是不可能的。为了更方便高效的处理无界流&#xff0c;一种方式就是把无限的流数据切割成有限的数…