Linux下部署MySQL8.0集群 - 主从复制(一主两从)

目录


一、部署前准备

1、查看系统信息
# 查看系统版本
cat /etc/red*
# 查看系统位数
getconf LONG_BIT
[root@localhost ~]# cat /etc/red*
CentOS Linux release 7.5.1804 (Core) 
[root@localhost ~]# getconf LONG_BIT
64
2、下载对应安装包

进入MySQL官网:https://dev.mysql.com/downloads/mysql/

可以选择一个自己需要的版本下载,我这里会使用MySQL8.0.37,使用Linux-Generic(通用包),可以先在自己开发机器上直接下载然后上传到Linux服务器中。

在这里插入图片描述

3、准备三台服务器

一主两从会使用到三台Linux服务器。

182.168.40.142 (master节点)
182.168.40.141 (slave1节点)
182.168.40.140 (slave2节点)
4、上传安装包到三台服务器
这里自己上传即可,统一上传到一个目录路径即可,方便后续操作,我这里会放在/data/soft目录下

二、开始部署(基础部署,主从部署先要完成基础部署,该部分操作需要在所有节点执行)

rpm -qa | grep mariadb 查找mariadb的版本名称(和MySQL冲突,会导致MySQL的3306端口监听不到):如果存在文件,使用rpm -e --nodeps 安装包 删除

主节点和从节点部署其实都差不多,我这里使用xshell操作Linux服务器可以直接将命令同步到所有会话,如果没有类似的工具就只能独立执行。

在这里插入图片描述

1、将安装包解压并且移动到目标安装目录

注意:这里的文件是.xz文件,如果你下载的文件是**.tar.gz文件的话用 :tar -zxvf +文件命令

进入安装包存放目录,我这里是cd /data/soft
tar -Jxvf mysql-8.0.37-linux-glibc2.12-x86_64.tar.xz

不带tar.xz后缀的文件就是我们解压后的安装包,我们将安装包重命名为mysql-8.0.37

mv mysql-8.0.37-linux-glibc2.12-x86_64 /usr/local/mysql-8.0.37
2、编译配置文件my.cnf

这个文件一般是默认存在的,不需要自己手动创建,mysql在初始化是会去寻找这个配置文件,如果没有有则是默认的系统配置

在/etc文件夹下配置my.cnf文件,没有就创建

vim /etc/my.cnf

添加以下参数:

PS:其中有个server-id参数每个节点不能重复,需要独立配置,这一步先不做调整,在后续会进行独立修改。
[mysqld]
#设置3306端口
port=3306 
#socket=/tmp/mysql.sock#设置mysql的安装目录
basedir=/usr/local/mysql-8.0.37
#   
#设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql-8.0.37/data     
#允许最大连接数/
max_connections=10000#允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10#服务ID(不允许重复,推荐使用该服务器ip后几位)
server-id =142#是否只读,1代表只读,0代表读写,从库建议设置成只读 SUPER权限可无视该规则(比如root账号)
read-only=0#      
#服务端使用的字符集默认为UTF8
#character-set-server=UTF8
#       
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB#默认使用“caching_sha2_password”插件认证default_authentication_plugin=caching_sha2_password  
#         
[mysql]
#设置mysql客户端默认字符集
default-character-set=utf8                
[client]
#设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
user=mysql
3、创建用户并初始化

在mysql的安装目录下新建文件data

cd /usr/local/mysql-8.0.37/
mkdir data

创建用户组并给用户组权限

groupadd mysql
useradd -rg mysql mysql
chown -R mysql:mysql /usr/local/mysql-8.0.37/

此时ll查看data目录的属组为mysql,如下:

sss

4、初始化mysql数据库
cd /usr/local/mysql-8.0.37
su mysql
./bin/mysqld --initialize

此时会弹出mysql的临时密码,将密码记下来:

5、启动mysql(MySQL用户下)
cd support-files/
./mysql.server start
#Starting MySQL SUCCESS!    //意思为成功启动MySQL
#这里注意,如果不是在/usr/local/mysql-8.0.37下安装的mysql,需要在mysql.server文件中将所有路径变量都修改成当前安装目录才能正常启动
6、连接mysql、修改密码、设置远程登陆
exit
./bin/mysql -u root -p

输入临时密码进入MySQL

在这里插入图片描述

修改密码:

alter user 'root'@'localhost' identified by 'root';

此时,MySQL的密码就修改为了root

此时我们再用修改后的密码进行验证,看是否可以使用修改后的密码登录MySQL

在这里插入图片描述

登录成功!!!

配置允许远程登录

查看访问权限
select user,host from mysql.user;
mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)

root用户的localhost表示只允许本机访问,要实现远程连接,可以将用户的host改为%,表示允许任意主机访问,如果需要设置只允许特定ip访问,则应改为对应的ip。

修改root用户的host字段为%

update mysql.user set host="%" where user="root";
mysql> update mysql.user set host="%" where user="root";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)

刷新配置

flush privileges;

开放3306端口允许外网访问
先切回root用户在执行以下操作,su root

# 开启指定的端口号
firewall-cmd --add-port=3306/tcp --permanent
# 重启一下防火墙
firewall-cmd --reload
# 查看指定端口号是否开启成功
firewall-cmd --query-port=3306/tcp
[root@localhost data]# firewall-cmd --add-port=3306/tcp --permanent
success
[root@localhost data]# firewall-cmd --reload
success
[root@localhost data]# firewall-cmd --query-port=3306/tcp
yes

这里也可以直接关闭防火墙,如果是自己测试使用可以直接将防火墙关闭

# 查看防火墙状态  active(running)说明防火墙已经被打开
systemctl status firewalld.service
# 临时关闭防火墙
systemctl stop firewalld.service
# 永久关闭防火墙
systemctl disable firewalld.service
# 开启防火墙
systemctl start firewalld.service

关机后再次登录如果报错111,进入 support-files/目录      输入:./mysql.server restart 重启mysql,返回上一级重新登录即可

三、将MySQL添加到环境变量中

通过编译安装的MySQL必须在support-files文件下执行命令才能进行开启、关闭重启等服务功能,如果想在linux任何目录下都可以进行这些功能就需要将其添加到环境变量中

1、将MySQL命令添加到环境变量
vim /etc/profile  

末尾添加以下内容:

PATH=$PATH:/usr/local/mysql-8.0.37/bin:/usr/local/mysql-8.0.37/bin
export PATH

保存退出

source /etc/profile                # 重新加载环境变量配置脚本
2、将MySQL的启动等服务添加到环境变量
cp /usr/local/mysql-8.0.37/support-files/mysql.server /etc/init.d/mysql
#检查一下复制过去的文件中的basedir=  和datadir=   后的路径和原先是否一致,不一致需要修改一致   

此时就可在任意目录下对MySQL进行重启、关闭等功能,例如

service mysql restart            # 重启MySQL
service mysql start              # 开启MySQL
service mysql stop               # 暂停MySQL
service mysql enable             # 开机自启MySQL
或者
systemctl restart mysql			 # 重启MySQL
systemctl start mysql			 # 开启MySQL
systemctl stop mysql			 # 暂停MySQL
systemctl enable mysql			 # 开机自启MySQL

现在可以在任意目录下使用mysql命令进入MySQL

mysql -u root -p

四、主从复制部署

1、修改从节点配置文件my.cnf中的server-id
在集群部署中每台节点的server-id不能重复,这里进行单独修改。
vi /etc/my.cnf

找到配置文件中的server-id配置,将该配置修改成不重复即可,我这里会使用ip的最后几位,如果想将从库设置成只读还可以将read-only配置成只读

# 182.168.40.141 (slave1节点)
server-id = 141
# 192.168.40.140 (slave2节点)
server-id = 140

修改完成后保存,并且重启两台从节点即可

service mysql restart
2、在主节点创建主从复制的独立账号
这里其实也可以直接使用root账号,但是root账号权限太大测试的时候可以使用,生产还是建议使用独立的主从复制账号。
# 使用root账号登录数据库
mysql -uroot -proot
# 创建slave用户,并设置密码,并设置该用户可在任意主机连接该MySQL服务
mysql> create user 'slave'@'%' identified with mysql_native_password by 'root';
# 为slave用户分配主从复制权限
mysql> grant replication slave on *.* to 'slave'@'%';
# 刷新
mysql> flush privileges;

在主节点查看binlog记录的File和Position值,从节点同步时需要指定这两个值

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000010 |      157 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

在从库执行主从复制操作
配置主从复制时不做特殊处理主库是不用有任何调整的,除非没有开启binlog日志记录,这里开始进行主从复制操作。
两台从节点先使用root账号登录

mysql -uroot -proot

执行主从复制操作

