[GCP] Cloud Spanner
Cloud Spanner๋ GCP์์ ์์ฒด์ ์ผ๋ก ๊ตฌํ, ๊ตฌ์ถํด์ ์ ๊ณตํ๋ ์ด๋ํ ๋ถ์ฐ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋น์ค๋ค.
์ ์ธ๊ณ์ ์ง๋ฆฌ์ ์ผ๋ก ๋ถํฌ๋๋ ์์คํ
์ ์ ํฉํ๋ค.
ํ์กดํ๋ ๋ฉํฐ๋ฆฌ์ -๋ฉํฐ๋ ธ๋-๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํด๋ผ์ฐ๋ ์๋น์ค ์ค์์ ๊ฐ์ฅ ๋นผ์ด๋ ์ฑ๋ฅ๊ณผ ์์ฑ๋๋ฅผ ์๋ํ๋ค.
๊ทผ๋ ๋ถ์ํ CockroachDB๋ง ํด๋ Spanner ์ถ์ ๊ฐ๋ฐ์๋ค์ด ๋ฐ์ณ๋์์ ๊ฒฝ์ํ๋ ค๊ณ ๊ฑฐ์ ๋น์ทํ๊ฒ ๋ง๋ ๊ฒ์ธ๋ฐ, ์์ง ๊ทธ ์์ฑ์ ๋๋ฌํ ์ ๋๋ ์๋๋ผ๋ ๊ฒ ๊ฐ๋ค.
๋น์ฉ
์์ธํ ๊ฒ์ ์ฌ์ดํธ๋ฅผ ์ฐธ์กฐํ๋ค.
https://cloud.google.com/spanner/pricing?hl=ko
์ด๋งํ ์๋น์ค๊ฐ ๋ฑํ ์๋๋งํผ, ๊ฐ๊ฒฉ๋ ๋งค์ฐ ๋น์ผ ํธ์ด๋ค.
DB ๋
ธ๋ ๊ฐ์, ๋ฉํฐ๋ฆฌ์ ์ฌ๋ถ, ์ฌ์ฉํ ์คํ ๋ฆฌ์ง ์ด๋์ ๊ธฐ์ค์ผ๋ก ์๊ธ์ ๋ถ๊ณผํ๋ค.
๋ฐ์ดํฐ ์ ์ก ๊ฐ์๊ฑด ๋ ๊ทธ๊ฒ๋๋ก ๋น์ฉ์ด ๋๊ฐ ๊ฒ์ด๋ค
์ผ๋จ ์ค์ ๋ก ๋ ธ๋๊ฐ ๋ ์๋ ๊ฐ์์ ์๊ฐ์ ๋น๋กํด์ ๊ณ ์ ์๊ธ์ด ๋๊ฐ๋ค.
์ผ๋จ ์์ธ์ ๊ทธ๋ฅ ๋
ธ๋๋ฅผ ํ๋๋ง ๋์ด๋ค๊ณ ํด๋, ์๊ฐ๋น 1.17 ๋ฌ๋ฌ๋๊น ํ๋ฌ์ ๊ฑฐ์ 5๋ง์ ๋์ด ๋๊ฐ๋ค.
๊ทผ๋ฐ ๋ ๋ฉํฐ๋ฆฌ์ ์ผ๋ก ํ๋ฉด ์๊ฐ๋น 3.90๋ฌ๋ฌ, ํ๋ฌ์ 117๋ฌ๋ฌ=15๋ง์ ์ ๋ ๋๊ฐ๋ค.
๋ ์ฌ์ฉํ ์คํ ๋ฆฌ์ง ์ฉ๋๋งํผ๋ ๋น์ฉ์ ์ง๋ถํ๋ค.
์์ธ์ด ๊ธฐ๊ฐ๋น 0.39๋ฌ๋ฌ๋๊น, DB์ 500๊ธฐ๊ฐ ์ ๋ ์ ์ฅํ๋ค ์น๋ฉด ํ๋ฌ์ 195๋ฌ๋ฌ=25๋ง์์ด ๋๊ฐ๋ ์
์ด๋ค.
๋ฐฑ์ ์คํ ๋ฆฌ์ง๋ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง๋ณด๋ค๋ ์ธ์ง๋ง, ๊ทธ๋๋ ์ฌ์ ํ ๋น์ธ๋ค.
์ด๋ฌ๋ฉด ์๋ฌด๋ฆฌ ์๊ฒ์ก์๋ ์ต์ ํ๋ฌ์ ๋ฐฑ๋ง์์ ์ก์์ผ ํ ๊ฒ ๊ฐ๊ณ , ์ ๋๋ก ์ฐ๋ค๋ณด๋ฉด ์๋ฐฑ๋ง-์์ฒ๋ง์์ ์ฝ๊ฒ ๊นจ์ง ๊ฒ ๊ฐ๋ค.
์ธ์คํด์ค ๋ง๋ค๊ธฐ
์ฐ์ Cloud Spanner ํ์ด์ง๋ก ์ด๋ํด์ ์๋น์ค๋ฅผ ํ์ฑํํ๋ค.
์์ง ์จ๋ณธ ์ ์ด ์๋ค๋ฉด, 3๊ฐ์๋์ ์ ํ์ ์ธ ๋ฌด๋ฃ์ฒดํ์ด ๊ฐ๋ฅํ๋ค.

