当前位置: 首页 > news >正文

MySQL高可用集群

https://dev.mysql.com/doc/mysql-shell/8.4/en/mysql-innodb-cluster.html

1 什么是MySQL高可用集群
  • MySQL高可用集群MySQL InnoDB Cluster
  • InnoDB ClusterMySQL官方实现高可用+读写分离架构方案包含以下组件
    • MySQL Group Replication简称MGRMySQL主从同步高可用方案包括数据同步角色选举
    • MySQL ShellInnoDB Cluster管理工具用来创建管理集群
    • MySQL Router业务流量入口支持MGR主从角色判断可以配置不同端口分别对外提供读写服务实现读写分离
  • MySQL InnoDB Cluster架构

  • InnoDB Cluster三个MySQL数据库实例构成一个高可用集群
  • 其中一个实例是具有读写能力成员
  • 其他两个实例具有只读能力成员
  • 组复制数据成员复制次成员
  • MySQL Router连接读写端口客户端请求转发成员连接到只读端口客户端请求转发成员

2 搭建高可用集群示例
2.1 准备三个MySQL实例
2.2.1 准备MySQL实例20000
  • 创建目录
mkdir -p /opt/mysql/20000/{data,log,tmp}

  • 准备配置文件
vi /opt/mysql/20000/my.cnf[mysql]
#设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
port=20000
pid-file= /opt/mysql/20000/mysqld.pid
socket= /opt/mysql/20000/mysqld.sock
datadir= /opt/mysql/20000/data
log-error=/opt/mysql/20000/log/mysqld.log
tmpdir=/opt/mysql/20000/tmp
mysqlx-port=20010
mysqlx-socket=/opt/mysql/20000/mysqldx.sock
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#服务器唯一ID,默认是1
server-id=20000
#启用二进制日志
log-bin=mysql-bin
#最大连接数
max_connections=1000
#设置默认时区
default-time_zone='+8:00'
# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1
user = mysql
#启用全局事务标识符(GTID)模式
gtid_mode=on
#强制GTID的一致性。这意味着在执行事务时,MySQL将确保所有涉及的服务器都使用相同的GTID集。
enforce_gtid_consistency=on
#启用并行复制
binlog_transaction_dependency_tracking=WRITESET
replica_preserve_commit_order=ON
replica_parallel_type=LOGICAL_CLOCK
transaction_write_set_extraction=XXHASH64

  • 初始化
chown -R mysql:mysql /opt/mysql/20000
mysqld --defaults-file=/opt/mysql/20000/my.cnf --initialize

mysqld --defaults-file=/opt/mysql/20000/my.cnf &

  • 初始化密码
#查看临时密码
cat /opt/mysql/20000/log/mysqld.log|grep "A temporary password"
#登录
mysql -uroot -p'ji2m:aJ9K26y' --socket=/opt/mysql/20000/mysqld.sock
>ALTER USER 'root'@'localhost' identified by '123456';
  CREATE USER 'root'@'%' IDENTIFIED  BY '123456';
  GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
  flush privileges;

  • root账号赋InnoDB Cluster 相关权限
mysql -uroot -p'123456' --socket=/opt/mysql/20000/mysqld.sock
>GRANT CLONE_ADMIN, CONNECTION_ADMIN, CREATE USER, EXECUTE, FILE, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SELECT, SHUTDOWN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'root'@'%' WITH GRANT OPTION;GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'root'@'%' WITH GRANT OPTION;GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata.* TO 'root'@'%' WITH GRANT OPTION;GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_bkp.* TO 'root'@'%' WITH GRANT OPTION;GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_previous.* TO 'root'@'%' WITH GRANT OPTION;

2.2.2 复制实例20001
cp -rf /opt/mysql/20000 /opt/mysql/20001
sed -i "s#20000#20001#g" /opt/mysql/20001/my.cnf
sed -i "s#20010#20011#g" /opt/mysql/20001/my.cnf
rm -f /opt/mysql/20001/data/auto.cnf
chown -R mysql:mysql /opt/mysql/20001
mysqld --defaults-file=/opt/mysql/20001/my.cnf &

