ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQL8.3.0安装及InnoDB Cluster集群搭建 [打印本页]

作者: 北冰洋以北    时间: 2024-9-1 23:37
标题: MySQL8.3.0安装及InnoDB Cluster集群搭建
        本文告急记载了最新版本的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(供应用程序毗连)   

MySQL 8.3.0安装步骤:

1.安装MySQL(master):


a.下载安装包:


下载地址: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版本是非常告急的,否则可能会导致不稳定或不可猜测的举动。
b.解压:

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

c.在MySQL根目次创建data目次:


mkdir /home/mysql-8.3.0-master/data

d.创建mysql.cnf文件:


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初始化前设置好,因为一旦初始化了,就不允许再修改该设置了!

e.创建mysql用户组、用户及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

f.mysql初始化:


【留意:虽然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

g.启动与停止MySQL服务:


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

h.登录后修改root用户密码:


(留意:MySQL8.3登录后欺压要求先修改密码,否则不让做其他操作的)
-登录:
./mysql -u root -p
(用初始化时的临时密码登录,比如:gLfOAkhG=7fT)
-修改密码下令:
alter user 'root'@'localhost' identified by '8888';

i.登录后修改允许远程访问:


use mysql;
update user set host='%' where user='root';
flush privileges;

2.安装MySQL(slave1):


a.创建data和socket目次:



mkdir /home/mysql-8.3.0-slave1/data /home/mysql-8.3.0-slave1/socket
b.创建mysql.cnf文件:

[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
c.给系统mysql用户进行MySQL目次授权

(留意:mysql用户及用户组在刚才安装master时已经创建过了)
chown mysql:mysql -R /home/mysql-8.3.0-slave1

d.mysql初始化:

-进入bin目次
cd /home/mysql-8.3.0-slave1/bin
-初始化MySQL
./mysqld --defaults-file=/home/mysql-8.3.0-slave1/my.cnf --user=mysql --initialize
e.启动与停止MySQL服务:

-启动服务
./mysqld  --defaults-file=/home/mysql-8.3.0-slave1/my.cnf --user=mysql  &
-停止服务
./mysqladmin -h127.0.0.1 -P3311 -u root -p shutdown

f.登录后修改root用户密码:

-登录
./mysql -h127.0.0.1 -P3311 -u root -p
-修改密码下令:
alter user 'root'@'localhost' identified by '8888';
g.登录后修改允许远程访问:

use mysql;
update user set host='%' where user='root';
flush privileges;

3.安装MySQL(slave2):


a.创建data和socket目次:



mkdir /home/mysql-8.3.0-slave2/data /home/mysql-8.3.0-slave2/socket
b.创建mysql.cnf文件:

[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
c.给系统mysql用户进行MySQL目次授权

(留意:mysql用户及用户组在刚才安装master时已经创建过了)
chown mysql:mysql -R /home/mysql-8.3.0-slave2

d.mysql初始化:

-进入bin目次
cd /home/mysql-8.3.0-slave2/bin
-初始化MySQL
./mysqld --defaults-file=/home/mysql-8.3.0-slave2/my.cnf --user=mysql --initialize
e.启动与停止MySQL服务:

-启动服务
./mysqld  --defaults-file=/home/mysql-8.3.0-slave2/my.cnf --user=mysql  &
-停止服务
./mysqladmin -h127.0.0.1 -P3312 -u root -p shutdown

f.登录后修改root用户密码:

-登录
./mysql -h127.0.0.1 -P3312 -u root -p
-修改密码下令:
alter user 'root'@'localhost' identified by '8888';
g.登录后修改允许远程访问:

use mysql;
update user set host='%' where user='root';
flush privileges;

MySQL InnoDB Cluster 安装与设置:


简介:



        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项目)

InnoDB Cluster安装与设置

a.给MySQL的root用户授权

-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;
b.MySQL Shell安装与启动

-下载地址:
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

c.查抄实例并修正设置(MySQL Shell)

-查抄:
(查抄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服务即可。
 
d.创建集群并添加实例(MySQL Shell)

-启动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()

e.MySQL Router安装与启动


-下载地址:
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 &

毗连MySQL Router进行测试

        之前我们已经搭建好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



 




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4