MySQL 高可用解决方案(双主双从)

1.环境说明

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

2.准备事项

  • 主库和从库数据库的版本一致
  • 把主库的数据同步给从库一份
#对主库进行全局读锁定
FLUSH TABLES WITH READ LOCK ;
#在主服务器上把数据导出
mysqldump -udolphinscheduler -p dolphinscheduler_new > dolphinscheduler_new.sql
#在从服务器上进行数据导入
mysql -u root -p dolphinscheduler_new < dolphinscheduler_new.sql

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 eventMaster_Host: 192.168.1.102Master_User: rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 863Relay_Log_File: node3-relay-bin.000002Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000001Slave_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: 863Relay_Log_Space: 527Until_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: 393a9867-cc77-11ed-b111-000c29991e40Master_Info_File: /var/lib/mysql/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave 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: 
1 row in set (0.00 sec)

注意:Slave_IO_Running和Slave_SQL_Running这两个服务必须保证正常
至此,Mysql主从复制的配置已完成,可进行测试

5.双主双从配置

  • 把从库当作主库,在从库(node3)上面执行主库(node2)的操作配置,以上第3节
  • 把主库当作从库,在主库(node2)上面执行从库(node3)的操作配置,以上第4节

6.高可用配置

  引入了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配置信息,从而实现了高可用

6.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

6.2 keepalived.conf配置

[root@node2 keepalived-1.2.13]# vim /etc/keepalived/keepalived.conf
6.2.1 主库配置
global_defs {router_id Nginx_HA_1
}vrrp_script check_run {script "/home/mysql/mysql_check.sh"interval 60fall 3rise 1
}vrrp_sync_group VG1 {group {VI_1}
}vrrp_instance VI_1 {state MASTERinterface ens32virtual_router_id 12priority 100advert_int 1nopreempt#本机ip
unicast_src_ip 192.168.1.102
unicast_peer {#对象IP  发送vrrp包给备服务器192.168.1.103
}authentication {auth_type PASSauth_pass nginxha}track_script {check_run}virtual_ipaddress {192.168.1.100}
}
6.2.2 从库配置
global_defs {router_id Nginx_HA_1
}vrrp_script check_run {script "/home/mysql/mysql_check.sh"interval 30rise 1fall 3
}vrrp_sync_group VG1 {group {VI_1}
}vrrp_instance VI_1 {state BACKUPinterface ens32virtual_router_id 12priority 50advert_int 1nopreempt#本机ip
unicast_src_ip 192.168.1.103
unicast_peer {#对象IP  发送vrrp包给备服务器192.168.1.102
}authentication {auth_type PASSauth_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;
4.interval 60:定义了检查脚本执行的时间间隔,此处为60秒。意味着每隔60秒执行一次脚本检查;
5.fall 3:指定在多少次检查失败后认定服务故障切换到备用服务器;
6.rise 1:指定在多少次检查成功后切回到主服务器,表示在连续1次检查成功后才会将服务恢复到主服务器。

6.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 ]; thenservice keepalived stop
fi

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

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

6.4 启动并测试

主从都启动

[root@node2 ~]# systemctl start keepalived

启动后可以进行状态查看

[root@node2 ~]# service keepalived status
● keepalived.service - SYSV: Start and stop KeepalivedLoaded: loaded (/etc/rc.d/init.d/keepalived; bad; vendor preset: disabled)Active: active (running) since 一 2024-02-26 22:18:06 CST; 14s agoDocs: 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 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::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 1000link/ether 00:0c:29:99:1e:40 brd ff:ff:ff:ff:ff:ffinet 192.168.1.102/24 brd 192.168.1.255 scope global noprefixroute ens32valid_lft forever preferred_lft foreverinet 192.168.1.100/32 scope global ens32valid_lft forever preferred_lft foreverinet6 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 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::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 1000link/ether 00:0c:29:8e:59:08 brd ff:ff:ff:ff:ff:ffinet 192.168.1.103/24 brd 192.168.1.255 scope global noprefixroute ens32valid_lft forever preferred_lft foreverinet6 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)

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

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

相关文章

GEE代码条带问题——sentinel-1接缝处理的问题

问题 我有兴趣确定 NDVI 损失最大的年份。我创建了一个函数来收集所有陆地卫星图像并应用预处理。当我导出结果以识别 NDVI 损失最大年份时&#xff0c;生成的数据产品与陆地卫星场景足迹有可怕的接缝线。造成这种情况的原因是什么以及如何调整代码&#xff1f; sentinel1数据…

flutter之终极报错

看到这个报错头都大了 一开始在网上各种搜搜&#xff0c;然后有人说是flutter版本的问题&#xff0c;改完版本之后还是不对&#xff0c;又是各种搜搜搜 有人说是环境变量的问题&#xff0c;后来改了环境变量&#xff0c;妈的&#xff0c;竟然还不行&#xff0c;想砸电脑的心都…

Xcode :Could not build module ‘WebKit‘ 已验证解决

问题&#xff1a;Could not build module WebKit 具体报错如下&#xff1a; error: type argument nw_proxy_config_t (aka struct nw_proxy_config *) is neither an Objective-C object nor a block type property (nullable, nonatomic, copy) NSArray<nw_proxy_config_…

C++学习笔记:set和map

set和map set什么是setset的使用 关联式容器键值对 map什么是mapmap的使用map的插入方式常用功能map[] 的灵活使用 set 什么是set set是STL中一个底层为二叉搜索树来实现的容器 若要使用set需要包含头文件 #include<set>set中的元素具有唯一性(因此可以用set去重)若用…

【java-面试题】start和run的区别

【java-面试题】start和run的区别 在run方法内部&#xff0c;只是单纯的描述了该线程要执行的内容。run方法是线程的入口。 在start方法内部&#xff0c;会调用到系统api&#xff0c;从而在系统内核中创建出线程&#xff0c;创建线程后&#xff0c;再自动调用run方法。 在代码…

掌握未来技术:一站式深度学习学习平台体验!

介绍&#xff1a;深度学习是机器学习的一个子领域&#xff0c;它模仿人脑的分析和学习能力&#xff0c;通过构建和训练多层神经网络来学习数据的内在规律和表示层次。 深度学习的核心在于能够自动学习数据中的高层次特征&#xff0c;而无需人工进行复杂的特征工程。这种方法在图…

大模型笔记:RAG(Retrieval Augmented Generation,检索增强生成)

1 大模型知识更新的困境 大模型的知识更新是很困难的&#xff0c;主要原因在于&#xff1a; 训练数据集固定,一旦训练完成就很难再通过继续训练来更新其知识参数量巨大,随时进行fine-tuning需要消耗大量的资源&#xff0c;并且需要相当长的时间LLM的知识是编码在数百亿个参数中…

格式规范性知识的探究式学习

对于格式规范性这种规定性的知识&#xff0c;可以采用“增删改”的方式进行控究式学习。 #include<stdio.h>int main(){printf("%.1f\n", 8.0/5.0);return 0;} 这个printf语句分两部分&#xff0c;本身的功能就是格式化输出&#xff0c;因此参数完全是格式化…

一些C语言知识

C语言的内置类型&#xff1a; char short int long float double C99中引入了bool类型&#xff0c;用来表示真假的变量类型&#xff0c;包含true&#xff0c;false。 这个代码的执行结果是什么&#xff1f;好好想想哦&#xff0c;坑挺多的。 #include <stdio.h>int mai…

STM32(5) GPIO(2)输出

1.点亮LED 1.1 推挽接法和开漏接法 要想点亮LED&#xff0c;有两种接法 推挽接法&#xff1a; 向寄存器写1&#xff0c;引脚输出高电平&#xff0c;LED点亮&#xff1b;向寄存器写0&#xff0c;引脚输出低电平&#xff0c;LED熄灭。 开漏接法&#xff1a; 向寄存器写0&…