2.2.3 复制实例20002
cp -rf /opt/mysql/20000 /opt/mysql/20002
sed -i "s#20000#20002#g" /opt/mysql/20002/my.cnf
sed -i "s#20010#20012#g" /opt/mysql/20001/my.cnf
rm -f /opt/mysql/20002/data/auto.cnf
chown -R mysql:mysql /opt/mysql/20002
mysqld --defaults-file=/opt/mysql/20002/my.cnf &

2.2 MySQL Shell部署集群
2.2.1 安装MySQL Shell

MySQL :: Download MySQL Shell

2.2.2 MySQL Shell 集群相关常用命令
mysqlsh root@192.168.221.100:20000 --js
> dba.help(); --查看帮助文档? dba.deploySandboxInstance --查看具体操作帮助文档

2.2.3 检测实例是否满足要求
mysqlsh root@192.168.221.100:20000 --js
> dba.checkInstanceConfiguration('root@192.168.221.100:20000');dba.checkInstanceConfiguration('root@192.168.221.100:20001');dba.checkInstanceConfiguration('root@192.168.221.100:20002');

返回ok表示验证通过

2.2.4 初始化InnoDB Cluster配置
mysqlsh root@192.168.221.100:20000 --js
> dba.configureInstance('root@192.168.221.100:20000');dba.configureInstance('root@192.168.221.100:20001');dba.configureInstance('root@192.168.221.100:20002');

2.2.5 使用主实例创建集群
  • 创建集群
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.createCluster('myCluster');

  • 创建集群默认会将当前节点添加集群作为节点
  • 默认创建模式集群

  • 查看集群状态
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.status();
2.2.6 添加副本实例

mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.addInstance('root@192.168.221.100:20001');cluster.addInstance('root@192.168.221.100:20002');cluster.status();

新添加进来实例默认作为副本节点

2.3 InnoDB Cluster数据同步测试
  • 主库20000添加数据
mysql -uroot -p'123456' --socket=/opt/mysql/20000/mysqld.sock
> create database test;use test;create table test (id int,name varchar(10));ALTER TABLE test ADD PRIMARY KEY id(id);insert into test values(1,'a'),(2,'b'),(3,'c');

  • 从库20001查询数据
mysql -uroot -p'123456' --socket=/opt/mysql/20001/mysqld.sock
>  use test;select * from test;

  • 20002查询数据
mysql -uroot -p'123456' --socket=/opt/mysql/20002/mysqld.sock
>  use test;select * from test;

2.4 InnoDB Cluster主从切换测试
  • kill主库实例20000
  • 查看成员
mysql -uroot -p'123456' --socket=/opt/mysql/20001/mysqld.sock
>  SELECT CHANNEL_NAME,MEMBER_ID,MEMBER_HOST,MEMBER_PORT, MEMBER_ROLE FROM performance_schema.replication_group_members;
  • 查看集群状态
mysqlsh root@192.168.221.100:20001 --js
> var cluster = dba.getCluster('myCluster');cluster.status();
2.5 MySQL Shell集群常见操作
2.5.1 参数配置
  • 使用cluster.options()查看当前集群配置属性
  • 集群参数配置分为两种方式
    • cluster.setOption()设置集群属性所有节点
    • cluster.setInstanceOption()设置指定节点属性
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.setOption("memberWeight",50);#重新加入集群重试次数改为5次cluster.setOption("autoRejoinTries",5);#将其中一个节点的权重改为75
  cluster.setInstanceOption("192.168.221.100:20001","memberWeight",75)#重新加入集群重试次数改为10次
  cluster.setInstanceOption("192.168.221.100:20001","autoRejoinTries",10)

