You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cluster.go 1.5 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package cluster
  2. import (
  3. "context"
  4. "time"
  5. "gitlink.org.cn/cloudream/common/pkgs/logger"
  6. clirpc "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/rpc/client"
  7. )
  8. type Cluster struct {
  9. cfg Config
  10. cliPool *clirpc.Pool
  11. }
  12. func New(cfg *Config) *Cluster {
  13. c := Config{}
  14. if cfg != nil {
  15. c = *cfg
  16. } else {
  17. c.IsMaster = true
  18. }
  19. return &Cluster{
  20. cfg: c,
  21. }
  22. }
  23. func (c *Cluster) Start() error {
  24. log := logger.WithField("Mod", "Cluster")
  25. if c.cfg.IsMaster {
  26. log.Infof("cluster start as master")
  27. return nil
  28. }
  29. poolCfgJSON := clirpc.PoolConfigJSON{
  30. Address: c.cfg.MasterAddress,
  31. RootCA: c.cfg.RootCA,
  32. ClientCert: c.cfg.ClientCert,
  33. ClientKey: c.cfg.ClientKey,
  34. }
  35. poolCfg, err := poolCfgJSON.Build()
  36. if err != nil {
  37. return err
  38. }
  39. c.cliPool = clirpc.NewPool(*poolCfg)
  40. for {
  41. cli := c.cliPool.Get()
  42. ctx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second)
  43. resp, cerr := cli.GetClusterMasterInfo(ctx, &clirpc.GetClusterMasterInfo{})
  44. cancelFn()
  45. if cerr != nil {
  46. log.Warnf("first report: %v, will retry after 3 seconds", cerr.ToError())
  47. time.Sleep(3 * time.Second)
  48. continue
  49. }
  50. log.Infof("cluster start as slave, master is: %v", resp.Name)
  51. break
  52. }
  53. return nil
  54. }
  55. func (c *Cluster) IsMaster() bool {
  56. return c.cfg.IsMaster
  57. }
  58. func (c *Cluster) Name() string {
  59. return c.cfg.Name
  60. }
  61. func (c *Cluster) MasterClient() *clirpc.Pool {
  62. return c.cliPool
  63. }
  64. func (c *Cluster) RaftTransport() *Transport {
  65. return nil
  66. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。