MySQL8.0 innodb Cluster 高可用集群部署(MySQL、MySQL Shell、MySQL Router安装)

embedded/2025/2/13 19:25:59/

简介

MySQL InnoDB集群(Cluster)提供了一个集成的,本地的,HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议,保障数据一致性,组复制支持单主模式和多主模式。

InnoDB Cluster组件:

MySQL Group Replication,简称MGR,是MySQL的主从同步高可用方案,包括数据同步及角色选举

Mysql Shell 是InnoDB Cluster的管理工具,用来创建和管理集群

Mysql Router 是业务流量入口,支持对MGR的主从角色判断,可以配置不同的端口分别对外提供读写服务,和单端口读写分离。

innoDB Cluster将三个MySQL数据库实例构成一个高可用集群。其中一个实例是具有读/写能力的主要成员,其他两个实例是具有只读能力的次要成员。组复制将数据从主要成员复制到次要成员。MySQL Router将客户端应用程序连接到集群的主要成员。

为什么选择InnoDB Cluster:

InnoDB **集群(Cluster)**是InnoDB 副本集(ReplicaSet) 与 组复制(Group Replication) 的合成版,是InnoDB 副本集(ReplicaSet) 的高可用版,是 组复制(Group Replication) 的简易、自动化故障转移、可编程的增强版。

InnoDB **集群(Cluster)**提供了一个集成的,本地的,HA解决方案。Mysq Innodb Cluster是利用组复制的 pxos 协议,保障数据一致性,组复制模式(支持单主模式和多主)。

一、基础环境配置

1.1 部署规划:

IP

主机名

角色

安装软件

172.31.0.115

Mysql01

primary

mysql-shell,mysql8.3.0

172.31.0.116

Mysql02

secondary

mysql-shell,mysql8.3.0,mysqlroute

172.31.0.117

Mysql03

secondary

mysql-shell,mysql8.3.0,mysqlroute

1.2 部署资源:

下载地址:https://www.mysql.com/downloads

mysql-8.3.0-linux-glibc2.17-x86_64.tar.xz

mysql-router-8.3.0-linux-glibc2.17-x86_64.tar.xz

mysql-shell-8.3.0-linux-glibc2.17-x86-64bit.tar.gz

1.3 设置主机名:

每个节点都要设置

#配置主机名

vi /etc/hosts

#写入主机名信息

172.31.0.115 mysql01

172.31.0.116 mysql02

172.31.0.117 mysql03

#也可通过命令设置主机名:

sudo hostnamectl set-hostname mysql01

sudo hostnamectl set-hostname mysql02

sudo hostnamectl set-hostname mysql03

系统相关优化(自选):

cat>>/etc/sysctl.conf <<EOF

fs.aio-max-nr = 1048576

fs.file-max = 681574400

kernel.shmmax = 137438953472

kernel.shmmni = 4096

kernel.sem = 250 32000 100 200

net.ipv4.ip_local_port_range = 9000 65000

net.core.rmem_default = 262144

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

net.core.wmem_max = 1048586

EOF

#执行生效

sysctl -p

cat>>/etc/security/limits.conf <<EOF

mysql soft nproc 65536

mysql hard nproc 65536

mysql soft nofile 65536

mysql hard nofile 65536

EOF

cat>>/etc/pam.d/login <<EOF

session required /lib/security/pam_limits.so

session required pam_limits.so

EOF

cat>>/etc/profile<<EOF

if [ $USER = “mysql” ]; then

ulimit -u 16384 -n 65536

fi

EOF

检查防火墙:

# 关闭

systemctl stop firewalld

# 开机禁用

systemctl disable firewalld

1.4 设置SSH免登录:

用ssh-keygen生成公钥,用ssh-copy-id将本地公钥复制到远程主机的authorized_keys文件。每台机器都要执行,注意执行时修改远程机器ip。

cd ~

ssh-keygen -t rsa

#一路回车

ssh-copy-id -i ~/.ssh/id_rsa.pub 172.31.0.117

ssh-copy-id -i ~/.ssh/id_rsa.pub 172.31.0.116

测试免登陆在mysql1上ssh mysql02

[root@mysql01 ~]# ssh mysql02

二、MySQL安装

2.1 查看系统是否自带adb&spm=1001.2101.3001.7020" title="mariadb">mariadb并卸载(防止mysql与mariadb的文件发生冲突)

