MySQL 8.4 MGR 可以上生产吗?

40 天前
 vczyh

准备做新版本

2978 次点击
所在节点    MySQL
42 条回复
vczyh
38 天前
@hetal 谢谢提供的测试数据
realpg
38 天前
@vczyh #19

router 前面为啥要挂 lb 啊
router 是跟 client 绑定的末端设施 他自身是分配的


@hetal #15
无任何日志 它自己根本不输出任何东西

router 的日志是我二十多年运维生涯见过的最干净的日志 跟没有日志没啥区别

包括但不仅限于 自己就 exit 了 日志里啥也没有
还有它跟 cluster 的通讯一切正常 keepalive 什么都正常发 然后对下面的应用就不提供服务了

还有它提供服务 socket 正常 tcp 就 connection refused 以及反过来

当然我们自己在 router 以外做了一些东西去解决这个事情 暂时影响不大了

----------
router 的版本,我们最开始跑这个集群时候 是 8.3 那时候第一个 lts 还没发布 我们每一个小版本都跟着滚动更新
现在是 8.4 lts 最新 lts 更新我们延迟两周就跟着滚动更新
这些问题在任何版本都是一样的发生
其实看了他们 router 代码 这玩意压根也没怎么更新过多少代码

我们现在从 router 以外的 app 侧做了很多处理
同时对 router 外挂了检测机制 基本 2 秒内解决 router 的故障

目前 router 的抽风频率大概是一个 6 个 backend 6 个 router 的系统 每 55 小时左右 大概就会有一只 router 莫名其妙进入一个随机的故障状态
hetal
38 天前
@vczyh 没有什么限制
hetal
38 天前
@realpg 你可以看看 router configure 的配置,你说的问题我们都没有碰到
hetal
38 天前
我们生产是 8.4.2 ,测试环境是 8.4.3
hetal
38 天前
@realpg router 的配置参数可以发出来看看,有一此参数是不能随便配置的,会影响事务相关的操作等
vczyh
38 天前
@realpg 意思是多个 router 挂个 VIP 吗?所有请求发送到一个 router 这样好吗?还有就是其中一个 router 挂了怎么办
realpg
38 天前
@vczyh #27
额。你看看文档吧,你没理解 innodb cluster 的架构。


@hetal #26
随便找一个
256G 内存 3TB 左右存储空间 每日高峰综合负载 40%左右 日产生新行数约千万 删除也差不多这么多 写占比 78%
90%字段整数类型 索引充分 非 DDL 慢查询阈值 1 秒

[DEFAULT]
name=system
user=mysqlrouter
keyring_path=/var/lib/mysqlrouter/keyring-39-1
master_key_path=/etc/mysqlrouter/mysqlrouter-39-1.key
connect_timeout=3
read_timeout=45
dynamic_state=/var/lib/mysqlrouter/state-39-1.json
client_ssl_cert=/var/lib/mysqlrouter/router-cert-39-1.pem
client_ssl_key=/var/lib/mysqlrouter/router-key-39-1.pem
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
server_ssl_verify=DISABLED
unknown_config_option=error
max_idle_server_connections=240
router_require_enforce=1

[logger]
level=INFO

[metadata_cache:bootstrap]
cluster_type=gr
router_id=44
user=node-router-main-39-1
metadata_cluster=HB2DB39
ttl=0.5
auth_cache_ttl=-1
auth_cache_refresh_interval=2
use_gr_notifications=0

[routing:bootstrap_rw]
bind_address=127.0.0.1
bind_port=6446
socket=/run/mysqlrouter/mysql-39-1-main.sock
destinations=metadata-cache://HB2DB39/?role=PRIMARY
routing_strategy=first-available
protocol=classic

[routing:bootstrap_ro]
bind_address=127.0.0.1
bind_port=6447
socket=/run/mysqlrouter/mysql-39-1-ro.sock
destinations=metadata-cache://HB2DB39/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=classic


[http_server]


[rest_api]
vczyh
38 天前
@realpg

