MySQL 8.0 InnoDB Cluster 安装手册

1. 介质准备

https://dev.mysql.com/downloads/ 下载下面的安装包

  • 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 包

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解析记录,本例子如下:

    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 连接
sudo setsebool -P mysql_connect_any 1
  • 设置 防火墙策略允许myql 连接
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
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
sudo mysqld --initialize;
  • 修改msql 目录的所有者
sudo chown mysql:mysql /var/lib/mysql -R
  • 启动mysql 服务,并设置为自动启动
#启动mysql服务
sudo systemctl start mysqld

#设置为自动启动
sudo systemctl enable mysqld
  • mysqld --initialize 会为root 用户生成随机的初始密码,通过下面命令可以查看
sudo cat /var/log/mysqld.log | grep password
  • 修改root 用户 的密码

    • 使用上面查看到的初始密码,进入mysql命令行工具

      mysql -uroot -p 
      
    • 执行下面的命令

      -- 修改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 可以通过下面的命令安装:

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 可以通过下面的命令安装:

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

6. 创建InnoDB Cluster 群集

6.1 配置和准备服务器节点

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

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

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

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

// 配置服务器节点,对提示均输入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 上执行下面的操作:

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

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

// 下面命令创建名字为 '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 的服务器,执行下面命令。

#下面命令初始化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 登陆群集中的一个数据库服务器节点

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

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

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

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

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

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