rpm -qa | grep mariadb

rpm -e mariadb-libs-X(更换查出来的信息) --nodeps

上传到 /usr/local/ 路径下,解压

cd /usr/local

ls

tar -xvf mysql-8.3.0-linux-glibc2.17-x86_64.tar.xz

mysqlmysql_201">2.2 删除压缩包,并将解压的mysql文件夹重命名为mysql

rm -rf mysql-8.3.0-linux-glibc2.17-x86_64.tar.xz

mv mysql-8.3.0-linux-glibc2.17-x86_64/ ./mysql
qwqw

mysqldata_207">2.3 进入mysql目录,创建data文件夹

cd mysql

mkdir data

mysql_213">2.4 创建mysql用户和组并修改权限

groupadd mysql

useradd -g mysql mysql

chown -R mysql.mysql /usr/local/mysql

2.5 创建编辑my.cnf配置文件

vim /etc/my.cnf

[client]

port = 3306

#根据实际情况调整mysql.sock配置

socket = /tmp/mysql.sock

[mysqld]

#Mysql服务的唯一编号 每个mysql服务Id需唯一

server-id = 1

report_host = mysql01

#服务端口号 默认3306

port = 3306

#mysql安装根目录

basedir = /usr/local/mysql

#mysql数据文件所在位置

datadir = /usr/local/mysql/data

#pid

pid-file = /usr/local/mysql/mysql.pid

#设置socke文件所在目录

socket = /tmp/mysql.sock

#设置临时目录

tmpdir = /tmp

# 用户

user = mysql

# 允许访问的IP网段

bind-address = 0.0.0.0

#错误日志

log_error=/usr/local/mysql/data/mysql-error.log

#设置认证插件(mysql8以上默认为caching_sha2_password 如果使用mysql_native_password则在后续配置mysql router的时候会有问题,我在这里搞错了后面配mysql router的时候有问题掉过头来把mysql重装了)

#default_authentication_plugin=mysql_native_password

#设置sqlmode(根据需求自定义)

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

# 跳过密码登录

#skip-grant-tables

#主要用于MyISAM存储引擎,如果多台服务器连接一个数据库则建议注释下面内容

skip-external-locking

#只能用IP地址检查客户端的登录,不用主机名

skip_name_resolve = 1

#数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)

character-set-server = utf8mb4

#数据库字符集对应一些排序等规则,注意要和character-set-server对应

collation-server = utf8mb4_general_ci

#设置client连接mysql时的字符集,防止乱码

init_connect=‘SET NAMES utf8mb4’

#是否对sql语句大小写敏感,1表示不敏感

lower_case_table_names = 1

#最大连接数

max_connections = 15000

#最大错误连接数

max_connect_errors = 20000

#TIMESTAMP如果没有显示声明NOT NULL,允许NULL值

explicit_defaults_for_timestamp = true

#SQL数据包发送的大小,如果有BLOB对象建议修改成1G

max_allowed_packet = 128M

#MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭

#MySQL默认的wait_timeout 值为8个小时, interactive_timeout参数需要同时配置才能生效

interactive_timeout = 30

wait_timeout = 30

#内部内存临时表的最大值 ,设置成128M。

#比如大数据量的group by ,order by时可能用到临时表,

#超过了这个值将写入磁盘,系统IO压力增大

innodb_buffer_pool_size = 32G

table_open_cache = 4096

max_heap_table_size = 256M

sort_buffer_size = 32M

tmp_table_size = 256M

slow-query-log = 1

long_query_time = 4

max_allowed_packet = 32M

innodb_lock_wait_timeout = 120

open-files-limit = 30000

#mysql binlog日志文件保存的过期时间,过期后自动删除

#expire_logs_days = 5

#每个节点server_id要保障不一样

server_id = 4000000161

loose-group_replication_group_name=“a38e32fd-5fb6-11e8-ad7a-00259015d941”

#每个节点下面的配置信息不太一样,注意修改

loose-group_replication_local_address= “172.31.0.115:3306”

loose-group_replication_group_seeds= “172.31.0.115:3306,172.31.0.116:3306,172.31.0.117:3306”

loose-group_replication_single_primary_mode=TRUE

mysqlbinmysql_381">2.6 进入mysql文件夹的bin目录下,初始化mysql

cd /usr/local/mysql/bin

./mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --initialize

mysql_387">2.7 添加mysql服务,设置开机自启

#查看是是否有MySQL服务

chkconfig --list

#将MySQL的服务脚本放到系统服务中,/etc/init.d是 /etc/rc.d/init.d的软链接

cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql

#授予可执行权限

chmod +x /etc/rc.d/init.d/mysql

#添加mysql服务

chkconfig --add mysql

#使MySQL开机自启

chkconfig --level 345 mysql on

mysqlbinmysqlbinmysql_409">2.8 创建mysql下bin目录的同步链接,设置后无需进入mysql的bin目录就可以执行mysql命令

ln -s /usr/local/mysql/bin/mysql /usr/bin

2.9 启动MySQL

#查看状态

service mysql status

#启动

service mysql start

#停止

service mysql stop

2.10 设置密码

MySQL成功启动后可以通过mysql下data目录下的日志文件可以找到root用户初始化密码,将密码复制粘贴,我们就可以成功登录mysql

cat /usr/local/mysql/data/mysql-error.log

#修改root用户密码

#三台主机的root密码要一样

mysql -uroot -p

alter user 'root'@'localhost' identified by '你的密码';
use mysql;
#授权root用户任何IP访问
update user set host = '%' where user = 'root';
#刷新权限
FLUSH PRIVILEGES;
#查看用户信息是否被修改
select host, user, authentication_string, plugin from user;

到此mysql server 8 数据库的安装配置完成了!

2.11 给MySQL root用户授权(才能配置InnoDB集群实例)
grant all privileges on *.* to `root`@`%` with grant option;flush privileges;
2.12 组复制配置

修改各个节点/etc/my.cnf 配置MGR, 组复制信息,注意每台机器server_id,loose-group_replication_local_address需要不同

server_id = 4000000161

loose-group_replication_group_name=“a38e32fd-5fb6-11e8-ad7a-00259015d941”

loose-group_replication_local_address= “172.31.0.115:3306”

loose-group_replication_group_seeds= “172.31.0.115:3306,172.31.0.116:3306,172.31.0.117:3306”

loose-group_replication_single_primary_mode=TRUE

三、MySQL Shell安装

3.1将压缩包上传到每台机器/usr/local下,解压、授权并配置环境变量

#解压并配置

tar xvf mysql-shell-8.3.0-linux-glibc2.17-x86-64bit.tar.gz

#重命名

mv mysql-shell-8.3.0-linux-glibc2.17-x86-64bit mysql-shell

#授权给mysql用户–必须

chown -R mysql.mysql mysql-shell

#设置环境变量

vi /etc/profile

export PATH=/usr/local/mysql-shell/bin:$PATH

#:wq保存后使环境变量生效

source /etc/profile

3.2 节点配置检查

进入MySQL shell

mysqlsh

进去mysqlsh后进入js模式

js

在MySQL shell中执行,每台机器都要执行,注意修改主机名为当前节点

dba.configureInstance();

dba.checkInstanceConfiguration(‘root@mysql01:3306’);

3.3 创建并添加集群

mysql shell中

var cluster = dba.createCluster(‘testCluster’);

cluster.addInstance(‘root@mysql02:3306’);

cluster.addInstance(‘root@mysql03:3306’);

3.4 查看集群状态

在MySQL shell 中

var cluster=dba.getCluster(‘testCluster’);

cluster.status();

四、安装MySQL Router

4.1 上传资源并配置环境

压缩包上传到/usr/local下,解压、授权并配置环境变量**。**

#解压并配置

tar xvf mysql-router-9.1.0-linux-glibc2.17-x86_64.tar.xz

mv mysql-router-9.1.0-linux-glibc2.17-x86_64 mysql-router

#授权 – 必须

chown -R mysql.mysql mysql-router

#设置环境变量

vi /etc/profile

export PATH=/usr/local/mysql-shell/bin:/usr/local/mysql-router/bin:$PATH

#:wq保存后使环境变量生效

source /etc/profile

4.2 初始化MySQL Router

mysql router主备节点都要执行

mysqlrouter --bootstrap root@localhost:3306 -d /usr/local/mysql-router/myrouter --user=root

注:这里会生成/usr/local/mysql-router/myrouter目录, 并在里面生成 mysqlrouter.conf 配置文件,接着可以根据实际修改端口等配置。

cat /usr/local/mysql-router/myrouter/mysqlrouter.conf

mysql_router_569">4.3 启动mysql router

cd /usr/local/mysql-router/myrouter

sh start.sh

集群及Router安装结束

五、MySQL集群维护

5.1 集群节点扩容

MySQL、MySQL Shell及MySQL Router 安装配置见上

#进去mysqlsh

mysqlsh

#切换到js模式

js

#获取集群

var cluster = dba.getCluster();

#查看集群状态

cluster.status();

#检查扩容机器是否符合加入,如果不符合根据提示修改配置。

dba.checkInstanceConfiguration(‘user@主机名:3306’);

#加入集群

cluster.addInstance(user@主机名:3306’);

5.2 集群节点删除

#进去mysqlsh

mysqlsh

#切换到js模式

js

#获取集群

var cluster = dba.getCluster();

#查看集群状态

cluster.status();

#要移除的节点主机名或IP

var memberToBeRemoved = “mysql03”;

#删除

cluster.removeMemberFromMetadata(memberToBeRemoved);

#移除后保存配置

cluster.saveConfiguration();

#查看集群状态

cluster.status()


http://www.ppmy.cn/embedded/161946.html

相关文章

2022年中职网络建设与运维赛题-windows服务器解析

windows和linux安装后都需要关闭防火墙 一、windows服务配置 注意事项 1.首先要改一下主机名&#xff0c;.在控制面板或者在设置中更改&#xff0c;然后关闭防火墙&#xff0c;配置题中的静态ip地址 2.加入域之后换回工作组&#xff0c;然后又重新加入域&#xff0c;需要在域…

JavaScript设计模式 -- 单例模式

在实际开发中&#xff0c;我们常常需要确保某个类只有一个实例&#xff0c;并提供全局访问点。**单例模式&#xff08;Singleton Pattern&#xff09;**正是为了解决这个问题而产生的。本文将详细介绍单例模式的原理、实现方式以及在 JavaScript 中的多种应用场景&#xff0c;通…

Linux之kernel(1)系统基础理论(2)

Linux之Kernel(1)系统基础理论(2) Author: Once Day Date: 2025年2月10日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Linux内核知识_Once-Day的…

【Linux】ip命令详解

Linux网络排查 目录 一、ip命令介绍 1.1 ip命令简介 1.2 ip命令的由来 二、ip命令使用帮助 2.1 ip命令的help帮助信息 2.2 ip命令对象介绍 2.3 ip命令选项介绍 三、查看网络信息 3.1 显示当前网络接口信息 3.2 显示网络设备运行状态 3.3 显示详细设备信息 3.4 查看…

【Gin】Web框架开发快速入门

本文目录 一、使用go.work创建工作区二、gin框架快速上手2.1 简单的请求实现2.2 URI2.3 分组路由2.4 Get请求参数获取2.5 Post请求参数2.6 响应 一、使用go.work创建工作区 依次输入下面命令&#xff0c;初始化工程。 mkdir ginlearn cd .\ginlearn\ mkdir helloworld go wor…

iOS主要知识点梳理回顾-5-运行时方法交换

方法交换可以放在 load 或 initialize 方法中&#xff0c;也可以自己根据时机来空&#xff0c;比如开启某个开关后才需要交换方法。如果是在load中调用&#xff0c;交换工作会在类加载时&#xff08;程序启动&#xff09;自动调用&#xff1b;如果是在initialize中调用&#xf…

python利用jenkins模块操作jenkins

安装python-jenkins 可以使用pip命令来安装python-jenkins模块&#xff1a; pip install python-jenkins操作jenkins 接下来就是连接和操作jenkins&#xff0c;写了个class&#xff0c;直接上代码 class Jenkins():def __init__(self, url, username, password):# jenkins服…

鸿蒙HarmonyOS NEXT开发:优化用户界面性能——组件复用(@Reusable装饰器)

文章目录 一、概述二、原理介绍三、使用规则四、复用类型详解1、标准型2、有限变化型2.1、类型1和类型2布局不同&#xff0c;业务逻辑不同2.2、类型1和类型2布局不同&#xff0c;但是很多业务逻辑公用 3、组合型4、全局型5、嵌套型 一、概述 组件复用是优化用户界面性能&#…