当前位置:   article > 正文

innodb cluster 安装及性能测试_mysql innodb cluster 安装

mysql innodb cluster 安装

一、实验环境介绍
cpu:16核心
内存:64G
操作系统:centos7.8
mysql版本:mysql8.0
ip地址规划:10.99.19.74; 10.99.19.75; 10.99.19.76
配置主机名及解析在这里插入图片描述

二、安装mysql
https://blog.csdn.net/zyj81092211/article/details/107489793

更改root用户主机名为%

mysql> update mysql.user set host = '%' where user = 'root';

  • 1
  • 2

创建集群管理用户

mysql> CREATE USER 'icadmin'@'%' IDENTIFIED WITH mysql_native_password BY '1qazXSW@';
mysql> GRANT all on *.* to 'icadmin'@'%' with grant option;
mysql> GRANT REPLICATION SLAVE ON *.* to 'icadmin'@'%';
mysql>  FLUSH PRIVILEGES;
  • 1
  • 2
  • 3
  • 4

三、安装mysql-shell(74上进行)

 yum install mysql-shell
  • 1

四、配置集群
1、检查mysql实例 是否符合集群要求

mysqlsh          ##进入mysql-shell
MySQL  JS >  dba.checkInstanceConfiguration('icadmin@ic1:3306')
MySQL  JS >  dba.checkInstanceConfiguration('icadmin@ic2:3306')
MySQL  JS >  dba.checkInstanceConfiguration('icadmin@ic3:3306')
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

2、登录到具体实例修改相应配置(三个实例都要操作)

mysqlsh --uri icadmin@10.99.19.74:3306
  • 1

执行自动修复(MySQL 8.0.11版本之后可以自动持久化)

MySQL  10.99.19.74:3306 ssl  JS > dba.configureLocalInstance()
  • 1

在这里插入图片描述
3、开始创建集群
登录到74的具体实例

mysqlsh --uri icadmin@10.99.19.74:3306
  • 1

创建集群第一个节点

 MySQL  10.99.19.74:3306 ssl  JS > var cluster = dba.createCluster('testCluster')
  • 1

在这里插入图片描述
添加其他实例

从新获取集群

mysql-js> var cluster=dba.getCluster()
  • 1

添加节点

MySQL  ic1:3306 ssl  JS > cluster.addInstance('icadmin@ic2:3306')
MySQL  ic1:3306 ssl  JS > cluster.addInstance('icadmin@ic3:3306')
  • 1
  • 2

在这里插入图片描述
查看集群状态

 MySQL  ic1:3306 ssl  JS > cluster.status()
  • 1

在这里插入图片描述
管理使用

重启集群(注:此重启命令是集群完全关闭,例如三个节点全部关闭,再开启后,集群宕机节点大于最大宕机节点数,集群不能自动重组时,使用下面命令,重启恢复集群;另单独重启某台服务器的mysql服务后,会自动加入集群)

mysqlsh
\connect icadmin@ic1
var cluster = dba.rebootClusterFromCompleteOutage();
  • 1
  • 2
  • 3

查看集群状态

var cluster = dba.getCluster()
cluster.status()
  • 1
  • 2

宕机测试记录
所有节点全部关闭 执行systemctl stop mysqld
开始恢复
a、启动数据库

systemctl start mysqld
  • 1

b、连接至ic1

mysqlsh icadmin@ic1
  • 1

c、尝试恢复集群

var cluster = dba.rebootClusterFromCompleteOutage();
  • 1

无法恢复报错还是
在这里插入图片描述
d、查看集群名称再次尝试恢复

SELECT clusters.cluster_id,clusters.cluster_name from mysql_innodb_cluster_metadata.clusters;
  • 1

在这里插入图片描述
var cluster = dba.rebootClusterFromCompleteOutage(‘testCluster’);
还是这个错误 直接恢复不行
e、产看组复制情况

SELECT * FROM performance_schema.replication_group_members;
  • 1

发现全部节点 都不在线
f、准备找到主节点 先恢复主节点
找到 super_read_only=off 的节点就是最后的主节点

mysql> show global variables like "%read_only%";
  • 1

发现super_read_only都是on
g、选择其中一节点升级为主节点(这里可能丢失数据,暂时无法验证)

mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
  • 1
  • 2
  • 3

h、mysqlsh连接至刚才启动的主节点并查看集群状态

mysqlsh icadmin@ic2
  • 1
 MySQL  ic2:3306 ssl  JS > var cluster=dba.getCluster()
  • 1
 MySQL  ic2:3306 ssl  JS > cluster.status()
  • 1

