mysql8高可用MIC部署
mysql8.0作为一款新产品,其内置的mysql-innodb-cluster(MIC)高可用集群的技术确实惊艳,结合MySQLshell能够实施集群的快速部署,MySQL-router能够实现灾备快速切换,内置读写分离技术,负载均衡技术
读写分离实现
MySQL Router接受前端应用程序请求后,根据不同的端口来区分读写,把连接读写端口的所有写和查询发往主库,把连接只读端口的查询以轮询方式发往多个从库,从而实现读写分离的目的。读写返回的结果会交给MySQL Router,由MySQL Router返回给客户端的应用程序
MIC(MySQL InnoDB Cluster)主要由三部分组成,分别是:MySQL Shell、MySQL Router、MySQL Group Replication(MGR)。
MySQL Shell 是一个高级命令行工具,用于管理 MySQL 数据库和 InnoDB Cluster
MySQL Router 路由转发中间件,提供透明切换与读写分离能力
MySQL Group Replication 底层的数据同步集群(MGR),提供容错、故障恢复与弹性扩展
架构
一主两从
服务器
192.168.13.111 主节点 mysql-master
192.168.13.112 从节点 mysql-slave1
192.168.13.113 从节点 mysql-slave2
安装MySQL8.0
(三台机器均操作)
关闭防火墙和selinux
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
rpm -ivh mysql80-community-release-el7-3.noarch.rpm
vim /etc/yum.repos.d/mysql-community.repo
yum -y install mysql-server
修改密码
systemctl start mysqld
# 查看初始密码
grep password /var/log/mysqld.log
# 修改密码
mysqladmin -uroot -p'YdaQap_y-3o4' password '12QW!@qw'
修改配置文件my.cnf
(三台机器的server_id不同)
vim /etc/my.cnf
# 在mysqld标签下添加以下信息
server_id=1 #每台机器的server_id不同
report_host=192.168.13.111 #本机服务器的IP
report_port=3306 #MySQL端口
loose-group_replication_ip_whitelist="192.168.13.111,192.168.13.112,192.168.13.113" #用于指定允许参与组复制的 IP 地址
重启MySQL
systemctl restart mysqld
安装mysql-shell和mysql-router
(shell和router都只需要装一台)
安装mysql-shell
wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.37-linux-glibc2.12-x86-64bit.tar.gz
tar xvzf mysql-shell-8.0.37-linux-glibc2.12-x86-64bit.tar.gz -C /usr/local/
cd /usr/local/
mv mysql-shell-8.0.37-linux-glibc2.12-x86-64bit/ mysql-shell
安装mysql-router
wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-8.0.37-linux-glibc2.12-x86_64.tar.xz
tar xvf mysql-router-8.0.37-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
cd /usr/local/
mv mysql-router-8.0.37-linux-glibc2.12-x86_64/ mysql-router
两个安装包都是二进制安装包,解压即用
利用mysql-shell搭建集群
使用root用户创建用户并授权(在三台机器中均创建)
mysql -uroot -p'12QW!@qw'
mysql> \e
CREATE USER 'mic' IDENTIFIED BY '12QW!@qw';
GRANT BACKUP_ADMIN, CLONE_ADMIN, CREATE USER, EXECUTE, FILE, PERSIST_RO_VARIABLES_ADMIN, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SHUTDOWN, SUPER, SYSTEM_VARIABLES_ADMIN ON *.* TO 'mic'@'%' WITH GRANT OPTION;
GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'mic'@'%' 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 'mic'@'%' 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 'mic'@'%' 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 'mic'@'%' WITH GRANT OPTION;
GRANT CONNECTION_ADMIN, GROUP_REPLICATION_ADMIN, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN ON *.* TO 'mic'@'%' WITH GRANT OPTION;
搭建集群
MySQL JS > \c mic@192.168.13.111:3306 # 使用 mic 用户连接主节点(192.168.13.111)
Creating a session to 'mic@192.168.13.111:3306'
Please provide the password for 'mic@192.168.13.111:3306': ******** # 输入 mic 用户密码
Save password for 'mic@192.168.13.111:3306'? [Y]es/[N]o/Ne[v]er (default No): Y
Fetching schema names for auto-completion... Press ^C to stop.
Your MySQL connection id is 18
Server version: 8.0.39 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
检查配置信息
dba.checkInstanceConfiguration()
# 配置持久化,用于集群管理
dba.configureInstance('mic@192.168.13.111:3306')
dba.configureInstance('mic@192.168.13.112:3306')
dba.configureInstance('mic@192.168.13.113:3306')
# 创建一个mysqlcluster的集群(三台服务器都需要是空白的)
var cluster=dba.createCluster('mysqlcluster');
# 查看集群信息
cluster.status()(利用shell连接变量是一次性的,如果退出重连,则执行如下命令)
dba.getCluster().status()
# 在集群中添加实例(两个从库都执行)
cluster.addInstance('mic@192.168.13.112:3306')(同上,退出后重新连接得用如下命令)
var cluster=dba.getCluster();cluster.addInstance('bonree@192.168.13.112:3306')
cluster.addInstance('mic@192.168.13.113:3306')
# 添加实例过程中,会通过clone方式将主节点上的数据clone到从节点上,clone之后会重启从节点上的mysql。
# 如果添加过程中添加失败,可以 执行cluster.rescan()重新扫描加入集群
# 实例添加完成后,查看进行信息
cluster.status();
利用mysql-router做故障恢复
mysql-router对接innodb cluster集群
cd /usr/local/mysql-router/bin/
./mysqlrouter --bootstrap mic@192.168.13.111:3306 --user=root
# 执行完信息如下,提示执行启动命令,配置文件是mysqlrouter.conf,先不启动
修改配置文件mysqlrouter.conf
# 将dynamic_state进行注释,添加bootstrap_server_addresses信息。保存后启动mysqlrouter
vim /usr/local/mysql-router/mysqlrouter.conf
bootstrap_server_addresses=mysql://192.168.13.111:3306,mysql://192.168.13.112:3306,mysql://192.168.13.113:3306
启动
cd /usr/local/mysql-router/bin/
./mysqlrouter -c ../mysqlrouter.conf &
netstat -tnlp
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)