记录:在K8S上创建高可用的MySql集群

更新 2

查看了 kubernetes 的资料和配置
Pod CIDR 10.9.12.0/24
Pod CIDR 10.9.13.0/24
Pod CIDR 10.10.11.0/24

这里不连续的原因是, Mysql-0 和 Mysql-1 使用的两台机器是常年开着的,没有关闭过
而 Mysql-2 使用的机器是刚刚创建的,而我们的集群有个特点,就是频繁的创建和删除节点。 这里猜测 kubernetes 在分配 ip 的时候是顺序分配的,如果分配完了再从头开始分配,把已经释放的重新分配。

由于我们使用的是 Google kubernetes,很多东西是无法更改的。
所以解决方案我认为有:

  1. 重新创建一个 nodepool,把 mysql 部署在这个新创建的 nodepool 上,这样新的机器大概率 IP 连续。
  2. 修改 kubedb 的源码,把白名单的子网掩码修改为/8。其实我觉得这里作者的代码应该优化一下,使用 service 的方式来寻找 pod,而不是通过 Pod IP。
  3. 寻找其他 MySql 高可用部署的解决方案

我准备就创建一个 nodepool,因为从我的个人实际情况出发,这是最简单有效,最快速的解决方案,然后问题也和提了 issue,希望作者会进行优化。

更新 1

问题查了下,看了下作者的更新记录
https://github.com/kubedb/mysql/commit/1db0fa511d31f32bf36b4dcdc07733d3853f3d18
关键的几行

1
2
3
4
myips=$(hostname -I)
first=${myips%% *}
# Now use this IP with CIDR notation
export whitelist="${first}/16"

然后我确认了下我的 IP:
mysql-0:

1
IP:                 10.9.12.246

mysql-2:

1
IP:                 10.10.11.2

这里 kubernetes 内网 IP 的第二个数不一样,作者的掩码是/16,我这里需要/8
我觉得这个问题应该在 kubernetes 这里找解决方案

原文

参考文章:
https://jeremy-xu.oschina.io/2019/08/kubernetes%E4%B8%AD%E9%83%A8%E7%BD%B2mysql%E9%AB%98%E5%8F%AF%E7%94%A8%E9%9B%86%E7%BE%A4/
https://kubedb.com/docs/0.12.0/guides/mysql/clustering/overview/

按照博主的文章,确实搭建成功了。但是在后续改进的时候遇到了问题,目前还没有解决,先记录下来,以后解决了再修改。

我使用的是 google 的 kubernetes,这里使用的是一台四核的机器,三个节点全部部署在同一台机器上,上面还有一些其他的服务,基本上单节点分配不到一个核。
在另一台单核的 VM 上使用 sysbench 进行测试

1
2
3
sysbench /usr/share/sysbench/oltp_read_write.lua --time=180 --mysql-host=mysqlip --mysql-port=3306 --mysql-user=root --mysql-password=mysqlmima --mysql-db=demo --table-size=50000 --tables=8 --threads=8 prepare

sysbench /usr/share/sysbench/oltp_read_write.lua --time=180 --mysql-host=mysqlip --mysql-port=3306 --mysql-user=root --mysql-password=mysqlmima --mysql-db=demo --table-size=50000 --tables=8 --threads=8 run >> k8smysql.log

第一次直接挂了,改小数据量后重新测试得到测试报告

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
sysbench 1.0.19 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 8
Initializing random number generator from current time


Initializing worker threads...

Threads started!

FATAL: mysql_stmt_execute() returned error 2013 (Lost connection to MySQL server during query) for query 'SELECT c FROM sbtest7 WHERE id=?'
FATAL: `thread_run' function failed: /usr/share/sysbench/oltp_common.lua:419: SQL error, errno = 2013, state = 'HY000': Lost connection to MySQL server during query
sysbench 1.0.19 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 8
Initializing random number generator from current time


Initializing worker threads...

Threads started!

SQL statistics:
queries performed:
read: 310646
write: 68981
other: 64143
total: 443770
transactions: 22187 (123.19 per sec.)
queries: 443770 (2463.94 per sec.)
ignored errors: 2 (0.01 per sec.)
reconnects: 0 (0.00 per sec.)

General statistics:
total time: 180.1038s
total number of events: 22187

Latency (ms):
min: 22.81
avg: 64.91
max: 370.94
95th percentile: 139.85
sum: 1440248.80

Threads fairness:
events (avg/stddev): 2773.3750/1495.23
execution time (avg/stddev): 180.0311/0.04

说实话性能一般,所以准备使用更好的机器继续测试性能,让单个节点使用两个核。

这一步的时候出问题了,集群起不来。
查了一下,发现有人也遇到了同样的问题,作者说解决了,但是我今天实测还是出了这个问题。
https://github.com/kubedb/project/issues/529
目前没有找到很好的解决方案,在 github 上提了新的 issue
https://github.com/kubedb/project/issues/702
希望可以得到解决。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!