# 执行前先停止slave
stop slave;
# 这是从库和主库连接的关键一步,host是主库的ip,user是前面创建的slave用户,file和pos是主库show master status的信息
change master to
master_host='192.168.40.142',master_user='slave',master_password='root',
master_log_file='mysql_bin.000010',master_log_pos=157;
# 执行后启动slave
start slave;
mysql> stop slave;
Query OK, 0 rows affected, 2 warnings (0.00 sec)mysql> change master to-> master_host='192.168.40.142',master_user='slave',master_password='root',-> master_log_file='mysql_bin.000010',master_log_pos=157;
Query OK, 0 rows affected, 8 warnings (0.02 sec)mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

查看主从复制开启状态

show slave status\G;

两个yes则表示成功配置主从复制,Connection和No都是配置有问题

在这里插入图片描述

3、开始测试主从复制效果
在主库创建一个新的数据库
CREATE DATABASE test;

进入数据库创建一张测试用户表

# 进入刚刚创建的数据库
use test;
# 执行创建用户表语句
CREATE TABLE user_info (id INT AUTO_INCREMENT,name VARCHAR(255) NOT NULL,age INT,PRIMARY KEY (id)
);

在表中写入一条数据

INSERT INTO user_info (name, age) VALUES ('张三', 99);

查看从库中是否同步到了主库的数据库、表、数据

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.04 sec)mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user_info      |
+----------------+
1 row in set (0.01 sec)mysql> select*from user_info;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 张三   |   99 |
+----+--------+------+
1 row in set (0.00 sec)

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

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

相关文章

springboot中的AOP以及面向切面编程思想

快速入门体验AOP aop中相关概念 实现导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> 新建aop文件夹,里面声明XXXAspect类 @Aspect // 声…

在Java虚拟机(JVM)中,方法可以分为虚方法和非虚方法。

在Java虚拟机(JVM)中,方法可以分为虚方法和非虚方法。以下是关于这两种方法的详细解释: 一、虚方法(Virtual Method) 定义:虚方法是指在运行时由实例的实际类型决定的方法。在Java中,所有的非私有、非静态、非final方法都是虚方法。当调用一个虚方法时,JVM会根据实…

Java图片拼接

最近遇到一个挺离谱的功能&#xff0c;某个表单只让上传一张图&#xff0c;多图上传会使导出失败。跟开发沟通后表示&#xff0c;这个问题处理不了。我... 遂自己思考&#xff0c;能否以曲线救国的方式拯救一下&#xff0c;即不伤及代码之根本&#xff0c;又能解决燃眉之急。灵…

webGL硬核知识:图形渲染管渲染流程,各个阶段对应的API调用方式

一、图形渲染管线基础流程概述 WebGL 的图形渲染管线大致可分为以下几个主要阶段&#xff0c;每个阶段都有其特定的任务&#xff0c;协同工作将 3D 场景中的物体最终转换为屏幕上呈现的 2D 图像&#xff1a; 顶点处理&#xff08;Vertex Processing&#xff09;阶段&#xff1…

大数据面试题--企业面试真题

大数据面试题--企业面试真题 PlanHub 点击访问获取&#xff1a; 大数据面试体系专栏_酷兜科技​www.kudoumh.top/hlwai/85.html 点击访问获取&#xff1a; 大数据面试体系专栏_酷兜科技​www.kudoumh.top/hlwai/85.html 大数据面试题汇总 HDFS 1、 HDFS 读写流程。 2、HDF…

lambda初探(一)

发生捕获时&#xff0c;拿到x,y的值 退出lambda表达式后&#xff0c;foo外层的值不变化。foo内部的x&#xff0c;值是持续的&#xff0c;像static。即使退出foo函数后&#xff0c;值的状态依然保持。 外层x的值变化&#xff0c;并不影响foo内部。 foo运行了两次&#xff0c;内…

【D3.js in Action 3 精译_046】DIY 实战:在 Observable 平台利用饼图布局函数实现 D3 多个环形图的绘制

当前内容所在位置&#xff1a; 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段&#xff08;一&#xff09;5.1.2 饼图布局生成器&#xff08;二&#xff09;5.1.3 圆弧的绘制&#xff08;三&#xff09;5.1.4 数据标签的添加&#xff08;四&#…

基于Spring Boot的智慧农业专家远程指导系统

一、系统背景与意义 随着科技的不断进步&#xff0c;农业领域也在积极寻求创新与发展。然而&#xff0c;传统农业生产中农民往往依靠经验进行种植和养殖&#xff0c;缺乏科学的指导和技术支持。同时&#xff0c;农业专家资源有限&#xff0c;难以覆盖广大的农村地区&#xff0…

【JavaEE初阶】线程 和 thread