在这里插入图片描述
其中ci1和ic3显示missing 尝试重新加入节点

MySQL  ic2:3306 ssl  JS >  cluster.rejoinInstance("icadmin@ic1:3306")
  • 1

在这里插入图片描述
重新加入不成功,提示有些事务日志不属于集群,让把节点剔除集群,再从新加入,并选择clone

MySQL  ic2:3306 ssl  JS > cluster.removeInstance("icadmin@ic1:3306")
  • 1
 MySQL  ic2:3306 ssl  JS > cluster.addInstance("icadmin@ic1")
  • 1

ic1和ic3全部重复这个部动作后,集群恢复正常

常用维护命令参考https://www.jianshu.com/p/e947f0969e9f

五、配置使用mysql-router

1、安装mysql-router

yum install mysql-router -y
  • 1

2、初始化mysql-router

mysqlrouter --bootstrap icadmin@ic1:3306 --user=mysqlrouter
  • 1

在这里插入图片描述
3、启动mysql-router

systemctl start mysqlrouter
systemctl enable mysqlrouter
  • 1
  • 2

4、通过mysql-router连接数据库

mysql -h ic1 -uroot -p1qazXSW@ -P 6446
  • 1

六、集群模式切换
更改为单主

SELECT group_replication_switch_to_single_primary_mode();
  • 1

更改为多主

SELECT group_replication_switch_to_multi_primary_mode();
  • 1

查看切换期间任务执行情况

SELECT event_name, work_completed, work_estimated FROM performance_schema.events_stages_current WHERE event_name LIKE "%stage/group_rpl%";
  • 1

七、测试mysql性能
脚本如下

#!/bin/bash

function log_info(){
    local msg=$1
	echo -e "\033[1;32;40m[INFO]\033[0m [`date +'%Y-%m-%d %H:%M:%S'`] $msg "
    return 0
}

function log_warn(){
    local msg=$1
	echo -e "\033[1;31;40m[WARN]\033[0m [`date +'%Y-%m-%d %H:%M:%S'`] $msg " 
    return 1
}

function print_help(){
    cat <<EOF
=========================================================================
		Run SysBench Test 
		         cfl@foxhis.com

OPTS:
  ./sysbench.sh help : show help
  ./sysbench.sh install : install fio sysbench
  ./sysbench.sh fio_4k : Test fio 4k files
  ./sysbench.sh fio_16k : Test fio 16k files
  ./sysbench.sh create_sbtest : Create sbtest 
  ./sysbench.sh sysbench_prepare : Prepare test data
  ./sysbench.sh sysbench_run : Run MySQL Test
  ./sysbench.sh sysbench_cleanup : Cleanup test data
  ./sysbench.sh sysbench_io : Run System files IO R/W Test
  ./sysbench.sh sysbench_locks : Test System locks
  ./sysbench.sh sysbench_thread : Test System threads
Note:
  Please Install MySQL and ./sysbench.sh install
=========================================================================
EOF
}

IP=`ip a | grep -w "inet" | grep eth |sed 's/^.*inet //g'|sed 's/\/[0-9][0-9].*$//g'|awk 'NR==1{print $1}'`
if [ -z "$IP" ];then
IP=`ip a | grep -w "inet" | grep ens |sed 's/^.*inet //g'|sed 's/\/[0-9][0-9].*$//g'|awk 'NR==1{print $1}'`
fi

DIR=`pwd`

function install(){
yum -y install epel-release
yum -y install fio sysbench
}

function fio_4k(){
#fio
fio -filename=/tmp/test_rw -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=4k -size=2G -numjobs=10 -runtime=600 -group_reporting -name=mytest  >> ${DIR}/mysysbench-${IP}.log
rm -rf /tmp/test_rw
if [ $? -eq 127 ];then
log_warn "Please install ./sysbench.sh install"
print_help
fi
}
function fio_16k(){
#fio
fio -filename=/tmp/test_rw -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=600 -group_reporting -name=mytest  >> ${DIR}/mysysbench-${IP}.log
rm -rf /tmp/test_rw
if [ $? -eq 127 ];then
log_warn "Please install ./sysbench.sh install"
print_help
fi
}
function create_sbtest(){
#登录数据库创建账号密码
mysql -uroot -p1qazXSW@ -e"CREATE USER 'sbtest'@'%' IDENTIFIED WITH mysql_native_password BY '1qazXSW@';GRANT all on *.* to 'sbtest'@'%' with grant option;flush privileges;create database sbtest;"
if [ $? -eq 127 ];then
log_warn "Please install MySQL"
print_help
else
log_info "sysbench账号、数据库创建成功"
fi 
}

