> ## Content Index
> Fetch the complete content index at: https://yonglun.me/llms.txt
> Use this file to discover other available public pages before exploring further.

# MySQL 8.0 InnoDB Cluster 安装手册
- URL: https://yonglun.me/mysql-8-0-innodb-cluster-manual/
- Published: 2021-06-08T03:24:48.000Z
- Updated: 2025-04-22T08:14:06.000Z
- Author: Yonglun
- Tags: Open Source, #lang-zh

# 1\. 介质准备

到 [https://dev.mysql.com/downloads/](https://dev.mysql.com/downloads/?ref=yonglun.me) 下载下面的安装包

- mysql-8.0.25-1.el8.x86\_64.rpm-bundle.tar
- mysql-router-community-8.0.25-1.e2l8.x86\_64.rpm
- mysql-shell-8.0.25-1.el8.x86\_64.rpm

使用下面命令解压tar 包

```bash
tar xvf mysql-8.0.25-1.el8.x86_64.rpm-bundle.tar

```

解压后得到下面文件备用：

- mysql-community-common-8.0.25-1.el8.x86\_64.rpm
- mysql-community-client-plugins-8.0.25-1.el8.x86\_64.rpm
- mysql-community-libs-8.0.25-1.el8.x86\_64.rpm
- mysql-community-client-8.0.25-1.el8.x86\_64.rpm
- mysql-community-server-8.0.25-1.el8.x86\_64.rpm

# 2\. 环境准备

## 2.1 服务器准备

InnoDB Cluster 至少需要三个数据库服务器节点，每个节点的硬件配置一致 。

> MySQL InnoDB Cluster 至少需要3个节点。 对3节点群集，当1个节点出现故障时群集仍然正常工作。
> 
> MySQL InnoDB Cluster 最佳配置要求每个节点的硬件配置一致。如果配置不一样，整个群集的性能由性能最低的节点决定。

本文档以下面三台服务器为例子：

| 服务器名称      | IP地址      | 操作系统                                 | 硬件配置              |
| ---------- | --------- | ------------------------------------ | ----------------- |
| ow-rhel-01 | 10.0.3.10 | Red Hat Enterprise Linux release 8.2 | 8cpu, 16GB, 256GB |
| ow-rhel-02 | 10.0.3.11 | Red Hat Enterprise Linux release 8.2 | 8cpu, 16GB, 256GB |
| ow-rhel-03 | 10.0.3.12 | Red Hat Enterprise Linux release 8.2 | 8cpu, 16GB, 256GB |

## 2.2 网络准备

- 为了保证群集性能，三台服务器需要有部署在同一个局域网中，而网络连接带宽要足够。（对于生产系统建议千兆以太网 或以上）。
- 三台服务器之间网络连接良好，最好部署在同一个网段。
- 编辑三台服务器的 /etc/hosts 文件， 在最后加上三台服务器的主机 IP解析记录，本例子如下：  
```bash
10.0.3.10   ow-rhel-01
10.0.3.11   ow-rhel-02
10.0.3.12   ow-rhel-03  
```

## 2.3 服务器设置

**注：下面操作需要在群集每一个节点服务器上执行**

- 设置 SELinux 策略，在SELinux 下 允许myql 连接

```bash
sudo setsebool -P mysql_connect_any 1

```

- 设置 防火墙策略允许myql 连接

```bash
sudo  firewall-cmd --add-port=3306/tcp --permanent
sudo  firewall-cmd --add-port=33061/tcp --permanent
sudo  firewall-cmd --reload

```

# 3\. 安装MySQL Server

**注：下面操作需要在群集每一个节点服务器上执行**

- 将1.介质准备中 下载并解压后得到的所有rpm 文件拷贝到服务器上
- 安装mysql-community-server

```bash
sudo rpm -i mysql-community-common-8.0.25-1.el8.x86_64.rpm
sudo rpm -i mysql-community-client-plugins-8.0.25-1.el8.x86_64.rpm
sudo rpm -i mysql-community-libs-8.0.25-1.el8.x86_64.rpm
sudo rpm -i mysql-community-client-8.0.25-1.el8.x86_64.rpm
sudo rpm -i mysql-community-server-8.0.25-1.el8.x86_64.rpm

```

- 初始化mysql-community-server

```bash
sudo mysqld --initialize;

```

- 修改msql 目录的所有者

```bash
sudo chown mysql:mysql /var/lib/mysql -R

```

- 启动mysql 服务，并设置为自动启动

```bash
#启动mysql服务
sudo systemctl start mysqld

#设置为自动启动
sudo systemctl enable mysqld

```

- mysqld --initialize 会为root 用户生成随机的初始密码，通过下面命令可以查看

```bash
sudo cat /var/log/mysqld.log | grep password

```

- 修改root 用户 的密码

  - 使用上面查看到的初始密码，进入mysql命令行工具  
  ```bash  
  mysql -uroot -p  
  ```
  - 执行下面的命令  
  ```sql
-- 修改root@localhost的密码,xxxx替换为需要设置的密码  
  ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY  'xxxx';  
-- 创建root@% 用户，并设置密码,xxxx替换为需要设置的密码  
  create user 'root'@'%' identified with mysql_native_password by  'xxxx';  
-- 设置root@% 用户权限  
  GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;  
-- 使设置的权限信息立即失效  
  flush privileges;
-- 设置完成，退出  
  quit;  
  ```

# 4\. 安装MySQL Shell

**注：下面操作需要在群集每一个节点服务器上执行**

mysql shell 是mysql提供的新的管理工具，可以用于管理mysql 服务器，也可以用于创建和管理InnoDB Cluster 群集。 支持javaScript 及 python 语法， 缺省使用javaScript 语法。

mysql shell 可以通过下面的命令安装：

```bash
sudo rpm -i mysql-shell-8.0.25-1.el8.x86_64.rpm

```

# 5\. 安装mysql-router

**注：下面操作需要在群集每一个节点服务器上执行**

mysql-router 用于将应用系统发起的数据库请求转发到正确的 数据库服务器节点，mysql-router 可以安装在下面三个位置：

1. 安装在应用服务器上
2. 安装在一个独立的服务器上
3. 安装在数据库服务器上

本例子中我们按照在数据库服务器上

mysql-router 可以通过下面的命令安装：

```bash
sudo rpm -i mysql-router-community-8.0.25-1.el8.x86_64.rpm

```

# 6\. 创建InnoDB Cluster 群集

## 6.1 配置和准备服务器节点

**注：下面操作需要在群集每一个节点服务器上执行**

在第一个节点ow-rhel-01 上执行下面的操作：

```bash
 # 使用mysql shell 登陆第一个服务器节点
 mysqlsh --uri root@ow-rhel-01:3306

```

输入root 密码后，进入mysql shell 界面，执行下面的命令

```javascript
// 配置服务器节点,对提示均输入y, 最后会重启该节点的MySQL 实例
// 显示 NOTE: MySQL server at xxxx was restarted. 则配置完成
dba.configureLocalInstance();

// 检查服务器节点配置, 显示The instance  XXXX is valid to be used in an InnoDB cluster 表明配置正确，可以加入群集
dba.checkInstanceConfiguration('root@ow-rhel-01:3306');

// 退出mysql shell
\q

```

在每个服务器节点上 重复上述的过程，完成该服务器节点的配置准备和检查。

## 6.2 创建服务器群集

在第一个节点ow-rhel-01 上执行下面的操作：

```bash
 # 使用mysql shell 登陆第一个服务器节点
 mysqlsh --uri root@ow-rhel-01:3306

```

输入root 密码后，进入mysql shell 界面，执行下面的命令

```javascript
// 下面命令创建名字为 'mainCluster' 的群集，设置为主-主模式，并将当前节点加入群集
// InnoDB Cluster 有主-从模式，和主-主模式，本例子使用主-主模式，即每个节点均可以写入和查询
// 命令执行后，出现Cluster successfully created 表明群集创建成功
var cluster = dba.createCluster('mainCluster',{multiMaster:true,adoptFromGR:false})

//将第二个节点加入群集
cluster.addInstance('root@ow-rhel-02:3306');

//将第三个节点加入群集
cluster.addInstance('root@ow-rhel-03:3306');

//用下面命令显示群集状态
cluster.status();

//创建一个mysql 用户，用于管理集群，这样不需每次使用root 进行管理
cluster.setupAdminAccount('clusterAdmin’)

//创建一个mysql 用户，用于mysql router
cluster.setupRouterAccount('mysqlrouter');

// 退出mysql shell
\q

```

完成上面步骤后，一个三节点的MySQL InnoDB Cluster 群集已经创建完成。

- 三个节点均可以写入，三个节点均可以读取，数据在三个节点上的保持强一致性的。
- 当一个节点出现故障时，群集仍然可以正常工作。
- 当故障节点恢复后，该节点会自动进行数据同步，当数据同步完成后，恢复的节点可以重新提供服务。
- 当添加新节点到群集，该节点会自动进行数据同步，当数据同步完成后，新加入的节点可以提供服务。

# 7\. 初始化mysql rounter

在需要部署mysql router 的服务器，执行下面命令。

```bash
#下面命令初始化mysqlrouter
#--user mysqlrouter 指定 mysqlrouter服务运行的linux用户，如修改为其它用户需要先创建
#初始化mysqlrouter的配置文件及脚本目录
sudo mysqlrouter --bootstrap root@ow-rhel-01:3306 --user=mysqlrouter --directory /var/lib/myrouter

#启动mysqlrouter服务
sudo systemctl start mysqlrouter

#将mysqlrouter服务设置为自动启动
sudo systemctl enable mysqlrouter

```

# 8\. 群集常用管理命令

使用mysql shell 可以对群集进行维护和管理，下面列出常用的命令

首先需要用mysql shell 登陆群集中的一个数据库服务器节点

```bash
 # 使用mysql shell 登陆第一个服务器节点
 mysqlsh --uri root@ow-rhel-01:3306

```

下面是一些常用的运维管理命令：

```javascript
//获取群集实例,mainCluster 是创建群集时指定的名字
var cluster = dba.getCluster('mainCluster');

//查看群集状态
cluster.status();

//查看群集的信息
cluster.describe();

//查看所有的mysql router
cluster.listRouters();

```