文章

MySQL8 搭建 innodb cluster 实验

innodb cluster 搭建

mysqlshell、mysqlrouter 和实例装在一台机器上,如果是三台服务器建集群需要配置每台服务器的 hosts。

环境

一台 CentOS7 使用 mysql_multi 启动3个 mysql 实例

下载安装 mysql shell 和 mysql router

MySQL Router MySQL Shell MySQL 二进制包,现在最新二进制包是 8.0.33。 我的解压文件夹是 /opt/mysql8

配置 mysql_multi

#创建 mysql 用户
groupadd -g 30 mysql
useradd -u 30 -g mysql mysql
#创建相关目录
mkdir -p /data/mysql/{mysql_3306,mysql_3307,mysql_3308}
mkdir /data/mysql/mysql_3306/{data,log,tmp}
mkdir /data/mysql/mysql_3307/{data,log,tmp}
mkdir /data/mysql/mysql_3308/{data,log,tmp}
#修改权限
chown -R mysql:mysql /data/mysql/
chown -R mysql:mysql /opt/mysql8/
#将 mysql 下 bin 加入环境变量
echo 'export PATH=$PATH:/opt/mysql8/bin' >>  /etc/profile
source /etc/profile
#复制my.cnf文件到etc目录,配置参考下方

#逐一启动3个实例,每次启动修改 root 密码,首次启动生成的密码可在 error log 中查看
mysqld_multi start ...

#配置mysql_config_edit
mysql_config_editor set --user=root --password
#mysqld_multi 命令
#启动所有/单个实例
mysqld_multi start
mysqld_multi start 3306
#关闭实例
mysqld_multi stop
mysqld_multi stop 3306
#查看实例状态
mysqld_multi report
mysqld_multi report 3306

my.cnf配置参考

[client]
port=3306
socket=/tmp/mysql_3306.sock
[mysqld_multi]
mysqld = /opt/mysql8/bin/mysqld_safe
mysqladmin = /opt/mysql8/bin/mysqladmin
log = /data/mysql/mysqld_multi.log
[mysqld]
user=mysql
basedir = /opt/mysql8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld3306]
mysqld=mysqld
mysqladmin=mysqladmin
datadir=/data/mysql/mysql_3306/data
port=3306
server_id=3306
socket=/tmp/mysql_3306.sock
log-output=file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql_3306/log/slow.log
log-error = /data/mysql/mysql_3306/log/error.log
log-bin = /data/mysql/mysql_3306/log/mysql3306_bin
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
#组复制设置
#server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction=XXHASH64
binlog_transaction_dependency_tracking=WRITESET
slave_preserve_commit_order=ON
slave_parallel_type=LOGICAL_CLOCK
#告知插件加入或创建组命名,UUID
loose-group_replication_group_name="d7fb5035-5912-4b8d-9160-a49b5bbcbba6"
#server启动时不自启组复制,为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_start_on_boot=off
#告诉插件使用IP地址,端口24901用于接收组中其他成员转入连接
loose-group_replication_local_address="172.16.22.163:24901"
#启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
loose-group_replication_group_seeds="172.16.22.163:24901"
loose-group_replication_bootstrap_group=off
# 使用MGR的单主模式
loose-group_replication_single_primary_mode = on
disabled_storage_engines = MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE
report_port=3306

