{"id":305773,"date":"2020-06-23T09:00:38","date_gmt":"2020-06-23T09:00:38","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=305773"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=305773","title":{"rendered":"\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f SELECT \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/507824\/\">\n<h1 id=\"testirovanie-gorizontalnogo-masshtabirovaniya-select-zaprosov-na-repliku\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f SELECT \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443<\/h1>\n<p>  <\/p>\n<p>\u0426\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 SELECT \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u0421\u0445\u0435\u043c\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0430\u044f.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/op\/zi\/t0\/opzit0s2opxwhigvzdmpubiypry.png\"><\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"postgresql-klaster\">PostgreSQL \u043a\u043b\u0430\u0441\u0442\u0435\u0440<\/h2>\n<p>  <\/p>\n<h2 id=\"harakteristiki-postgresql-klastera\">\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 PostgreSQL \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/h2>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043b\u044f PostgreSQL \u043f\u043e 2 \u0413\u0411 \u041e\u0417\u0423, \u0447\u0442\u043e\u0431\u044b \u0431\u0434 \u043d\u0435 \u0432\u0432\u043b\u0435\u0437\u0430\u043b\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 3 \u043d\u043e\u0434\u044b Etcd \u043f\u043e 1\u0413\u0411.<\/p>\n<p>  <\/p>\n<h2 id=\"ustanovka\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/h2>\n<p>  <\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c PostgreSQL \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <a href=\"https:\/\/github.com\/vitabaks\/postgresql_cluster\" rel=\"nofollow\">https:\/\/github.com\/vitabaks\/postgresql_cluster<\/a><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">git clone https:\/\/github.com\/vitabaks\/postgresql_cluster<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0432 inventory \u043d\u0430 \u0441\u0432\u043e\u0438. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 var\/main.yaml<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">synchronous_mode: true<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c Haproxy, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u0442\u043e Leader, \u0430 \u043a\u0442\u043e c \u043f\u043e\u043c\u043e\u0449\u044c\u044e health check<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">with_haproxy_load_balancing: true<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u043c pgbouncer, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0448\u0430\u0442\u044c \u044d\u043a\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0443.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">install_pgbouncer: false<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f test \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c password<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">postgresql_users:    - {name: &quot;test&quot;, password: &quot;password&quot;}    - {name: &quot;pgbenchwrite&quot;, password: &quot;password&quot;}    - {name: &quot;pgbenchread&quot;, password: &quot;password&quot;}<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0434 test \u0441 owner test<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">postgresql_databases:    - {db: &quot;test&quot;, encoding: &quot;UTF8&quot;, lc_collate: &quot;ru_RU.UTF-8&quot;, lc_ctype: &quot;ru_RU.UTF-8&quot;, owner: &quot;test&quot;}    - {db: &quot;pgbenchread&quot;, encoding: &quot;UTF8&quot;, lc_collate: &quot;ru_RU.UTF-8&quot;, lc_ctype: &quot;ru_RU.UTF-8&quot;, owner: &quot;pgbenchread&quot;}<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c max_connections<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> postgresql_parameters:   - {option: &quot;max_connections&quot;, value: &quot;150&quot;}<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u0434 \u0438 \u044e\u0437\u0435\u0440\u0430 test \u0432 pg_hba<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">postgresql_pg_hba: ...   - {type: &quot;host&quot;, database: &quot;test&quot;, user: &quot;test&quot;, address: &quot;0.0.0.0\/0&quot;, method: &quot;md5&quot;}   - {type: &quot;host&quot;, database: &quot;pgbenchwrite&quot;, user: &quot;pgbenchwrite&quot;, address: &quot;0.0.0.0\/0&quot;, method: &quot;md5&quot;}   - {type: &quot;host&quot;, database: &quot;pgbenchread&quot;, user: &quot;pgbenchread&quot;, address: &quot;0.0.0.0\/0&quot;, method: &quot;md5&quot;}<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u044e\u043d\u0438\u043d\u0433 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0434\u0435\u0441\u044c: <a href=\"http:\/\/pgconfigurator.cybertec.at\/\" rel=\"nofollow\">http:\/\/pgconfigurator.cybertec.at\/<\/a><\/p>\n<p>  <\/p>\n<h2 id=\"proverka-klastera\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0443 \u0432\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">patronictl -c \/etc\/patroni\/patroni.yml list<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/14\/g9\/kl\/14g9kluwlob-bcp3nkci4huoyoe.png\"><\/p>\n<p>  <\/p>\n<h2 id=\"testirovanie-s-ispolzovaniem-pgbench\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c pgbench<\/h2>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a pgbench-\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c ip \u0434\u043b\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0438, \u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c 2 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 pgbench: \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c update, \u0432\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e select-only \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/usr\/pgsql-12\/bin\/pgbench -h 172.26.10.73 -p 5000 -U pgbenchwrite -i -s 150 pgbenchwrite \/usr\/pgsql-12\/bin\/pgbench -h 172.26.10.73 -p 5000 -U pgbenchread -i -s 150 pgbenchread<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c 2 \u043a\u043e\u043d\u0441\u043e\u043b\u044f\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e pgbench write-only \u0438 select-only, \u0433\u0434\u0435 \u0432\u0441\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u044b \u0438\u0434\u0443\u0442 \u043a master<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/usr\/pgsql-12\/bin\/pgbench -h 172.26.10.73 -p 5000 -U pgbenchwrite -c 50 -j 2 -P 60 -T 600 -N pgbenchwrite \/usr\/pgsql-12\/bin\/pgbench -h 172.26.10.73 -p 5000 -U pgbenchread -c 50 -j 2 -P 60 -T 600 -S pgbenchread<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 pgbench write-only:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/usr\/pgsql-12\/bin\/pgbench -h 172.26.10.73 -p 5000 -U pgbenchwrite -c 50 -j 2 -P 60 -T 600 -N pgbenchwrite Password:  starting vacuum...end. progress: 60.0 s, 113.8 tps, lat 436.492 ms stddev 228.613 progress: 120.0 s, 112.1 tps, lat 445.698 ms stddev 181.140 progress: 180.0 s, 119.9 tps, lat 412.778 ms stddev 400.669 progress: 240.0 s, 110.7 tps, lat 452.843 ms stddev 364.284 progress: 300.0 s, 38.2 tps, lat 1284.131 ms stddev 868.801 progress: 360.0 s, 52.2 tps, lat 983.476 ms stddev 859.265 progress: 420.0 s, 62.9 tps, lat 791.075 ms stddev 704.830 progress: 480.0 s, 70.6 tps, lat 698.554 ms stddev 725.389 progress: 540.0 s, 68.9 tps, lat 739.978 ms stddev 787.998 progress: 600.0 s, 75.3 tps, lat 662.032 ms stddev 721.487 transaction type: &lt;builtin: simple update&gt; scaling factor: 150 query mode: simple number of clients: 50 number of threads: 2 duration: 600 s number of transactions actually processed: 49527 latency average = 606.825 ms latency stddev = 608.772 ms tps = 82.005351 (including connections establishing) tps = 82.006115 (excluding connections establishing)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 pgbench select-only:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/usr\/pgsql-12\/bin\/pgbench -h 172.26.10.73 -p 5000 -U pgbenchread -c 50 -j 2 -P 60 -T 600 -S pgbenchread Password:  starting vacuum...end. progress: 60.0 s, 88.6 tps, lat 559.665 ms stddev 169.444 progress: 120.0 s, 99.5 tps, lat 503.239 ms stddev 191.487 progress: 180.0 s, 111.4 tps, lat 448.638 ms stddev 823.392 progress: 240.0 s, 115.4 tps, lat 433.728 ms stddev 232.107 progress: 300.0 s, 75.2 tps, lat 664.727 ms stddev 442.582 progress: 360.0 s, 115.1 tps, lat 433.675 ms stddev 392.391 progress: 420.0 s, 123.1 tps, lat 407.399 ms stddev 461.501 progress: 480.0 s, 135.7 tps, lat 366.747 ms stddev 514.208 progress: 540.0 s, 119.9 tps, lat 416.024 ms stddev 529.415 progress: 600.0 s, 112.5 tps, lat 446.807 ms stddev 607.408 transaction type: &lt;builtin: select only&gt; scaling factor: 150 query mode: simple number of clients: 50 number of threads: 2 duration: 600 s number of transactions actually processed: 65823 latency average = 455.912 ms latency stddev = 490.338 ms tps = 109.546152 (including connections establishing) tps = 109.547312 (excluding connections establishing)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c 2 \u043a\u043e\u043d\u0441\u043e\u043b\u044f\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e pgbench write-only \u0438 select-only, \u0433\u0434\u0435 \u043a\u043e\u043d\u043d\u0435\u043a\u0442 write-only \u0438\u0434\u0435\u0442 \u043a master, \u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442 select-only \u0438\u0434\u0435\u0442 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/usr\/pgsql-12\/bin\/pgbench -h 172.26.10.73 -p 5000 -U pgbenchwrite -c 50 -j 2 -P 60 -T 600 -N pgbenchwrite \/usr\/pgsql-12\/bin\/pgbench -h 172.26.10.73 -p 5002 -U pgbenchread -c 50 -j 2 -P 60 -T 600 -S pgbenchread<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 pgbench write-only:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/usr\/pgsql-12\/bin\/pgbench -h 172.26.10.73 -p 5000 -U pgbenchwrite -c 50 -j 2 -P 60 -T 600 -N pgbenchwrite Password:  starting vacuum...end. progress: 60.0 s, 171.5 tps, lat 290.534 ms stddev 198.945 progress: 120.0 s, 95.2 tps, lat 524.225 ms stddev 836.995 progress: 180.0 s, 41.6 tps, lat 1172.546 ms stddev 1184.899 progress: 240.0 s, 106.4 tps, lat 479.830 ms stddev 613.741 progress: 300.0 s, 107.4 tps, lat 456.684 ms stddev 554.722 progress: 360.0 s, 126.7 tps, lat 403.261 ms stddev 425.490 progress: 420.0 s, 171.8 tps, lat 290.589 ms stddev 306.722 progress: 480.0 s, 119.9 tps, lat 413.012 ms stddev 433.962 progress: 540.0 s, 165.5 tps, lat 305.434 ms stddev 309.429 progress: 600.0 s, 134.4 tps, lat 363.495 ms stddev 312.672 transaction type: &lt;builtin: simple update&gt; scaling factor: 150 query mode: simple number of clients: 50 number of threads: 2 duration: 600 s number of transactions actually processed: 74483 latency average = 402.763 ms latency stddev = 515.695 ms tps = 124.006808 (including connections establishing) tps = 124.008050 (excluding connections establishing)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0432\u043e\u0434 pgbench select-only:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/usr\/pgsql-12\/bin\/pgbench -h 172.26.10.73 -p 5002 -U pgbenchread -c 50 -j 2 -P 60 -T 600 -S pgbenchread Password:  starting vacuum...ERROR:  cannot execute VACUUM during recovery (ignoring this error and continuing anyway) ERROR:  cannot execute VACUUM during recovery (ignoring this error and continuing anyway) ERROR:  cannot execute TRUNCATE TABLE in a read-only transaction (ignoring this error and continuing anyway) end. progress: 60.0 s, 170.8 tps, lat 291.310 ms stddev 115.079 progress: 120.0 s, 155.4 tps, lat 320.284 ms stddev 232.217 progress: 180.0 s, 153.7 tps, lat 326.370 ms stddev 284.169 progress: 240.0 s, 211.0 tps, lat 237.428 ms stddev 210.316 progress: 300.0 s, 269.6 tps, lat 185.419 ms stddev 169.064 progress: 360.0 s, 273.1 tps, lat 183.099 ms stddev 144.569 progress: 420.0 s, 294.4 tps, lat 169.912 ms stddev 128.209 progress: 480.0 s, 311.2 tps, lat 160.646 ms stddev 115.194 progress: 540.0 s, 317.8 tps, lat 157.084 ms stddev 113.825 progress: 600.0 s, 319.5 tps, lat 156.751 ms stddev 112.012 transaction type: &lt;builtin: select only&gt; scaling factor: 150 query mode: simple number of clients: 50 number of threads: 2 duration: 600 s number of transactions actually processed: 148638 latency average = 201.815 ms latency stddev = 169.752 ms tps = 247.553623 (including connections establishing) tps = 247.556199 (excluding connections establishing)<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f write \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0442\u0435\u0441\u0442\u0435 pgbench \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 SELECT \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443:<\/strong><\/p>\n<p>  <\/p>\n<p><strong>(124-82)\/82=0.51 \u0438\u043b\u0438 51%<\/strong><\/p>\n<p>  <\/p>\n<p><strong>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f select \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0442\u0435\u0441\u0442\u0435 pgbench \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 SELECT \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443:<\/strong><\/p>\n<p>  <\/p>\n<p><strong>(247-109)\/109=1.26 \u0438\u043b\u0438 126%<\/strong><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xz\/o4\/tr\/xzo4tr5guxhcy_ytb5ygovfmsyc.png\"><\/p>\n<p>  <\/p>\n<h3 id=\"ustanavlivaem-zavisimosti-na-leader-tak-kak-na-nem-budem-zapuskat-java-prilozhenie\">\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0430 Leader, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043d\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">yum install -y java-1.8.0-openjdk-devel git mc<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"proveryaem-read-only-repliku\">\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c Read-Only \u0440\u0435\u043f\u043b\u0438\u043a\u0443<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/usr\/pgsql-12\/bin\/psql --host=172.26.10.74 -U test test Password for user test:  psql (12.3) Type &quot;help&quot; for help.  test=&gt; create  user test1 with password 'password'; ERROR:  cannot execute CREATE ROLE in a read-only transaction test=&gt; <\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"sozdaem-tablicu-scale_data-v-bd-test-ot-polzovatelya-test\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 scale_data \u0432 \u0431\u0434 test \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f test<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/usr\/pgsql-12\/bin\/psql --host=172.26.10.73 -U test test<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">CREATE TABLE scale_data (    section NUMERIC NOT NULL,    id1     NUMERIC NOT NULL,    id2     NUMERIC NOT NULL );<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"generiruem-dannye-v-tablice-scale_data\">\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 scale_data<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">INSERT INTO scale_data SELECT sections.*, gen.*      , CEIL(RANDOM()*100)    FROM GENERATE_SERIES(1, 300)     sections,        GENERATE_SERIES(1, 900000) gen  WHERE gen &lt;= sections * 3000;<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"sozdaem-indeks-i-klasterizuem-tablicu-scale_data\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 scale_data<\/h3>\n<p>  <\/p>\n<p>\u0411\u0435\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 update \u0438 select \u0431\u0443\u0434\u0443\u0442 \u0443\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0438\u0441\u043a, \u0435\u0441\u043b\u0438 \u0431\u0434 \u043d\u0435 \u0432\u043b\u0430\u0437\u0438\u0442 \u0432 \u041e\u0417\u0423. \u0410 \u044d\u0442\u043e \u043c\u0435\u0448\u0430\u0435\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0443.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">CREATE INDEX scale_slow ON scale_data (section, id1, id2);  ALTER TABLE scale_data CLUSTER ON scale_slow; CLUSTER scale_data;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0411\u0414 \u043f\u043e\u0441\u043b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/3q\/u4\/rj\/3qu4rjixnvl8yx1n0i2htsgbia8.png\"><\/p>\n<p>  <\/p>\n<h3 id=\"kloniruem-repo-jdbc-read-only-requests\">\u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043f\u043e jdbc-read-only-requests<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">git clone https:\/\/github.com\/patsevanton\/jdbc-read-only-requests.git cd jdbc-read-only-requests wget https:\/\/jdbc.postgresql.org\/download\/postgresql-42.2.14.jar<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"testirovanie-vse-zaprosy-idut-na-leader-zapusk-1-ekzemplyara-prilozheniya\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0434\u0443\u0442 \u043d\u0430 Leader. \u0417\u0430\u043f\u0443\u0441\u043a 1 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<h3 id=\"pravim-stroku-string-nodes-v-fayle-javapostgresqlrepljava\">\u041f\u0440\u0430\u0432\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443 String nodes \u0432 \u0444\u0430\u0439\u043b\u0435 JavaPostgreSqlRepl.java<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">String nodes = &quot;172.26.10.73:5000&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">String nodes = &quot;ip-\u0430\u0434\u0440\u0435\u0441-Leader:5000&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0434 \u0437\u0430\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">String nodes = &quot;ip-\u0430\u0434\u0440\u0435\u0441-Leader:5000,ip-\u0430\u0434\u0440\u0435\u0441-Leader:5002&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430 <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/String nodes = &quot;ip-\u0430\u0434\u0440\u0435\u0441-Leader:5000,ip-\u0430\u0434\u0440\u0435\u0441-Leader:5002&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_b\/g2\/jb\/_bg2jbhbz697cry2ctrmwgv9k_m.png\"><\/p>\n<p>  <\/p>\n<h3 id=\"kompiliruem-kod-i-zapuskaem-ego\">\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0433\u043e<\/h3>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">javac -cp &quot;.\/postgresql-42.2.14.jar&quot; JavaPostgreSqlRepl.java<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">java -classpath .:.\/postgresql-42.2.14.jar JavaPostgreSqlRepl<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0443\u0442 \u043d\u0430 Leader, \u0438 select, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0443\u0442 \u043d\u0430 Replica<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Master: PostgreSQL 12.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit Slave: PostgreSQL 12.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit transact: 6.00 (2.60) ms   select: 31.07 (10.99) ms transact: 0.80 (0.11) ms   select: 0.72 (0.13) ms transact: 0.75 (0.10) ms   select: 0.56 (0.10) ms transact: 0.75 (0.12) ms   select: 0.60 (0.09) ms transact: 0.82 (0.13) ms   select: 0.59 (0.09) ms transact: 1.30 (0.10) ms   select: 1.04 (0.09) ms transact: 1.74 (0.10) ms   select: 2.90 (0.10) ms transact: 2.25 (0.11) ms   select: 1.48 (0.10) ms transact: 1.55 (0.12) ms   select: 1.14 (0.11) ms transact: 1.11 (0.11) ms   select: 1.31 (0.12) ms<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"testirovanie-tranzakcii-idut-na-leader-select-idut-na-sync-standby-zapusk-1-ekzemplyara-prilozheniya\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438\u0434\u0443\u0442 \u043d\u0430 Leader. Select \u0438\u0434\u0443\u0442 \u043d\u0430 Sync Standby. \u0417\u0430\u043f\u0443\u0441\u043a 1 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<h3 id=\"pravim-stroku-string-nodes-v-fayle-javapostgresqlrepljava-1\">\u041f\u0440\u0430\u0432\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443 String nodes \u0432 \u0444\u0430\u0439\u043b\u0435 JavaPostgreSqlRepl.java<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">String nodes = &quot;ip-\u0430\u0434\u0440\u0435\u0441-Leader:5000&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/String nodes = &quot;ip-\u0430\u0434\u0440\u0435\u0441-Leader:5000&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0434 \u0440\u0430\u0441\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/String nodes = &quot;ip-\u0430\u0434\u0440\u0435\u0441-Leader:5000,ip-\u0430\u0434\u0440\u0435\u0441-Leader:5002&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430 <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">String nodes = &quot;ip-\u0430\u0434\u0440\u0435\u0441-Leader:5000,ip-\u0430\u0434\u0440\u0435\u0441-Leader:5002&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/0i\/hk\/ft\/0ihkft7bcclqzt8cwexsler0zf4.png\"><\/p>\n<p>  <\/p>\n<h3 id=\"kompiliruem-kod-i-zapuskaem-ego-1\">\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0433\u043e<\/h3>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">javac -cp &quot;.\/postgresql-42.2.14.jar&quot; JavaPostgreSqlRepl.java<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">java -classpath .:.\/postgresql-42.2.14.jar JavaPostgreSqlRepl<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0438 select, \u0435\u0441\u043b\u0438 \u0438\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Leader<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Master: PostgreSQL 12.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit Slave: PostgreSQL 12.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit transact: 4.14 (0.89) ms   select: 63.41 (37.40) ms transact: 0.80 (0.10) ms   select: 0.96 (0.12) ms transact: 0.74 (0.10) ms   select: 0.76 (0.10) ms transact: 0.86 (0.14) ms   select: 0.72 (0.09) ms transact: 0.82 (0.10) ms   select: 4.94 (0.11) ms transact: 1.44 (0.12) ms   select: 0.84 (0.10) ms transact: 0.78 (0.10) ms   select: 1.64 (0.10) ms transact: 1.56 (0.10) ms   select: 0.79 (0.09) ms transact: 0.80 (0.10) ms   select: 0.94 (0.09) ms transact: 0.86 (0.12) ms   select: 0.79 (0.09) ms<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e.<\/strong><\/p>\n<p>  <\/p>\n<h3 id=\"zapusk-neskolkih-ekzemplyarov-java-prilozheniya\">\u0417\u0430\u043f\u0443\u0441\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 108 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0440\u0430\u0441\u0441\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c <code>while(true) {<\/code>, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c <code>for(int i=0; i &lt; 100; i++ ) {<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">while(true) { \/\/for(int i=0; i &lt; 100; i++ ) {<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bb\/wi\/jd\/bbwijd1huch6osw9matusiqlmna.png\"><\/p>\n<p>  <\/p>\n<h3 id=\"testirovanie-vse-zaprosy-idut-na-leader-zapusk-50-ekzemplyarov-prilozheniya\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438\u0434\u0443\u0442 \u043d\u0430 Leader. \u0417\u0430\u043f\u0443\u0441\u043a 50 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443 String nodes \u0432 \u0444\u0430\u0439\u043b\u0435 JavaPostgreSqlRepl.java<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">String nodes = &quot;172.26.10.73:5000&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430 <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">String nodes = &quot;ip-\u0430\u0434\u0440\u0435\u0441-Leader:5000&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0434 \u0437\u0430\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">String nodes = &quot;ip-\u0430\u0434\u0440\u0435\u0441-Leader:5000,ip-\u0430\u0434\u0440\u0435\u0441-Leader:5002&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430 <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/String nodes = &quot;ip-\u0430\u0434\u0440\u0435\u0441-Leader:5000,ip-\u0430\u0434\u0440\u0435\u0441-Leader:5002&quot;;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_b\/g2\/jb\/_bg2jbhbz697cry2ctrmwgv9k_m.png\"><\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">javac -cp &quot;.\/postgresql-42.2.14.jar&quot; JavaPostgreSqlRepl.java<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c 49 \u0440\u0430\u0437 Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0444\u043e\u043d\u0435 \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">java -classpath .:.\/postgresql-42.2.14.jar JavaPostgreSqlRepl &gt; \/dev\/null 2&gt;&amp;1 &amp;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e 49 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 java<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ps aux | grep java | grep -v grep | wc -l<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b postgres \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0435<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/an\/aq\/dg\/anaqdg4k0zeq5rintiwixch03lm.png\"><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0438 select, \u0435\u0441\u043b\u0438 \u0438\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Leader<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0412\u0440\u0435\u043c\u044f SQL update \u0434\u043b\u044f Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Leader<\/th>\n<th>\u0412\u0440\u0435\u043c\u044f SQL update \u043d\u0430 \u0441\u0430\u043c\u043e\u043c PostgreSQL \u0441\u0435\u0440\u0432\u0435\u0440\u0435 Leader<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>17,56<\/td>\n<td>0,13<\/td>\n<\/tr>\n<tr>\n<td>\u0412\u0440\u0435\u043c\u044f SQL select \u0434\u043b\u044f Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Leader<\/td>\n<td>\u0412\u0440\u0435\u043c\u044f SQL select \u043d\u0430 \u0441\u0430\u043c\u043e\u043c PostgreSQL \u0441\u0435\u0440\u0432\u0435\u0440\u0435 Leader<\/td>\n<\/tr>\n<tr>\n<td>8,51<\/td>\n<td>0,12<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0443\u0442 \u043d\u0430 Leader \u0438 select, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0434\u0443\u0442 \u043d\u0430 Replica<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0412\u0440\u0435\u043c\u044f SQL update \u0434\u043b\u044f Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Leader<\/th>\n<th>\u0412\u0440\u0435\u043c\u044f SQL update \u043d\u0430 \u0441\u0430\u043c\u043e\u043c PostgreSQL \u0441\u0435\u0440\u0432\u0435\u0440\u0435 Leader<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>9,07<\/td>\n<td>0,12<\/td>\n<\/tr>\n<tr>\n<td>\u0412\u0440\u0435\u043c\u044f SQL select \u0434\u043b\u044f Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Replica<\/td>\n<td>\u0412\u0440\u0435\u043c\u044f SQL select \u043d\u0430 \u0441\u0430\u043c\u043e\u043c PostgreSQL \u0441\u0435\u0440\u0432\u0435\u0440\u0435 Replica<\/td>\n<\/tr>\n<tr>\n<td>3,49<\/td>\n<td>0,10<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wo\/x7\/6k\/wox76kk4cerxtjg5yapua9xcrjc.png\"><\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/docs.google.com\/spreadsheets\/d\/1jw5DAsHFNsO4wmYUxR2TmbGc1CS9J0w2beNhfI0NLhQ\/edit?usp=sharing\" rel=\"nofollow\">https:\/\/docs.google.com\/spreadsheets\/d\/1jw5DAsHFNsO4wmYUxR2TmbGc1CS9J0w2beNhfI0NLhQ\/edit?usp=sharing<\/a><\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b pgbench \u0438\u0437 java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u043f\u043e\u0442\u0434\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (TPS) \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043d\u0443\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0435 Java \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 Connection Pool (\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, HikariCP, C3PO), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 SQL \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 pgbench.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u0442\u043e-\u0442\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/507824\/\"> https:\/\/habr.com\/ru\/post\/507824\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/507824\/\">\n<h1 id=\"testirovanie-gorizontalnogo-masshtabirovaniya-select-zaprosov-na-repliku\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f SELECT \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443<\/h1>\n<p>  <\/p>\n<p>\u0426\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 SELECT \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u0421\u0445\u0435\u043c\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0430\u044f.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/op\/zi\/t0\/opzit0s2opxwhigvzdmpubiypry.png\"><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-305773","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305773","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=305773"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/305773\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=305773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=305773"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=305773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}