MySQl高可用集群搭建(MGR + ProxySQL + Keepalived)

news2024/11/29 22:49:54

前言

服务器规划(CentOS7.x)

IP地址主机名部署角色
192.168.x.101mysql01mysql
192.168.x.102mysql02mysql
192.168.x.103mysql03mysql
192.168.x.104proxysql01proxysql、keepalived
192.168.x.105proxysql02proxysql、keepalived

将安装包 mysql_cluster_ha_pack.zip 上传至集群所有服务器,并解压(需要包请私我)。

上传位置 /root/

一、基础配置

1.1 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

1.2 关闭selinux

# 获取selinux状态
getenforce
# 临时关闭
setenforce 0 
# 永久关闭需要重启
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux 

1.3 修改主机名

# 临时修改
hostnamectl --transient set-hostname xxxx
# 永久修改需要重启   --static可以省略
hostnamectl --static set-hostname xxxx 

1.4 修改hosts

vim /etc/hosts

192.168.x.101 mysql01
192.168.x.102 mysql02
192.168.x.103 mysql03
192.168.x.104 proxysql01
192.168.x.105 proxysql02

二、MySQL安装

2.1 安装MySQL(mysql01、02、03)

cd /root/mysql_cluster_ha_pack/mysql
mv mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar /root
# 执行 mysql_auto_install.sh 前请确认 /opt/module/mysql 目录不存在
sh mysql_auto_install.sh
# 提示输入 root 用户密码
(Default password: root):xxxxxx

2.2 修改配置

(mysql01)

vim /etc/my.cnf
# 追加下面内容
server-id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log-bin=binlog
binlog_checksum=NONE
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="mysql01:24901"
loose-group_replication_group_seeds="mysql01:24901,mysql02:24901,mysql03:24901"
loose-group_replication_bootstrap_group=OFF
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
max_connections=2000

(mysql02)

vim /etc/my.cnf
# 追加下面内容
server-id=2
gtid_mode=ON
enforce_gtid_consistency=ON
log-bin=binlog
binlog_checksum=NONE
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="mysql02:24901"
loose-group_replication_group_seeds="mysql01:24901,mysql02:24901,mysql03:24901"
loose-group_replication_bootstrap_group=OFF
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
max_connections=2000

(mysql03)

vim /etc/my.cnf
# 追加下面内容
server-id=3
gtid_mode=ON
enforce_gtid_consistency=ON
log-bin=binlog
binlog_checksum=NONE
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="mysql03:24901"
loose-group_replication_group_seeds="mysql01:24901,mysql02:24901,mysql03:24901"
loose-group_replication_bootstrap_group=OFF
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
max_connections=2000

2.3 初始化MySQL(mysql01、02、03)

systemctl restart mysqld
# 连接mysql,输入root的密码
mysql -uroot -p
# 创建同步数据用户
CREATE USER rpl_user@'%' IDENTIFIED BY 'rpl202302';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
# 重置已产生的binlog
RESET MASTER;
# 安装MGR插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
# 运行下面的SQL,看到结果出现PLUGIN_STATUS=ACTIVE,说明安装成功了
SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'group_replication' \G;
# 指定主从账户与指定通信频道
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="rpl202302" FOR CHANNEL 'group_replication_recovery';

2.4 启动 MGR 集群

(mysql01)

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

(mysql02、03)

START GROUP_REPLICATION;
-- 运行下面结果进行验证。
SELECT * FROM performance_schema.replication_group_members;

日志位置:/var/log/mysqld.log

2.5 查看自身角色

show variables like '%read_only%';

(mysql01)

在这里插入图片描述

(mysql02、03)

在这里插入图片描述

与图片保持一致成功。

三、ProxySQL安装

3.1 安装Proxysql(proxysql01、02)

cd /root/mysql_cluster_ha_pack/proxysql/rpms/proxysql
rpm -ivh *.rpm --force

3.2 安装mysql客户端(proxysql01、02)

cd /root/mysql_cluster_ha_pack/proxysql/rpms/mysql_client
rpm -Uvh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
rpm -Uvh mysql-community-client-5.7.28-1.el7.x86_64.rpm

3.3 配置(proxysql01、02)

