目录

MySQL 集群之主从部署

背景信息

为了增加数据的冗余备份,增强服务的高可用性,从传统的单服务应用升级到集群服务应用是一个合适方案,这里介绍一下MySQL 5.7 版本的部署,5.7 版本也是目前大多数企业当前在用的版本,虽然也有很多企业升级到了8.0 版本,不过从安装部署的角度来看其实是大同小异的

环境准备

操作系统版本cpu内存磁盘IP部署方式MySQL版本主从节点
centos 7.92c4G40G192.168.143.101rpm5.7.20Master
centos 7.92c4G40G192.168.143.102rpm5.7.20Slave

安装MySQL 5.7

1、下载安装包

1
2
3
4
$ cd /path/to/directory
$ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.20-1.el7.x86_64.rpm-bundle.tar
# 删除不需要的安装包
$ ls |grep -vE 'client|libs|common|server-5.7'|xargs rm -f

2、安装依赖

1
2
3
4
5
6
# mysql-community-common-5.7.20-1.el7.x86_64.rpm 依赖
$ sudo yum -y install gcc vim wget net-tools lrzsz libaio
# mysql-community-client-5.7.20-1.el7.x86_64.rpm 依赖
$ sudo yum install  ncurses-compat-libs -y
# mysql-community-server-5.7.20-1.el7.x86_64.rpm 依赖
$ sudo yum install libaio numactl-libs -y

3、服务器时间校正
4、关闭防火墙和安全(主从)

1
2
3
$ setenforce 0
$ systemctl stop firewalld
$ systemctl disable firewalld

4.1 (可选)如果你的仓库中没有 ncurses-compat-libs,你可能需要添加一个额外的仓库,例如 EPEL (Extra Packages for Enterprise Linux):

1
2
$ sudo yum install epel-release  -y
$ sudo yum install ncurses-compat-libs  -y

4.2 (可选) 检验系统是否包含mariadb-lib 检验系统是否包含mariadb-lib,如果有需要卸载,否则mysql 无法安装

1
2
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64

5、安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ sudo rpm -ivh mysql-community-common-5.7.20-1.el7.x86_64.rpm
$ sudo rpm -ivh mysql-community-libs-5.7.20-1.el7.x86_64.rpm
$ sudo rpm -ivh mysql-community-libs-compat-5.7.20-1.el7.x86_64.rpm
$ sudo rpm -ivh mysql-community-client-5.7.20-1.el7.x86_64.rpm
$ sudo rpm -ivh mysql-community-server-5.7.20-1.el7.x86_64.rpm

$ rpm -qa|grep mysql
mysql-community-common-5.7.20-1.el7.x86_64
mysql-community-libs-5.7.20-1.el7.x86_64
mysql-community-libs-compat-5.7.20-1.el7.x86_64
mysql-community-client-5.7.20-1.el7.x86_64
mysql-community-server-5.7.20-1.el7.x86_64
# 检查生成的mysql 目录和文件
$ ls  /var/lib/mysql /etc/my.cnf 
/etc/my.cnf

/var/lib/mysql:

6、安装过程摘取

1
2
3
4
5
6
7
# rpm -ivh mysql-community-server-5.7.20-1.el7.x86_64.rpm
warning: mysql-community-server-5.7.20-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...
   1:mysql-community-server-5.7.20-1.e################################# [100%]
/usr/lib/tmpfiles.d/mysql.conf:16: Line references path below legacy directory /var/run/, updating /var/run/mysqld  /run/mysqld; please update the tmpfiles.d/ drop-in file accordingly.
注意
这个警告提示说明该 RPM 包未被 GPG 签名验证。如果你信任这个包的来源,可以忽略这个警告

或者一次性安装会自动进行依赖顺序安装调整:

1
sudo rpm -ivh *.rpm

安装包功能和作用