function sysbench_prepare(){
#数据准备
log_info "正在创建压测数据,数据大小约160G。"
sysbench  --num-threads=32 --max-time=600 --max-requests=999999999 --test= /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp-table-size=10000000 --oltp-tables-count=64 --db-driver=mysql --mysql-table-engine=innodb --mysql-host="127.0.0.1" --mysql-port=6446 --mysql-user="sbtest" --mysql-password="1qazXSW@" prepare 
if [ $? -eq 127 ];then
log_warn "Please install ./sysbench.sh install or ./sysbench.sh create_sbtest"
print_help
fi 
}

function sysbench_run(){
#压测性能
log_info "正在执行测试,结果将保存在${DIR}/mysysbench-${IP}.log"
sysbench --num-threads=32 --max-time=600 --max-requests=999999999 --test= /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp-table-size=10000000 --oltp-tables-count=64 --db-driver=mysql --mysql-table-engine=innodb --mysql-host="127.0.0.1" --mysql-port=6446 --mysql-user="sbtest" --mysql-password="1qazXSW@" run >> ${DIR}/mysysbench-${IP}.log
}
function sysbench_cleanup(){
log_info "正在清理文件"
#清理环境
sysbench --num-threads=32 --max-time=600 --max-requests=999999999 --test= /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp-table-size=10000000 --oltp-tables-count=64 --db-driver=mysql --mysql-table-engine=innodb --mysql-host="127.0.0.1" --mysql-port=6446 --mysql-user="sbtest" --mysql-password="1qazXSW@" cleanup
}
function sysbench_io(){
log_info "正在执行测试,结果将保存在${DIR}/mysysbench-${IP}.log"
#文件io测试
sysbench --threads=12 --events=10000 fileio --file-total-size=2G --file-test-mode=rndrw prepare
if [ $? -eq 127 ];then
log_warn "Please install ./sysbench.sh install"
print_help
exit 0
fi 
sysbench --threads=12 --events=10000 fileio --file-total-size=2G --file-test-mode=rndrw run >> ${DIR}/mysysbench-${IP}.log
sysbench --threads=12 --events=10000 fileio --file-total-size=2G --file-test-mode=rndrw cleanup
}
function sysbench_locks(){
log_info "正在执行测试,结果将保存在${DIR}/mysysbench-${IP}.log"
#锁测试互斥锁测试模拟所有线程在同一时刻并发运行。
sysbench --threads=12 mutex --mutex-num=1024 --mutex-locks=10000 --mutex-loops=10000 run >> ${DIR}/mysysbench-${IP}.log
if [ $? -eq 127 ];then
log_warn "Please install ./sysbench.sh install"
print_help
exit 0
fi 
}
function sysbench_thread(){
log_info "正在执行测试,结果将保存在${DIR}/mysysbench-${IP}.log"
#线程测试
sysbench threads --num-threads=64 --thread-yields=100 --thread-locks=2 run >> ${DIR}/mysysbench-${IP}.log
if [ $? -eq 127 ];then
log_warn "Please install ./sysbench.sh install"
print_help
exit 0
fi 
}
$1

#help support
if [ "$1"x == ""x ]; then
 print_help
fi;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137

测试结果

单主模式
在这里插入图片描述
单主加入下列优化配置至my.cnf

tmp_table_size=256M
max_heap_table_size=256M
innodb_buffer_pool_size=51200M
innodb_log_file_size=12800M

innodb_flush_log_at_trx_commit=2
sync_binlog=1000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
多主模式加入innodb优化参数
在这里插入图片描述
多主加入mgr优化参数
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=16
slave_preserve_commit_order=ON
group_replication_compression_threshold=2000000
binlog_row_image=MINIMAL
group_replication_flow_control_mode=DISABLED

SET GLOBAL group_replication_flow_control_certifier_threshold=250000;
SET GLOBAL group_replication_flow_control_applier_threshold=250000;
  • 1
  • 2

在这里插入图片描述

总结:单机和半同步复制速度相差不多,但是MGR组复制明显变慢,性能相差较大,MGR增加日志同步优化参数后性能提升明显,但是会牺牲掉一部分同步性,生产环境应按需求自行更改参数

另:mysql-router应与上层应用部署在一起,同时程序设计读写分离,能进一步提升读性能
在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号