[mysqld3307]
mysqld=mysqld
mysqladmin=mysqladmin
datadir=/data/mysql/mysql_3307/data
port=3307
server_id=3307
socket=/tmp/mysql_3307.sock
log-output=file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql_3307/log/slow.log
log-error = /data/mysql/mysql_3307/log/error.log
log-bin = /data/mysql/mysql_3307/log/mysql3307_bin
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
#组复制设置
#server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction=XXHASH64
binlog_transaction_dependency_tracking=WRITESET
slave_preserve_commit_order=ON
slave_parallel_type=LOGICAL_CLOCK
#告知插件加入或创建组命名,UUID
loose-group_replication_group_name="d71acb2a-06d8-4edf-a08a-f37c262d616f"
#server启动时不自启组复制,为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_start_on_boot=off
#告诉插件使用IP地址,端口24901用于接收组中其他成员转入连接
loose-group_replication_local_address="172.16.22.163:24901"
#启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
loose-group_replication_group_seeds="172.16.22.163:24901"
loose-group_replication_bootstrap_group=off
# 使用MGR的单主模式
loose-group_replication_single_primary_mode = on
disabled_storage_engines = MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE
report_port=3307
[mysqld3308]
mysqld=mysqld
mysqladmin=mysqladmin
datadir=/data/mysql/mysql_3308/data
port=3308
server_id=3308
socket=/tmp/mysql_3308.sock
log-output=file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/mysql/mysql_3308/log/slow.log
log-error = /data/mysql/mysql_3308/log/error.log
log-bin = /data/mysql/mysql_3308/log/mysql3308_bin
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
#组复制设置
#server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction=XXHASH64
binlog_transaction_dependency_tracking=WRITESET
slave_preserve_commit_order=ON
slave_parallel_type=LOGICAL_CLOCK
#告知插件加入或创建组命名,UUID
loose-group_replication_group_name="93755aff-b5e2-4d81-b9ac-aebde0503632"
#server启动时不自启组复制,为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_start_on_boot=off
#告诉插件使用IP地址,端口24901用于接收组中其他成员转入连接
loose-group_replication_local_address="172.16.22.163:24901"
#启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
loose-group_replication_group_seeds="172.16.22.163:24901"
loose-group_replication_bootstrap_group=off
# 使用MGR的单主模式
loose-group_replication_single_primary_mode = on
disabled_storage_engines = MyISAM,BLACKHOLE,FEDERATED,CSV,ARCHIVE
report_port=3308

节点配置检查

#进入 mysqlshell 连接到3306
\connect mysqlx:[email protected]:33060
#检查配置
dba.checkInstanceConfiguration('[email protected]:3306')
#如果提示权限不够则根据提示添加权限
#有 error 就运行下面的命令修改配置
dba.configureInstance('[email protected]:3306')
#重启实例

初始化

#连接到 3306实例
\connect mysqlx://[email protected]:33060
#创建集群
var cluster = dba.createCluster('mycluster')
#添加副本实例到创建好的集群
var mycluster = dba.getCluster()
#添加节点,提示 group_name 不在组内,按提示选择 clone 即可
mycluster.addInstance('[email protected]:3307')
#添加后会重启 mysql 实例,如果实例没启动,手动启动然后执行
mycluster.rescan()
#查看集群状态
mycluster.status()

创建用户

#集群管理员用户
mycluster.setupAdminAccount('icadmin')
#router 用户
mycluster.setupRouterAccount('icrouter')

启动 mysqlrouter

MySQL Classic protocol:

  • Read/Write Connections: localhost:6446, /opt/myrouter/mysql.sock
  • Read/Only Connections: localhost:6447, /opt/myrouter/mysqlro.sock MySQL X protocol
  • Read/Write Connections: localhost:6448, /opt/myrouter/mysqlx.sock
  • Read/Only Connections: localhost:6449, /opt/myrouter/mysqlxro.sock
#配置
mysqlrouter --bootstrap root@localhost:3306 --directory=/opt/myrouter --conf-use-sockets --account icrouter --user=mysql --force
#启动
sh myrouter/start.sh
#停止
sh myrouter/stop.sh

维护命令

#获取帮助
dba.help()
#获取 cluster
var cluster=dba.getCluster()
#集群状态
cluster.status()
#查看集群结构(静态信息)
cluster.describe()
#更新集群元数据(重新扫描)
cluster.rescan()
#删除实例
cluster.removeInstance(instance)
#实例重新加入集群
cluster.rejoinInstance(instance)
#重启 
dba.rebootClusterFromCompleteOutage('myCluster')
#删除源数据 schema
dba.dropMetadataSchema()
#检查 cluster 里实例状态
cluster.checkInstanceState("root@localhost:3306")
#解散集群
cluster.dissolve({force:true})
#强制删除实例
cluster.removeInstance("root@localhost:3306",{force:true})
#停止集群,进入 sql 模式停止组复制
stop group_replication;
License:  CC BY 4.0