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: 0

mysql> 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 -A

Database 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)

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

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

相关文章

编辑, 抽成组件

问题 错误思路: 1 dept不能修改, 用watch监听一下:赋值给新的变量进行修改, 问题: currentDept 发生改变, depth也发生了改变,因为是浅拷贝, 用了json.pase(json.stringify(value…

2009 ~ 2019 年 408【计算机网络】大题解析

2009 年 路由算法(9’) 讲解视频推荐:【BOK408真题讲解-2009年(催更就退网版)】 某网络拓扑如下图所示,路由器 R1 通过接口 E1 、E2 分别连接局域网 1 、局域网 2 ,通过接口 L0 连接路由器 R2 &…

MySQL追梦旅途之慢查询分析建议

一、找到慢查询 查询是否开启慢查询记录 show variables like "%slow%";log_slow_admin_statements: 决定是否将慢管理语句(如 ALTER TABLE 等)记录到慢查询日志中。 log_slow_extra : MySQL 和 MariaDB 中的一个系…

进阶版 -- 某恋爱话术 app 的爬虫经历与思考(含脚本)

背景 承接前文,由于上一个app 爬出来的数据只有 1w 多条,感觉不是很过瘾 所以这次又找到了一个非破解版 app,数据量大概有 40w,安全等级直线上升 声明 本次爬虫是学习实践行为,获取到的数据均已在 24 小时内全部删…

深入理解 Linux 内核启动流程

目录 一、BIOS 与 Bootloader 1.BIOS(Basic Input/Output System) 2.Bootloader(引导加载程序) 二、内核初始化 1.解压内核映像 2.初始化硬件设备 3.建立内存管理系统 4.启动第一个进程(init) 三、…

Android笔记【19】

具体示例 run: val result someObject.run {// 这里可以使用 thisthis.someMethod() }let: val result someObject?.let {// 这里使用 itit.someMethod() }with: val result with(someObject) {// 这里使用 thissomeMethod() }apply: val obj SomeClass().apply {// 这里使…

【Qt】qt安装

在工作一年之后,还是想做一个Qt的教程,遥想研一刚刚接触Qt,从0到1学习,没有什么参考书籍,网上的资料也不多,幸好Qt官方文档写得好,加上自己肯研究,才堪堪入门。 现在我想自己写一个…

Word使用分隔符实现页面部分分栏

文章目录 Word使用分隔符实现页面部分分栏分隔符使用页面设置 Word使用分隔符实现页面部分分栏 分隔符使用 word中的分隔符: 前面不分栏,后面分栏(或前面分栏,后面不分栏),只需要在分隔位置处插入分隔符:“连续”即…

搭建Tomcat(四)---Servlet容器

目录 引入 Servlet容器 一、优化MyTomcat ①先将MyTomcat的main函数搬过来: ②将getClass()函数搬过来 ③创建容器 ④连接ServletConfigMapping和MyTomcat 连接: ⑤完整的ServletConfigMapping和MyTomcat方法: a.ServletConfigMappin…

谁说C比C++快?

看到这个问题,我我得说:这事儿没有那么简单。 1. 先把最大的误区打破 "C永远比C快" —— 某位1990年代的程序员 这种说法就像"自行车永远比汽车省油"一样荒谬。我们来看个例子: // C风格 char* str (char*)malloc(100…

html <a>设置发送邮件链接、打电话链接 <a href=“mailto:></a> <a href=“tel:></a>

1.代码 <ul><li>电话&#xff1a;<a href"tel:18888888888">188-8888-8888</a></li><li>邮箱&#xff1a;<a href"mailto:10000qq.com">10000qq.com</a></li><li>邮箱&#xff1a;<a hre…

Nginx三种安装方式

Nginx安装 可以登录 Nginx 的官方网站&#xff1a;https://www.nginx.com/ 找到安装方式。 查看如何安装开源的版本&#xff1a;https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/ 通过官方的说明&#xff0c;也可以知道安装&#…

Android 10 Launcher3 删除谷歌搜索

命令行获取页面 手机处于launcher首页 adb shell dumpsys window | findstr mCurrentFocus 输出 mCurrentFocusWindow{9afb34d u0 com.android.launcher3/com.android.launcher3.Launcher} 找到源码路径 packages/apps/Launcher3/ Android10源码 搜索控件 grep -r -n Apps…

自动驾驶AVM环视算法--python版本的俯视TOP投影模式

c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--全景的俯视图像和原图》本文档进用于展示部分代码的视线&#xff0c;获取方式网盘自行获取&#xff08;非免费介意勿下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/1MJa8ZCEfNyLc5x0uVegto…

前端OpenAPI根据后端Swagger自动生成前端接口报错

测试之后发现是因为Map<Long,List<CommentVO>>的返回值类型的锅&#xff0c;改成Page<List<CommentVO>>即可解决。 前端使用的umiMAX的openapi&#xff0c;报错如下&#xff1a; originalRef: BaseResponseboolean\n "401&q…

java开发入门学习五-流程控制

流程控制语句 if&#xff0c; if...else&#xff0c; if..else if..else 与前端相同 略 switch case 与前端不同的是case不能使用表达式&#xff0c;使用表达式会报错 class TestSwitch {public static void main(String[] args) {// switch 表达式只能是特定的数据类型…

.NET 技术 | 调用系统API创建Windows服务

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

《PCI密码卡技术规范》题目

单选1 在《PCI密码卡技术规范》中&#xff0c;下列哪项不属于PCI密码卡的功能&#xff08;&#xff09;。 A.密码运算功能 B.密钥管理功能 C.物理随机数产生功能 D.随主计算机可信检测功能 正确答案&#xff1a;D. <font style"color:#DF2A3F;">解析&…

Java操作Redis-Jedis

介绍 前面我们讲解了Redis的常用命令&#xff0c;这些命令是我们操作Redis的基础&#xff0c;那么我们在 java程序中应该如何操作Redis呢&#xff1f;这就需要使用Redis的Java客户端&#xff0c;就如同我们使 用JDBC操作MySQL数据库一样。 Redis 的 Java 客户端很多&#xff0…

QT网络(二):TCP通信

传输层概念 传输控制协议&#xff08;transmission control protocol&#xff0c;TCP&#xff09;是一种被大多数 Internet 网络协议用于数据传输的底层网络协议&#xff0c;它是可靠的、面向流和连接的传输协议&#xff0c;特别适合用于连续数据传输。 应用层在网络模型中的…