赞
踩
本文主要记录了最新版本的MySQL 8.3.0的安装方式以及MySQL InnoDB Cluster集群的搭建过程。
为了最终实现集群,我这里测试时在一台虚拟机中安装了3个MySQL实例:
-master:
IP:192.168.70.128
端口:3310
安装位置:/home/mysql-8.3.0-master
-slave1:
IP:192.168.70.128
端口:3311
安装位置:/home/mysql-8.3.0-slave1
-slave2:
IP:192.168.70.128
端口:3312
安装位置:/home/mysql-8.3.0-slave2
【整体安装步骤为】:
MySQL 8.3.0(3个实例)->MySQL Shell(集群配置)->MySQL Router(供应用程序连接)
下载地址:https://dev.mysql.com/downloads/mysql/
比如下载:
mysql-8.3.0-linux-glibc2.17-x86_64.tar.xz
注意:glibc2.17和glibc2.28的区别:
文件名中的"glibc2.17"和"glibc2.28"表示了两个不同的glibc(GNU C Library)版本。
glibc是Linux系统中的重要组件之一,它提供了许多操作系统功能和服务的实现。不同的Linux发行版和版本可能使用不同的glibc版本。
"glibc2.17"表示该版本是构建和编译在glibc 2.17上的,而"glibc2.28"表示该版本是构建和编译在glibc 2.28上的。
选择正确的glibc版本对于确保软件与特定Linux发行版和版本的兼容性非常重要。
因此,你应该根据你的操作系统使用的glibc版本来选择相应的包进行安装。
如果你的Linux系统使用的是glibc 2.17,那么你应该选择下载并安装"glibc2.17"版本的包。
如果你不确定你的系统使用的是哪个glibc版本,你可以在终端中运行以下命令来查看:
ldd --version
根据输出结果中的glibc版本信息,选择对应的MySQL tar.gz包进行安装。
请注意,确保选择与你的操作系统和glibc版本兼容的MySQL版本是非常重要的,否则可能会导致不稳定或不可预测的行为。
tar xvf mysql-8.3.0-linux-glibc2.17-x86_64.tar.xz
mkdir /home/mysql-8.3.0-master/data
vim /home/mysql-8.3.0-master/my.cnf
-mysql.cnf内容如下:(这里精简了一些配置,主要是演示用,实际项目根据需要添加所需MySQL配置即可)
[mysqld]
skip-name-resolve
port = 3310
mysqlx=0
basedir=/home/mysql-8.3.0-master
datadir=/home/mysql-8.3.0-master/data
max_connections=200
max_allowed_packet = 500M
character-set-server=utf8mb4
default-storage-engine=INNODB
innodb_buffer_pool_size=2G
lower_case_table_names=1
server-id=300
[mysql]
default-character-set=utf8mb4
-注意:MySQL8不像MySQL5.7版本,不区分大小写的配置lower_case_table_names=1必须在MySQL初始化前配置好,因为一旦初始化了,就不允许再修改该配置了!
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
chown mysql:mysql -R /home/mysql-8.3.0-master
-下面这个授权是给MySQL默认的mysql.sock存放目录授权
chown mysql:mysql -R /tmp
【注意:虽然MySQL的初始化和启动也可以用系统的root用户进行,但正式部署时,为了安全性,应该单独为MySQL创建个系统用户来操作,比如上面创建的mysql用户和用户组】
(初始化时会生成密码,记得保存,比如:gLfOAkhG=7fT)
cd /home/mysql-8.3.0-master/bin
--用mysql用户进行初始化
./mysqld --defaults-file=/home/mysql-8.3.0-master/my.cnf --user=mysql --initialize
cd /home/mysql-8.3.0-master/bin
-启动MySQL服务:
./mysqld --defaults-file=/home/mysql-8.3.0-master/my.cnf --user=mysql &
-停止MySQL服务:
./mysqladmin -u root -p shutdown
(注意:MySQL8.3登录后强制要求先修改密码,否则不让做其他操作的)
-登录:
./mysql -u root -p
(用初始化时的临时密码登录,比如:gLfOAkhG=7fT)
-修改密码命令:
alter user 'root'@'localhost' identified by '8888';
use mysql;
update user set host='%' where user='root';
flush privileges;
mkdir /home/mysql-8.3.0-slave1/data /home/mysql-8.3.0-slave1/socket
[mysqld]
skip-name-resolve
port = 3311
mysqlx=0
socket=/home/mysql-8.3.0-slave1/socket/mysql.sock
basedir=/home/mysql-8.3.0-slave1
datadir=/home/mysql-8.3.0-slave1/data
max_connections=200
max_allowed_packet = 500M
character-set-server=utf8mb4
default-storage-engine=INNODB
innodb_buffer_pool_size=2G
lower_case_table_names=1
server-id=301
[mysql]
default-character-set=utf8mb4
(注意:mysql用户及用户组在刚才安装master时已经创建过了)
chown mysql:mysql -R /home/mysql-8.3.0-slave1
-进入bin目录
cd /home/mysql-8.3.0-slave1/bin
-初始化MySQL
./mysqld --defaults-file=/home/mysql-8.3.0-slave1/my.cnf --user=mysql --initialize
-启动服务
./mysqld --defaults-file=/home/mysql-8.3.0-slave1/my.cnf --user=mysql &
-停止服务
./mysqladmin -h127.0.0.1 -P3311 -u root -p shutdown
-登录
./mysql -h127.0.0.1 -P3311 -u root -p
-修改密码命令:
alter user 'root'@'localhost' identified by '8888';
use mysql;
update user set host='%' where user='root';
flush privileges;
mkdir /home/mysql-8.3.0-slave2/data /home/mysql-8.3.0-slave2/socket
[mysqld]
skip-name-resolve
port = 3312
mysqlx=0
socket=/home/mysql-8.3.0-slave2/socket/mysql.sock
basedir=/home/mysql-8.3.0-slave2
datadir=/home/mysql-8.3.0-slave2/data
max_connections=200
max_allowed_packet = 500M
character-set-server=utf8mb4
default-storage-engine=INNODB
innodb_buffer_pool_size=2G
lower_case_table_names=1
server-id=302
[mysql]
default-character-set=utf8mb4
(注意:mysql用户及用户组在刚才安装master时已经创建过了)
chown mysql:mysql -R /home/mysql-8.3.0-slave2
-进入bin目录
cd /home/mysql-8.3.0-slave2/bin
-初始化MySQL
./mysqld --defaults-file=/home/mysql-8.3.0-slave2/my.cnf --user=mysql --initialize
-启动服务
./mysqld --defaults-file=/home/mysql-8.3.0-slave2/my.cnf --user=mysql &
-停止服务
./mysqladmin -h127.0.0.1 -P3312 -u root -p shutdown
-登录
./mysql -h127.0.0.1 -P3312 -u root -p
-修改密码命令:
alter user 'root'@'localhost' identified by '8888';
use mysql;
update user set host='%' where user='root';
flush privileges;
InnoDB Cluster 主要由MySQL Shell、MySQL Router和MySQL服务器集群组成,三者协同工作,共同为 MySQL 提供完整的高可用性解决方案。
InnoDB Cluster 以组复制为基础,集群中的每个 MySQL 服务器实例都是组复制的成员,提供了在 InnoDB Cluster 内复制数据的机制,并且具有内置的故障转移功能。
MySQL Group Replication(MGR),全称MySQL Group Replication,是由MySQL官方于2016年12月推出的一项全新的高可用性与高扩展性解决方案。
该解决方案旨在提供高可用、高扩展和高可靠的MySQL集群服务。
在MySQL Group Replication出现之前,用户通常采用Master-Slave架构作为MySQL高可用性的主要方式。然而,随着业务需求的增长和发展,传统的Master-Slave架构可能会面临一些限制,例如单点故障和扩展性瓶颈。
MySQL 5.7版本开始支持无损半同步复制(lossless semi-synchronous replication),这一特性进一步提升了数据复制的强一致性。而MySQL Group Replication则在此基础上进一步发展,为用户提供了一种更为灵活和可靠的数据库复制方案。
通过使用MySQL Group Replication,用户可以构建一个由多个MySQL实例组成的集群,这些实例可以相互协作,提供高可用性和扩展性,并保证数据的一致性和可靠性。
MySQL Group Replication采用基于Paxos协议的一致性算法,确保了集群中的所有节点在任何时候都保持一致的数据状态。同时还提供了自动故障检测和恢复机制,当集群中的某个节点发生故障时,集群可以自动进行故障切换,保证服务的持续可用性。
MySQL Shell 在 InnoDB Cluster 中充当控制台角色,使用它包含的AdminAPI,可以使安装、配置、管理、维护多个MySQL组复制实例的工作更加轻松,通过AdminAPI的几条交互指令就可自动完成组复制配置。
MySQL Router 可以根据集群部署信息自动生成配置,将客户端应用程序透明地连接到 MySQL 服务器实例。
如果服务器实例意外故障,群集将自动重新配置。在默认的单主模式下,InnoDB Cluster 具有单个读写主服务器实例。
多个辅助服务器实例是主服务器实例的副本。如果主服务器出现故障,则辅助服务器将自动升级为主服务器。
MySQL Router 可以检测到这种情况并将客户端应用程序自动转发到新的主服务器。
为了获得最佳性能,MySQL Router通常与使用它的应用程序安装在同一主机上。
1.MySQL Servers
MySQL Group Replication,简称MGR, 是 MySQL 的主从同步高可用方案,包括数据同步及角色选举
里面有三个服务节点 (官网指定服务的节点数最少 3 个最多 9 个),如果过多或造成性能下降
1.1 其中有一个主节点,两个从节点
1.2 主节点可以进行读写操作,从节点只能进行读取操作
1.3 集群设置默认为单主模式,当然还可以设置成多主模式
2.MySQL Router
是业务流量入口,支持对MGR的主从角色判断,可以配置不同的端口分别对外提供读写服务,实现读写分离(重要)
3.MySQL Shell(Cluster Admin)
是 InnoDB Cluster 的管理工具,用于管理和配置集群 (重要)
4.Client App(MYSQL Connector)
这个节点部署的是项目 (非重点,和本章课程无关,可以看成是操作数据库的Java项目)
-master root用户授权:
cd /home/mysql-8.3.0-master/bin
./mysql -u root -p
GRANT CLONE_ADMIN, CONNECTION_ADMIN, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'root'@'%' WITH GRANT OPTION;
-slave1 root用户授权:
cd /home/mysql-8.3.0-slave1/bin
./mysql -h127.0.0.1 -P3311 -u root -p
GRANT CLONE_ADMIN, CONNECTION_ADMIN, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'root'@'%' WITH GRANT OPTION;
-slave2 root用户授权:
cd /home/mysql-8.3.0-slave2/bin
./mysql -h127.0.0.1 -P3312 -u root -p
GRANT CLONE_ADMIN, CONNECTION_ADMIN, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'root'@'%' WITH GRANT OPTION;
-下载地址:
https://dev.mysql.com/downloads/shell/
-文档地址:
https://dev.mysql.com/doc/mysql-shell/8.3/en/
-解压:
tar zxvf mysql-shell-8.3.0-linux-glibc2.17-x86-64bit.tar.gz
-启动:
/home/mysql-shell-8.3.0-linux-glibc2.17-x86-64bit/bin/mysqlsh
-检查:
(检查MySQL实例配置是否符合InnoDB Cluster集群要求)
dba.checkInstanceConfiguration('root@192.168.70.128:3310')
dba.checkInstanceConfiguration('root@192.168.70.128:3311')
dba.checkInstanceConfiguration('root@192.168.70.128:3312')
正常的检测结果示例:
-修正:
(如果检查有问题,则可以用下面的命令自动修正配置)
dba.configureInstance('root@192.168.70.128:3310')
dba.configureInstance('root@192.168.70.128:3311')
dba.configureInstance('root@192.168.70.128:3312')
【注意】:修正后Shell会自动重启该MySQL实例,如果重启失败,则需要手动重启下MySQL服务即可。
-启动MySQL Shell后,首先连接到MySQL主实例,我这里是端口为3310的实例:
\connect root@192.168.70.128:3310
-创建集群:
var cluster = dba.createCluster('clusterTest')
(clusterTest为集群名称)
-查看集群状态:
cluster.status()
-添加集群实例:
var cluster = dba.getCluster()
cluster.addInstance('root@192.168.70.128:3311')
cluster.addInstance('root@192.168.70.128:3312')
正常添加完实例后,查看集群状态如下:
可以看出来,3310为主实例,提供读写;3311和3312为从实例,为只读。
【注意1】:
添加实例命令会提示选择一种恢复策略,用于决定实例如何恢复与集群同步所需的事务。
这里提供了2种恢复策略:
[C]lone:克隆。会完全复制种子实例,并且会删除本实例与种子实例的差异。
[I]ncremental recovery:增量恢复。会将种子实例中存在但本实例中不存在的数据同步到本实例,并且会保留本实例中存在但种子实例中不存在的数据。
[A]bort:取消导入。
这里会提示 (default Clone),即默认为克隆,可根据需求选择。
这里选择第一项克隆,输入C,然后回车即可。
若从实例只参与集群,不做其他用途,则可以选克隆;若从实例除了集群还有其他作用,则需要选择增量。
【注意2】:
实例添加到集群后,Shell会自动重启该MySQL实例,如果重启失败,则需要手动重启下被加入集群的MySQL服务。
【注意3】:
如果重启添加到集群的MySQL实例后,通过Shell连接主实例执行cluster.status()时,有些实例出现以下错误:
...
"instanceErrors": [
"WARNING: Instance is not managed by InnoDB cluster. Use cluster.rescan() to repair.",
"ERROR: Invalid or missing information of Group Replication's network address in metadata. Use Cluster.rescan() to update the metadata."
],
...
则需要在主实例中执行下 cluster.rescan() 重新更新下集群元数据。
【注意4】:
如果通过Shell连接主实例执行var cluster = dba.getCluster()时,出现以下错误:
Dba.getCluster: This function is not available through a session to a standalone instance (metadata exists, instance belongs to that metadata, but GR is not active) (MYSQLSH 51314)
则需要连接主实例后,重启下集群即可:
dba.rebootClusterFromCompleteOutage()
-下载地址:
https://dev.mysql.com/downloads/router/
-文档地址:
https://dev.mysql.com/doc/mysql-router/8.3/en/
-解压:
tar xvf mysql-router-8.3.0-linux-glibc2.17-x86_64.tar.xz
-生成配置文件:
MySQL Router单独配置时,通常是手动在根目录下添加一个mysqlrouter.conf文件。
但结合InnoDB Cluster使用时,则是使用--bootstrap命令来自动生成配置文件。
cd /home/mysql-router-8.3.0-linux-glibc2.17-x86_64/bin
mysqlrouter --user=root --bootstrap root@192.168.70.128:3310
(注意:生成配置文件时,连接的是InnoDB Cluster中的MySQL主实例,我这里是端口为3310的实例)
生成的mysqlrouter.conf配置文件内容如下:
# File automatically generated during MySQL Router bootstrap
[DEFAULT]
name=system
user=root
keyring_path=/home/mysql-router-8.3.0-linux-glibc2.17-x86_64/var/lib/mysqlrouter/keyring
master_key_path=/home/mysql-router-8.3.0-linux-glibc2.17-x86_64/mysqlrouter.key
connect_timeout=5
read_timeout=30
dynamic_state=/home/mysql-router-8.3.0-linux-glibc2.17-x86_64/bin/../var/lib/mysqlrouter/state.json
client_ssl_cert=/home/mysql-router-8.3.0-linux-glibc2.17-x86_64/var/lib/mysqlrouter/router-cert.pem
client_ssl_key=/home/mysql-router-8.3.0-linux-glibc2.17-x86_64/var/lib/mysqlrouter/router-key.pem
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
server_ssl_verify=DISABLED
unknown_config_option=error
max_idle_server_connections=64
router_require_enforce=1
[logger]
level=INFO
[metadata_cache:bootstrap]
cluster_type=gr
router_id=1
user=mysql_router1_9apgv6ehpsnk
metadata_cluster=clusterTest
ttl=0.5
auth_cache_ttl=-1
auth_cache_refresh_interval=2
use_gr_notifications=0
[routing:bootstrap_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://clusterTest/?role=PRIMARY
routing_strategy=first-available
protocol=classic
[routing:bootstrap_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://clusterTest/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=classic
[routing:bootstrap_rw_split]
bind_address=0.0.0.0
bind_port=6450
destinations=metadata-cache://clusterTest/?role=PRIMARY_AND_SECONDARY
routing_strategy=round-robin
protocol=classic
connection_sharing=1
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
access_mode=auto
[routing:bootstrap_x_rw]
bind_address=0.0.0.0
bind_port=6448
destinations=metadata-cache://clusterTest/?role=PRIMARY
routing_strategy=first-available
protocol=x
router_require_enforce=0
client_ssl_ca=
server_ssl_key=
server_ssl_cert=
[routing:bootstrap_x_ro]
bind_address=0.0.0.0
bind_port=6449
destinations=metadata-cache://clusterTest/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=x
router_require_enforce=0
client_ssl_ca=
server_ssl_key=
server_ssl_cert=
[http_server]
port=8443
ssl=1
ssl_cert=/home/mysql-router-8.3.0-linux-glibc2.17-x86_64/var/lib/mysqlrouter/router-cert.pem
ssl_key=/home/mysql-router-8.3.0-linux-glibc2.17-x86_64/var/lib/mysqlrouter/router-key.pem
[http_auth_realm:default_auth_realm]
backend=default_auth_backend
method=basic
name=default_realm
[rest_router]
require_realm=default_auth_realm
[rest_api]
[http_auth_backend:default_auth_backend]
backend=metadata_cache
[rest_routing]
require_realm=default_auth_realm
[rest_metadata_cache]
require_realm=default_auth_realm
根据生成的配置文件可知,MySQL Router的 读写端口:6446、只读端口:6447、读写分离端口:6450。
-启动MySQL Router:
cd /home/mysql-router-8.3.0-linux-glibc2.17-x86_64/bin
mysqlrouter &
如果我现在关闭这台虚拟机,重新启动后,可按照如下步骤恢复集群功能:
1.启动主从的所有MySQL服务:
-启动master
/home/mysql-8.3.0-master/bin/mysqld --defaults-file=/home/mysql-8.3.0-master/my.cnf --user=mysql &
-启动slave1
/home/mysql-8.3.0-slave1/bin/mysqld --defaults-file=/home/mysql-8.3.0-slave1/my.cnf --user=mysql &
-启动slave2
/home/mysql-8.3.0-slave2/bin/mysqld --defaults-file=/home/mysql-8.3.0-slave2/my.cnf --user=mysql &
2.MySQL Shell中重启下集群:
/home/mysql-shell-8.3.0-linux-glibc2.17-x86-64bit/bin/mysqlsh
\connect root@192.168.70.128:3310
dba.rebootClusterFromCompleteOutage()
var cluster = dba.getCluster()
cluster.status()
3.启动MySQL Router
cd /home/mysql-router-8.3.0-linux-glibc2.17-x86_64/bin
mysqlrouter &
之前我们已经搭建好InnoDB Cluster一主两从的集群了,并且启动了MySQL Router,现在我们可以通过程序或Navicat 连接MySQL Router的读写分离端口6450进行测试了。
当我们连接MySQL Router的读写分离端口6450后,对测试库(test)的测试表(xm)进行 insert、update、delete操作时,会发现xm表数据会自动同步到集群中的3个实例中了。
当我们模拟master实例(端口3310)宕机后,再次在Shell中查看集群状态时,会发现主实例自动切换为原先端口为3311的从实例了:
此时我们通过Navicat连接MySQL Router的读写分离端口6450,对测试表xm添加一条记录:
会发现正常运行的两个实例3311、3312仍然能正常同步数据(3310实例此时已经噶了):
然后我们重启启动端口为3310的实例,再次查看集群状态,会发现3310作为从库上线了:
此时查看下3310实例的xm表数据,会发现刚才宕机时插入其他实例的数据也自动同步过来了:
-重新加入集群
cluster.rejoinInstance('root@192.168.1.8:3312')
cluster.rejoinInstance('root@192.168.1.8:3313')
-删除实例
cluster.removeInstance('root@192.168.1.8:3312')
cluster.removeInstance('root@192.168.1.8:3313')
-强制删除实例
cluster.removeInstance('root@192.168.1.8:3312',{force:true})
cluster.removeInstance('root@192.168.1.8:3313',{force:true})
-配置实例
dba.configureLocalInstance('root@localhost:3313');
-解散集群
cluster.dissolve({force:true})
其他集群命令可参考以下文章:
https://www.cnblogs.com/wangjunjiehome/p/16267655.html
参考文章:
https://www.cnblogs.com/kingdevops/articles/17868941.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。