
èŠããã«ïŒ
- cfdbã¯ãããŒãããã³ããŒã¿ããŒã¹ã®ã¯ã©ã¹ã¿ãŒããããã€ããã³èªå調æŽããé«å¯çšæ§ãšé害ã«å¯Ÿããä¿è·ã䜿çšããŠãããã«ã¢ã¯ã»ã¹ããããã®ã¢ãžã¥ãŒã«ã§ãã
- æŠå¿µå®èšŒãšããŠãPercona Server / XtraDB Clusterããã³å
¬åŒã®PostgreSQL + repmgrãã«ãã«åºã¥ããŠã MySQLãšPostgreSQLããµããŒããããŠããŸãã
- cgroupsã«åºã¥ããªãœãŒã¹ã®åé¢ã
cfnetwork
ã¢ãžã¥ãŒã«ã«ãããããã¯ãŒã¯ãã£ã«ã¿ãŒèšå®ãšã®çµ±åãããã³DBMSã䜿çšããå³å¯ãªã¢ã¯ã»ã¹å¶åŸ¡ã - èªã¿åãå°çšã¢ã¯ã»ã¹ã®ç«¶åãšè² è·åæ£ãæå°éã«æããããã«ã1ã€ã®ããŒãã«æžã蟌ã¿ãŸãã
- ã¯ã©ã¹ã¿ã®ç¶æ
ãšå®éã®ã¢ã¯ã»ã¹ã®å®è¡å¯èœæ§ãèªåçã«ç¢ºèªããŸãã
- æåããã³èªåããŒã«ã«ããã¯ã¢ãããèªåããŒã¿ãªã«ããªã
- æ¢åã®ããŒã¿ããŒã¹ã®èªå移è¡ã®ãµããŒã
ããŒããµã€ã¯ã«ïŒ
ã³ã³ã»ãããšçšèªã®çŽ¹ä»

