PhxSQL FAQ

本文主要用来记录自己对 PhxSQL 关注的一些问题。其中,一部分问题来自 Github issues ,并从众多回答中整理出自认为满意的答案,方便以后查阅。

FAQ

  1. master 切换时,需要多久能完成?
    master 完成切换需要的最长时间是租约时间 + 选举新 master 耗费的时间。
    10 次测试结果平均值为:
    (34 + 27 + 26 + 27 + 25 + 26 + 26 + 38 + 28 + 38)/ 10 = 29.5 s

  2. PhxSQL 集群是否支持指定主机作为集群的 master?
    由于master的选举流程稍微复杂,因此外部指定 master 的功能暂时不支持。 link

  3. 选举 master 流程

    • slaves 检查租约是否到期;
    • slaves 检查 binlog 是否同步完成;
    • slaves 发起成为 master 申请;
    • 切换 master。
  4. 集群中仅剩余一台机器时,能否进行读写操作?
    可以。

  5. PhxSQL 中的 phxsync 插件被移除后,PhxSQL 是否工作?
    启动时,去掉 phxsync 插件后,集群是不能正常工作的。

  6. phxbinlogsvr 和 phxsqlproxy 日志的级别该如何调整?
    可以通过配置 etc/phxbinlogsvr.conf 中的 loglevel 选项。级别1 < 2 < 3。目前的级别为 3,可以通过降低级别来减少日志。

  7. 扩容问题
    目前 PhxSQL 致力于一致性和高可用上,对于横向扩展行没有增强,横向扩展还是要由业务自行解决。或者考虑自行组合一些已有的横向扩展的方案。

  8. PhxSQL 是否能够避免 MySQL 的分库分表工作?
    PhxSQL 目前专注于 MySQL 数据从单机扩展到多机并保持一致性上,分库分表暂时并没有在这里实现。但你仍然可以挂载其他分库分表的组件以达到期望的效果。

  9. 增加节点是否意味着增加集群处理性能
    增加节点会降低集群的写性能,因为每个写请求需要同步到集群中的多数派机器。所以一般建议使用3-5个节点的集群。
    而对于读多写少的场景,如果允许读备机数据,增加节点可以提高集群的读性能。

  10. 初始化失败
    安装成功后,请确保 phxsqlproxy, mysql, phxbinlogsvr 都已运行,可执行 ps -ef 查看二进制。
    机器都安装完成并确保二进制运行正常后,在其中一台机器,进入 phxsql/sbin 目录,并执行下面命令来进行集群初始化:

    1
    ./phxbinlogsvr_tools_phxrpc -f InitBinlogSvrMaster -h"ip1,ip2,ip3" -p 17000

    该初始化会对集群进行两个步骤:

    1. 对集群进行初始化,并设置 master
    2. 添加除 master 的机器到集群中

    在执行期间,如果出现:

    1. “connect machine xxx.xxx.xxx.xx fail”,则请检查改ip的机器上的 PhxSQL 是否正常运行
    2. “init master 10.27.171.13 done, start to add member” 或者 “init svr fail, ret 912” 则集群已经完成第 1 步。
    3. “add ip xxx to master done”,则第 2 步已完成。

    如果,第 2 步没有正常完成而异常退出,可以通过执行 phxbinlogsvr_tools_phxrpc -f getmemberlist -hIP -p17000 来查看当前集群中的成员。
    如果某些机器没有在机器中,可通过 phxbinlogsvr_tools_phxrpc -f addmember -h ip -p 17000 -m机器ip 来添加。

测试数据

简单地测试了 master 切换时间。

测试原理:一直对集群写数据(当前系统时间),切换 master 时数据会写入失败,等新的 master 确定后会再次写入成功。因此,数据库记录时间差最大的就是切换 master 的时间。