2.5.2 配置节点权重
  • memberWeight选项0~100之间整数缺省值50;
  • 该值故障转移自动选举节点百分比权重
  • 具有较高memberWeight实例更有可能集群选为节点
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');#查看集群参数配置cluster.options();#创建集群配置dba.createCluster('myCluster', {memberWeight:75});#添加实例配置var cluster = dba.getCluster();cluster.addInstance('root@192.168.221.100:20001',{memberWeight:50});#集群创建修改配置
  cluster.setInstanceOption('192.168.221.100:20000','memberWeight',100)

2.5.3 将节点重新加入集群
  • 状态missing节点组复制关闭或者中断
  • 使用cluster.rejionInstance()重新加入集群
  • 重新节点设置MGR相关参数

2.5.4 集群多数节点异常恢复
  • 集群多个节点异常则失去仲裁机制无法选举主节点
  • 使用cluster.forceQuorumUsingPartitionOf集群剥离单节点运行
2.5.5 集群节点角色切换
  • 模式指定节点切换
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.setPrimaryInstance('192.168.221.100:20001');

  • 单主模式切换模式
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.switchToMultiPrimaryMode();

  • 多主模式切换模式
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');
   cluster.switchToSinglePrimaryMode("192.168.221.100:20000")

2.5.6 销毁集群
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.dissolve();

2.5.7 创建集群管理用户
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.setupAdminAccount('test');
  • 操作创建MySQL系统账号
  • mysqlsh连接集群也可使用账号登录
2.6 MySQL Router连接集群
2.6.1 安装MySQL Router

MySQL :: Download MySQL Router

2.6.2 配置路由
mysqlrouter --bootstrap root@192.168.221.100:20000 --force --user=root
2.6.3 查看集群路由信息
mysqlsh root@192.168.221.100:20000 --js
> var cluster = dba.getCluster('myCluster');cluster.listRouters();
2.6.4 启动路由

mysqlrouter &

2.6.5 通过路由连接MySQL
  • mysql client连接路由
mysql -uroot -p123456 -P6446  -h192.168.221.100
  • mysqlsh连接路由
mysqlsh root@192.168.221.100:6446  --sql
2.7 MySQL Router连接测试
  • R/W端口测试读写
  • R/O端口测试读写
  • R/W Split端口测试读写

相关文章:

  • 小黑大语言模型应用探索:langchain智能体构造源码demo搭建1(初步流程)
  • QEMU/KVM课程大纲暨学习路线(1)
  • 通义灵码2.5——基于编程智能体开发Wiki多功能搜索引擎
  • 多卡训练核心技术详解
  • 【Go语言】Fyne GUI 库使用指南 (面向有经验开发者)
  • 1,QT的编译教程
  • Go语言结构体:数据组织的艺术
  • STL_stack和queue(deque priority_queue)
  • HTML网页-练习float
  • Java 注解式限流教程(使用 Redis + AOP)
  • 【C++】C++面向对象设计的核心思想之一: 接口抽象、解耦和可扩展性
  • 【仿生机器人软件架构】通过整合认知系统实现自主精神性——认知系统非常具有可执行性
  • 深入解析 Redis Cluster 架构与实现(二)
  • python打卡day40@浙大疏锦行
  • AWS云创建安全审计用户组
  • 扫地机器人苦寻新引擎,大疆们却已攻入腹地
  • 基于微服务架构的社交学习平台WEB系统的设计与实现
  • 【交通 Traffic Transformer】同一篇文章,内容排版稍有不同 | 交通预测模型中,Transformer相比传统GCN模型有何优势?
  • 基于Vite的前端自动化部署方案
  • AI绘画提示词:解锁创意无限可能
  • it培训机构哪家强/seo综合查询站长工具
  • 天津和平做网站哪家好/关键词优化排名软件
  • 图片压缩wordpress/网络seo营销推广
  • 微信如何做商城网站/seo排名优化怎么样
  • 公司内部网站怎么做/武汉seo公司哪家专业
  • 免费做司考真题的网站/近期国际热点大事件