本节⽬标 认识多线程 掌握多线程程序的编写 掌握多线程的状态 一. 认识线程&#xff08;Thread&#xff09; 1概念 1) 线程是什么 ⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代码. 多个线程之间 "同时" 执⾏着多份代码. 还…

练习题 最小栈

最小栈 最小栈 class MinStack {private Stack<Integer> stack;private Stack<Integer> minstack;public MinStack() {stacknew Stack<>();minstacknew Stack<>();}public void push(int val) {stack.push(val);if(minstack.empty()){minstack.push(…

全志H618 Android12修改doucmentsui鼠标单击图片、文件夹选中区域

背景: 由于当前的文件管理器在我们的产品定义当中,某些界面有改动的需求,所以需要在Android12 rom中进行定制以符合当前产品定义。 需求: 在进入File文件管理器后,鼠标左击整个图片、整个文件夹可以选中该类型,进行操作,故代码分析以及客制化如下: 主要涉及的代码:…

堆【Lecode_HOT100】

文章目录 1.数组中的第&#xff2b;个最大元素No.2152.前K个高频元素347 1.数组中的第&#xff2b;个最大元素No.215 方法一&#xff1a;NlogN不能满足时间复杂度的要求 public int findKthLargest(int[] nums, int k) {Arrays.sort(nums);return nums[nums.length-k];}方法二&…

Android 搭建AIDL Client和Server端,双向通信

一、背景 使用AIDL,搭建Client和Server端,实现跨进程通讯,即两个应用之间可以相互通讯。这里列举AIDL实现的方式和需注意的细节&#xff0c;并附上源码。 二、实现方式 2.1 定义AIDL需要的接口,名字为xxx.aidl,Client和Server端 AIDL接口的包名和aidl文件必须一致&#xff0c…

HIPT论文阅读

题目《Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning》 论文地址&#xff1a;[2206.02647] Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning 项目地址&#xff1a;mahmoodlab/HI…

[ESP]从零开始的Arduino IDE安装与ESP环境配置教程

一、前言 最近也是在比赛方面比较忙&#xff0c;没有更多的时间和精力去更新长文章了。这几周都更倾向于环境搭建的教程&#xff0c;这类教程写起来确实方便&#xff0c;也不怎么费时间&#xff0c;一个下午基本可以搞定&#xff0c;哈哈&#xff0c;我保证不是在为自己想摆烂找…

投标心态:如何在“标海战术”中保持清醒的头脑?

在竞争激烈的市场环境下&#xff0c;“标海战术”——即大规模参与投标——已经成为许多企业争取市场份额的重要策略。然而&#xff0c;盲目追求投标数量可能导致资源浪费、团队疲劳以及战略目标的模糊化。在这种高强度的竞争模式中&#xff0c;如何保持清醒的头脑&#xff0c;…

wxWidgets使用wxStyledTextCtrl(Scintilla编辑器)的正确姿势

开发CuteMySQL/CuteSqlite开源客户端的时候&#xff0c;需要使用Scintilla编辑器&#xff0c;来高亮显示SQL语句&#xff0c;作为C/C领域最成熟稳定又小巧的开源编辑器&#xff0c;Scintilla提供了强大的功能&#xff0c;wxWidgets对Scintilla进行包装后的是控件类&#xff1a;…

【原生js案例】让你的移动页面实现自定义的上拉加载和下拉刷新

目前很多前端UI都是自带有上拉加载和下拉刷新功能,按照官网配置去实现即可,比如原生小程序,vantUI等UI框架,都替我们实现了内部功能。 那如何自己来实现一个上拉加载和下拉刷新的功能? 实现效果 不用浏览器的css滚动条,自定义实现滚动效果 自定义实现滚动,添加上拉加载…

批处理理解

初识批处理 如何批处理&#xff1a; 命名&#xff1a;.bat 方法&#xff1a;创建一个记事本文件&#xff0c;然后将其扩展改为.bat 批处理作用&#xff1a;自上而下成批处理每一条DOS命令&#xff0c;直到执行到最后一条。运行环境&#xff1a;当然是我们cmd了 回归我学过的…

APM32F411使用IIS外设驱动es8388实现自录自播

前言&#xff1a; 从零开始学习I2s外设&#xff0c;配置Es8288寄存器实现录音播放。本文章使用主控芯片是APM32F411系类。音频相关的概念比较多&#xff0c;就不再次做过多的介绍&#xff0c;本文章只是简单实现边录边播功能。APM系类兼容st的芯片&#xff0c;所以用st的hal库来…