1
2
3
4
5
6
7
8
9
10
| 985 | Mon Oct 10 10:46:13 2016 |
| 986 | Mon Oct 10 10:46:13 2016 |
| 987 | Mon Oct 10 10:46:13 2016 |
| 988 | Mon Oct 10 10:46:13 2016 |
| 989 | Mon Oct 10 10:46:14 2016 |
| 990 | Mon Oct 10 10:46:14 2016 |
| 991 | Mon Oct 10 10:46:48 2016 |
| 992 | Mon Oct 10 10:46:48 2016 |
| 993 | Mon Oct 10 10:46:49 2016 |
| 994 | Mon Oct 10 10:46:49 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 48 - 14 = 34 s。

1
2
3
4
5
6
7
8
9
10
| 1493 | Mon Oct 10 11:08:22 2016 |
| 1494 | Mon Oct 10 11:08:22 2016 |
| 1495 | Mon Oct 10 11:08:22 2016 |
| 1496 | Mon Oct 10 11:08:22 2016 |
| 1497 | Mon Oct 10 11:08:49 2016 |
| 1498 | Mon Oct 10 11:08:49 2016 |
| 1499 | Mon Oct 10 11:08:50 2016 |
| 1500 | Mon Oct 10 11:08:51 2016 |
| 1501 | Mon Oct 10 11:08:51 2016 |
| 1502 | Mon Oct 10 11:08:52 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 49 - 22 = 27 s。

1
2
3
4
5
6
7
8
9
| 2068 | Mon Oct 10 13:43:32 2016 |
| 2069 | Mon Oct 10 13:43:32 2016 |
| 2070 | Mon Oct 10 13:43:33 2016 |
| 2071 | Mon Oct 10 13:43:33 2016 |
| 2072 | Mon Oct 10 13:43:33 2016 |
| 2073 | Mon Oct 10 13:43:59 2016 |
| 2074 | Mon Oct 10 13:44:00 2016 |
| 2075 | Mon Oct 10 13:44:00 2016 |
| 2076 | Mon Oct 10 13:44:00 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 59 - 33 = 26 s。

1
2
3
4
5
6
7
8
9
| 2339 | Mon Oct 10 14:13:59 2016 |
| 2340 | Mon Oct 10 14:14:00 2016 |
| 2341 | Mon Oct 10 14:14:00 2016 |
| 2342 | Mon Oct 10 14:14:00 2016 |
| 2343 | Mon Oct 10 14:14:01 2016 |
| 2344 | Mon Oct 10 14:14:28 2016 |
| 2345 | Mon Oct 10 14:14:30 2016 |
| 2346 | Mon Oct 10 14:14:30 2016 |
| 2347 | Mon Oct 10 14:14:31 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 28 - 01 = 27 s。

1
2
3
4
5
6
7
8
9
10
| 2596 | Mon Oct 10 14:21:23 2016 |
| 2597 | Mon Oct 10 14:21:23 2016 |
| 2598 | Mon Oct 10 14:21:24 2016 |
| 2599 | Mon Oct 10 14:21:24 2016 |
| 2600 | Mon Oct 10 14:21:24 2016 |
| 2601 | Mon Oct 10 14:21:49 2016 |
| 2602 | Mon Oct 10 14:21:50 2016 |
| 2603 | Mon Oct 10 14:21:50 2016 |
| 2604 | Mon Oct 10 14:21:51 2016 |
| 2605 | Mon Oct 10 14:21:52 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 49 - 24 = 25 s。

1
2
3
4
5
6
7
8
9
10
11
| 37 | Tue Oct 11 11:35:12 2016 |
| 38 | Tue Oct 11 11:35:12 2016 |
| 39 | Tue Oct 11 11:35:12 2016 |
| 40 | Tue Oct 11 11:35:12 2016 |
| 41 | Tue Oct 11 11:35:13 2016 |
| 42 | Tue Oct 11 11:35:39 2016 |
| 43 | Tue Oct 11 11:35:40 2016 |
| 44 | Tue Oct 11 11:35:40 2016 |
| 45 | Tue Oct 11 11:35:40 2016 |
| 46 | Tue Oct 11 11:35:41 2016 |
| 47 | Tue Oct 11 11:35:41 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 39 - 13 = 26 s。

