我正在用3个节点作为POC测试Cassandra 4.0,所有节点都使用具有8GB RAM和2核的vm。创建虚拟机的方式确保它们不共享I/o。
我启动了第一个节点,在客户端中有50个线程,插入150,000条记录需要7秒(无批处理)。所以写速度是22k/s。然后我添加了第二个节点,并启动了另一个客户端(与第一个客户端同时写入不同的表),有50个线程,也插入150k记录,两个客户端需要18秒才能完成,所以写速度变成16k/秒。最后,我添加了第3个节点,使用2个客户机,插入300k条记录需要27秒,因此写入速度变为11k/秒。显然,写入速度随着节点的增加而降低。
我检查了CPU使用率,大约在70~80%。
下面是来自" nodeool status"的结果:
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 10.30.1.1 1.65 GiB 16 ? 4d379ca0-362b-4077-b650-c589088e86ed rack1
UN 10.30.1.2 3.1 GiB 16 ? b0d37f83-dfaf-45ae-9749-25f2d6746d0e rack1
UN 10.30.1.3 2.7 GiB 16 ? 8a48959b-a2a4-4543-abbf-257ddb7ca5b1 rack1
和result from " nodeool tpstats"
Pool Name Active Pending Completed Blocked All time blocked
RequestResponseStage 0 0 1615905 0 0
MutationStage 0 0 2090208 0 0
ReadStage 0 0 1466 0 0
CompactionExecutor 0 0 1239 0 0
MemtableReclaimMemory 0 0 6 0 0
PendingRangeCalculator 0 0 4 0 0
GossipStage 0 0 7695 0 0
SecondaryIndexManagement 0 0 0 0 0
HintsDispatcher 0 0 0 0 0
MemtablePostFlush 0 0 11 0 0
PerDiskMemtableFlushWriter_0 0 0 6 0 0
ValidationExecutor 0 0 0 0 0
Sampler 0 0 0 0 0
ViewBuildExecutor 0 0 0 0 0
MemtableFlushWriter 0 0 6 0 0
CacheCleanupExecutor 0 0 0 0 0
Native-Transport-Requests 0 0 2202576 0 0
Latencies waiting in queue (micros) per dropped message types
Message type Dropped 50% 95% 99% Max
READ_RSP 0 0.0 0.0 0.0 0.0
RANGE_REQ 0 0.0 0.0 0.0 0.0
PING_REQ 0 0.0 0.0 0.0 0.0
_SAMPLE 0 0.0 0.0 0.0 0.0
VALIDATION_RSP 0 0.0 0.0 0.0 0.0
SCHEMA_PULL_RSP 0 0.0 0.0 0.0 0.0
SYNC_RSP 0 0.0 0.0 0.0 0.0
SCHEMA_VERSION_REQ 0 0.0 0.0 0.0 0.0
HINT_RSP 0 0.0 0.0 0.0 0.0
BATCH_REMOVE_RSP 0 0.0 0.0 0.0 0.0
PAXOS_COMMIT_REQ 0 0.0 0.0 0.0 0.0
SNAPSHOT_RSP 0 0.0 0.0 0.0 0.0
COUNTER_MUTATION_REQ 0 0.0 0.0 0.0 0.0
GOSSIP_DIGEST_SYN 0 943.1270000000001 1955.666 2816.159 2816.159
PAXOS_PREPARE_REQ 0 0.0 0.0 0.0 0.0
PREPARE_MSG 0 0.0 0.0 0.0 0.0
PAXOS_COMMIT_RSP 0 0.0 0.0 0.0 0.0
HINT_REQ 0 0.0 0.0 0.0 0.0
BATCH_REMOVE_REQ 0 0.0 0.0 0.0 0.0
STATUS_RSP 0 0.0 0.0 0.0 0.0
READ_REPAIR_RSP 0 0.0 0.0 0.0 0.0
GOSSIP_DIGEST_ACK2 0 654.9490000000001 3379.391 4055.2690000000002 4055.2690000000002
CLEANUP_MSG 0 0.0 0.0 0.0 0.0
REQUEST_RSP 0 0.0 0.0 0.0 0.0
TRUNCATE_RSP 0 0.0 0.0 0.0 0.0
UNUSED_CUSTOM_VERB 0 0.0 0.0 0.0 0.0
REPLICATION_DONE_RSP 0 0.0 0.0 0.0 0.0
SNAPSHOT_REQ 0 0.0 0.0 0.0 0.0
ECHO_REQ 0 0.0 0.0 0.0 0.0
PREPARE_CONSISTENT_REQ 0 0.0 0.0 0.0 0.0
FAILURE_RSP 0 0.0 0.0 0.0 0.0
BATCH_STORE_RSP 0 0.0 0.0 0.0 0.0
SCHEMA_PUSH_RSP 0 0.0 0.0 0.0 0.0
MUTATION_RSP 0 2816.159 10090.808 17436.917 89970.66
FINALIZE_PROPOSE_MSG 0 0.0 0.0 0.0 0.0
ECHO_RSP 0 0.0 0.0 0.0 0.0
INTERNAL_RSP 0 0.0 0.0 0.0 0.0
FAILED_SESSION_MSG 0 0.0 0.0 0.0 0.0
_TRACE 0 0.0 0.0 0.0 0.0
SCHEMA_VERSION_RSP 0 0.0 0.0 0.0 0.0
FINALIZE_COMMIT_MSG 0 0.0 0.0 0.0 0.0
SNAPSHOT_MSG 0 0.0 0.0 0.0 0.0
PREPARE_CONSISTENT_RSP 0 0.0 0.0 0.0 0.0
PAXOS_PROPOSE_REQ 0 0.0 0.0 0.0 0.0
PAXOS_PREPARE_RSP 0 0.0 0.0 0.0 0.0
MUTATION_REQ 0 2346.799 10090.808 17436.917 74975.55
READ_REQ 0 0.0 0.0 0.0 0.0
PING_RSP 0 0.0 0.0 0.0 0.0
RANGE_RSP 0 0.0 0.0 0.0 0.0
VALIDATION_REQ 0 0.0 0.0 0.0 0.0
SYNC_REQ 0 0.0 0.0 0.0 0.0
_TEST_1 0 0.0 0.0 0.0 0.0
GOSSIP_SHUTDOWN 0 0.0 0.0 0.0 0.0
TRUNCATE_REQ 0 0.0 0.0 0.0 0.0
_TEST_2 0 0.0 0.0 0.0 0.0
GOSSIP_DIGEST_ACK 0 785.939 2346.799 14530.764000000001 14530.764000000001
SCHEMA_PUSH_REQ 0 0.0 0.0 0.0 0.0
FINALIZE_PROMISE_MSG 0 0.0 0.0 0.0 0.0
BATCH_STORE_REQ 0 0.0 0.0 0.0 0.0
COUNTER_MUTATION_RSP 0 0.0 0.0 0.0 0.0
REPAIR_RSP 0 0.0 0.0 0.0 0.0
STATUS_REQ 0 0.0 0.0 0.0 0.0
SCHEMA_PULL_REQ 0 0.0 0.0 0.0 0.0
READ_REPAIR_REQ 0 0.0 0.0 0.0 0.0
REPLICATION_DONE_REQ 0 0.0 0.0 0.0 0.0
PAXOS_PROPOSE_RSP 0 0.0 0.0 0.0 0.0
创建的表:
create keyspace example with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };
create table example.tweet(timeline text, id UUID, text text, PRIMARY KEY(id));
和客户端代码:
package main
import (
"fmt"
"strconv"
"github.com/gocql/gocql"
"time"
"sync"
)
const (
gophers = 50
entries = 3000
)
func main() {
var wg sync.WaitGroup
start_time:=time.Now().UnixNano()
for i :=0 ; i < gophers; i++ {
wg.Add(1)
// spin up a gopher
go gopher(i, &wg)
}
wg.Wait()
end_time := time.Now().UnixNano()
total_time := (end_time - start_time)/1000000
fmt.Println("total spent time: ", strconv.FormatInt(total_time, 10))
}
func gopher (thread_id int, wg *sync.WaitGroup) {
defer wg.Done()
cluster := gocql.NewCluster("10.30.1.1","10.30.1.2","10.30.1.3")
cluster.ConnectTimeout = time.Second*30
cluster.DisableInitialHostLookup=true
cluster.Timeout = 25*time.Second
cluster.Consistency = gocql.LocalQuorum
cluster.Keyspace = "example"
session, err := cluster.CreateSession()
if err != nil {
panic(err)
}
defer session.Close()
stmt:= session.Query("INSERT INTO tweet (timeline, id, text) VALUES (?, ?, ?)")
fmt.Println("StartTime: ", time.Now())
for i:=0; i < entries; i ++ {
_=stmt.Bind("me", gocql.TimeUUID(), "Hello"+strconv.Itoa(i)).Exec()
}
fmt.Println("EndTime:", time.Now())
}
我想知道是否有人能给我一些建议,我还可以寻找什么?
如果您在同一物理主机上运行所有3个vm,那么这将使您的测试无效,因为这3个vm正在竞争相同的物理资源。
要使测试有效,您应该将每个VM托管在单独的物理主机上。干杯!