æœè±¡æ§æã®ãšã³ãã£ãã£ã¿ã€ãïŒ
cluster
-åäžã®ãŠããããšããŠæ©èœããDBMSããŒãã®æœè±¡çãªååä»ãã³ã¬ã¯ã·ã§ã³ãinstance
ã¯cluster
ãææããç©çããŒãã§ããdatabase
ã¯cluster
ãææããååä»ãããŒã¿ããŒã¹ã§ããrole
-ç¹å®ã®database
ãžã®ã¢ã¯ã»ã¹æš©ãæã€ã¢ã«ãŠã³ãã ããã©ã«ãã§ã¯ã察å¿ããããŒã¿ããŒã¹ãžã®ãã«ã¢ã¯ã»ã¹ãæã€database
ãšåãååã®ããŒã«ãåžžã«ååšããŸããaccess
-ç¹å®ã®ããŒãã®æå®ãããããŒã«ã«ã¢ã«ãŠã³ãããã®æ¥ç¶ã®ç¹å®ã®æ倧æ°ãæã€ç¹å®ã®ããŒã¿ããŒã¹ã¢ã«ãŠã³ãã§ç¹å®ã®ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããå¿
èŠæ§ã宣èšãããŸãã
ã¯ã©ã¹ã¿æ§æã®è©³çŽ°ã¯ãDBAã®ã©ã€ãäœæ¥ã«ãã£ãŠããçšåºŠæ±ºå®ãããŸãããã¹ãŠã®å€æŽãè¡ãããã¡ã€ã³ããŒãããããŸãã ãã®ååã«ããã°ã database
ãšrole
ãšã³ãã£ãã£ã¯1ã€ã®ããŒãã§ã®ã¿å®çŸ©ã§ããæ®ãã®ããŒãã¯ã»ã«ã³ããªãŸãã¯äžè¬çãªã¢ãŒããã¬ãŒã¿ãŒãšããŠæ§æããå¿
èŠããããŸãã ãã§ã€ã«ãªãŒããŒäžã«å€æŽãå ãããå Žåããã®ç¶æ³ã¯å°ãäžå¿«æãäžããå¯èœæ§ããããŸãããäžæçãªæåå€æŽã®å¯èœæ§ãå¶éãããã®ã¯ãããŸããã
ã€ã³ãã©ã¹ãã©ã¯ãã£ã®ãããã°ãçµ±åããŠç°¡çŽ åããããã«ããŠãããŒãµã«HAProxyãããã·ãµãŒãã¹ãééçã«äœ¿çšãããŸãã æ確ãªå©ç¹ã¯ãã¢ããªã±ãŒã·ã§ã³ã«ç¹å¥ãªå€æŽããªãå Žåãå®å
šã«åäœããã¯ã©ã¹ã¿ãŒããŒãã®ã¹ããŒã¿ã¹ã®é«åºŠãªç£èŠãDBMSããã»ã¹å€ã®ã»ãã¥ã¢ãªéä¿¡ãã£ãã«ã®äœæïŒTLSãªãããŒãïŒãããã¯ã¹ããã®çµ±èšããŒã¿ã®åéã®ãµããŒããã¢ããªã±ãŒã·ã§ã³ã«ãŒãããã§ãèš±å¯ãããæ¥ç¶æ°ã®å³æ Œãªå¶éã HAProxyã¯ã次ã®å Žåã«èªåçã«ã²ãŒã ã«å
¥ããŸãã
cluster
ã¯è€æ°ã®ããŒãããããããããããã®ã¹ããŒã¿ã¹ãå¶åŸ¡ããå¿
èŠããããŸãã- ã¢ã¯ã»ã¹å®£èšå®£èšã«ã¯ããªã¢ãŒããã¹ããšã®å®å
šãªéä¿¡ãã£ãã«ã匷å¶çã«å¿
èŠã§ãã
- ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ããŒãã®
cf_location
äžèŽããªãïŒç°ãªãããŒã¿ã»ã³ã¿ãŒïŒãããVPNã®å Žåãå®å
šã§ãªãæ¥ç¶ã¯æããã«ç€ºãããŸããã
ã©ããŒã®ãçç£çãªããªãœãŒã¹ïŒCPUãI / OïŒãšã¯ç°ãªããäž»ãªåé¡ã¯ã¡ã¢ãªã®å²ãåœãŠã«ãããŸãã ãã®ãããå¯èœãªæå°ããã³æ倧å¶éãèæ
®ã«å
¥ããŠããµãŒãã¹ã®çžå¯Ÿçãªéã¿ïŒåªå
床ïŒã«åŸã£ãŠã·ã¹ãã å
ã®ã¡ã¢ãªãå²ãåœãŠãããã«ããŠãããŒãµã«ã·ã¹ãã ãcfsystem
ã¢ãžã¥ãŒã«ã«äœæãããŸããã åinstance
ã®ããã»ã¹ã®ã»ããã¯ãç¬èªã®cgroup
ã¹ã©ã€ã¹systemd
èµ·åãããŸãã ãªãœãŒã¹å²ãåœãŠãšãã¡ã€ã«èšè¿°åã®æ倧æ°ãªã©ã®å¶éã®ç®¡çã«å ããŠã systemd
ã¯ããã»ã¹ã®ä¿è·è
ãšããŠãæ©èœããç°åžžãªã¯ã©ãã·ã¥ãèªåçã«åéããŸãã ãã£ã¹ã¯å®¹éã«ã€ããŠã¯ãåé¢ãšé床ãæ倧åããããã«åå¥ã®ããªã¥ãŒã ãããŠã³ãããããšãåŒãç¶ãç®çãšããŠããŸãã
ãã®ã¢ãžã¥ãŒã«ã®ã¡ã¿æ
å ±ã¯åéãããPuppetãã¡ã¯ããšããŠä¿åãããŸãããã¡ã¯ããã¿ãŒã²ããã·ã¹ãã ã§çæããããããã€ã¡ã³ãã®éå§æã«PuppetDBã«ããŒããããããšãããçšåºŠç解ããå¿
èŠããããŸãã ã€ãŸã å€æŽåŸã«ãã¡ã¯ããææ°ã®ç¶æ
ã«ä¿ã€ã«ã¯ãåå±éãå¿
èŠã§ãã ã¢ã¯ã»ã¹ã®èªåæ§æãæ¥ç¶æ°ã®å¶éããã®ä»ã®åŸ®åŠãªéãã¯ããã¹ãŠã®ç®¡ç察象ã·ã¹ãã ã«é¢ãããããã®äžå€®ã«æ ŒçŽããããã¡ã¯ãããæ£ç¢ºã«æ§æãããŸãã æããã«æ¹åã®äœå°ãšé©åãªèšç»ããããŸããããããŸã§ã®ãšããã
èŠç¹ãã€ãã
ãã®ã¢ãžã¥ãŒã«ã¯ãå€é¢çãªæ¬æ ŒçãªDBMSãã¥ãŒãã³ã°ãšã»ãŒåããããå€é¢çã§ãcfdbã®ããã¥ã¡ã³ãã¯ãæ©èœãéšåçã«æ確ã«ããã®ã«åœ¹ç«ã¡ãŸããããã®èšäºããã¹ãŠããŒãããã®ã¯äžèŠã§ãã
DBMSãäžãã
- ããŒã¹ã§ã·ã¹ãã æ§æãè¿œå ããŸã
# cfdb classes: [cfdb] # cfdb::instances: mysrv: type: mysql port: 3306 databases: db1: {} db2: roles: ro: readonly: true custom: custom_grant: 'GRANT SELECT ON $database.* TO $user; GRANT SELECT ON mysql.* TO $user;'
- 2åå±éããŸãã ãããŸã§ã®ãšãã-第äºæ®µéã§ã¯ãå¿
èŠãªäºå®ãéäžåãããããŒã¹ã«åéãããŸãã
@db$ sudo /opt/puppetlabs/bin/puppet agent --test; sudo /opt/puppetlabs/bin/puppet agent --test
äœãèµ·ãã£ãããææ¡ããŠã¿ãŸãããã
- Percona Serverããã±ãŒãžã®å®å
šãªãªã¹ããã€ã³ã¹ããŒã«ãããŸãã
- äžæã®åå
mysrv
ãæã€æœè±¡ã¯ã©ã¹ã¿ãŒã«å±ããDBMSããŒããäœæããŸã - ã¯ã©ã¹ã¿ãŒã§ã¯ã2ã€ã®ããŒã¿ããŒã¹
db1
ãšdb2
ãå®çŸ©ããŸã - ããŒã«
db1
ããã³db2
ã¯ã察å¿ããããŒã¿ããŒã¹ãžã®ãã«ã¢ã¯ã»ã¹ã§èªåçã«äœæãããŸã - ããã«ã
db2ro
ããŒã«ãdb2ro
ã db2
ãžã®èªã¿åãå°çšã¢ã¯ã»ã¹ãšããŒãéã®è² è·åæ£ããµããŒããããŸãã - ããã«ãå®å
šã«ä»»æã®ã¢ã¯ã»ã¹æš©ã§
db2custom
ããŒã«ãdb2custom
ãŸãã $database
ãš$user
ã¯ã€ã«ãã«ãŒãããŒã®å¿
é ã®äœ¿çšã«æ³šæããŠãã ããã - ãã¹ãŠã®ãã¹ã¯ãŒãã¯ã©ã³ãã ã«çæãããŸããã匷å¶ããããšãã§ããŸãã
- éäžPuppetDBããŒã¿ããŒã¹ã§ã¯ãæ¢åã®ã¯ã©ã¹ã¿ãŒããã®ããŒããããŒã¿ããŒã¹ãããã³ããŒã«ã«é¢ããæ
å ±ã衚瀺ãããŸãã
ã¯ã©ã¹ã¿ãŒããŒã«ãžã®ã¢ã¯ã»ã¹ã宣èšãã
- ã¢ããªã±ãŒã·ã§ã³ã§ã·ã¹ãã æ§æãè¿œå ãã
# cfdb classes: [cfdb] # cfdb::access: # , webapp_mysrv_db1: cluster: mysrv role: db1 local_user: webapp max_connections: 100 webapp_mysrv_db2ro: cluster: mysrv role: db2ro local_user: webapp max_connections: 500 config_prefix: 'DBRO_'
- ã¯ã©ã€ã¢ã³ãã·ã¹ãã ã«2åå±éããŸãã èªåãã§ãã¯äžã«ã¢ã¯ã»ã¹ã§ããªããšããèŠåã衚瀺ãããã¯ãã§ãã
@web$ sudo /opt/puppetlabs/bin/puppet agent --test; sudo /opt/puppetlabs/bin/puppet agent --test
- ããŒã¹ã®ããã·ã¹ãã ã«äžåºŠå±éããŸã
@db$ sudo /opt/puppetlabs/bin/puppet agent --test
- å¿
èŠã«å¿ããŠãDBMSããªãŒããŒããŒãããŠãããã©ã«ãã§100ã®åæ°ã§ãããã¹ãŠã®æ¥ç¶ã®æ倧æ°ãå¢ãããŸãã å±éããã»ã¹èªäœãå¿
èŠãªã¢ã¯ã·ã§ã³ãä¿ããŸãã
@db$ sudo /bin/systemctl restart cfmysql-mysrv.service
- æçµæ®µé-ãã¹ãŠã®ã¢ã¯ã»ã¹ãæ©èœããããšã確èªããããã«ãã¯ã©ã€ã¢ã³ãã·ã¹ãã ã«å床å±éããŸãã
@db$ sudo /opt/puppetlabs/bin/puppet agent --test
äœãèµ·ãã£ãïŒ
- ã¯ã©ã€ã¢ã³ãã·ã¹ãã ã§ãããŒã«ã«
webapp
ãŠãŒã¶ãŒã®äžã«.env
ãã¡ã€ã«ãäœæãããŸããã
- ããŒã¿ããŒã¹ãšåãååã®
db1
ããŒã«ã«ã¢ã¯ã»ã¹ããããã®DB_
ãã¬ãã£ãã¯ã¹ïŒããã©ã«ãïŒãä»ããå€æ°ã®ã»ãããå«ãŸããŠããŸãã - ããã«ã
DBRO
_ããŒã¿ããŒã¹ã®db2ro
ããŒã«ã«ã¢ã¯ã»ã¹ããããã®DBRO
_ãã¬ãã£ãã¯ã¹ä»ãã®å€æ°ã»ããã - å¿
èŠã«å¿ããŠã
.env
ã«å ããŠãç¹å®ã®ã¢ãããŒãã䜿çšã§ããŸãïŒ cfdb::access::custom_config
åç
§ïŒã
- 2çªç®ã®ãã¹ã§ããã¡ã¯ããããŒãããŸãã
- 次ã«ãDBMSæ§æãæŽæ°ããŸããããã§ãåããŒã«ã«å¯ŸããŠãèš±å¯ããããªã¹ãã«ã¯ã©ã€ã¢ã³ãããŒããè¿œå ãããæ¥ç¶ã®æ倧æ°ãå¢å ããŸãã
- ãã¹ãŠã®ã¢ã¯ã»ã¹ãæ©èœããããšã確èªããŸã-å±éæã«èªåçã«è¡ãããŸã
ããã ãã§ããDBMSã®ã¿ã€ãã«å€§ããªéãã¯ãããŸããã ãã¹ãŠãåãã§ãã
æ¢åã®ããŒã¿ãã£ã¬ã¯ããªã®ç§»è¡
以åã«ã€ã³ã¹ããŒã«ãããDBMSæ§æããã®ç§»è¡ã®äŸ¿å®äžã init_db_from
埮調æŽãã©ã¡ãŒã¿ãŒã®åœ¢åŒã§æ©èœãè¿œå ãããŸããã å€ã®åœ¢åŒã¯ãã¢ããã°ã¬ãŒãããã»ã¹ã®ä»æ§ã«ãããDBMSã®çš®é¡ã«ãã£ãŠè¥å¹²ç°ãªããŸãã 䜿çšäŸïŒ
cfdb::instances: mymigrate: type: mysql ... settings_tune: cfdb: init_db_from: '/var/lib/mysql' pgmigrate: type: postgresql ... settings_tune: cfdb: init_db_from: '9.5:/var/lib/postgresql/9.5/main/'
ãšããã§ãæŽæ°ãããcfpuppetserver
ã¢ãžã¥ãŒã«ã¯ãã§ã«cfdb
ã䜿çšcfdb
ãŠé«å¯çšæ§ãæ§æããŠããŸãã ã€ã³ã¹ããŒã«äžã«ãã¡ã¿æ
å ±ã倱ãããšãªããã¡ã¯ãããŒã¹ã移è¡ãããŸãã
instance
æåæäœãå®è¡ãã
ããã©ã«ãã§ã¯ãããŒã ãã©ã«ããŒã¯/db/{type}_{name}/
ã«ãªããŸããããã§ã bin/
ãã£ã¬ã¯ããªãŒã¯ãæšæºã®mysql
ã psql
ã repmgr
ãããã³cfdb_
ãã¬ãã£ãã¯ã¹ãæã€ä»ã®cfdb_
䟿å©ãªã©ãããŒãšãšãã«cfdb_
ãŸãã ãããã¯root
ãšããŠå®è¡ã§ããŸãããããã¯åãPostgreSQLã®æ¡åŒµæ©èœãä»ããã¹ããŒãã£ã³ã°ã®å¯èœæ§ãããããå®å
šã§ã¯ãããŸããã ããŒã¿ããŒã¹ãã¹ãŒããŒãŠãŒã¶ãŒãšããŠå
¥åããäŸïŒ
@db$ sudo -u mysql_mysrv /db/mysql_mysrv/bin/cfdb_mysql
ããã¯ã¢ãããšåŸ©å
æåã§ããã¯ã¢ããããã³åŸ©å
ããæ©èœã¯ã instance
ããŒã ãã©ã«ããŒã®~/bin/cfdb_backup
ããã³~/bin/cfdb_restore
ã䜿çšããŠåžžã«å©çšã§ããŸãã $cfdb::instance::backup = true
ãèªåå®æããã¯ã¢ãããæå¹ã«ãªã$cfdb::instance::backup = true
ã ãã¥ãŒãã³ã°ã¯ã $cfdb::instance::backup_tune
ã«ãã£ãŠè¡ãã$cfdb::instance::backup_tune
ã å®è£
ã®è©³çŽ°ã¯ãDBMSã®ã¿ã€ãã«ãã£ãŠç°ãªããŸãã çŸåšã xtrabackup
ã¯MySQLã§äœ¿çšããã pg_backup_ctl
ã¯PostgreSQLã§äœ¿çšãããŠããŸãã
泚ïŒXB 2.4ã«ã¯åé¡ããããŸã -å¢åå埩ã«ã¯æäœ1GBã®ç©ºãã¡ã¢ãªãå¿
èŠã§ã
ããšãã°ãrepmgrã§ãããã¹ã¿ã³ãã€PostgreSQLã¯ã©ã¹ã¿ãŒãäœæããŠã¿ãŸãããã
- ãã¹ãæ§æ
classes: [cfdb] cfdb::instances: pgcluster: type: postgresql port: 5432 # is_cluster: true databases: - db1
- ãã€ããŒããŒãã®æ§æ
classes: [cfdb] cfdb::instances: pgcluster: type: postgresql port: 5432 # is_secondary: true
ã¯ã©ã€ã¢ã³ãã¯ãåäžããŒãã®å ŽåãšãŸã£ããåãæ¹æ³ã§æ§æãããŸãããHAProxyã¯èªåçã«ééçã«ã²ãŒã ã«å
¥ããŸãã
- æ¥ç¶ãããŠãããã¹ãŠã®ã·ã¹ãã ã«å±éããŸãã ããã«2åç¹°ãè¿ããŸããæåã®ã¹ãããã§PuppetDBã«ãã¡ã¯ããããããã2çªç®ã®ã¹ãããã§ãããæãæµ®ãã¹ãŸãã 3åç®ã®ç¹°ãè¿ãã§ã¯ãå€æŽã¯ãããŸããã *ã¯ã©ã¹ã¿ãŒã®äžéšã®ããŒããåèµ·åããå¿
èŠãããå Žåãrepmgrã®å Žåã
max_connections
ãã©ã¡ãŒã¿ãŒãšã¬ããªã±ãŒã·ã§ã³ã®è©³çŽ°ã®ããããã¹ã¿ãŒããéå§ããå¿
èŠããããŸãïŒ ~/bin/cfdb_repmgr cluster show
ïŒã
repmgrã䜿çšããŠå
žåçãªPostgreSQLã¯ã©ã¹ã¿ãŒãã»ããã¢ãããã人ã¯ããŸãããéããæããŸãããïŒ
Dockerãå€éšã€ã³ãã©ã¹ãã©ã¯ãã£ãªã©ã®ã³ã³ãããŒãšã®çµ±å
2ã€ã®åŽé¢ããããŸãã1ã€ç®ã¯DBMSèªäœã§ããã2ã€ç®ã¯æ¡ä»¶ä»ãã§DBMSã¯ã©ã€ã¢ã³ãã§ãã éçããŒãžã§ã³ã§ã¯åé¡ã¯ãããŸããããåçã«æ§ç¯ããå Žåã¯ãæåã«æ倧ã€ã³ãã©ã¹ãã©ã¯ãã£ãå±éãããã®åŸãã¯ã©ãŒã©ã ãç¯çŽããããã«ã¯ã©ã¹ã¿ãŒããŒããé©åã«åæããŠäœåãªãã®ãåé€ããå¿
èŠããããŸãã
ã管çãããŠããªããå€éšã¯ã©ã€ã¢ã³ãã®å Žåããã©ã¡ãŒã¿ãŒ$cfdb::role::static_access
ãéäžã¡ã¿ããŒã¿ãæåã§ãã€ãã¹ããŠã宣èšãããã¢ã¯ã»ã¹ã«é¢ããäºå®ãæè»ã«èšå®ã§ããŸãã
åèšã§äœããããŸãã
æããã«ããã®ã¢ãããŒãã«ãããçæéã§ç£æ¥èŠæš¡ã§ããŒã¿ããŒã¹ã¯ã©ã¹ã¿ãŒãããªããããããã³ä¿å®ã§ããããããã®ãããªããªã±ãŒããªãšãªã¢ã§ã®ãšã©ãŒã®ãªã¹ã¯ã倧å¹
ã«åæžãããŸãã ãã¡ãããçŸæç¹ã§ã¯ãéäžåãããããŒã¿ããŒã¹ã«ã€ã³ãã©ã¹ãã©ã¯ãã£ã¡ã¿ããŒã¿ãå«ãããšãå±éããã»ã¹ãå€å°è€éã«ãªããŸãã ãã段éã§ã¯ããŸã å±éãããŠããªãéšåãããã«èæ
®ããŠããããæ¹åããæ©äŒããããŸããããã¹ãŠã«æéããããŸãã åæã«ããã®Puppetã¢ãžã¥ãŒã«ã䜿çšãããšãæé©åããã»ã¹ãšæçµæ§æã®èª¿æŽã®äž¡æ¹ãå¶åŸ¡ããéåžžã«æè»ãªæ©èœã«ãããæå°éã®åŽåã§å®å
šã§æ¯èŒçæé©ã«èª¿æŽãããDBMSãååŸã§ããŸãã äžè¬çãªæŠå¿µã¯æ®éçã§ãããå¿
èŠã«å¿ããŠä»ã®ã¿ã€ãã®DBMSã®ãµããŒããç°¡åã«è¿œå ã§ããŸãã
ããããã¹ãŠã®ããã«ãããŒã¿ã®å®å
šæ§ã¯ããããã§ã-èªååã«ã¯å³ããå¶éããããããŒã¿æ倱ã®ãªã¹ã¯ãããå Žåãå±éäžã®ããã³ããã«åŸã£ãŠæåã®ä»å
¥ãå¿
èŠã§ãã
UPDïŒ Habrã®ããŒã¯ããŠã³åŠçã®äžå
·åãä¿®æ£ãããŸããã