1
2
3
4
5
6
7
8
9
10
11
| 270 | Tue Oct 11 11:40:10 2016 |
| 271 | Tue Oct 11 11:40:10 2016 |
| 272 | Tue Oct 11 11:40:11 2016 |
| 273 | Tue Oct 11 11:40:11 2016 |
| 274 | Tue Oct 11 11:40:11 2016 |
| 275 | Tue Oct 11 11:40:37 2016 |
| 276 | Tue Oct 11 11:40:37 2016 |
| 277 | Tue Oct 11 11:40:37 2016 |
| 278 | Tue Oct 11 11:40:38 2016 |
| 279 | Tue Oct 11 11:40:38 2016 |
| 280 | Tue Oct 11 11:40:39 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 37 - 11 = 26 s。

1
2
3
4
5
6
7
8
9
10
| 523 | Tue Oct 11 11:46:42 2016 |
| 524 | Tue Oct 11 11:46:42 2016 |
| 525 | Tue Oct 11 11:46:43 2016 |
| 526 | Tue Oct 11 11:46:43 2016 |
| 527 | Tue Oct 11 11:47:21 2016 |
| 528 | Tue Oct 11 11:47:21 2016 |
| 529 | Tue Oct 11 11:47:22 2016 |
| 530 | Tue Oct 11 11:47:22 2016 |
| 531 | Tue Oct 11 11:47:22 2016 |
| 532 | Tue Oct 11 11:47:23 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 21 - 43 = 38 s。

1
2
3
4
5
6
7
8
9
10
| 715 | Tue Oct 11 11:50:55 2016 |
| 716 | Tue Oct 11 11:50:55 2016 |
| 717 | Tue Oct 11 11:50:56 2016 |
| 718 | Tue Oct 11 11:51:29 2016 |
| 719 | Tue Oct 11 11:51:30 2016 |
| 720 | Tue Oct 11 11:51:30 2016 |
| 721 | Tue Oct 11 11:51:30 2016 |
| 722 | Tue Oct 11 11:51:31 2016 |
| 723 | Tue Oct 11 11:51:31 2016 |
| 724 | Tue Oct 11 11:51:32 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 29 - 56 = 33 s。

1
2
3
4
5
6
7
8
9
10
| 930 | Tue Oct 11 12:34:26 2016 |
| 931 | Tue Oct 11 12:34:26 2016 |
| 932 | Tue Oct 11 12:34:26 2016 |
| 933 | Tue Oct 11 12:34:26 2016 |
| 934 | Tue Oct 11 12:34:54 2016 |
| 935 | Tue Oct 11 12:34:55 2016 |
| 936 | Tue Oct 11 12:34:55 2016 |
| 937 | Tue Oct 11 12:34:55 2016 |
| 938 | Tue Oct 11 12:34:55 2016 |
| 939 | Tue Oct 11 12:34:56 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 54 - 26 = 28 s。

1
2
3
4
5
6
7
8
9
10
| 1111 | Tue Oct 11 12:38:12 2016 |
| 1112 | Tue Oct 11 12:38:12 2016 |
| 1113 | Tue Oct 11 12:38:13 2016 |
| 1114 | Tue Oct 11 12:38:13 2016 |
| 1115 | Tue Oct 11 12:38:13 2016 |
| 1116 | Tue Oct 11 12:38:14 2016 |
| 1117 | Tue Oct 11 12:38:52 2016 |
| 1118 | Tue Oct 11 12:38:53 2016 |
| 1119 | Tue Oct 11 12:38:54 2016 |
| 1120 | Tue Oct 11 12:38:54 2016 |

列表中时间差最大的值表示 master 切换花费的时间,即 52 - 14 = 38 s。

10 次测试结果平均值为:
(34 + 27 + 26 + 27 + 25 + 26 + 26 + 38 + 28 + 38)/ 10 = 29.5 s

已知目前租约时间设置为:

1
MasterLease = 20 // 20 s

本文的一部分问题和答案来自 Github issues,在题干已附加链接。如果关注这些问题,可以直接访问链接 :-)

参考

  1. 中文详细编译手册
  2. 中文部署手册
  3. PhxSQL 成员管理
  4. 分布式系统理论基础 - 选举、多数派和租约