https://imgur.com/a/mc0PmPi
左边的 router 如果挂了,如何保证左边的 application 仍然可用?
realpg
38 天前
@vczyh #29
挂了就不用了啊 你的程序都不是分布式的 就没必要上这个

你没发现他们这个设计图都没给你做交叉吗

或者换句话说 router 是不应该挂的 只有 app 能挂

这也是我遇到的问题 这个 router 高负载下是真的不稳
vczyh
38 天前
@realpg

这个和应用程序是否是分布式没关系,mysql 高可用就是要求每个组件有一定的容错能力,比如 master 挂了,slave 后变成新主,多个 router 只要有一个没挂就能继续为应该程序提供服务。

如果 router 挂了应用程序就不可用的话,为什么要用 MGR ,我用单节点不行吗,不会只是为了多一份数据备份吧。
vczyh
38 天前
@realpg

正如你说的 router 确实不应该挂,部署多个 router 并且配合 keepalived 可以实现高可用。

https://medium.com/@makhshif.tanvir/configuring-mysql-router-and-keepalived-for-high-availability-in-a-mysql-cluster-3589e40d5dd6
hetal
38 天前
@realpg 我没有配置[routing:xx],让其内部操作,可以禁用连接池试式

[DEFAULT]
max_idle_server_connections=0
router_require_enforce=0

[metadata_cache]
use_gr_notifications=1
hetal
38 天前
@vczyh 我们是用的 docker swarm ,启动的多个 mysql router replicas ,只启用了 use-gr-notifications 这个参数,其它都是默认参数,比较稳定
vczyh
38 天前
@hetal 谢谢老哥,我参考一下
hetal
38 天前
目前看官方的 changelog ,连接池和读写分离的 bug 比较多,我们这 2 个都没有使用,应用端根据端口来区分的;
https://dev.mysql.com/doc/relnotes/mysql-router/8.4/en/news-8-4-3.html
realpg
37 天前
@hetal #36
内部操作?
你不指定,默认就所有读写操作都在 PRIMARY 上面 除非你指定 SPLIT 的入口

我们现在不考虑副本 最小的集群上是 1 个 PRIMARY4 个 SENCONARY ,最多的 1 个 PRIMARY 三十多个 SENCODARY 才能扛得住请求数
都扔给 PRIMARY 启动后 100 毫秒整个集群就死了
realpg
37 天前
@vczyh #32
额 别把野鸡攻略当回事吧
你要是认定一种做法 什么地方都找得到跟你想法一样的人



@hetal #36
补充一下 我用的根本不是你给的 changlog 里说的 Read-Write splitting
那玩意指的是

[routing:bootstrap_rw_split]
destinations=metadata-cache://HB2DB161/?role=PRIMARY_AND_SECONDARY

而我用的只是指定连接 PRIMARY 还是 SENCODARY

因为 INNODB CLUSTER 是不保证一致性的,甚至可以说,高负载下他是一定不一致的。
冷数据才可以连 SENCODARY

而且 spilit 这玩意纯属娱乐功能 源代码写的一坨屎

----
从 8.3.0 到 8.4.4 router 基本就没修复过任何正经的 bug

我公司有 oracle 的商业支持(mysql) 不过是比较便宜的 已经不再续了
他们商业支持认为我们反馈的问题是在骗他们 是在 joking 然后就不管了
他们认为 router 能自己 exit 还没有日志是我们在骗他

他们给我们这个问题定的结论是: 我们没管理好服务器 被人登上去手动 service mysqlrouter stop 了
hetal
37 天前
@realpg 多看看文档吧
By default, generated bind_port values are as follows: For the classic protocol, Read-Write uses 6446 and Read-Only uses 6447, and for the X protocol Read-Write uses 6448 and Read-Only uses 6449.

https://dev.mysql.com/doc/mysql-router/8.0/en/mysqlrouter.html
hetal
37 天前
@realpg 默认 mysql router 的 max_connections 为 512 ,如果负载大,连接不释放,不仅仅要调 router 的参数,mysql 的很多参数也要调整;随你吧,你说问题多就多呗,用不用也你们的选择。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1099981

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX