Skip to content

Commit

Permalink
server: resource ratio
Browse files Browse the repository at this point in the history
  • Loading branch information
huachaohuang committed Nov 22, 2016
1 parent cca1466 commit 68b081e
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 55 deletions.
4 changes: 2 additions & 2 deletions server/balancer.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func (cb *capacityBalancer) Balance(cluster *clusterInfo) (float64, *balanceOper
}

// Check diff score.
diff := source.getScore(cb.kind) - target.getScore(cb.kind)
diff := source.resourceRatio(cb.kind) - target.resourceRatio(cb.kind)
if diff < cb.cfg.MaxDiffScoreFraction {
return 0, nil, nil
}
Expand Down Expand Up @@ -112,7 +112,7 @@ func (lb *leaderBalancer) Balance(cluster *clusterInfo) (float64, *balanceOperat
return 0, nil, nil
}

diff := source.getScore(lb.kind) - target.getScore(lb.kind)
diff := source.resourceRatio(lb.kind) - target.resourceRatio(lb.kind)
if diff < lb.cfg.MaxDiffScoreFraction {
return 0, nil, nil
}
Expand Down
9 changes: 0 additions & 9 deletions server/balancer_worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,15 +256,6 @@ func (bw *balancerWorker) checkReplicas(region *regionInfo) error {
return nil
}

func (bw *balancerWorker) storeScores(store *storeInfo) []int {
scores := make([]int, 0, len(bw.balancers))
for _, balancer := range bw.balancers {
score := store.getScore(balancer.GetResourceKind())
scores = append(scores, int(score*100))
}
return scores
}

func collectOperatorMetrics(bop *balanceOperator) map[string]uint64 {
metrics := make(map[string]uint64)
prefix := ""
Expand Down
19 changes: 9 additions & 10 deletions server/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -426,8 +426,8 @@ func (c *RaftCluster) collectMetrics() {
regionTotalCount := 0
storageSize := uint64(0)
storageCapacity := uint64(0)
minUsedRatio, maxUsedRatio := float64(1.0), float64(0.0)
minLeaderRatio, maxLeaderRatio := float64(1.0), float64(0.0)
minStorageRatio, maxStorageRatio := float64(1.0), float64(0.0)

for _, s := range cluster.getStores() {
// Store state.
Expand All @@ -454,18 +454,18 @@ func (c *RaftCluster) collectMetrics() {
}

// Balance.
if minUsedRatio > s.usedRatio() {
minUsedRatio = s.usedRatio()
}
if maxUsedRatio < s.usedRatio() {
maxUsedRatio = s.usedRatio()
}
if minLeaderRatio > s.leaderRatio() {
minLeaderRatio = s.leaderRatio()
}
if maxLeaderRatio < s.leaderRatio() {
maxLeaderRatio = s.leaderRatio()
}
if minStorageRatio > s.storageRatio() {
minStorageRatio = s.storageRatio()
}
if maxStorageRatio < s.storageRatio() {
maxStorageRatio = s.storageRatio()
}
}

metrics := make(map[string]float64)
Expand All @@ -476,8 +476,8 @@ func (c *RaftCluster) collectMetrics() {
metrics["region_total_count"] = float64(regionTotalCount)
metrics["storage_size"] = float64(storageSize)
metrics["storage_capacity"] = float64(storageCapacity)
metrics["store_max_diff_used_ratio"] = maxUsedRatio - minUsedRatio
metrics["store_max_diff_leader_ratio"] = maxLeaderRatio - minLeaderRatio
metrics["store_max_diff_storage_ratio"] = maxStorageRatio - minStorageRatio

for label, value := range metrics {
clusterStatusGauge.WithLabelValues(label).Set(value)
Expand Down Expand Up @@ -585,8 +585,7 @@ func (c *RaftCluster) GetScores(store *metapb.Store, status *StoreStatus) []int
Store: store,
stats: status,
}

return c.balancerWorker.storeScores(storeInfo)
return storeInfo.resourceScores()
}

// FetchEvents fetches the operator events.
Expand Down
4 changes: 2 additions & 2 deletions server/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,11 @@ func newCapacityFilter(cfg *BalanceConfig) *capacityFilter {
}

func (cf *capacityFilter) FilterSource(store *storeInfo) bool {
return store.usedRatio() <= cf.cfg.MinCapacityUsedRatio
return store.storageRatio() <= cf.cfg.MinCapacityUsedRatio
}

func (cf *capacityFilter) FilterTarget(store *storeInfo) bool {
return store.usedRatio() >= cf.cfg.MaxCapacityUsedRatio
return store.storageRatio() >= cf.cfg.MaxCapacityUsedRatio
}

type snapCountFilter struct {
Expand Down
22 changes: 0 additions & 22 deletions server/resource.go

This file was deleted.

4 changes: 2 additions & 2 deletions server/selector.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func (s *balanceSelector) SelectSource(stores []*storeInfo, filters ...Filter) *
if filterSource(store, filters) {
continue
}
if result == nil || result.getScore(s.kind) < store.getScore(s.kind) {
if result == nil || result.resourceRatio(s.kind) < store.resourceRatio(s.kind) {
result = store
}
}
Expand All @@ -54,7 +54,7 @@ func (s *balanceSelector) SelectTarget(stores []*storeInfo, filters ...Filter) *
if filterTarget(store, filters) {
continue
}
if result == nil || result.getScore(s.kind) > store.getScore(s.kind) {
if result == nil || result.resourceRatio(s.kind) > store.resourceRatio(s.kind) {
result = store
}
}
Expand Down
31 changes: 23 additions & 8 deletions server/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ import (
"github.com/pingcap/kvproto/pkg/pdpb"
)

// ResourceKind distinguishes different kinds of resources.
type ResourceKind int

const (
leaderKind ResourceKind = iota + 1
storageKind
)

// storeInfo contains information about a store.
// TODO: Export this to API directly.
type storeInfo struct {
Expand Down Expand Up @@ -58,31 +66,38 @@ func (s *storeInfo) downTime() time.Duration {
return time.Since(s.stats.LastHeartbeatTS)
}

func (s *storeInfo) usedRatio() float64 {
if s.stats.GetCapacity() == 0 {
func (s *storeInfo) leaderRatio() float64 {
if s.stats.TotalRegionCount == 0 {
return 0
}
return float64(s.stats.GetUsedSize()) / float64(s.stats.GetCapacity())
return float64(s.stats.LeaderRegionCount) / float64(s.stats.TotalRegionCount)
}

func (s *storeInfo) leaderRatio() float64 {
if s.stats.TotalRegionCount == 0 {
func (s *storeInfo) storageRatio() float64 {
if s.stats.GetCapacity() == 0 {
return 0
}
return float64(s.stats.LeaderRegionCount) / float64(s.stats.TotalRegionCount)
return float64(s.stats.GetUsedSize()) / float64(s.stats.GetCapacity())
}

func (s *storeInfo) getScore(kind ResourceKind) float64 {
func (s *storeInfo) resourceRatio(kind ResourceKind) float64 {
switch kind {
case leaderKind:
return s.leaderRatio()
case storageKind:
return s.usedRatio()
return s.storageRatio()
default:
return 0
}
}

func (s *storeInfo) resourceScores() []int {
var scores []int
scores = append(scores, int(s.leaderRatio()*100))
scores = append(scores, int(s.storageRatio()*100))
return scores
}

// StoreStatus contains information about a store's status.
type StoreStatus struct {
*pdpb.StoreStats
Expand Down

0 comments on commit 68b081e

Please sign in to comment.