Linux从零部署MySQL8.0 主从复制(一主两从)
MySQL默认会读取/etc下的my.cnf文件,这里我们可以将自定义配置写入到该文件中,如果已经有mariadb的my.cnf,检测一下系统中是否有使用,如果没有则直接删除即可。可以选择一个自己需要的版本下载,我这里会使用MySQL8.0.37,使用Linux-Generic(通用包),可以先在自己开发机器上直接下载然后上传到Linux服务器中。这里其实也可以直接使用root账号,但是root账
一、部署前准备
我这里使用Linux版本为CentOS7.x,部署时会使用Linux-Generic(通用包)来部署MySQL。
1.1、查看系统版本和位数(32位或64位)
# 查看系统版本
cat /etc/red*
# 查看系统位数
getconf LONG_BIT
[root@localhost ~]# cat /etc/red*
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# getconf LONG_BIT
64
1.2、下载对应安装包
官网下载地址:https://dev.mysql.com/downloads/mysql/
可以选择一个自己需要的版本下载,我这里会使用MySQL8.0.37,使用Linux-Generic(通用包),可以先在自己开发机器上直接下载然后上传到Linux服务器中。
1.3、准备三台服务器
我这里演示部署的是一主两从会使用到三台Linux服务器,其实准备两台也行,部署一主一从和一主两从其实没有什么区别。
172.16.8.181 (master节点)
172.16.8.191 (slave1节点)
172.16.8.192 (slave2节点)
1.4、上传安装包到三台服务器
这里自己上传即可,统一上传到一个目录路径即可,方便后续操作,我这里会放在/usr/local/tools
目录下
二、开始部署(基础部署,主从部署先要完成基础部署,该部分操作需要在所有节点执行)
主节点和从节点部署其实都差不多,我这里使用xshell
操作Linux服务器可以直接将命令同步到所有会话,如果没有类似的工具就只能独立执行。
2.1、将安装包解压并且移动到目标安装目录
进入安装包存放目录,我这里是cd /usr/local/tools
- 解压安装包
tar -Jxvf mysql-8.0.37-linux-glibc2.12-x86_64.tar.xz
[root@localhost tools]# ls
mysql-8.0.37-linux-glibc2.12-x86_64 mysql-8.0.37-linux-glibc2.12-x86_64.tar.xz
- 移动并修改文件夹名称为mysql-8.0.37
mv mysql-8.0.37-linux-glibc2.12-x86_64 /usr/local/mysql-8.0.37
[root@localhost tools]# mv mysql-8.0.37-linux-glibc2.12-x86_64 /usr/local/mysql-8.0.37
[root@localhost tools]# ls /usr/local/
bin etc games include lib lib64 libexec mysql-8.0.37 sbin share src tools
2.2、准备MySQL数据和日志等存储文件夹
# 进入MySQL解压目录
cd /usr/local/mysql-8.0.37
# 创建数据和日志等存储文件夹 data:数据存储 log:日志存储 tmp:临时文件 binlog:binlog日志
mkdir data log tmp binlog
2.3、准备MySQL配置文件 my.cnf
MySQL默认会读取/etc下的my.cnf文件,这里我们可以将自定义配置写入到该文件中,如果已经有mariadb的my.cnf,检测一下系统中是否有使用,如果没有则直接删除即可
vi /etc/my.cnf
将下面配置内容粘贴到my.cnf中
PS 其中有个server-id参数每个节点不能重复,需要独立配置,这一步先不做调整,在后续会进行独立修改
###### [client]配置模块 ######
[client]
default-character-set=utf8mb4
socket=/usr/local/mysql-8.0.37/tmp/mysql.sock
###### [mysql]配置模块 ######
[mysql]
# 设置MySQL客户端默认字符集
default-character-set=utf8mb4
socket=/usr/local/mysql-8.0.37/tmp/mysql.sock
###### [mysqld]配置模块 ######
[mysqld]
port=3306
user=mysql
# 设置sql模式 sql_mode模式引起的分组查询出现*this is incompatible with sql_mode=only_full_group_by,这里最好剔除ONLY_FULL_GROUP_BY
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# MySQL服务安装的基本目录
basedir=/usr/local/mysql-8.0.37
# MySQL服务数据存储
datadir=/usr/local/mysql-8.0.37/data/
socket=/usr/local/mysql-8.0.37/tmp/mysql.sock
# 服务ID
server-id = 1
# 是否只读,1代表只读,0代表读写,从库建议设置成只读 SUPER权限可无视该规则(比如root账号)
read-only=0
# MySQL8 的密码认证插件 如果不设置低版本navicat无法连接
default_authentication_plugin= mysql_native_password
# 允许最大连接数
max_connections=1000
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 0: 表名将按指定方式存储,并且比较区分大小写;
# 1: 表名以小写形式存储在磁盘上,比较不区分大小写;
lower_case_table_names=0
max_allowed_packet=16M
# 设置时区
default-time_zone='+8:00'
# binlog 配置 只要配置了log_bin地址 就会开启
log_bin = /usr/local/mysql-8.0.37/binlog/mysql_bin
# 日志存储天数 默认0 永久保存
# 如果数据库会定期归档,建议设置一个存储时间不需要一直存储binlog日志,理论上只需要存储归档之后的日志
expire_logs_days = 30
# binlog最大值
max_binlog_size = 1024M
# 规定binlog的格式,binlog有三种格式statement、row、mixad,默认使用statement,建议使用row格式
binlog_format = ROW
# 在提交n次事务后,进行binlog的落盘,0为不进行强行的刷新操作,而是由文件系统控制刷新日志文件,如果是在线交易和账有关的数据建议设置成1,如果是其他数据可以保持为0即可
sync_binlog = 1
# MySQL服务器安全启动的配置部分
[mysqld_safe]
# mysqld_safe进程的日志文件位置
log-error=/usr/local/mysql-8.0.37/log/mysqld_safe.err
# mysqld_safe的pid文件存放位置
pid-file=/usr/local/mysql-8.0.37/tmp/mysqld.pid
# mysqld_safe使用的socket文件位置
socket=/usr/local/mysql-8.0.37/tmp/mysql.sock
# MySQLadmin工具的配置部分
[mysqladmin]
# mysqladmin工具使用的socket文件位置
socket=/usr/local/mysql-8.0.37/tmp/mysql.sock
2.4、创建mysql单独用户组和用户,将安装目录 /usr/local/mysql-8.0.37/ 的所有者及所属组改为 mysql
- 增加用户组 mysql,在用户组下增加用户 mysql
# 增加用户组 mysql
groupadd mysql
# 在用户组下增加用户 mysql
useradd -r -g mysql mysql
- 检查用户组、用户是否创建成功
groups mysql
[root@localhost tools]# groups mysql
mysql : mysql
- 将安装目录 /usr/local/mysql-8.0.37/ 的所有者及所属组改为 mysql
chown -R mysql:mysql /usr/local/mysql-8.0.37/
2.5、初始化数据库
初始的时候指定一下默认配置文件和一些别的配置,如果不指定默认配置文件会使用/etc 下的 my.cnf
./bin/mysqld --basedir=/usr/local/mysql-8.0.37/ --datadir=/usr/local/mysql-8.0.37/data/ --user=mysql --initialize
初始化数据库的时候会生成一个root用户的登录密码,提前记录一下后面修改,我这个里的随机密码是q7EBL=z,0-e
2.6、将mysql加入到可控制启动服务的文件夹内,并命名mysql(service可控制的服务名)
cp ./support-files/mysql.server /etc/init.d/mysql
2.7、配置profile环境变量
vi /etc/profile
在文件底部添加以下内容:
export MYSQL_HOME="/usr/local/mysql-8.0.37"
export PATH="$PATH:$MYSQL_HOME/bin"
添加好保存后,执行让修改的profile文件立即生效命令
source /etc/profile
2.8、启动并登录 mysql
- 切换到mysql用户启动mysql
su mysql
service mysql start
[root@localhost mysql-8.0.37]# su mysql
bash-4.2$ service mysql start
Starting MySQL.. SUCCESS!
执行完成启动成功后切换回root用户,开始进行下面操作
bash-4.2$ su root
密码:
[root@localhost ~]#
- 登录 mysql(
q7EBL=z,0-e
是在初始化数据库数据库时生成的密码)
mysql -u root -p'q7EBL=z,0-e'
[root@localhost data]# mysql -u root -p'q7EBL=z,0-e'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.37
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2.9、修改登录密码和设置允许远程登录
- 修改密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
mysql> flush privileges;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
-
配置允许远程登录
- 1、查看访问权限
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。
- 2、修改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)
- 3、 刷新配置
flush privileges;
- 4、开放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
三、主从复制部署
3.1、修改从节点配置文件my.cnf中的server-id
在集群部署中每台节点的server-id不能重复,这里进行单独修改。
- 编辑my.cnf
vi /etc/my.cnf
- 找到配置文件中的server-id配置,将该配置修改成不重复即可,我这里会使用ip的最后几位,如果想将从库设置成只读还可以将read-only配置成只读
## 172.16.8.191 (slave1节点)
server-id = 191
## 172.16.8.192 (slave2节点)
server-id = 192
- 修改完成后保存,并且重启两台从节点即可
service mysql restart
3.2、在主节点创建主从复制的独立账号
这里其实也可以直接使用root账号,但是root账号权限太大测试的时候可以使用,生产还是建议使用独立的主从复制账号。
# 使用root账号登录数据库
mysql -uroot -p123456
# 创建slave用户,并设置密码,并设置该用户可在任意主机连接该MySQL服务
mysql> create user 'slave'@'%' identified with mysql_native_password by '123456';
# 为slave用户分配主从复制权限
mysql> grant replication slave on *.* to 'slave'@'%';
# 刷新
mysql> flush privileges;
3.3、在主节点查看binlog记录的File和Position值,从节点同步时需要指定这两个值
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000003 | 821 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3.4、在从库执行主从复制操作
配置主从复制时不做特殊处理主库是不用有任何调整的,除非没有开启binlog日志记录,这里开始进行主从复制操作。
- 两台从节点先使用root账号登录
mysql -uroot -p123456
- 执行主从复制操作
# 执行前先停止slave
stop slave;
# 这是从库和主库连接的关键一步,host是主库的ip,user是前面创建的slave用户,file和pos是主库show master status的信息
change master to
master_host='172.16.8.181',master_user='slave',master_password='123456',
master_log_file='mysql_bin.000003',master_log_pos=821;
# 执行后启动slave
start slave;
mysql> stop slave;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> change master to
-> master_host='172.16.8.181',master_user='slave',master_password='123456',
-> master_log_file='mysql_bin.000003',master_log_pos=821;
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.5、开始测试主从复制效果
- 1、在主库创建一个新的数据库
CREATE DATABASE test;
- 2、进入数据库创建一张测试用户表
# 进入刚刚创建的数据库
use test;
# 执行创建用户表语句
CREATE TABLE user_info (
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT,
PRIMARY KEY (id)
);
- 3、在表中写入一条数据
INSERT INTO user_info (name, age) VALUES ('张三', 99);
- 4、查看从库中是否同步到了主库的数据库、表、数据
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)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)