第7节. 实现galaracluster和性能测试

image-20230919135007319

image-20230919135102822

老版本的安装就是uyum install MariaDB-Galera-server,老版本的方法这里不管了,直接集成到新版里的。

然后就是看配置文件,在/etc/my.cnf里明确说了include

image-20230919135910659

galeracluster的配置就在这里

image-20230919140028596

wsrep_provider=

image-20230919141456692

其中wsrep_provider=要填写一个叫做libgalera_smm.so的库文件,而这个文件是安装mariadb自带安装的,

image-20230919141059885

image-20230919141116807

image-20230919141140225

而且就是mariadb的yum源安装的@mariadb可见。

👇这个源就是按官网的yum源复制过来就行啦,详情将前文mysql安装吧。

image-20230919141214764

好了,基本零件都不缺了。

wsrep_cluster_address=

image-20230919141428096

三个节点的各自地址

binlog_format=row,就是二进制格式,一般默认新版都是MIXED,这里取消注释用ROW吧,忘记了,看前文👇

image-20230919141620982

default_storage_engine=InooDB肯定是InnoDB了,MyISAM都不支持,官方就是说仅仅实验环境吧我看到好像。

innodb_autoinc_lock_mode=2这个不管默认就好

其实就是改wsrep_provider和wsrep_cluster_address以及binlog_format=row。

具体配置选项👇

https://mariadb.com/kb/en/configuring-mariadb-galera-cluster/

image-20230919143040906

实际需要的操作

vim /etc/my.cnf.d/server.cnf
[galera]
wsrep_on=ON  # 10.1.1多了个开关
wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://192.168.126.129,192.168.126.130,192.168.126.131"
binlog_format=row

这个gcomm是协议,就好比ftp://还比https://一样,gcomm是glaeraCluster内部通讯的协议。

image-20230919143202776

👆就改这么多,其他不动

优化设置

wsrep_cluster_name = 'mycluster'  # 默认my_wsrep_cluster
wsrep_node_name = 'node1'  # 本机器的名称,这里暂时不加
wsrep_node_address = '192.168.126.x’  # 当前机器的IP,不用写,这里只是强调写出,实际不写

通过scp复制到其他2个节点

image-20230919143732435

启动注意点

  • 三台不是一样的方法启动;

  • 集群存在/不存在,启动方式也是不同的。

1、原来没有cluster的启动方法和原来有cluster集群的启动方法是不同!

image-20230919145150254

image-20230919145527141

2、首次启动,其他节点,systemctl restart mariadb就行

本实验是初始化集群,开始启动

任意一个节点,来初始化集群
galera_new_cluster

其他节点就
systemctl restart mariadb

image-20230919150244962

这里我就用192.168.126.129,这里的master主机名,不要在意,不用纠结,这是以前实验 主从起的名字,这里多主,每个节点既是master也是slave。

其他节点重启报错

image-20230919150841898

而且初始化集群的node,直接重启也会报错

image-20230919150932693

此时处理方法,在没有头绪的情况下,俺是第一次接触这个集群,所以注释掉/etc/my.cnf.d/server里的galer模块配置,重启mariadb。

然后再重新走一遍就行了。注意重新启动就用galera_recovery来启动集群

image-20230919152257276

image-20230919152357434

然后莫名其妙再敲一遍就OK了?

image-20230919152154647

然后去重启其他节点的服务,看看能不能成功,image-20230919152516094

不行

排错

image-20230919152942842

之前的配置注释掉

没用,重新做吧,把mariadb remove掉重弄?

