Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

polaris-server leader 选举功能模块 #789

Closed
shichaoyuan opened this issue Nov 7, 2022 · 5 comments · Fixed by #817
Closed

polaris-server leader 选举功能模块 #789

shichaoyuan opened this issue Nov 7, 2022 · 5 comments · Fixed by #817
Assignees
Labels
need discuss Need to discuss

Comments

@shichaoyuan
Copy link
Member

shichaoyuan commented Nov 7, 2022

背景

#775 引出 polaris-server 需要一个 leader 选举模块,选出一个 leader 执行一些协调性的任务

问题 issue 中 polaris.checker 存在脏实例,所以复用现有的自注册机制选择 id 最小的实例并不能解决问题,这里的选主模块需要独立于 polaris 的自注册机制。

方案

基于 store 层实现选举,对上层提供接口

type LeaderElection interface {
	IsLeader() bool
}

基于 mysql 的实现:

  1. 选主依赖原子操作 update leader_election set leader_id = ?, version = version + 1 where service_id = ? and version = ?,只会有一个实例更新成功获得 leader 身份;
  2. leader 身份的维护通过周期性(tick)原子更新 version 和 update_time 实现;(这里需要原子更新的原因是,leader如果长时间卡住,需要感知自己已经失去leader身份)
  3. follower 周期性(tick)检查 leader 是否存活,如果 UNIX_TIMESTAMP(SYSDATE()) - update_time 超过了设定的“租约(lease)”,尝试第1步竞争 leader 身份。

配置

# 存储配置
store:
  # 数据库存储插件
  name: defaultStore
  option:
    master:
      dbType: mysql
      dbName: polaris_server
      dbUser: ##DB_USER##
      dbPwd: ##DB_PWD##
      dbAddr: ##DB_ADDR##
      maxOpenConns: 300
      maxIdleConns: 50
      connMaxLifetime: 300 # 单位秒
      txIsolationLevel: 2 #LevelReadCommitted
  leaderelection:
    open: true
    tick: 1s
    lease: 10s

限制

  1. leader 挂掉的感知时间为 lease
  2. 允许 tick 时间窗内两个 leader 并存

其他sql数据库都支持类似的操作,如果之后扩容 raft 协议的内嵌数据库也很容易支持。

@shichaoyuan shichaoyuan added the enhancement New feature or request label Nov 7, 2022
@chuntaojun
Copy link
Member

leaderelection 或许应该是要默认只能开启?

@chuntaojun chuntaojun added need discuss Need to discuss and removed enhancement New feature or request labels Nov 9, 2022
@chuntaojun
Copy link
Member

同时还有另外一个问题,这个 LeaderElection 需要支持不同的功能组之间,leader各自选举吗?比如一组功能的leader和另一组功能的leader可以各自进行 election

@shichaoyuan
Copy link
Member Author

同时还有另外一个问题,这个 LeaderElection 需要支持不同的功能组之间,leader各自选举吗?比如一组功能的leader和另一组功能的leader可以各自进行 election

这可能取决于leader的任务的数量,如果有很多的任务,分一下组比较合适;如果像kafka的controller那样,那么一个就够了,并且默认开启。

@chuntaojun
Copy link
Member

同时还有另外一个问题,这个 LeaderElection 需要支持不同的功能组之间,leader各自选举吗?比如一组功能的leader和另一组功能的leader可以各自进行 election

这可能取决于leader的任务的数量,如果有很多的任务,分一下组比较合适;如果像kafka的controller那样,那么一个就够了,并且默认开启。

也是,目前先不过度考虑了

@chuntaojun
Copy link
Member

LeaderElection 仅作为内部能力,相关参数不对外用户暴露。

chuntaojun pushed a commit that referenced this issue Nov 25, 2022
* Add leader election

* fix test

* add sql delta
chuntaojun added a commit that referenced this issue Dec 2, 2022
* Fix k8s deploy (#819)

* fix issue #629 (#693)

* docs:优化错误信息描述

* Update zh.toml

* fix:修复eureka心跳协议错误码不兼容问题

* fix:修复eureka心跳协议错误码不兼容问题

* unit:添加单元测试

* test:调整测试配置文件位置

* fix:issue #692

* fix:issue #692

* fix:issue #692

* fix:issue #692

* docs:add error code desc

* fix:调整license-checker的触发

* fix:调整license-checker的触发

* fix:k8s standalone deploy

* [ISSUE #789] Leader Election (#817)

* Add leader election

* fix test

* add sql delta

* feat:优化eureka插件大小写敏感,默认大小写不敏感 (#820) (#821)

* feat: 支持eureka双向数据同步

* fix:golintci warnings

* feat: 调整import顺序

* fix:修复golint格式化问题

* fix:修复导入问题

* fix: 修复导入顺序问题

* Fix k8s deploy (#819)

* fix issue #629 (#693)

* docs:优化错误信息描述

* Update zh.toml

* fix:修复eureka心跳协议错误码不兼容问题

* fix:修复eureka心跳协议错误码不兼容问题

* unit:添加单元测试

* test:调整测试配置文件位置

* fix:issue #692

* fix:issue #692

* fix:issue #692

* fix:issue #692

* docs:add error code desc

* fix:调整license-checker的触发

* fix:调整license-checker的触发

* fix:k8s standalone deploy

* feat:优化大小写问题,eureka插件默认大小写不敏感,无需配置

* feat:读取的时候进行大写转换

* feat:修改读取时候大小写

* feat:处理replication大小写

* fix:修复用例失败问题

* fix:修复用例失败问题

Co-authored-by: liaochuntao <[email protected]>

Co-authored-by: liaochuntao <[email protected]>

* fix: 解决eureka同步时,出现存量服务同步失败的问题 (#823)

* feat: 支持eureka双向数据同步

* fix:golintci warnings

* feat: 调整import顺序

* fix:修复golint格式化问题

* fix:修复导入问题

* fix: 修复导入顺序问题

* feat:优化大小写问题,eureka插件默认大小写不敏感,无需配置

* feat:读取的时候进行大写转换

* feat:修改读取时候大小写

* feat:处理replication大小写

* fix:修复用例失败问题

* fix:修复用例失败问题

* fix:修复eureka心跳复制失败的问题

* fix:解决自注册时候,服务不存在需要动态创建的问题

* fix:修复服务不存在,创建报错问题

* feat:修复polaris之间走eureka同步接口出现报错的问题 (#830)

* fix: eureka同步时,实例不存在没有返回404,导致eureka触发不了重注册 (#833)

* 增强batchDeleteInstanceMeta方法的场景兼容性

解决以下sql
delete from instance_metadata where id in (,?)

Co-authored-by: liaochuntao <[email protected]>
Co-authored-by: Shichao <[email protected]>
Co-authored-by: andrew shan <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
need discuss Need to discuss
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants