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 可以安装在下面三个位置:
- 安装在应用服务器上
- 安装在一个独立的服务器上
- 安装在数据库服务器上
本例子中我们按照在数据库服务器上
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();