์ด๋ฆ ์ง๊ณ , ๋ฆฌ์ ์ ์ ํํ๋ค.
์ฒดํํ์์๋ ๋ช๊ฐ์ง ์ ํ์ ์ธ ๋ฆฌ์ ๋ง ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋์ ์ด๋ฐ ๋์๋ณด๋๊ฐ ๋จ๋ฉด ์ผ๋จ์ ์์ฑ์ด ๋ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
๊ทธ๋ผ ์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ๋ค.
์ด๊ฒ๋ ๋ญ ์ด๋ ค์ธ ๊ฒ์ ์๋ค.

๊ทธ๋ฅ ์ด๋ฆ ์ง๊ณ , SQL ํธํ์ฑ๋ง ๊ณจ๋ผ์ค๋ค.
Google SQL์ ๊ตฌ๊ธ ์์ฒด ๊ท๊ฒฉ์ด๊ณ ,
Postgresql์ ์์ ํ์ง๋ ์์ง๋ง Postgres ๋ฌธ๋ฒ์ ์ด๋์ ๋ ์ง์ํ๋ค.
๋๋ ์ข๋ ์๋ฃ๊ฐ ๋ง๊ณ ๋ฒ์ฉ์ฑ์ด ์ข์ Postgres๋ฅผ ๋ฐ๋ฅด๊ฒ ๋ค...
๊ทธ๋์ ์ด๋ ๊ฒ ๋ง๋ค์ด์ง๋ฉด ๋ ๊ฒ์ด๋ค.

ํ ์ด๋ธ ๋ง๋ค๊ธฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ง๋ค์ด์ก์ผ๋ฉด, ํ ์ด๋ธ ์์ฑ ๋ฒํผ์ด๋ SQL ํธ์ง๊ธฐ๋ฅผ ํตํด์ ํ ์ด๋ธ์ ๋ง๋ค ์ ์๋ค.
ํ์
์ serial์ด ์๋ค์ด๊ฐ๋ค๊ฑฐ๋, default์ now()๋ฅผ ์ง์ด๋ฃ์ ์ ์๋ค๊ฑฐ๋ ํ๋ ์ ํ์ด ์ข ์๊ธฐ๊ธด ํ๋๋ฐ, ๊ทธ๋๋ ๋์ฒด๋ก๋ postgres์ ์๋น์ทํ๊ฒ ์งค ์๋ ์๋ค.
๊ทธ๋ ๊ฒ ํด์ ๋ง๋ค๋ฉด

์ด๋ฐ์์ผ๋ก ์์ฑ์ด ๋์์ ๊ฒ์ด๊ณ
ํธ์ง๊ธฐ๋ฅผ ํตํด์ ๊ฐ์ง๊ณ ๋ ์ ์๊ฒ ๋ค.


๋ฐ์ดํฐ ๊ด๋ฆฌ์ฉ ๋๊ตฌ๋ ์๊ณ
APM์ฉ ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ๋ค๋ ์๊ณ
๋์ถฉ ์์๊ฑด ๋ค ์๋ ๊ฒ ๊ฐ๋ค.
์ฝ๋์์ ์ ์ํ๊ธฐ (Node.js)
ํ๋ก๊ทธ๋จ์์ spanner์ ์ ์ํด์ ์ฌ์ฉํ๋ ค๋ฉด, ๋ณดํต ์ ์ฉ ๋ชจ๋์ ์ค์นํ๊ณ , gcloud๋ก ์ธ์ฆ์ ๋จน์ธ ์ํ์์ ์จ๋จน์ผ๋ฉด ๋๋ค.
Node.js์ ๊ฒฝ์ฐ์๋ ๋ค์ ๋ชจ๋์ด ํ์ํ๋ค.
npm i @google-cloud/spanner
์๋๋ Singers์ Albums ํ ์ด๋ธ์ ๋ง๋๋ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ์ด๋ค.
// Imports the Google Cloud client library
const {Spanner} = require('@google-cloud/spanner');
/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
const projectId = 'ํ๋ก์ ํธID';
const instanceId = 'test-spanner';
const databaseId = 'test-db';
// Creates a client
const spanner = new Spanner({
projectId: projectId,
});
const instance = spanner.instance(instanceId);
// Note: Cloud Spanner interprets Node.js numbers as FLOAT64s, so they
// must be converted to strings before being inserted as INT64s
const request = {
schema: [
`CREATE TABLE Singers (
SingerId INT64 NOT NULL,
FirstName STRING(1024),
LastName STRING(1024),
SingerInfo BYTES(MAX),
FullName STRING(2048) AS (ARRAY_TO_STRING([FirstName, LastName], " ")) STORED,
) PRIMARY KEY (SingerId)`,
`CREATE TABLE Albums (
SingerId INT64 NOT NULL,
AlbumId INT64 NOT NULL,
AlbumTitle STRING(MAX)
) PRIMARY KEY (SingerId, AlbumId),
INTERLEAVE IN PARENT Singers ON DELETE CASCADE`,
],
};
async function main() {
// Creates a database
const [database, operation] = await instance.createDatabase(
databaseId,
request
);
console.log(`Waiting for operation on ${database.id} to complete...`);
await operation.promise();
console.log(`Created database ${databaseId} on instance ${instanceId}.`);
}
main()์ฐธ์กฐ
https://cloud.google.com/spanner/docs/getting-started/nodejs?hl=ko