vim /etc/proxysql.cnf
# 替换部分
admin_variables=
{
        admin_credentials="admin:admin;cluster_kevin:proxy2023"
        mysql_ifaces="0.0.0.0:6032"
        cluster_username="cluster_kevin"
        cluster_password="proxy2023"
        cluster_check_interval_ms=1000
        cluster_check_status_frequency=10
        cluster_mysql_query_rules_save_to_disk=true
        cluster_mysql_servers_save_to_disk=true
        cluster_mysql_users_save_to_disk=true
        cluster_proxysql_servers_save_to_disk=true
        cluster_mysql_query_rules_diffs_before_sync=3
        cluster_mysql_servers_diffs_before_sync=3
        cluster_mysql_users_diffs_before_sync=3
        cluster_proxysql_servers_diffs_before_sync=3
}

# 追加部分(注意修改IP)
proxysql_servers =                                    
(
        {
                hostname="192.168.x.104"
                port=6032
                weight=1
                comment="proxysql01"
        },
        {
                hostname="192.168.x.105"
                port=6032
                weight=1
                comment="proxysql02"
        }
)
# 通过命令修改配置
sed -i 's/threads=4/threads=8' /etc/proxysql.cnf
sed -i 's/max_connections=2048/max_connections=1000000' /etc/proxysql.cnf

3.4 MySQL创建用户\视图(mysql01)

# 连接mysql,输入root的密码
mysql ‐uroot ‐p
CREATE USER 'monitor'@'%' IDENTIFIED BY "monitor@2023";
CREATE USER 'proxysql'@'%' IDENTIFIED BY "proxysql@2023";
GRANT ALL PRIVILEGES ON *.* TO 'monitor'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'proxysql'@'%';
FLUSH PRIVILEGES;
USE sys;
SOURCE /root/mysql_cluster_ha_pack/proxysql/addition_to_sys.sql

# 查看 mysql 处于 MGR 中的角色状态
select * from sys.gr_member_routing_candidate_status;

3.5 启动

(proxysql01、02)

rm -rf /var/lib/proxysql/proxysql.db
systemctl start proxysql

(proxysql01)

# 管理员身份登录 proxysql
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
# 查看集群状态,配置中的集群信息是否加载进来
select * from proxysql_servers;
# 添加角色
set mysql-monitor_username='monitor';
set mysql-monitor_password='monitor@2023';
INSERT INTO mysql_users(username,password,active,default_hostgroup,transaction_persistent ) VALUES ('proxysql','proxysql@2023',1,10,1);
# 添加后端节点 注意修改成对应的ip!
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.101',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.102',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'192.168.x.103',3306);
# 设置读写主机组
INSERT INTO mysql_group_replication_hostgroups (writer_hostgroup,backup_writer_hostgroup,reader_hostgroup,offline_hostgroup,active,max_writers,writer_is_also_reader,max_transactions_behind) VALUES (10,20,30,40,1,1,0,100);
# 设置读写分离规则
INSERT INTO mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1), (2,1,'^SELECT',30,1);
# 保存启用
load mysql servers to runtime;
save mysql servers to disk;
load mysql users to runtime;
save mysql users to disk;
load mysql variables to runtime;
save mysql variables to disk;
load mysql query rules to runtime;
save mysql query rules to disk;

日志位置:/var/lib/proxysql/proxysql.log

3.6 查看 MGR 状态(proxysql01、02)

# 管理员身份登录 proxysql
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

# 状态校验
select hostgroup_id,hostname,port,status from runtime_mysql_servers;

在这里插入图片描述

除了 hostname 其余应保持一致。

四、Keepalived安装

4.1 安装Keepalived(proxysql01、02)

cd /root/mysql_cluster_ha_pack/keepalived/rpms/gcc
rpm -Uvh *.rpm --nodeps --force
cd /root/mysql_cluster_ha_pack/keepalived/rpms/gcc-c++
rpm -Uvh *.rpm --nodeps --force
cd /root/mysql_cluster_ha_pack/keepalived
tar -zxf keepalived-2.2.7.tar.gz -C /usr/local/src
cd /usr/local/src/keepalived-2.2.7/
./configure --prefix=/usr/local/keepalived
make & make install
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
mkdir /etc/keepalived
# 监控脚本
cp /root/mysql_cluster_ha_pack/keepalived/proxysql_check.sh /etc/keepalived/proxysql_check.sh
chmod u+x /etc/keepalived/proxysql_check.sh

4.2 配置

查看网卡名(proxysql01、02)

ifconfig

在这里插入图片描述

(proxysql01)

vim /etc/keepalived/keepalived.conf
# 仅需修改网卡名称和虚拟IP
! Configuration File for keepalived

vrrp_script chk_proxysql_port  {
	script "sh /etc/keepalived/proxysql_check.sh"
	interval 2
	weight 1
}

vrrp_instance VI_1 {
	state MASTER
	interface ens192 #节点网卡名
	virtual_router_id 51
	priority 100
	advert_int 2
	authentication {
		auth_type PASS
		auth_pass keep2023
	}
	virtual_ipaddress {
		192.168.0.99/24 #虚拟IP,和外网的IP要一个网段
	}
	track_script {
		chk_proxysql_port
	}
}

(proxysql02)

vim /etc/keepalived/keepalived.conf
# 仅需修改网卡名称和虚拟IP
! Configuration File for keepalived

vrrp_script chk_proxysql_port  {
	script "sh /etc/keepalived/proxysql_check.sh"
	interval 2
	weight 1
}

vrrp_instance VI_1 {
	state BACKUP
	interface ens192 #节点网卡名
	virtual_router_id 51
	priority 99
	advert_int 2
	authentication {
		auth_type PASS
		auth_pass keep2023
	}
	virtual_ipaddress {
		192.168.0.99/24 #虚拟IP,和外网的IP要一个网段
	}
	track_script {
		chk_proxysql_port
	}
}

4.3 启动(proxysql01、02)

systemctl start keepalived

日志位置:/var/log/messages

五、测试

create database testdb;
use testdb;
create table test (id int primary key,name varchar(20));
select * from test;
insert into test values (1,'zhangsan');

读写分离测试

# 登录proxysql回到6032,查看路由日志
mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
select hostgroup,username,digest_text,count_star from stats_mysql_query_digest;

通过 stop mysql 或 stop proxysql 服务做故障迁移测试(MGR集群单点故障和proxysql集群单点故障);

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

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

相关文章

这套软件测试试卷能打90分,直接入职字节吧

目录 一.填空 二、 判断题(正确的√,错误的╳)共10分,每小题1分 三、数据库部分:(共15分) 四、设计题。本题共 1 小题,满分 20分 一.填空 1、 系…

让ArcMap变得更加强大,用python执行地理处理以及编写自定义脚本工具箱

文章目录一、用python执行地理处理工具1.1 例:乘以0.00011.2 例:裁剪栅格1.3 哪里查看调用某工具的代码?二、用python批量执行地理处理工具2.1 必需的python语法知识for循环语句缩进的使用注释的使用2.2 一个批处理栅格的代码模板三、创建自定…

数组中的各种迭代API方法手写

js的数组上有很多实用的方法,不论是在遍历数组上,还是在操作数组内元素上,它有许多不同的遍历数组的方法,同时它还有着可以直接操作数组中间元素的方法。 接下来,我来带大家手写数组里的 遍历方法 。 Array.forEach(…

Elasticsearch在Linux中的单节点部署和集群部署

目录一、Elasticsearch简介二、Linux单节点部署1、软件下载解压2、创建用户3、修改配置文件4、切换到刚刚创建的用户启动软件5、测试三、Linux集群配置1、拷贝文件2、修改配置文件3、分别修改文件所有者4、启动三个软件5、测试四、问题总结1、在elasticsearch启动时如果报错内存…

【黑盒模糊测试】路由器固件漏洞挖掘实战--AFL++ qemu_mode

前言 很久之前就想写AFL++的qemu_mode了,只是模糊测试专题的文章有些过于耗费时间,加上工作原因导致一直搁置。最近需要出差会用到黑盒模糊测试,所以就当做复习一遍,我记得Fuzzing 101也有一个qemu_mode的练习,有空的话下一篇文章更新吧~ 编写不易,如果能够帮助到你,希望…

金三银四软件测试面试如何拿捏面试官?【接口测试篇】

九、接口测试 9.1 接口测试怎么测 (jmeter版本) 首先开发会给我们一个接口文档,我们根据开发给的接口文档,进行测试点的分析,主要是考虑正常场景与异常场景,正常场景,条件的组合,…

前端vue实现获取七天时间和星期几功能

前端vue实现获取七天时间和星期几功能 功能展示代码 <div v-for"(item,index) in same_week" :class"[same_dayitem.date? activ :,dis]" click"select(item)" :keyindex><span>{{item.name}}</span><span>{{item.…

[技术经理]01 程序员最优的成长之路是什么?

00前言 谈起程序员的职业规划&#xff0c;针对大部分的职场人士&#xff0c;最优的成长之路应该是走技术管理路线&#xff0c;而不是走技术专家路线。 01关键的一步 中国自古就有“学而优则仕”的传统&#xff0c;发展到今天&#xff0c;在我们的现代企业里面&#xff0c;尤…

【JavaEE初阶】第一节.多线程(进阶篇 ) 常见的锁策略、CAS及它的ABA问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、常见的锁策略 1.1 乐观锁 vs 悲观锁 1.2 普通的互斥锁 vs 读写锁 1.3 重量级锁 vs 轻量级锁 1.4 自旋锁 vs 挂起等待锁 1.5 公平…

Mac - Spotlight(聚焦)

文章目录一、Mac 中 Spotlight 的使用1、调用/打开 Spotlight2、执行搜索3、Spotlight 设置二、Mac 上的 Spotlight 开发1、关于 Spotlight2、使用 NSMetadataQuery 搜索示例三、mds 和 fsevents四、命令行访问 Spotlight五、Core Spotlight Framework六、Spotlight 插件相关资…

拼多多订单查询

下载地址webcrawl最新版本下载、安装、运行教程使用场景场景一我有很多个拼多多的买家号&#xff0c;想通过一个订单编号&#xff0c;查询该订单的各种信息&#xff0c;如订单状态&#xff0c;收件信息&#xff0c;物流信息&#xff0c;售后信息&#xff0c;联系商家场景二有很…

unix高级编程-fork和execve

fork和vfork vfork是老的实现方法又很多问题 vfork #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <signal.h> #include <errno.h> #include <sys/stat.…

AQS-ReentrantLock

一、AQS 在 Lock 中&#xff0c;用到了一个同步队列 AQS&#xff0c;全称 AbstractQueuedSynchronizer&#xff0c;它是一个同步工具&#xff0c;也是 Lock 用来实现线程同步的核心组件。 1.AQS 的两种功能 独占和共享。 独占锁&#xff1a;每次只能有一个线程持有锁&#x…

Git 分支操作

1&#xff1a;什么是分支几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能&#xff0c;以免影响开发主线。 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作…

2023“Java基础-中级-高级”面试集结,已奉上我的膝盖

Java基础&#xff08;对象线程字符接口变量异常方法&#xff09; 面向对象和面向过程的区别&#xff1f; Java 语言有哪些特点&#xff1f; 关于 JVM JDK 和 JRE 最详细通俗的解答 Oracle JDK 和 OpenJDK 的对比 Java 和 C的区别&#xff1f; 什么是 Java 程序的主类&…

GLOG如何控制输出的小数点位数

1 问题 在小白的蹩脚翻译演绎型博文《GLOG从入门到入门》中&#xff0c;有位热心读者提问说&#xff1a;在保存日志时&#xff0c;浮点型变量的小数位数如何设置&#xff1f; 首先感谢这位“嘻嘻哈哈的地球人”赏光阅读了小白这不太通顺的博客文章&#xff0c;并提出了一个很…

红旗语音助手HMI设计流程之调研篇

红旗智能语音助手是基于红旗4.0智能化平台打造的场景设计研究成果。本篇文章&#xff0c;将会以红旗语音助手为例&#xff0c;带领小伙伴们了解一下HMI设计中的调研工作。在项目中&#xff0c;我们需要要通过多模态的调研手段&#xff0c;去分辨用户的哪些需求是真需求&#xf…

【C++】string类的基本使用

层楼终究误少年&#xff0c;自由早晚乱余生。你我山前没相见&#xff0c;山后别相逢… 文章目录一、编码&#xff08;ascll、unicode字符集、常用的utf-8编码规则、GBK&#xff09;1.详谈各种编码规则2.汉字在不同的编码规则中所占字节数二、string类的基本使用1.string类的本质…

Hive---Hive语法(一)

Hive语法&#xff08;一&#xff09; 文章目录Hive语法&#xff08;一&#xff09;Hive数据类型基本数据类型&#xff08;与SQL类似&#xff09;集合数据类型Hive数据结构数据库操作创建库使用库删除库表操作创建表指定分隔符默认分隔符&#xff08;可省略 row format&#xff…

逆向工具之 unidbg 执行 so

1、unidbg 入门 unidbg 是一款基于 unicorn 和 dynarmic 的逆向工具&#xff0c; 可以直接调用 Android 和 IOS 的 so 文件&#xff0c;无论是黑盒调用 so 层算法&#xff0c;还是白盒 trace 输出 so 层寄存器值变化都是一把利器&#xff5e; 尤其是动态 trace 方面堪比 ida tr…