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 分钟前
【Linux进程】进程间的通信
linux·进程
YRr YRr24 分钟前
详细指南:在Ubuntu 20.04上安装和配置Orbbec SDK及USB设备权限
linux·运维·ubuntu
yuanbenshidiaos1 小时前
linux----文件访问(c语言)
linux·服务器·算法
ghostwritten1 小时前
Linux 下的 GPT 和 MBR 分区表详解
linux·运维·gpt
ElePower95271 小时前
linux常用命令(touch、cat、less、head、tail)
linux
初心_20241 小时前
10. 虚拟机VMware Workstation Pro下共享Ubuntu和Win11文件夹
linux·运维·服务器
是十一月末2 小时前
Mysql语法之DQL查询的多行函数
开发语言·数据库·sql·mysql
豪宇刘2 小时前
深入理解 MySQL 索引
数据库·mysql
Dyn's blog2 小时前
MySQL和Oracle的区别
数据库·mysql·oracle
时空无限2 小时前
raid 状态查看 storcli64
linux