重新rm -rf /var/lib/mysql/* 反复3次后倒是成功了

image-20230919164358450

mb的怎么弄都OK了现在!!

应该就是/var/lib/mysql/下要干净,

然后有个明确的故障点处理方式就是

image-20230919165029327

👆这个文件要么删掉,要么修改safe_to_bootstra:1就可以启动服务成功。

错误-2

image-20230919165422809

这是cli用错了,重启不能这么干,

image-20230919165938323

好像所有的node 都stop mariadb就起不来了,因为可能没有gcomm的通信方了

image-20230919170223216

我的理解,就是集群里必须有一个活着才能重启成功,测试下

现在3个node都挂了,如何起来了,简单,

image-20230919170253505

这样处理就行了

随便找一台node,一般是最优的吧

image-20230919170359736

果然就好了,所以前面的配置OK就是这里的处理手法要注意,这里你可以理解为是技术细节,也可以理解为产品不傻瓜化。

此时理论上另外2个node直接restart就行了

image-20230919170516424

本来创建集群的那一台tm的竟然起不来

image-20230919170555058

判断失误,没事,老方法,狗屁啊,safe_to_bootstrap=1这个参数是针对the most advanced node最优节点也就是数据最新的节点的操作,就是确定后要敲galera_recovery的,前面已经有一台node初始化了cluster,此时其他只能是加入了,所以操作就是systemctl restart mariadb,通过报错日志可见

image-20230919171357131

说明是SSL证书问题,关掉ssl

image-20230919171423222

重启就好了

image-20230919171445213

总结

1、初始化cluster

2、重启cluster

操作要小心

galera_recover重启cluster,报错没关系,集群不受影响👇

image-20230919171725860

总结2:重启集群

image-20230919172031212

上图👆就告诉你了,如果nodes及群里的节点全部都stop了,此时就需要有一个node去做bootstrapped创建集群,如果只是简单的started normally就是systemctl start mariadb就会找wsrep_cluster_address里的IP地址去做gcomm协议连接,如果没有一个nodes是起来的,那么就会启动服务失败,这很关键。

测试下:

当前集群OK

image-20230919172348760

停掉3台中的2台node,尝试将两台stop的start

image-20230919172438926

没问题,处理方式OK

image-20230919172549768

集群里的所有nodes全部停掉,这里就是3台咯

此时就需要恢复集群,

1、galera_recovery

image-20230919172736925

按上文的说明,就是要修改

image-20230919172843149

还是起不来

image-20230919173002141

image-20230919172952742

再次查看,发现人家让你找最优的node,何为最优,就是seqno

image-20230919173039811

image-20230919173056930

image-20230919173113533

找到了,去84这台敲

galera_recovery

image-20230919173145345

不行啊,操!

不过通过上面的操作已经知道了 不是恢复而是创建,用galera_new_cluster就可以了

image-20230919173306841

而且集群ID也不会变

image-20230919173341787

剩下两台node就简单了,重启服务就行了

image-20230919173420275

到此不为此,基本的处理方法就有了。重点看总结就行,然后之前不行的原因就是①ssl没有弄好,之前实验遗留的,只配置了2个node的ssl,这里涉及3个呢,不过有一次ssl没关也OK,不过通过上文的报错可见确实有问题的;②就是集群的启动和重启有讲究的,重启有问题还是用的初始化创建的命令来解决问题的。

继续看集群的数据读写处理

说明:hostname无所谓master slave,这仅仅是之前实验的遗留,这里是多主,都是master。

导入一个sql脚本,会创建新库和表,这是在第一个节点上做的。

image-20230919174143167

然后其他所有nodes也就自动同步了👇

image-20230919174352331

表同步自然也OK

image-20230919174507277

image-20230919174538275

变量查看

SHOW VARIABLES LIKE 'wsrep_%\G';

有当前自己的IP信息👇

image-20230919174753051

有/etc/my.cnf.d/server.conf里配置的信息👇

image-20230919174917759

SHOW STATUS LIKE 'wsrep_%'; # 状态变量

image-20230919175111726

image-20230919175129421

SHOW STATUS LIKE 'wsrep_cluster_size';

image-20230919175214090

查看集群nodes数👆

image-20230919175319080

添加新成员node

image-20230919180533521

不过人家官方说了,the first node has x.x.x.x,才能加入x.x.x.x,呵呵~。👇

image-20230919180903800

其实就是每台node都补一个IP,然后一个个重启就行了

image-20230919181220875

只要cluster里有一个活着,就能重启服务OK,除非同时down了

image-20230919181251335

人家说的就是这个意思,所有nodes都down了,才需要重新初始化(这个我走成功了),或者没有走成功的galera_recovery;

然后新加入的node,也会很快同步db的

image-20230919181437863

建表也不会冲突,因为有wsrep机制啊

image-20230919181837269

只会有一个成功👇

../_images/certificationbasedreplication.png

然后看看大量数据写入的一个速度,是明显比主从慢很多的,因为👆

下班关机

算了明天继续弄吧,由于机器关机了,之前就是临时做实验,所以mysql服务都停了,这里正好重演一次cluster的启动

image-20230919192042082

可见👆所有服务都没起来

随便选一台初始化集群

查看seqno虚拟号,👇下图注意哦,135的seqno最优秀,所以safe_to_bootstrap:1就是1,其他都是0,这是系统给默认设置好的,然后有个node3的1是我改的!我之前准备用node3初始化新建的,所以看到的是1。

image-20230919192410975

node2最优秀,尝试不初始化,重启的专用cli试试

image-20230919192638961

起不来啊~

直接new吧哈哈

image-20230919192752265

image-20230919192801825

然后其他node 都systemctl start mariadb就行了

image-20230919192911714

同时创建的cli的没问题👇

image-20230919193127367

测试开始

image-20230919193544970

image-20230919193647977

然后就看看数据的增长

image-20230919194040967

发现这个速度比简单的主从还要慢很多,然后其实可以做成事务,事务就是一起提交,会快一点。

像这种就好比大量用户的写咯,所以具体用的时候还存在问题,需要优化吧应该!好像他们业务实际也不这么玩。

还发现一个现象👇

就是galera cluster默认就给你做了table的插入的自动间隔,以前是image-20230919195153835这么配置的。

image-20230919195117332

👇12分钟终于结束了:

image-20230919195714518

试试 事务的方式,理论上会快一些

image-20230919195955669

这TM也太夸张了,不对吧

第二十运行事务,一样是6秒种,一共插入了3次,每次99999行,300000-3=299997行,对的👇

image-20230919200224539

再次不跑事务看看

结论,galeraCluster集群,大数据并发写入,使用事务就很快!不使用事务就灰常慢!

复制的问题和解决方案

其实以下这段文字算不得什么问题和方案,聊胜于无,看看吧👇

(1)数据损坏或丢失

Master: MHA + semi repl

Slave:重新复制

(2)混合使用存储引擎

MyISAM:不支持事务

InnoDB: 支持事务

(3)不惟一的server id

重新复制

(2)复制延迟:

需要额外的监控工具的辅助

一从多主:mariadb10版后支持

多线程复制:对多个数据库复制,好像是高版本的特性。

TiDb概述

主从、多主,对于写操作,本质上都是在一台上操作的,所以mysql这种HA,本质上就是有瓶颈的。这话欠妥,没有讲到点子上,我们将LB的行为,在很多地方体现:①portchannel②f5这些其实都是针对多个session多个会话或多个用户去负载分担的,mysql的瓶颈本质的一个点就是如果是一个session里的一个事务,而这个事务里面有大量的操作,那么这个事务肯定是往一台机器持续读写的,而针对这个单个事务的负载分担解决方案就是TiDB它可以做到分布式事务。

image-20230920105615701

牛逼👆

而更优的解决方案就是TiDb分布式数据库

image-20230919200851709

RDBMS关系型数据的 数据一致性ACID特性;NoSQL性能好但是没有保证数据的一致性;TiDb结合了两者的优点,又叫做NewSQL

所以DB分为了:RDBMS、NoSQL、NewSQL

image-20230919201306845

据说:mysql的业务迁到TiDb,基本上不用改动,直接搬过去就能用,不用改代码。

TiDB的核心特点

1 高度兼容 MySQL 大多数情况下,无需修改代码即可从 MySQL 轻松迁移至 TiDB,分库分 表后的 MySQL 集群亦可通过 TiDB 工具进行实时迁移 2 水平弹性扩展 通过简单地增加新节点即可实现 TiDB 的水平扩展,按需扩展吞吐或存储,轻 松应对高并发、海量数据场景。 3 分布式事务 TiDB 100% 支持标准的 ACID 事务 4 真正金融级高可用 相比于传统主从 (M-S) 复制方案,基于 Raft 的多数派选举协议可以提 供金融级的 100% 数据强一致性保证,且在不丢失大多数副本的前提下,可以实现故障的自动 恢复 (auto-failover),无需人工介入。 5 一站式 HTAP 解决方案 TiDB 作为典型的 OLTP 行存数据库,同时兼具强大的 OLAP 性能, 配合 TiSpark,可提供一站式 HTAP解决方案,一份存储同时处理OLTP & OLAP(OLAP、OLTP 的介绍和比较 )无需传统繁琐的 ETL 过程。 6 云原生 SQL 数据库 TiDB 是为云而设计的数据库,同 Kubernetes (十分钟带你理解 Kubernetes核心概念 )深度耦合,支持公有云、私有云和混合云,使部署、配置和维护变得十 分简单。 TiDB 的设计目标是 100% 的 OLTP 场景和 80% 的 OLAP 场景,更复杂的 OLAP 分析可以通过 TiSpark 项目来完成。 TiDB 对业务没有任何侵入性,能优雅的替换传统的数据 库中间件、数据库分库分表等 Sharding 方案。同时它也让开发运维人员不用关注数据库 Scale 的细节问题,专注于业务开发,极大的提升研发的生产力.

数据库的整理差不多了就 下面介绍以下压力测试

性能衡量指标

数据库服务衡量指标

QPS: query per second # 查询性能: 每秒处理的查询次数,简单的单表select和多表join对系统资源的消耗是截然不同!所以压力测试的时候是要事先定义select查询规则--涉及哪些查询方法。

TPS: transaction per second # 事务的处理,主要指的就是数据的修改性能了,涉及增删改。

压力测试工具 mysqlslap # 系统自带,无需安装 Sysbench:功能强大 https://github.com/akopytov/sysbench tpcc-mysql MySQL Benchmark Suite MySQL super-smack MyBench

mysqlslap使用

该工具来源于MariaDB-client软件👇

image-20230919202805799

image-20230919202945144

image-20230919204046401

image-20230919204208689

注意:虽然这个工具测试完成后不会在DB中留痕,但是binlog肯定会大量被它修改的,所以测试的时候binlog要么关闭,要么单独存放。

binlog除了在/etc/my.cnd里定义,也可以放到/etc/my.cnf.d/server.conf里一样的,👇涉及集群galera里定义了binglog的格式row,所以也可以log-bin开启也放在这个配置文件里。

image-20230919203412460

binlog是否启用,最好还是看变量,而不是ll /var/lib/mysql/去看相关文件有没有对吧,你这样还得去先看看cnf人家配置在哪里了。

image-20230919204001405

image-20230919204226654

image-20230919204240003

image-20230919204606178

生产了大量的binlog

image-20230919204636782

如果要停binlog,set 变量这种挺不掉,因为是基于你当前cli交互进去的session的,而压力测试是多session并发的,完全没有一点效果,因为session完全撞不到一起去,哈哈。而且sql_log_bin是session级别的变量,没有全局的。真的是session的,看看官方

image-20230919205427595

image-20230919205437537

再试试

image-20230919205545717

果然👆,无法实现:关闭全局binlog的效果,只能去cnf文件了。

等等👇这TM什么回事:

image-20230919205645119

问👆binlog基于本会话到底是关了还是没关?

image-20230919205820257

image-20230919210011549

确实关了

测试引擎之间的差异👇

[root@node1 ~]# mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -pmagedu

image-20230920120555772

--concurrency=50,100 # 50到100个并发数,是个范围区间。

案例

也不是绝对的👇,网速随便搜搜都有推荐配置优化方案,也可以参考他们的。

image-20230920132718656

image-20230920162626532

image-20230920162715895

image-20230920162732838

max_connections的默认值看看

image-20230920132822266

因为这个默认限制,所以并发测试看下效果👇,并发就是多个sessions同时测试的。

image-20230920133044358

修改并发数👇

image-20230920133157593

重启服务后

image-20230920133337868

那个遇到低版本的并发改不上去(mariadb5.5.60就是上不去151只能通过my.cnf改成214的上限)的处理方法,这里也做一下记录,因为涉及底层逻辑:151的默认,明明mysql的配置文件里改的是2000,但是实际只能到214,是因为并发底层走的是文件socket,这个socket要调上去的,是系统层面的东西,底层的东西。打开一个socket就会开启一个文件描述符fd。

1、mysql的配置文件里

/etc/my.cnf里或者/etc/my.cnf.d/server.cnf的max-connectsions=2000

2、系统级别的socket,文件socket的限制扩容

ulimit -n 66666 # 设置

ulimit -a # 查看 就可以看到open files这项改了,不过这个命令是基于session修改的,也就是当前shell窗口有效。

image-20230920150215742

3、LimitNOFILE

image-20230920150501644

高版本就是改了的,至于第二点ulimit应该不用改!确保下面👇的数据足够以及mysql配置文件里max_connections改了就行了。

image-20230920155617161

一般数据库1000-2000并发就差不多了,不想apache或nginx上万都行。

所数据库的并发数,不是越大越好,设置一个你的服务器资源能够承受的值就好,如果设置过大比如8000,结果真的来了这么多并发,就会导致db处理不过来,结果就是一个用户都访问不了了。

back_log

并发加入是2000,那么如果超出2000,又来了10个人,那么10个就是进入backlog进行排队。这个排队好像和QoS里的队列不是一回事,是保持的tcp连接数,本来2000个tcp连接上线,超出了也不是说就拒绝掉,而是用back_log机制暂存以下这些tcp连接。

max_connect_errors

针对单个用户,如果连接报错的次数达到一定的值,就会禁止该client连接过来。直到mysql服务重启,或者flush hosts命令清空此client主机的相关信息。所以这个参数的计数周期也就是两次服务重启或者flush hosts之间的时间。

比如黑客不断尝试连接,密码出错了10次,此时应该就可以触发此机制。

open_files_limit

这个其实就是 /usr/lib/systemd/system/mariadb.service 文件里的LimitNOFILE参数

两个都是干一件事的,不过使用场景不同

open_files_limit是适用于二进制安装或者编译安装的,这两类的服务启动都是二进制文件启动的,此时调整socket文件的打开数就这么调,这就是一个配置选项直接配置在my.cnf配置文件里。

LimitNOFILEs是用于 systemctl 启动的服务

本身就是一个配置选项,也是变量,所以直接配置到/etc/my.cnf里就行啦,他👇这里的三个配置方式,最后一个是/etc/security/limits.onf估计也是一个意思。

image-20230920162100869

image-20230920163340705

就是知道有这么个东西,具体最合适的还需要自己修订,和找最新的实践分享。

Copyright 🌹 © oneyearice@126.com 2022 all right reserved,powered by Gitbook文档更新时间: 2024-07-28 14:47:51

results matching ""

    No results matching ""