
Tsurugiã®éçºäžã¬ããªã±ãŒã·ã§ã³æ©èœãåãããŠã¿ã
1. ã¯ããã«
次äžä»£é«éRDBãåïŒTsurugiïŒãã¯ããªãŒãã³ãœãŒã¹ãšããŠéçºãé²ããããŠãã髿§èœããŒã¿ããŒã¹ç®¡çã·ã¹ãã ïŒDBMSïŒã§ãã
ã¡ã¢ãªäžå¿ã®ã¢ãŒããã¯ãã£ãæ¡çšããããšã§ãå€§èŠæš¡ãªäžŠååŠçãšäœã¬ã€ãã³ã·ãªãã©ã³ã¶ã¯ã·ã§ã³å®è¡ãå¯èœã«ããŠããŸãã
ãã®Tsurugiã§ãçŸåšãã¬ããªã±ãŒã·ã§ã³æ©èœãã®éçºãé²ããããŠããŸãã
ãã®æ©èœã¯ãããŒã¿ã®åé·åãé«å¯çšæ§ãå®çŸããããã®åºç€ãšãªããã®ã§ãTsurugiã®ä¿¡é Œæ§ã倧ããé«ããéèŠãªèŠçŽ ã§ãã
çŸæç¹ã§ã¯ç ç©¶éçºæ®µéã«ãããäžè¬ãŠãŒã¶åãã«ã¯å
¬éãããŠããŸããã
äžæ¹ã§ãã³ã¢æ©èœã¯ãã§ã«çšŒåããŠãããå
éšæ€èšŒãšããŠãã³ãããŒã¯ã«ããåäœã»æ§èœè©äŸ¡ãé²ããããŠããŸãã
ãã®èšäºã§ã¯ãéçºäžã®ã¬ããªã±ãŒã·ã§ã³æ©èœãå®éã«æå¹åããŠåãããŠã¿ãçµæã玹ä»ããŸãã
ãããŸã§éçºäžã®è©Šéšçãªå®è¡ã§ãããçŸæç¹ã§ã®èšèšæ¹éãå®è£
ç¶æ³ããããŠä»åŸã®å±æã«ã€ããŠèª¬æããŸãã
1.1 éçºç¶æ³ã®æŠèŠ
çŸåšãTsurugiã§ã¯ã¬ããªã±ãŒã·ã§ã³æ©èœã®éçºãé²ããŠããŸãã
ãã®æ©èœã®ç¬¬äžã®ç®çã¯ããã°ã®ã¬ããªã±ãŒã·ã§ã³ã«ãã£ãŠé«å¯çšæ§ãå®çŸããããšã§ãã
ã³ãããæžã¿ããŒã¿ããã¹ã¿ãµãŒããšã¬ããªã«ã®äž¡æ¹ã«ä¿æããããšã§ã
äžäžãã¹ã¿ãµãŒãã«é害ãçºçããŠããã¬ããªã«åŽã§æ¥åãç¶ç¶ã§ããããã«ããçãããããŸãã
次ã®ã¹ããããšããŠã¯ããªãŒãã¬ããªã«ã«ããè² è·åæ£ãç®æããŠããŸãã
çŸæç¹ã§ã¯ãã°ã®ã¬ããªã±ãŒã·ã§ã³ã®ã¿ãå¯èœã§ããã
ä»åŸã¯ã¬ããªã«ããŒãããªãŒããªã³ãªãŒã¬ããªã«ãšããŠèµ·åãã
èªã¿åãè² è·ãè€æ°ããŒãã«åæ£ã§ããããã«ããäºå®ã§ãã
ããã«ãã®å
ã§ã¯ã忣ãã©ã³ã¶ã¯ã·ã§ã³ã®å®çŸãèŠéã«å
¥ããŠããŸãã
çŸæç¹ã®å®è£ ã§ã¯ãWALïŒWrite-Ahead LogïŒã®æžãèŸŒã¿æã«ãã¹ã¿ãšã¬ããªã«ã®äž¡æ¹ãžäžŠåã§ããŒã¿ãéä¿¡ããäž¡æ¹ã®æžã蟌ã¿ãå®äºããæç¹ã§ã³ãããã確å®ãããæ¹åŒãæ¡çšããŠããŸãããã®èšèšã«ãããã¬ããªã«åŽã«ããã¹ã¿ãšåäžã®WALãåžžã«ä¿æãããããšãä¿èšŒãããŸãã
1.2 æªå®è£ æ©èœ
çŸåšã®ã¬ããªã±ãŒã·ã§ã³æ©èœã¯ããã³ãããŒã¯ãå®è¡ã§ããæäœéã®æ©èœã®ã¿ãå®è£
ãããŠããŸãã
ãã¹ã¿ããã¬ããªã«ãžã®ãã°è»¢éã®åºæ¬çãªæµãã¯åäœããŠããŸããã
éçšãé害察å¿ã«å¿
èŠãªåšèŸºæ©æ§ã¯ãŸã æŽåéäžã§ãã以äžã®æ©èœã¯ä»åŸã®éçºå¯Ÿè±¡ã§ãã
ãšã©ãŒåŠç
çŸæç¹ã§ã¯ãšã©ãŒçºçæã«ãã°åºåãäŸå€ã¹ããŒãè¡ãã®ã¿ã§ã埩æ§åŠçããªãã©ã€æ©æ§ã¯æªå®è£ ã§ãã
å€ãã®å Žåãã¬ããªã±ãŒã·ã§ã³ã«é¢ãããšã©ãŒãçºçãããšãã°ãèšé²ããã®ã¡ããã»ã¹ãçµäºãããæåã«ãªã£ãŠããŸãã
ä»åŸã¯ãå®å®ãããšã©ãŒãã³ããªã³ã°ãå®è£ ããäºå®ã§ããçµäºåŠç
ã¬ããªã«ãæç€ºçã«åæ¢ããæ¹æ³ããªããçŸç¶ã§ã¯ `Ctrl+C` ã«ãã匷å¶çµäºãå¿ èŠã§ããããŒã¿äžæŽåçºçæã®åäœ
éä¿¡éçµ¶ãé害ã«ãããã¹ã¿ãšã¬ããªã«ã®æŽåæ§ã厩ããå Žåã
çŸç¶ã§ã¯æ€åºã»èªå察å¿ã®ä»çµã¿ããããŸããã
ä»åŸã¯ãããŒã¿äžäžèŽã®æ€åºã»ååæã»å®å šåæ¢ãªã©ã®æåãå®çŸ©ãã
äžæŽåçºçæã«ãã·ã¹ãã ãå®å šã«ä¿ã€æ©èœã远å ããŠãããŸãã
2. ã€ã³ã¹ããŒã«ãšã»ããã¢ãã
2.1 å®è¡ç°å¢
ä»åã®åäœç¢ºèªã¯ã以äžã®ç°å¢ã§å®æœããŸããã
OSïŒUbuntu 24.04 LTS
CPUïŒIntel Core i7-13700KïŒ16ã³ã¢ïŒ24ã¹ã¬ããïŒ
ã¡ã¢ãªïŒ128GB
ã¡ã¢ãª32GBã»8ã³ã¢çšåºŠã®PCããµãŒãã§ããã°ã
ã»ãŒåæ§ã®æé ã§å®è¡å¯èœã ãšæããŸãã
2.2 ãœãŒã¹ã®ååŸ
ãŸãã2025幎10ææç¹ã§ã®ææ°çã§ãã Tsurugi 1.6.0 ãããŠã³ããŒãããŸãã
$ curl -OL https://github.com/project-tsurugi/tsurugidb/releases/download/1.6.0/tsurugidb-1.6.0.tar.gzååŸããã¢ãŒã«ã€ããå±éããå±éå ãã£ã¬ã¯ããªã«ç§»åããŸãã
$ tar xf tsurugidb-1.6.0.tar.gz
$ cd tsurugidb-1.6.0/2.3 ã¬ããªã±ãŒã·ã§ã³æ©èœã®æå¹å
ãã®ãŸãŸãã«ãããŠããã¬ããªã±ãŒã·ã§ã³é¢é£ã®ãã€ããªã¯ãã«ããããŸãããéçºäžã®ã¬ããªã±ãŒã·ã§ã³æ©èœã¯ã`limestone` ã¢ãžã¥ãŒã«ã«å®è£ ãããŠããŸããããã§ã`limestone/CMakeLists.txt` å ã®èšå®ã以äžã®ããã«å€æŽããŸãã
-option(INSTALL_EXPERIMENTAL_TOOLS "Install experimental tools like tgreplica" OFF)
-option(BUILD_REPLICATION_TESTS "Build replication tests" OFF)
+option(INSTALL_EXPERIMENTAL_TOOLS "Install experimental tools like tgreplica" ON)
+option(BUILD_REPLICATION_TESTS "Build replication tests" ON)ãã®å€æŽã«ãããå®éšçããŒã«ïŒ`tgreplica`ïŒããã³ã¬ããªã±ãŒã·ã§ã³é¢é£ã®ãã¹ãããã«ã察象ã«å«ãŸããããã«ãªããŸãã
2.4 äŸåããã±ãŒãžã®ã€ã³ã¹ããŒã«
ãã«ããšå®è¡ã«å¿ èŠãªããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
$ sudo ./apt-install.sh2.5 ãã«ããšã€ã³ã¹ããŒã«
次ã«ãTsurugiããã«ãããŠã€ã³ã¹ããŒã«ããŸãã
ããã§ã¯ãã€ã³ã¹ããŒã«å
ã `~/opt` ã«æå®ããŠããŸãã
$ mkdir -p $HOME/opt
$ ./install.sh --symbolic --prefix=$HOME/optããã§ãã¬ããªã±ãŒã·ã§ã³æ©èœãå«ãTsurugiã®ãã«ããšã€ã³ã¹ããŒã«ãå®äºããŸãã
2.6 ã€ã³ã¹ããŒã«åŸã®ãã£ã¬ã¯ããªæ§æ
ã€ã³ã¹ããŒã«ãå®äºãããšã次ã®ãããªãã£ã¬ã¯ããªæ§æã«ãªããŸãã
$ ls ~/opt
tsurugi tsurugi-1.6.0
$ ls ~/opt/tsurugi-1.6.0/
BUILDINFO.md bin include lib libexec share var`bin` ãã£ã¬ã¯ããªã«ã¯å®è¡å¯èœãã¡ã€ã«ïŒ`tgctl`, `tgsql`, `tgreplica` ãªã©ïŒãé
眮ããã
`var` ã«ã¯ããã©ã«ãã®èšå®ãã¡ã€ã«ãããŒã¿é åãçæãããŸãã
3. ã¹ã¿ã³ãã¢ããŒã³ç°å¢ã§åãããŠã¿ã
ãŸãã¯ãã¬ããªã±ãŒã·ã§ã³ã䜿ããªãéåžžã®ã¹ã¿ã³ãã¢ããŒã³æ§æã§åäœã確èªããŸãã
3.1 ç°å¢å€æ°ã®èšå®
Tsurugiã®å®è¡ãã€ããªããããã£ã¬ã¯ããªãç°å¢å€æ°ã«èšå®ããŸãã
$ export TSURUGI_HOME=$HOME/opt/tsurugi
$ export PATH=$TSURUGI_HOME/bin:$PATHããã§èšå®ãã `TSURUGI_HOME` ã¯ã€ã³ã¹ããŒã«å ãã£ã¬ã¯ããªã®ã«ãŒããæãã`PATH` ã« `$TSURUGI_HOME/bin` ã远å ããããšã§ `tgctl` ãªã©ã®ã³ãã³ãããã®ã·ã§ã«ããçŽæ¥å®è¡ã§ããããã«ãªããŸããã©ã¡ããã·ã§ã«ãéãããšãªã»ãããããåæã§ãã
3.2 Tsurugiã®èµ·å
`tgctl start` ã³ãã³ãã§Tsurugiãèµ·åããŸãã
$ tgctl start
successfully launched tsurugidb.3.3 SQLã®å®è¡
`tgsql` ã䜿çšããŠããµãŒãã«æ¥ç¶ããŸãã
$ tgsql -c ipc:tsurugi
[main] INFO com.tsurugidb.tgsql.core.TgsqlRunner - establishing connection: ipc:tsurugi
[main] INFO com.tsurugidb.tgsql.core.TgsqlRunner - start repl
tgsql>æ¥ç¶ã«æåãããšãäžèšã®ããã« `tgsql>` ããã³ããã衚瀺ãããŸãã
ããã§SQLãå®è¡ããŠãTsurugiãæ£ããåäœããŠããããšã確èªããŸãã
次ã«ãç°¡åãªããŒãã«ãäœæããŠãããŒã¿æäœã®åºæ¬åäœã確èªããŸãã
`tgsql` ã®ããã³ããã§ä»¥äžãé ã«å®è¡ããŸãã
ããŒãã«äœæ
SQLå ¥åïŒ
CREATE TABLE demo_table (
id INT PRIMARY KEY,
name VARCHAR(64),
value INT
);åºåäŸïŒ
start transaction implicitly. option=[
type: OCC
label: "tgsql-implicit-transaction2025-10-27 20:06:57.312+09:00"
]
Time: 0.262 ms
execute succeeded
Time: 17.341 ms
transaction commit(DEFAULT) finished implicitly.
Time: 14.113 msããŒã¿æ¿å ¥
SQLå ¥åïŒ
INSERT INTO demo_table VALUES (1, 'alpha', 100);
INSERT INTO demo_table VALUES (2, 'bravo', 200);
INSERT INTO demo_table VALUES (3, 'charlie', 300);åºåäŸïŒ
INSERT INTO demo_table VALUES (1, 'alpha', 100)
start transaction implicitly. option=[
type: OCC
label: "tgsql-implicit-transaction2025-10-27 20:07:06.113+09:00"
]
Time: 0.338 ms
(1 row inserted)
Time: 1.402 ms
transaction commit(DEFAULT) finished implicitly.
Time: 17.858 ms
INSERT INTO demo_table VALUES (2, 'bravo', 200)
start transaction implicitly. option=[
type: OCC
label: "tgsql-implicit-transaction2025-10-27 20:07:06.134+09:00"
]
Time: 0.171 ms
(1 row inserted)
Time: 0.416 ms
transaction commit(DEFAULT) finished implicitly.
Time: 12.333 ms
INSERT INTO demo_table VALUES (3, 'charlie', 300)
start transaction implicitly. option=[
type: OCC
label: "tgsql-implicit-transaction2025-10-27 20:07:06.148+09:00"
]
Time: 0.137 ms
(1 row inserted)
Time: 0.323 ms
transaction commit(DEFAULT) finished implicitly.
Time: 10.274 msããŒã¿ååŸ
SQLå ¥åïŒ
SELECT * FROM demo_table;åºåäŸïŒ
start transaction implicitly. option=[
type: OCC
label: "tgsql-implicit-transaction2025-10-27 20:08:21.403+09:00"
]
Time: 0.356 ms
[id: INT, name: VARCHAR(64), value: INT]
[1, alpha, 100]
[2, bravo, 200]
[3, charlie, 300]
(3 rows)
Time: 7.142 ms
transaction commit(DEFAULT) finished implicitly.
Time: 1.534 msãããŸã§ã§ãTsurugiã®åºæ¬çãªåŠçãæ£ããåäœããŠããããšã確èªã§ããŸãã
`tgsql` ã®ããã³ãããçµäºããã«ã¯ã`Ctrl+D` ãæŒããŸãã
3.4 ã·ã£ããããŠã³ãšããŒã¿ã®åé€
æåŸã« `tgctl shutdown` ã§ãµãŒãã忢ããŠãããŸãã
$ tgctl shutdown
.
successfully shutdown tsurugidb.次ã«ãå ã»ã©ã®ã¹ã¿ã³ãã¢ããŒã³æ§æã§äœæãããããŒã¿ãåé€ããŸãã
$ rm -rf ~/opt/tsurugi-1.6.0/var/data/log/4. ã¬ããªã±ãŒã·ã§ã³ã詊ããŠã¿ã
4.1 ã¬ããªã±ãŒã·ã§ã³æ§æã®æºå (ãã¹ã¿ã»ã¬ããªã«èšå®)
ããããã¯ãã¬ããªã±ãŒã·ã§ã³æ©èœãæå¹ã«ããæ§æã詊ããŸãã
å®éã«ãµãŒãã2å°çšæããªããŠãã1å°ã®ãµãŒãäžã§ãã¹ã¿ãšã¬ããªã«ãåæã«å®è¡ããããšãå¯èœã§ãã
ããã§ã¯ããã®ããã®æºåæé ã説æããŸãã
4.1.1 ã¬ããªã«çšã€ã³ã¹ã¿ã³ã¹ã®äœæ
ã¬ããªã«åŽã®Tsurugiãå¥ãã£ã¬ã¯ããªã«çšæããŸãã
åãã«ãããŠãæ§ããŸããããããã§ã¯æ¢åã®ã€ã³ã¹ããŒã«ãã£ã¬ã¯ããªãã³ããŒããŠå©çšããŸãã
$ cd ~/opt
$ cp -rp tsurugi-1.6.0 replicaããã§ã以äžã®2ã€ã®ãã£ã¬ã¯ããªãååšããç¶æ ã«ãªããŸãã
~/opt/tsurugi-1.6.0 ... ãã¹ã¿çš
~/opt/replica ... ã¬ããªã«çšã©ã¡ããåãããŒãžã§ã³ã®Tsurugiãå±éãããŠããŸããã
ä»åŸãããããå¥ããã»ã¹ãšããŠèµ·åããã¬ããªã±ãŒã·ã§ã³åäœã確èªããŸãã
4.1.2 ãã¹ã¿ãšã¬ããªã«ã®èµ·åèšå® (ãã°åé¢ãšèšå®å€æŽ)
1å°ã®ãµãŒãã§ãã¹ã¿ãšã¬ããªã«ãåæã«å®è¡ããå Žåã
ããã©ã«ãèšå®ã®ãŸãŸã ãšäž¡è
ãåã `/tmp` ã«ãã°ãåºåããããã
ãã°ãæ··ãã£ãŠèå¥ãé£ãããªããŸãã
ãã®ããããã¹ã¿çšã»ã¬ããªã«çšã®ãã°ãã£ã¬ã¯ããªãåããŠèšå®ããŸãã
4.1.3 ãã°ãã£ã¬ã¯ããªã®äœæ
ãŸãããã°åºåå ãšãªããã£ã¬ã¯ããªãäœæããŸãã
$ mkdir -p ~/logs/master
$ mkdir -p ~/logs/replicaããã§æ¬¡ã®ãããªæ§æã«ãªããŸãã
~/logs/master ... ãã¹ã¿çšãã°
~/logs/replica ... ã¬ããªã«çšãã°4.1.4 èšå®ãã¡ã€ã«ã®å€æŽ
次ã«ãããããã® Tsurugi ã€ã³ã¹ã¿ã³ã¹ã§ãã°åºåå
ã倿ŽããŸãã
èšå®ãã¡ã€ã«ã¯ `var/etc/tsurugi.ini` ã«ãããŸãã
以äžã®äŸã§ã¯ãã³ã¡ã³ãã¢ãŠããããŠãã `#log_dir=` ã®è¡ãä¿®æ£ããŸãã
`username` ã®éšåã¯ãèªèº«ã®ãŠãŒã¶åã«çœ®ãæããŠãã ããã
$ sed -i 's!#log_dir=!log_dir=/home/username/logs/replica!' ~/opt/replica/var/etc/tsurugi.ini
$ sed -i 's!#log_dir=!log_dir=/home/username/logs/master!' ~/opt/tsurugi-1.6.0/var/etc/tsurugi.ini倿ŽåŸããã¹ã¿ãšã¬ããªã«ã®ãã°ã¯ããããå¥ãã£ã¬ã¯ããªã«åºåãããããã«ãªããŸããããã«ãããåäœç¢ºèªããã©ãã«ã·ã¥ãŒãã£ã³ã°ã®éã«ãã°ãæ··åããå¿é ããªããªããŸãã
4.1.5 ã¬ããªã«ãšãã¹ã¿ã®èµ·å
ã¬ããªã±ãŒã·ã§ã³æ©èœã®çŸç¶ã§ã¯ãå ã«ã¬ããªã«ãèµ·åããåŸãããã¹ã¿ãæ¥ç¶ããå¿ èŠããããŸãã
ä»åŸã®æé ã§ã¯ããã¹ã¿åŽãšã¬ããªã«åŽã®æäœãæ··åããªãããããã¹ã¿çšãšã¬ããªã«çšã®2ã€ã®ã¿ãŒããã«ãçšæããŠé ã«æäœããŠãããŸãã
4.1.6 ã¬ããªã«ã®èµ·å (ã¬ããªã«åŽã¿ãŒããã«)
ãŸãã¬ããªã«åŽã¿ãŒããã«ã§ã`TSURUGI_HOME` ãš `PATH` ãã¬ããªã«ã€ã³ã¹ã¿ã³ã¹ã«åãããŠåãæ¿ããŸãã
$ export TSURUGI_HOME=$HOME/opt/replica
$ export PATH=$TSURUGI_HOME/bin:$PATH
$ export TSURUGI_REPLICATION_ENDPOINT="tcp://0.0.0.0:12346"ããã§ã¯ãã¬ããªã«çšã®ã€ã³ã¹ããŒã«å
ã `TSURUGI_HOME` ã«èšå®ããåãã `PATH` ãåãæ¿ããŠããŸãã
远å ã§èšå®ãã `TSURUGI_REPLICATION_ENDPOINT` ã¯ãã¬ããªã«ããã¹ã¿ããã®æ¥ç¶ãåŸ
ã¡åãããœã±ããã®
ãšã³ããã€ã³ããæç€ºããç°å¢å€æ°ã§ããä»åã¯ããŒã«ã«ãã¹ãã§ TCP 12346çªãéãæ§æã«ããŠããŸãã
ç°å¢å€æ°ãã»ããããããã¬ããªã±ãŒã·ã§ã³ããŒã¿ãä¿åãããã£ã¬ã¯ããªãæå®ã㊠`tgreplica` ãèµ·åããŸãã
ããã§ã¯äºåã« `$TSURUGI_HOME/var/data/log` ãäœæãããããä¿åå
ãšããŠæž¡ããŠããŸãã
äžåºŠã§ãåãããåŸã¯ã¬ããªã«åŽã®ããŒã¿ãã¡ã€ã«ãæ®ããããåèµ·åæã¯å
ã«åé€ããŠã¯ãªãŒã³ãªç¶æ
ã«æ»ããŸãã
ããã»ã¹ã¯ãã©ã¢ã°ã©ãŠã³ãã§åŸ
æ©ããããããã®ã¿ãŒããã«ã¯éãããŸãŸã«ããŠãããŸãã
$ rm -rf $TSURUGI_HOME/var/data/log
$ mkdir -p $TSURUGI_HOME/var/data/log
$ tgreplica $TSURUGI_HOME/var/data/log
Endpoint: 0.0.0.0:12346
...
[replica] initialized and listeningã¬ããªã«ã®ãã°ã«ã¯ããã¹ã¿ããã®æ¥ç¶åŸ
ã¡ç¶æ
ã§ããããšãåŸ
ã¡åãããŒãã衚瀺ãããŸãã
ãã®ãŸãŸåŸ
æ©ãããå¥ã¿ãŒããã«ã§ãã¹ã¿ãèµ·åããŸãã
4.1.7 ãã¹ã¿ã®èµ·å (ãã¹ã¿åŽã¿ãŒããã«)
ãã¹ã¿åŽã¿ãŒããã«ã§ã¯ã`TSURUGI_HOME` ãš `PATH` ããã¹ã¿ãã£ã¬ã¯ããªã®å€ã«æŽæ°ããŸãã
$ export TSURUGI_HOME=$HOME/opt/tsurugi-1.6.0
$ export PATH=$TSURUGI_HOME/bin:$PATH
$ export TSURUGI_REPLICATION_ENDPOINT="tcp://127.0.0.1:12346"
$ export REPLICATION_ASYNC_SESSION_CLOSE=boost_thread_pool_async
$ export REPLICATION_ASYNC_GROUP_COMMIT=boost_thread_pool_asyncãã¡ãã¯ãã¹ã¿åŽã®ã€ã³ã¹ããŒã«ãã¹ã«åãããŠç°å¢å€æ°ãåãæ¿ããŠããŸãã
`TSURUGI_REPLICATION_ENDPOINT` ã¯ãã¹ã¿ããã¬ããªã«ãžæ¥ç¶ããéã®ãšã³ããã€ã³ãæå®ã§ã
ä»åã¯åããµãŒãäžã§åäœããã¬ããªã«ã«æ¥ç¶ãããã `127.0.0.1` ãæå®ããŠããŸãã
ã¬ããªã«ãå¥ãµãŒãã«ããå Žåã¯ããã®ãµãŒãã®IPã¢ãã¬ã¹ã«çœ®ãæããŠãã ããã
`REPLICATION_ASYNC_SESSION_CLOSE` ãš `REPLICATION_ASYNC_GROUP_COMMIT` ã¯ãã¬ããªã±ãŒã·ã§ã³æã®
ã»ãã·ã§ã³çµäºåŠçãšã³ãããåŠçãã©ã®å®è£
ã§å®è¡ããããéžã¶ããã®ç°å¢å€æ°ã§ã
ããã§ã¯æãé«é㪠`boost_thread_pool_async` ãçšããŠéåæåŠçãããŠããŸãã
ãã§ã«TsurugiãåããŠãããã以åã®å®è¡ã§çæãããããŒã¿ãã¡ã€ã«ãæ®ã£ãŠãããšèµ·åã倱æããã®ã§ã`tgctl kill` ãš
`rm -rf $TSURUGI_HOME/var/data/log` ã§ã¯ãªãŒã³ã«ããŠããå®è¡ããŸãã
ç¶ããŠãã¹ã¿ãèµ·åãããšãå
ã»ã©èµ·åããã¬ããªã«ãžæ¥ç¶ããã¬ããªã±ãŒã·ã§ã³ã»ãã·ã§ã³ã確ç«ããŸãã
ãã¡ããèµ·ååã«æ¢åããã»ã¹ãšããŒã¿ãæé€ããŠãããŸãã
$ tgctl kill
kill was not performed, as no tsurugidb was running.
$ rm -rf $TSURUGI_HOME/var/data/log
$ tgctl start
successfully launched tsurugidb.ãã¹ã¿ã¯ããã¯ã°ã©ãŠã³ãã§åäœãããã°ã¯ `~/logs/master/tsurugidb.INFO` ã«åºåãããŸãã
ããã«æ¬¡ã®ãããªè¡ã䞊ã¹ã°ã¬ããªã«ãšã®æ¥ç¶ã確ç«ãããµã€ã³ã§ãã
I20251028 18:46:24.240554 1603145 datastore_impl.cpp:199] /:limestone:api:datastore_impl:create_log_channel_connector Log channel successfully created to 127.0.0.1:12346ãã®ãã°ã確èªã§ããã°ããã¹ã¿ã®èµ·åããã³ã¬ããªã«ãžã®æ¥ç¶ãæåãããšå€æã§ããŸãã
ã¬ããªã«åŽã§ã¯å€§ããªè¿œå ãã°ã¯åºãŸãããã`tgreplica` ããã»ã¹ãåŒãç¶ãåŸ
æ©ãç¶ããŠããããšã確èªããŠãããŸãã
4.2 ã¬ããªã±ãŒã·ã§ã³æ§æã§ã®æäœ
4.2.1 èµ·åçŽåŸã®ç¶æ ç¢ºèª (ãã¹ã¿åŽã¿ãŒããã«)
ãŸãããã¹ã¿ãšã¬ããªã«ã®ããŒã¿ãã£ã¬ã¯ããªãã¯ãªãŒã³ãªç¶æ ã§æã£ãŠããããšã確èªããŸãã
$ ls -l ~/opt/tsurugi-1.6.0/var/data/log/
åèš 28
drwxrwxr-x 2 umegane umegane 4096 10æ 28 18:53 blob
-rw-rw-r-- 1 umegane umegane 81 10æ 28 18:53 compaction_catalog
drwxrwxr-x 2 umegane umegane 4096 10æ 28 18:53 ctrl
drwxrwxr-x 2 umegane umegane 4096 10æ 28 18:53 data
-rw-rw-r-- 1 umegane umegane 18 10æ 28 18:53 epoch
-rw-rw-r-- 1 umegane umegane 109 10æ 28 18:53 limestone-manifest.json
-rw-rw-r-- 1 umegane umegane 272 10æ 28 18:53 pwal_0000
$ ls -l ~/opt/replica/var/data/log/
åèš 20
drwxrwxr-x 2 umegane umegane 4096 10æ 28 18:53 blob
-rw-rw-r-- 1 umegane umegane 81 10æ 28 18:53 compaction_catalog
-rw-rw-r-- 1 umegane umegane 18 10æ 28 18:53 epoch
-rw-rw-r-- 1 umegane umegane 109 10æ 28 18:53 limestone-manifest.json
-rw-rw-r-- 1 umegane umegane 272 10æ 28 18:53 pwal_0000èµ·åçŽåŸã¯ããã¹ã¿åŽã« `ctrl/` ã `data/` ãã£ã¬ã¯ããªãçæãããŠããç¹ä»¥å€ã¯ã»ãŒåãæ§æã§ãã
4.2.2 SQLå®è¡ãšWALåæ (ãã¹ã¿åŽã¿ãŒããã«)
ãããããã¹ã¿åŽã®ããŒã¿ããŒã¹ãæŽæ°ããŠãããŸããæäœèªäœã¯å
ã«ç޹ä»ãã
ã3.3 SQLã®å®è¡ãã®æé ã§åãSQLãå®è¡ããã¬ããªã«åŽã«ãã°ã転éã»é©çšãããæ§åã远跡ããŸãã
å®è¡åŸã«å床ãã£ã¬ã¯ããªã確èªãããšããã¹ã¿ãšã¬ããªã«ã®åæ¹ã§ãã°ãã¡ã€ã«çŸ€ãå¢ããŠããããšãåãããŸãã
$ ls -l ~/opt/tsurugi-1.6.0/var/data/log/
åèš 32
drwxrwxr-x 2 umegane umegane 4096 10æ 28 18:53 blob
-rw-rw-r-- 1 umegane umegane 81 10æ 28 18:53 compaction_catalog
drwxrwxr-x 2 umegane umegane 4096 10æ 28 18:53 ctrl
drwxrwxr-x 2 umegane umegane 4096 10æ 28 18:53 data
-rw-rw-r-- 1 umegane umegane 63 10æ 28 18:56 epoch
-rw-rw-r-- 1 umegane umegane 109 10æ 28 18:53 limestone-manifest.json
-rw-rw-r-- 1 umegane umegane 487 10æ 28 18:56 pwal_0000
-rw-rw-r-- 1 umegane umegane 241 10æ 28 18:56 pwal_0001
$ ls -l ~/opt/replica/var/data/log/
åèš 24
drwxrwxr-x 2 umegane umegane 4096 10æ 28 18:53 blob
-rw-rw-r-- 1 umegane umegane 81 10æ 28 18:53 compaction_catalog
-rw-rw-r-- 1 umegane umegane 63 10æ 28 18:56 epoch
-rw-rw-r-- 1 umegane umegane 109 10æ 28 18:53 limestone-manifest.json
-rw-rw-r-- 1 umegane umegane 487 10æ 28 18:56 pwal_0000
-rw-rw-r-- 1 umegane umegane 241 10æ 28 18:56 pwal_0001ãã¹ã¿ãšã¬ããªã«ã®åæ¹ã«åãWAL (`pwal_0000`, `pwal_0001`) ãçæããããã¯ãµã€ãºãå¢å ããŠããããšã確èªã§ããŸãã
ãããŸã§ã§ããã°è»¢éãšé©çšãæ£ããåäœããŠããããšãåãããŸãã
4.3 ãã§ã€ã«ãªãŒããŒã®æ€èšŒ
4.3.1 ããã»ã¹ã®åæ¢ (ã¬ããªã«åŽâãã¹ã¿åŽ)
ã¬ããªã±ãŒã·ã§ã³ç¶æ
ã確èªãçµãããããŸãã¬ããªã«åŽã® `tgreplica` ã忢ããŸãã
忢ã³ãã³ãã¯çšæãããŠããªãããã`Ctrl+C` ã§ãã©ã¢ã°ã©ãŠã³ãããã»ã¹ãçµäºãããŸãã
忢çŽåŸã«ãã¬ããªã±ãŒã·ã§ã³çšã®ç°å¢å€æ°ãè§£é€ããŠãããŸãããã®ç°å¢å€æ°ãè§£é€ããããšã«ããã
ã¹ã¿ã³ãã¢ããŒã³ã§åäœããããã«ãªããŸãã
$ unset TSURUGI_REPLICATION_ENDPOINTç¶ããŠãã¹ã¿åŽã®ã¿ãŒããã«ã§Tsurugiã忢ããŸãã
$ tgctl shutdown
.
successfully shutdown tsurugidb.ãã¹ã¿åŽã§ã忢åŸããã«åãç°å¢å€æ°ãè§£é€ããã¹ã¿ã³ãã¢ããŒã³ã§åäœããããã«ããŸãã
$ unset TSURUGI_REPLICATION_ENDPOINT4.3.2 ãã¹ã¿åŽã§ã®åèµ·åãšæŽæ° (ãã¹ã¿åŽã¿ãŒããã«)
ãã¹ã¿åŽã®ã¿å床起åããã¹ã¿ã³ãã¢ããŒã³æ§æãšããŠåäœãããŸãã
$ tgctl start
successfully launched tsurugidb.ç¶ã㊠`tgsql` ãèµ·åãããµã³ãã«ããŒãã«ã®å€ãæŽæ°ããŸããããã§ã¯ `demo_table` ã®
`value` åã1ä»¶ã ãæžãæããã·ã³ãã«ãª `UPDATE` æãæµããŸãã
$ tgsql -c ipc:tsurugi
[main] INFO com.tsurugidb.tgsql.core.TgsqlRunner - establishing connection: ipc:tsurugi
[main] INFO com.tsurugidb.tgsql.core.TgsqlRunner - start repl
tgsql> UPDATE demo_table SET value = value + 100 WHERE id = 1;
start transaction implicitly. option=[
type: OCC
label: "tgsql-implicit-transaction2025-10-28 19:10:58.742+09:00"
]
Time: 10.222 ms
(1 row updated)
Time: 5.467 ms
transaction commit(DEFAULT) finished implicitly.
Time: 13.621 ms
tgsql> SELECT * FROM demo_table;
start transaction implicitly. option=[
type: OCC
label: "tgsql-implicit-transaction2025-10-28 19:11:11.439+09:00"
]
Time: 0.287 ms
[id: INT, name: VARCHAR(64), value: INT]
[1, alpha, 200]
[2, bravo, 200]
[3, charlie, 300]
(3 rows)
Time: 6.929 ms
transaction commit(DEFAULT) finished implicitly.
Time: 2.145 ms
tgsql>
[main] INFO com.tsurugidb.tgsql.core.TgsqlRunner - repl execution was successfully completedãã®æäœã«ãã£ãŠãã¬ããªã±ãŒã·ã§ã³æ©èœãç¡å¹åããç¶æ
ã§ãããŒãã«ãæŽæ°ããã
SQLå®è¡çµæãå³åº§ã«åæ ãããããšã確èªã§ããŸãã
æ¬¡ã®æäœã«å ¥ãåã«ããã¹ã¿ã忢ããŠãããŸãã
$ tgctl shutdown
.
successfully shutdown tsurugidb.4.3.3 ã¬ããªã«åŽã§åäœèµ·åãšç¢ºèª (ã¬ããªã«åŽã¿ãŒããã«)
ããããã®æäœã¯ã¬ããªã«åŽã¿ãŒããã«ã§è¡ããŸããã¹ã¿ã³ãã¢ããŒã³ãšããŠèµ·åããããã
å
ã»ã©è§£é€ããã¬ããªã±ãŒã·ã§ã³çšç°å¢å€æ°ããã®ãŸãŸã«ã㊠Tsurugi ãç«ã¡äžããŸãã
æåã®è©Šè¡ã§ã¯ããŸã ãã¹ã¿åŽã®ããã»ã¹ãæ®ã£ãŠããå Žåã«ãšã©ãŒãšãªãããšãããããã
å¿
èŠã«å¿ããŠæ°ç§åŸ
ã£ãŠããå床起åããŸãã
$ tgctl start
successfully launched tsurugidb.tgreplica ãé©çšããŠããããŒã¿ããã®ãŸãŸåŒãç¶ãã§ tgctl start ãæåããã¬ããªã«åŽã ãã§ãµãŒãã¹ãç¶ç¶ã§ããç¶æ ã«ãªããŸããã
ããã¯ããã¹ã¿ã忢ããå Žåã«ã¬ããªã«ãåç¬ã§èµ·åããŠåŠçãç¶ç¶ã§ããããšã瀺ããŠããããã§ã€ã«ãªãŒããŒæã®ãã¹ã¿åãæ¿ãã®åºæ¬çãªåäœã確èªã§ããäŸãšãããŸãã
èµ·ååŸã« tgsql ã§å 容ã確èªãããšãã¬ããªã±ãŒã·ã§ã³çµç±ã§åãåã£ãææ°ã®ç¶æ ãæ£ããåŒãç¶ãããŠããããšãåãããŸãã
$ tgsql -c ipc:tsurugi
[main] INFO com.tsurugidb.tgsql.core.TgsqlRunner - establishing connection: ipc:tsurugi
[main] INFO com.tsurugidb.tgsql.core.TgsqlRunner - start repl
tgsql> SELECT * FROM demo_table;
start transaction implicitly. option=[
type: OCC
label: "tgsql-implicit-transaction2025-10-28 19:23:42.866+09:00"
]
Time: 16.809 ms
[id: INT, name: VARCHAR(64), value: INT]
[1, alpha, 100]
[2, bravo, 200]
[3, charlie, 300]
(3 rows)
Time: 13.199 ms
transaction commit(DEFAULT) finished implicitly.
Time: 3.212 ms
tgsql>
[main] INFO com.tsurugidb.tgsql.core.TgsqlRunner - repl execution was successfully completedãã®çµæãããã¬ããªã±ãŒã·ã§ã³çšŒåäžã«ãã¹ã¿ã§è¡ã£ã倿Žã¯ã¬ããªã«ã«åæ ãããŠããäžæ¹ã
ã¬ããªã±ãŒã·ã§ã³åæ¢åŸã«ãã¹ã¿ã§è¿œå å®è¡ãã `UPDATE` ã¯åœç¶ãªããåæ ãããŠããªãããšã確èªã§ããŸãã
確èªãå®äºãããCTRL+Dã§tgsqlãçµäºãããã®ã次ã®ã³ãã³ããå®è¡ããŠTsurugiã忢ããŠãããŸãã
$ tgctl shutdown5. TPC-Cãã³ãããŒã¯ãåãã
ããããã¯ãã¬ããªã±ãŒã·ã§ã³æ§æãèžãŸã㊠TPC-C ãã³ãããŒã¯ãåããæé ããŸãšããŠãããŸãã
ãŸãã¯ã»ããã¢ãããåºããåŸç¶ã®æž¬å®ãæ¯èŒãã¹ã ãŒãºã«é²ãç¶æ
ãäœããŸãã
4ç« ã§çšæãããã¹ã¿ïŒã¬ããªã«ã®ãã£ã¬ã¯ããªæ§æãšç°å¢å€æ°èšå®ããã®ãŸãŸäœ¿ãããã¹ã¿åŽã¿ãŒããã«ã§äœæ¥ãé²ããŸãã
5.1 ãªããžããªã®ååŸãšãã«ã (ãã¹ã¿åŽã¿ãŒããã«)
TPC-C ãã³ãããŒã¯äžåŒã¯ `tsubakuro-examples` ãªããžããªã«åããããŠããŸãã
次㮠3 ã¹ãããã§ã©ã³ããŒãšããŒã¿çæããŒã«ããŸãšããŠãã«ãããŠãããŸãã
`~/benchmarks` ã«äœæ¥ãã£ã¬ã¯ããªãçšæããŠãªããžããªãååŸãã
`gradlew clean build` ã§ `tpcc` ã¢ãžã¥ãŒã«ããã«ããã
CMake ã§ `tpc-c-datagen` ããã«ãããåæããŒã¿çæãã€ããªãäœã
$ mkdir -p ~/benchmarks
$ cd ~/benchmarks
$ git clone https://github.com/project-tsurugi/tsubakuro-examples.git
$ cd tsubakuro-examples/modules/tpcc
$ ../../gradlew clean build
$ cd ~/benchmarks/tsubakuro-examples/tools/tpc-c-datagen
$ mkdir -p build
$ cd build
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Release ..
$ cmake --build .5.2 ã¹ã¿ã³ãã¢ããŒã³ç°å¢ã§TPC-CãåãããŠã¿ã
5.2.1 ã¹ã¿ã³ãã¢ããŒã³ç°å¢ã®åæå (ãã¹ã¿åŽã¿ãŒããã«)
ã¬ããªã±ãŒã·ã§ã³èšå®ãè§£é€ãããã¹ã¿ã€ã³ã¹ã¿ã³ã¹ãã¯ãªãŒã³ãªç¶æ ã§èµ·åãçŽããŸãã`tgctl kill` ã®ã¡ãã»ãŒãžã¯æ¢ã«åæ¢ããŠããå Žåã®éç¥ãªã®ã§ããã®ãŸãŸæ¬¡ã®æé ã«é²ãã§åé¡ãããŸããã
$ unset TSURUGI_REPLICATION_ENDPOINT
$ tgctl kill
kill was not performed, as no tsurugidb was running.
$ rm -rf $TSURUGI_HOME/var/data/log/*
$ tgctl start
successfully launched tsurugidb.5.2.2 TPC-C åæããŒã¿ã®çæ (ãã¹ã¿åŽã¿ãŒããã«)
`tpc-c-datagen` ã䜿ã£ãŠååº«æ° 4 ã®ããŒã¿ã»ãããçæããŸãã`-w` ã§æå®ããå€ã¯ç·å庫æ°ã§ãããåŸã§ãã³ãããŒã¯ãå®è¡ããã¹ã¬ããæ°ä»¥äžã§ããå¿ èŠããããŸããç¡éã«å€§ããªå€ãèšå®ãããšçæããŒã¿éã ããå¢ããŠããŸããããåºæ¬çã«ã¯ã¹ã¬ããæ°ãšåãå€ãæå®ããã®ãããããã§ããåºåå ã® `~/tpcc-data` ãååšããå Žåã¯ãçæåã«åé€ããŠãããŸããããã§ã¯ã¹ã¬ããæ° 4 ã§æž¬å®ããã®ã§ãå庫æ°ã 4 ãæå®ããŠããŸãã
$ ~/benchmarks/tsubakuro-examples/tools/tpc-c-datagen/build/src/tpcc-datagen -w 4 -o $HOME/tpcc-data5.2.3 åæããŒã¿ã®ããŒã (ãã¹ã¿åŽã¿ãŒããã«)
äœæããããŒã¿ã `runTpccLoader` ã¿ã¹ã¯ã§ããŒãããŸãã
$ cd ~/benchmarks/tsubakuro-examples
$ ./gradlew runTpccLoader --args="-w 4 -d $HOME/tpcc-data"
BUILD SUCCESSFUL in 18s
9 actionable tasks: 1 executed, 8 up-to-date5.2.4 TPC-C ã®å®è¡ (ãã¹ã¿åŽã¿ãŒããã«)
åŒãç¶ãã¹ã¿ã³ãã¢ããŒã³æ§æã®ãŸãŸãTPC-C ãäžåºŠå®è¡ããŠãããŸãã
`--args="4 60"` ã®æåã®å€ã¯ã¹ã¬ããæ°ã2çªç®ã®å€ã¯å®è¡æéïŒç§ïŒãæå³ããŸããä»åã¯å庫æ°ãšæããŠã¹ã¬ããæ°ã 4ãæéã 60 ç§ã«æå®ããŸããã
$ cd ~/benchmarks/tsubakuro-examples
$ ./gradlew runTpcc --args="4 60"
> Task :tpcc:runTpcc
benchmark started, warehouse = 4, threads = 4
benchmark stoped
duration(mS): 60021
===============================================================================================
new order: 108041255 / 4465 = 24197 (us)
payment: 100104854 / 4281 = 23384 (us)
order status: 7613202 / 428 = 17788 (us)
delivery: 16644027 / 399 = 41714 (us)
stock level: 7670833 / 409 = 18755 (us)
===============================================================================================
tx type: invocation:completion(:intentional rollback) - retry on statement:retry on commit
-----------------------------------------------------------------------------------------------
new order: 5250: 4407: 58 - 36: 749
payment: 4688: 4281 - 0: 407
order status: 428: 428 - 0: 0
delivery: 461: 399 - 7: 55
stock level: 424: 409 - 3: 12
-----------------------------------------------------------------------------------------------
new order: ORDERS 36 DISTRICT 0 WAREHOUSE 0 CUSTOMER 0 STOCK 0
payment: ORDERS 0 DISTRICT 0 WAREHOUSE 0 CUSTOMER 0 STOCK 0
order status: ORDERS 0 DISTRICT 0 WAREHOUSE 0 CUSTOMER 0 STOCK 0
delivery: ORDERS 7 DISTRICT 0 WAREHOUSE 0 CUSTOMER 0 STOCK 0
stock level: ORDERS 0 DISTRICT 0 WAREHOUSE 0 CUSTOMER 0 STOCK 3
-----------------------------------------------------------------------------------------------
##NoTPM=4405.42
response time distribution for new order transaction
1- 10(ms): 9 29 17 1 0 0 0 1 0 0
11- 20(ms): 1 4 2 21 44 51 57 22 197 1371
21- 30(ms): 422 222 139 180 180 128 51 73 207 486
31- 40(ms): 141 42 27 15 33 37 58 32 27 36
41- 50(ms): 14 4 3 11 9 6 2 1 1 3
51- 60(ms): 4 9 8 3 3 3 2 1 5 2
61- 70(ms): 4 0 1 1 0 0 1 1 0 0
71- 80(ms): 0 0 0 0 0 0 0 0 0 0
81- 90(ms): 0 0 0 0 0 0 0 0 0 0
91-100(ms): 0 0 0 0 0 0 0 0 0 0
101(ms)- : 0
BUILD SUCCESSFUL in 1m
9 actionable tasks: 1 executed, 8 up-to-dateåºåã®äž»ãªèªã¿æ¹ãæŽçããŠãããŸãã
`benchmark started, warehouse = 4, threads = 4` ã®è¡ã§å®è¡æ¡ä»¶ïŒå庫æ°ã»ã¹ã¬ããæ°ïŒãå確èªã§ããŸãã
1 ã€ç®ã®ããŒãã« (`new order: 108041255 / 4465 = 24197 (us)` ãªã©) ã¯ãTPC-C ãå®çŸ©ãã 5 çš®é¡ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«ã€ããŠã环èšåŠçæé (µs) / å®äºä»¶æ° = å¹³åã¬ã€ãã³ã· (µs)ãã衚瀺ããŠããŸãã
`##NoTPM=4405.42` 㯠Number of Transactions Per Minute ã®ç¥ã§ãå šãã©ã³ã¶ã¯ã·ã§ã³ã®å®äºæ°ã 1 åãããã«æç®ããå€ã§ãã
æåŸã®ãresponse time distributionã㯠`new order` ã®å¿çæéã 10ms å»ã¿ã§äžŠã¹ããã¹ãã°ã©ã ã§ãã¬ããªã±ãŒã·ã§ã³æå¹æãšã®æ¯èŒã«äœ¿ããŸãã
TPC-C ã¯ãæ°èŠå泚ããæ±ºæžããåºè·ããªã©æ¥åãã©ã³ã¶ã¯ã·ã§ã³ãæš¡ããã¯ãŒã¯ããŒãã§ããããã§åŸãåºæºå€ãææ¡ããŠãããšã次ã®ã¹ãããã§ã¬ããªã±ãŒã·ã§ã³ãæå¹åããéã®å·®åãè©äŸ¡ãããããªããŸãã
5.3 ã¬ããªã±ãŒã·ã§ã³ç°å¢ã§TPC-CãåãããŠã¿ã
ç¶ããŠãã¬ããªã±ãŒã·ã§ã³ãæå¹åããæ§æã§ TPC-C ãå®è¡ããŸããåºæ¬çã«ã¯ 4 ç« ãš 5.2 ã®äœæ¥ãçµã¿åããã`tgreplica` ã皌åãããç¶æ ã§ãã¹ã¿åŽãããã³ãããŒã¯ãæµããŸãã
5.3.1 äºåã¯ãªãŒã³ã¢ãã (ãã¹ã¿åŽã¿ãŒããã«)
ãŸããã¹ã¿åŽã§ããã»ã¹ã忢ããã¬ããªã±ãŒã·ã§ã³åãã®ç°å¢å€æ°ãèšå®ããããã§ããŒã¿é åãåæåããŸãã
$ export TSURUGI_HOME=$HOME/opt/tsurugi-1.6.0
$ export PATH=$TSURUGI_HOME/bin:$PATH
$ tgctl kill
kill was not performed, as no tsurugidb was running.
$ rm -rf $TSURUGI_HOME/var/data/log/*
$ export TSURUGI_REPLICATION_ENDPOINT="tcp://127.0.0.1:12346"
$ export REPLICATION_ASYNC_SESSION_CLOSE=boost_thread_pool_async
$ export REPLICATION_ASYNC_GROUP_COMMIT=boost_thread_pool_async5.3.2 ã¬ããªã«ã®èµ·å (ã¬ããªã«åŽã¿ãŒããã«)
ã¬ããªã«çšã€ã³ã¹ã¿ã³ã¹ã«åãæ¿ãããã°é åãã¯ãªãŒã³ã«ã㊠`tgreplica` ãåŸ ã¡åãç¶æ ã«ããŸãã`tgreplica` ã¯ãã©ã¢ã°ã©ãŠã³ãã§åäœããããããã®ã¿ãŒããã«ã¯éãããŸãŸã«ããŠãããŸãã
$ export TSURUGI_HOME=$HOME/opt/replica
$ export PATH=$TSURUGI_HOME/bin:$PATH
$ export TSURUGI_REPLICATION_ENDPOINT="tcp://0.0.0.0:12346"
$ rm -rf $TSURUGI_HOME/var/data/log/*
$ tgreplica $TSURUGI_HOME/var/data
Endpoint: 0.0.0.0:12346
WARNING: Logging before InitGoogleLogging() is written to STDERR
I20251030 20:20:59.695940 1628556 datastore_impl.cpp:39] /:limestone:api:datastore_impl:datastore_impl REPLICATION_ASYNC_SESSION_CLOSE: disabled
I20251030 20:20:59.695982 1628556 datastore_impl.cpp:41] /:limestone:api:datastore_impl:datastore_impl REPLICATION_ASYNC_GROUP_COMMIT: disabled
I20251030 20:20:59.695989 1628556 datastore_impl.cpp:46] /:limestone:api:datastore_impl:datastore_impl Replica enabled; endpoint valid: 1
I20251030 20:20:59.695995 1628556 datastore.cpp:89] /:limestone:config:datastore setting log location = /home/umegane/opt/replica/var/data/log
I20251030 20:20:59.706000 1628556 datastore.cpp:158] /:limestone:config:datastore setting the number of recover process thread = 8
[replica] initialized and listeningãã¹ã¿åŽãã㯠`tcp://127.0.0.1:12346` ã§æ¥ç¶ããŸãããããã§ã¯ 0.0.0.0 ã§åŸ ã¡åããããšã§ããŒã«ã«ãã¹ãå®ã®æ¥ç¶ãåãä»ããããããã«ããŠããŸãã
5.3.3 ãã¹ã¿ã®èµ·åãšããŒã¿ããŒã (ãã¹ã¿åŽã¿ãŒããã«)
$ tgctl start
successfully launched tsurugidb.èµ·ååŸãã¬ããªã±ãŒã·ã§ã³ãæå¹ãªãŸãŸ `runTpccLoader` ãå®è¡ããã¹ã¿ã³ãã¢ããŒã³æã«äœæãã `~/tpcc-data` ãããŒãããŸãã
$ cd ~/benchmarks/tsubakuro-examples
$ ./gradlew runTpccLoader --args="-w 4 -d $HOME/tpcc-data"
BUILD SUCCESSFUL in 22s
9 actionable tasks: 1 executed, 8 up-to-date5.3.4 TPC-C ã®å®è¡ (ãã¹ã¿åŽã¿ãŒããã«)
æºåãæŽã£ãããã¹ã¿ã³ãã¢ããŒã³æ§æãšåãæ¡ä»¶ã§ `runTpcc` ãå®è¡ããŸãã`--args="4 60"` ã® 4 ã¯ã¹ã¬ããæ°ã60 ã¯å®è¡æéïŒç§ïŒã§ãã
$ cd ~/benchmarks/tsubakuro-examples
$ ./gradlew runTpcc --args="4 60"
> Task :tpcc:runTpcc
benchmark started, warehouse = 4, threads = 4
benchmark stoped
duration(mS): 60034
===============================================================================================
new order: 106797664 / 4229 = 25254 (us)
payment: 101104122 / 4125 = 24510 (us)
order status: 7981117 / 422 = 18913 (us)
delivery: 16659709 / 385 = 43272 (us)
stock level: 7580120 / 381 = 19895 (us)
===============================================================================================
tx type: invocation:completion(:intentional rollback) - retry on statement:retry on commit
-----------------------------------------------------------------------------------------------
new order: 4974: 4199: 30 - 34: 711
payment: 4511: 4125 - 1: 385
order status: 422: 422 - 0: 0
delivery: 446: 385 - 7: 54
stock level: 387: 381 - 1: 5
-----------------------------------------------------------------------------------------------
new order: ORDERS 32 DISTRICT 1 WAREHOUSE 0 CUSTOMER 1 STOCK 0
payment: ORDERS 0 DISTRICT 0 WAREHOUSE 1 CUSTOMER 0 STOCK 0
order status: ORDERS 0 DISTRICT 0 WAREHOUSE 0 CUSTOMER 0 STOCK 0
delivery: ORDERS 7 DISTRICT 0 WAREHOUSE 0 CUSTOMER 0 STOCK 0
stock level: ORDERS 0 DISTRICT 0 WAREHOUSE 0 CUSTOMER 0 STOCK 1
-----------------------------------------------------------------------------------------------
##NoTPM=4196.62
response time distribution for new order transaction
1- 10(ms): 5 13 6 5 0 0 0 0 0 0
11- 20(ms): 2 1 1 25 41 58 51 34 188 769
21- 30(ms): 358 275 227 238 234 179 130 118 265 387
31- 40(ms): 107 71 54 39 26 43 62 46 30 22
41- 50(ms): 16 8 5 5 12 9 4 4 4 5
51- 60(ms): 4 8 3 3 3 0 2 1 3 5
61- 70(ms): 2 3 0 0 0 2 2 0 1 1
71- 80(ms): 0 0 0 0 0 0 1 0 1 0
81- 90(ms): 1 0 0 0 0 0 0 0 0 0
91-100(ms): 0 0 0 0 0 0 0 0 0 0
101(ms)- : 1
BUILD SUCCESSFUL in 1m
9 actionable tasks: 1 executed, 8 up-to-dateã¹ã¿ã³ãã¢ããŒã³æ§æïŒ5.2.4ïŒã®çµæãšæ¯ã¹ããšãNoTPM ãçŽ 4405 ãã 4197 ãžå°å¹ ã«äœäžããå¹³åã¬ã€ãã³ã·ãåçšåºŠã®å¢å ã«åãŸã£ãŠããŸãã
5.3.5 çµäºåŠç
ãã³ãããŒã¯ãå®äºããããå ã«ã¬ããªã«ã忢ããç¶ããŠãã¹ã¿ãã·ã£ããããŠã³ããŸããç°å¢å€æ°ãè§£é€ããæ¬¡ã®æž¬å®ã«åããŠã¯ãªãŒã³ãªç¶æ ãžæ»ããŠãããŸãã
# ã¬ããªã«åŽã¿ãŒããã«
Ctrl+C ã§ tgreplica ã忢
$ unset TSURUGI_REPLICATION_ENDPOINT
# ãã¹ã¿åŽã¿ãŒããã«
$ tgctl shutdown
successfully shutdown tsurugidb.
$ unset TSURUGI_REPLICATION_ENDPOINT6. ãŸãšã
ãã®èšäºã§ã¯ãã¬ããªã±ãŒã·ã§ã³æ©èœãæå¹ã«ãã Tsurugi ã§ TPC-C ãã³ãããŒã¯ãåãããŸã§ã®æé ããã¹ã¿ã³ãã¢ããŒã³æ§æã®æºåããã¬ããªã«ã®èµ·åã»æ§èœæž¬å®ãŸã§é ã«æŽçããŸããã
ã¹ã¿ã³ãã¢ããŒã³æ§æãšã¬ããªã±ãŒã·ã§ã³æ§æã®çµæãæ¯ã¹ããšãNoTPM ã¯çŽ 4405 â 4197 ãšå°å¹
ãªäœäžã«çãŸããã¬ã€ãã³ã·ã®äŒžã³ãéå®çã§ããã
ã¬ããªã±ãŒã·ã§ã³ã®ãªãŒããŒãããã®åœ±é¿ã¯ã¯ãŒã¯ããŒãã«ãã£ãŠå€§ããç°ãªããä»åã®TPC-Cãã³ãããŒã¯ãåäžãµãŒãã«ã¬ããªã±ãŒã·ã§ã³ãããšããã®ã¯ããããã¯ãŒã¯ã®åœ±é¿ãåãã¥ãããæ¯èŒçãªãŒããŒããããå°ãããªãæ§æã§ããããšããããè¯å¥œãªçµæãåŸãããŸããã
ãã®ä»ã®å"Tsurugi"ã䜿ãéã«åœ¹ç«ã€Tipséã¯ã³ãã©ïŒ
次äžä»£é«éRDBå"Tsurugi"ã¯ããªãŒãã³ãœãŒã¹ã§å
¬éäžã§ãã
ã©ãªãã§ãç¡æã§ããŠã³ããŒãã§ããŸãã®ã§ãæ¯éè§Šã£ãŠã¿ãŠãã ããã
ããŠã³ããŒãã¯ã³ãã©ãã
https://www.tsurugidb.com/