部署 MySQL 5.7.20 版本的 RPM 包时,需要确保按照正确的顺序安装这些包,因为它们之间存在依赖关系。以下是各个包的功能作用和推荐的安装顺序:

  1. mysql-community-common-5.7.20-1.el7.x86_64.rpm

    • 功能:提供所有 MySQL 组件共享的文件。
    • 作用:这个包是基础,其他组件依赖它提供的文件。
  2. mysql-community-libs-5.7.20-1.el7.x86_64.rpm

    • 功能:包含客户端库文件。
    • 作用:为使用 MySQL 客户端连接到 MySQL 数据库服务器提供必要的库文件。
  3. mysql-community-libs-compat-5.7.20-1.el7.x86_64.rpm

    • 功能:提供兼容性库文件。
    • 作用:为旧版本的应用程序提供与旧版 MySQL 库的向后兼容性。
  4. mysql-community-client-5.7.20-1.el7.x86_64.rpm

    • 功能:包含 MySQL 客户端命令行工具。
    • 作用:允许用户通过命令行界面与 MySQL 数据库交互。
  5. mysql-community-server-5.7.20-1.el7.x86_64.rpm

    • 功能:提供 MySQL 数据库服务器。
    • 作用:这是核心包,负责处理 SQL 查询并管理数据库。

配置主服务器

MySQL 的主配置文件通常位于 /etc/my.cnf/etc/mysql/my.cnf,具体取决于你的操作系统。对于某些发行版或自定义安装,配置文件可能位于其他位置,如 /etc/my.cnf.d/ 目录下的某个文件中。你可以使用以下命令来查找配置文件的位置:

1
2
3
$ mysql --help | grep "Default options" -A 1
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 

调整需要将数据放到/data/mysql 目录下,该目录为外挂磁盘,磁盘空间较大,而不是安装在默认的系统磁盘目录下

创建安装目录/data/mysql

1
2
3
mkdir -p /data/mysql/binlog
chown -R mysql:mysql /data/mysql
chomod -R 755 /data/mysql

修改/etc/my.cnf配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
[mysqld]
user = mysql
port = 3306
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER
lower_case_table_names = 1
group_concat_max_len = 40960
max_allowed_packet = 1G

datadir = /data/mysql
socket = /data/mysql/mysql.sock
log_error = /data/mysql/mysqld.log
pid_file = /data/mysql/mysqld.pid

# 设置server_id,注意要唯一
server_id = 1
# 忽略的数据,指不需要同步的数据库
#binlog-ignore-db=mysql
# 指定同步的数据库
#binlog-do-db=test

###binlog###
binlog_format = row
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log_bin = /data/mysql/binlog/binlog.log
expire_logs_days = 7
master_info_repository = table
relay_log_info_repository = table

###slave###
slave_parallel_type = LOGICAL_CLOCK
slave_parallel_workers = 4
log_bin_trust_function_creators = 1
skip_slave_start = ON
relay_log_recovery = ON

###buffer_pool###
join_buffer_size = 32M
sort_buffer_size = 16M
query_cache_size = 512M
myisam_sort_buffer_size = 128M
thread_cache_size = 128
tmp_table_size = 512M
max_heap_table_size = 128M
read_rnd_buffer_size = 2M

#InnoDB#
default_storage_engine = InnoDB
innodb_file_per_table = ON
innodb_flush_log_at_trx_commit = 2
innodb_buffer_pool_size = 4G
innodb_log_file_size = 1024M
innodb_flush_method = O_DIRECT

##### MyISAM#####
key_buffer_size = 512M

### character_set#####
character_set_server = utf8
collation_server = utf8_general_ci
explicit_defaults_for_timestamp = ON

####name_resolves####
host_cache_size = 0
skip_name_resolve = ON

###connection###
max_connections = 25000
max_connect_errors = 10000

### Enable slow_query_log permanent ###
slow_query_log = 1
long_query_time = 0.5
slow_query_log_file = /data/mysql/mysql_slow.log

### MASTER_MASTER ###
auto_increment_increment = 1
auto_increment_offset = 1

[mysql]
#prompt = 'mysql[\u@\h]:[\d]:'

[client]
socket = /data/mysql/mysql.sock
port = 3306

启动mysqld服务,并设置开机自启

1
2
$ sudo systemctl enable mysqld --now
$ sudo systemctl status mysqld

配置从服务器

创建安装目录/data/mysql

1
2
3
mkdir -p /data/mysql/binlog
chown -R mysql:mysql /data/mysql
chomod -R 755 /data/mysql

修改/etc/my.cnf配置文件

1
2
3
4
5
6
7
[mysqld]
# 设置server_id,注意要唯一
server_id = 1
...
### MASTER_MASTER ###
auto_increment_increment = 1
auto_increment_offset = 2   # 可根据需要调整,确保从节点与主节点的 AUTO_INCREMENT 值不冲突

启动mysqld服务,并设置开机自启

1
2
$ sudo systemctl enable mysqld --now
$ sudo systemctl status mysqld

修改登录密码

快捷操作

1
2
3
4
MYSQL_OLDPASSWORD=`awk '/A temporary password/{print $NF}' /data/mysql/mysqld.log`
MYSQL_ROOT_PASSWORD="your_mysql_password"

mysqladmin -u root -p$MYSQL_OLDPASSWORD password $MYSQL_ROOT_PASSWORD &>/dev/null

分步操作

1、获取临时密码 默认是在/var/log/mysqld.log 文件下,这里修改了安装目录为/data/mysql

1
2
3
sudo grep 'temporary password' /data/mysq/mysqld.log
# grep 'temporary password' /var/log/mysqld.log
2024-11-25T06:34:37.637723Z 1 [Note] A temporary password is generated for root@localhost: hvqki:Gp>0EI

2、临时密码登录

1
mysql -u root -p

3、登录后修改默认密码并进行安全配置: 首次登录后,建议立即更改 root 密码并执行 mysql_secure_installation 脚本来提高安全性。 登录后修改root密码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
ALTER USER 'root'@'%' IDENTIFIED BY 'your_password';


mysql>  ALTER USER 'root'@'%' IDENTIFIED BY 'your_password';
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

# 赋远程访问权限
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> select host, user, authentication_string, plugin from user;
+-----------+---------------+-------------------------------------------+-----------------------+
| host      | user          | authentication_string                     | plugin                |
+-----------+---------------+-------------------------------------------+-----------------------+
| localhost | root          | *4E02A7566A743B1042608F7ED03213DE937E7D0E | mysql_native_password |
| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
| localhost | mysql.sys     | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password |
| %         | root          | *4E02A7566A743B1042608F7ED03213DE937E7D0E | mysql_native_password |
+-----------+---------------+-------------------------------------------+-----------------------+
4 rows in set (0.00 sec)

4、mysql_secure_installation MySQL 安全设置(可选)
mysql_secure_installation 是一个用于提高 MySQL 安装安全性的脚本。它可以帮助你执行一系列的安全设置,例如设置 root 密码、移除匿名用户、禁用远程 root 登录、移除测试数据库等。以下是执行 mysql_secure_installation 脚本的详细步骤:

1
2
3
4
5
[root@localhost mysql]<20241225 14:42:33># sudo mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: 

跟随提示完成配置

运行脚本后,你会被问到一系列问题。下面是每个问题的大致内容和建议的回答方式:

  • Enter password for user root: 输入你当前的 root 用户密码(即安装时生成的临时密码或你刚刚设置的新密码)。

  • Switch to unix_socket authentication [Y/n] 这个选项是关于是否切换到 Unix Socket 认证插件,默认情况下选择 N 不启用这个选项,这样可以继续使用基于密码的身份验证。

  • Change the root password? [Y/n] 如果你已经在登录时修改了 root 密码,可以选择 n;如果还没有修改,可以选择 y 并按照提示设置新密码。

  • Remove anonymous users? [Y/n] 移除匿名用户可以提高安全性,推荐选择 Y

  • Disallow root login remotely? [Y/n] 禁止 root 用户从远程登录通常是个好主意,除非你需要远程管理 MySQL,推荐选择 Y。测试环境也可以选择n

  • Remove test database and access to it? [Y/n] 移除测试数据库及其访问权限也是提高安全性的措施之一,推荐选择 Y。测试环境也可以选择n

  • Reload privilege tables now? [Y/n] 重新加载权限表以使更改立即生效,推荐选择 Y

对话参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Securing the MySQL server deployment.

Enter password for user root: ********

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
 ... Success!

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
 ... Success!

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
 ... Success!

Cleaning up...

All done! If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!
注意
安装过程有问题查看服务日志,/data/mysql/mysqld.log

安装后验证

  • 可以尝试通过 MySQL 客户端登录到服务器。
  • 使用 mysqladmin 工具验证服务器是否正在运行:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ mysqladmin -u root -p version
Enter password: 
mysqladmin  Ver 8.42 Distrib 5.7.20, for Linux on x86_64
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version          5.7.20
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/lib/mysql/mysql.sock
Uptime:                 14 min 46 sec

Threads: 1  Questions: 12  Slow queries: 0  Opens: 106  Flush tables: 1  Open tables: 99  Queries per second avg: 0.013

开启主从同步

Master 节点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 登录到 MySQL 主节点
$ mysql -u root -p

# 创建复制用户(例如:`replica_user`)
CREATE USER 'replica_user'@'192.168.143.102' IDENTIFIED BY 'your_password';

#授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'192.168.143.102';

#  刷新权限
FLUSH PRIVILEGES;
#  获取主节点的二进制日志位置
SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 154       | your_database_name |                |
+------------------+----------+--------------+------------------+

记下 File二进制文件(例如:mysql-bin.000001)和 Position偏移量(例如:154)的值。

Slave 节点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 登录到 MySQL 备节点
$ mysql -u root -p

# 配置主节点信息
# 使用 `CHANGE MASTER TO` 命令配置从库指向主库。你需要提供主库的 IP 地址、用户名、密码以及上面提到的 `File` 和 `Position` 值:
CHANGE MASTER TO
  MASTER_HOST='192.168.143.101',
  MASTER_USER='replica_user',
  MASTER_PASSWORD='your_password',
  MASTER_LOG_FILE='mysql-bin.000001',    -- 主节点的日志文件
  MASTER_LOG_POS=154;                    -- 主节点的日志位置

#启动复制进程 开始从库的 I/O 和 SQL 线程以开始复制过程:
START SLAVE;

# 查看复制状态 检查从库的状态,确认复制是否正常工作:
SHOW SLAVE STATUS\G;

关注以下字段:

  • Slave_IO_Running: 应该是 Yes
  • Slave_SQL_Running: 应该是 Yes
  • Last_Error: 应为空或无错误信息

测试主从同步

在Master主服务器上创建数据库和表,并插入数据:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mysql> create database test;
mysql> use test;
mysql> create table test(age int);
mysql> insert into test values(1);
mysql> select * from test;
+------+
| age  |
+------+
|    1 |
+------+

在从服务器上检查数据是否同步:

1
2
3
4
5
6
7
mysql> select * from test.test;
+------+
| age  |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

以上操作确保了主服务器的数据成功复制到从服务器,实现了主从同步。

卸载 MySQL

卸载或者卸载重新安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
systemctl stop mysqld
systemctl status mysqld

rpm -evh rpm包名
# 依次卸载rpm包,按照下面顺序卸载不然会报错
sudo rpm -evh mysql-community-server-5.7.20-1.el7.x86_64
sudo rpm -evh mysql-community-client-5.7.20-1.el7.x86_64
sudo rpm -evh mysql-community-libs-compat-5.7.20-1.el7.x86_64
sudo rpm -evh mysql-community-libs-5.7.20-1.el7.x86_64
sudo rpm -evh mysql-community-common-5.7.20-1.el7.x86_64
# 查询是否还存在遗漏文件
rpm -qa|grep mysql
# 删除 mysql 数据库内容

sudo rm -rf  /data/mysql
sudo rm -rf  /var/lib/mysql
sudo rm -rf /usr/local/mysql
sudo rm -rf /var/run/mysqld
sudo rm -rf /etc/my.cnf
sudo rm -f /var/log/mysqld.log

参考

  1. MySQL v5.7 rpm 安装包
  2. MySQL 官网各个版本安装包