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

目录


一、部署前准备

1、查看系统信息
bash 复制代码
# 查看系统版本
cat /etc/red*
# 查看系统位数
getconf LONG_BIT
bash 复制代码
[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服务器。

bash 复制代码
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

bash 复制代码
tar -Jxvf mysql-8.0.37-linux-glibc2.12-x86_64.tar.xz

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

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

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

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

bash 复制代码
vim /etc/my.cnf

添加以下参数:
PS:其中有个server-id参数每个节点不能重复,需要独立配置,这一步先不做调整,在后续会进行独立修改。

bash 复制代码
[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

bash 复制代码
cd /usr/local/mysql-8.0.37/
mkdir data

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

bash 复制代码
groupadd mysql
useradd -rg mysql mysql
chown -R mysql:mysql /usr/local/mysql-8.0.37/

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

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

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

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

输入临时密码进入MySQL

修改密码:

bash 复制代码
alter user 'root'@'localhost' identified by 'root';

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

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

登录成功!!!

配置允许远程登录
查看访问权限

bash 复制代码
select user,host from mysql.user;
bash 复制代码
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字段为%

bash 复制代码
update mysql.user set host="%" where user="root";
bash 复制代码
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)

刷新配置

bash 复制代码
flush privileges;

开放3306端口允许外网访问

先切回root用户在执行以下操作,su root

bash 复制代码
# 开启指定的端口号
firewall-cmd --add-port=3306/tcp --permanent
# 重启一下防火墙
firewall-cmd --reload
# 查看指定端口号是否开启成功
firewall-cmd --query-port=3306/tcp
bash 复制代码
[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

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

bash 复制代码
# 查看防火墙状态  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命令添加到环境变量
bash 复制代码
vim /etc/profile  

末尾添加以下内容:

bash 复制代码
PATH=$PATH:/usr/local/mysql-8.0.37/bin:/usr/local/mysql-8.0.37/bin
export PATH

保存退出

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

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

bash 复制代码
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

bash 复制代码
mysql -u root -p

四、主从复制部署

1、修改从节点配置文件my.cnf中的server-id

在集群部署中每台节点的server-id不能重复,这里进行单独修改。

bash 复制代码
vi /etc/my.cnf

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

bash 复制代码
# 182.168.40.141 (slave1节点)
server-id = 141
bash 复制代码
# 192.168.40.140 (slave2节点)
server-id = 140

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

bash 复制代码
service mysql restart
2、在主节点创建主从复制的独立账号

这里其实也可以直接使用root账号,但是root账号权限太大测试的时候可以使用,生产还是建议使用独立的主从复制账号。

bash 复制代码
# 使用root账号登录数据库
mysql -uroot -proot
bash 复制代码
# 创建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值,从节点同步时需要指定这两个值

bash 复制代码
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账号登录

bash 复制代码
mysql -uroot -proot

执行主从复制操作

bash 复制代码
# 执行前先停止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;
bash 复制代码
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)

查看主从复制开启状态

bash 复制代码
show slave status\G;

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

3、开始测试主从复制效果

在主库创建一个新的数据库

bash 复制代码
CREATE DATABASE test;

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

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

在表中写入一条数据

bash 复制代码
INSERT INTO user_info (name, age) VALUES ('张三', 99);

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

bash 复制代码
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)
相关推荐
嵩山小老虎6 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模6 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
a41324476 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
az44yao7 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
一只自律的鸡8 小时前
【Linux驱动】bug处理 ens33找不到IP
linux·运维·bug
17(无规则自律)8 小时前
【CSAPP 读书笔记】第二章:信息的表示和处理
linux·嵌入式硬件·考研·高考
!chen8 小时前
linux服务器静默安装Oracle26ai
linux·运维·服务器
秦老师Q8 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
REDcker9 小时前
Linux 文件描述符与 Socket 选项操作详解
linux·运维·网络
蒹葭玉树9 小时前
【C++上岸】C++常见面试题目--操作系统篇(第二十八期)
linux·c++·面试