Kubernetes operator 前置知识篇

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列的前置知识篇&#xff0c;帮助大家对 Operator 进行初步了解Kubernetes operator学习系列 快捷链接 Kubernetes operator 前置知识篇Kubernetes operator&#xff08;一&#xff0…

《精益DevOps》:填补IT服务交付的认知差距,实现高效可靠的客户期望满足

写在前面 在当今的商业环境中&#xff0c;IT服务交付已经成为企业成功的关键因素之一。然而&#xff0c;实现高效、可靠、安全且符合客户期望的IT服务交付却是一项艰巨的任务。这要求服务提供商不仅具备先进的技术能力&#xff0c;还需要拥有出色的组织协作、流程管理和态势感…

UniApp项目处理小程序分包

目前 uniApp也成为一种 App端开发的大趋势 因为在目前跨端 uniApp可以说相当优秀 可以同时兼容 H5 PC 小程序 APP 的技术 目前市场屈指可数 那么 说到微信小程序 自然就要处理分包 因为微信小程序对应用大小限制非常铭感 限制在2MB 超过之后就会无法真机调试与打包 不过需要注…

快速排序C语言代码实现(2)

#include<stdio.h> void quick_sort(int arr[], int left, int right) {if (left < right) {int i left, j right, pivot arr[i];while (i < j) {while (i<j&&arr[j]>pivot) {//此时判断使用i<j的目的是为了最终的目标位置是ij时的位置j--;}if…

vue项目中使用antvX6新手教程,附demo案例讲解(可拖拽流程图、网络拓扑图)

前言&#xff1a; 之前分别做了vue2和vue3项目里的网络拓扑图功能&#xff0c;发现对antv X6的讲解博客比较少&#xff0c;最近终于得闲码一篇了&#xff01; 需求&#xff1a; 用户可以自己拖拽节点&#xff0c;节点之间可以随意连线&#xff0c;保存拓扑图数据后传给后端&…

cPanel面板安装付费的SSL证书

前不久遇到购买Hostease服务器的客户反馈需要安装SSL证书。因为安装 SSL 证书不仅可以保护用户数据安全&#xff0c;增加用户信任度&#xff0c;提升搜索引擎排名&#xff0c;还有助于符合法规和标准&#xff0c;防止网络攻击。 安装SSL证书可以通过如下步骤: 1. 选择 SSL 证书…

数学建模【多元线性回归模型】

一、多元线性回归模型简介 回归分析是数据分析中最基础也是最重要的分析工具&#xff0c;绝大多数的数据分析问题&#xff0c;都可以使用回归的思想来解决。回归分析的任务就是&#xff0c;通过研究自变量X和因变量Y的相关关系&#xff0c;尝试去解释Y的形成机制&#xff0c;进…

Linux配置网卡功能

提示:工具下载链接在文章最后 目录 一.network功能介绍二.配置network功能2.1 network_ip配置检查 2.2 network_br配置2.2.1 配置的网桥原先不存在检查2.2.2 配置的网桥已存在-修改网桥IP检查2.2.3 配置的网桥已存在-只添加网卡到网桥里检查 2.3 network_bond配置检查 2.4 netw…

Access AR Foundation 5.1 in Unity 2022

如果已经下载安装了ARF但版本是5.0.7 可以通过下面的方式修改 修改后面的数字会自动更新 更新完成后查看版本 官方文档 Access AR Foundation 5.1 in Unity 2021 | AR Foundation | 5.1.2

【知识整理】Git 使用实践问题整理

问题1、fatal: refusing to merge unrelated histories 一、Git 的报错 fatal: refusing to merge unrelated histories 新建了一个仓库之后&#xff0c;把本地仓库进行关联提交、拉取的时候&#xff0c;出现了如下错误&#xff1a; fatal: master does not appear to be a g…