
Karon, ang taas nga pagkaanaa sa mga serbisyo gikinahanglan kanunay ug bisan asa, dili lamang sa dagkong mahal nga mga proyekto. Ang temporaryo nga dili magamit nga mga site nga adunay mensahe nga "Pasayloa, nagpadayon ang pagmentinar" nakit-an gihapon, apan kasagaran hinungdan sa usa ka mapaubsanon nga pahiyom. Atong idugang ang kinabuhi sa mga panganod niini, kung usa ra ka tawag sa API ang gikinahanglan aron maglansad usa ka dugang nga server, ug dili kinahanglan nga maghunahuna bahin sa "iron" nga operasyon. Ug wala nay bisan unsang pasangil kung ngano nga ang usa ka kritikal nga sistema wala gihimo nga kasaligan gamit ang mga teknolohiya sa cluster ug redundancy.
Isulti namo kanimo kung unsa nga mga solusyon ang among gikonsiderar aron masiguro ang kasaligan sa mga database sa among mga serbisyo ug kung unsa ang among nahimo. Dugang pa sa usa ka demo nga adunay daghang mga konklusyon.
Kabilin sa High Availability Architecture
Mas maayo pa nga makita kini sa konteksto sa pag-uswag sa lainlaing mga sistema sa open source. Ang mga solusyon sa kabilin kinahanglan nga magdugang mga teknolohiya nga adunay taas nga magamit samtang nagkadako ang panginahanglan. Ug lainlain ang ilang kalidad. Ang sunod-sunod nga henerasyon nga mga solusyon nagbutang sa taas nga pagkaanaa sa kinauyokan sa ilang arkitektura. Pananglitan, ang mga posisyon sa MongoDB nga cluster isip panguna nga kaso sa paggamit niini. Ang cluster scales horizontally, nga usa ka lig-on nga competitive advantage niini nga DBMS.
Balik ta sa PostgreSQL. Kini usa sa labing karaan nga sikat nga open source nga mga proyekto, ang una nga pagpagawas nga nahitabo sa ika-95 nga tuig sa miaging siglo. Ang team sa proyekto sa dugay nga panahon wala mag-isip sa taas nga pagkaanaa nga usa ka buluhaton nga sulbaron sa sistema. Busa, ang teknolohiya sa pagkopya alang sa paghimo og mga kopya sa datos nahimo nga built-in lamang sa bersyon 8.2 sa 2006, apan kini usa ka file (pagpadala sa log). Sa 2010, ang streaming nga replikasyon nagpakita sa bersyon 9.0, ug kini ang sukaranan sa paghimo sa usa ka halapad nga lainlaing mga cluster. Kini, sa tinuud, makapahingangha kaayo alang sa mga tawo nga nakaila sa PostgreSQL pagkahuman sa Enterprise SQL o modernong NoSQL - ang sumbanan nga solusyon gikan sa komunidad usa lamang ka master-replica nga pares nga adunay dungan o asynchronous nga replikasyon. Sa parehas nga oras, sa kanal, ang agalon gibalhin sa mano-mano, ug ang isyu sa pagbalhin sa mga kliyente gisugyot usab nga masulbad nga independente.
Giunsa namon nakahukom nga maghimo kasaligan nga PostgreSQL ug kung unsa ang among gipili alang niini
Bisan pa, ang PostgreSQL dili unta mahimong popular kung dili tungod sa daghang mga proyekto ug mga himan nga makatabang sa paghimo sa usa ka solusyon nga dili matugotan sa sayup nga wala magkinahanglan kanunay nga atensyon. Sa panganod (MCS) sukad sa paglusad sa DBaaS, usa ka PostgreSQL server ug master-replica nga mga pares nga adunay asynchronous nga replikasyon anaa na.
Natural lang, gusto namo nga himoong mas sayon ang kinabuhi para sa tanan ug himoong magamit ang PostgreSQL installation nga magsilbing basehan sa mga serbisyo nga magamit kaayo nga dili na kinahanglang mag-monitor ug momata sa gabii aron makahimo og switch. Sa kini nga bahin, adunay parehas nga daan nga napamatud-an nga mga solusyon ug usa ka henerasyon sa mga bag-ong kagamitan nga naggamit sa labing bag-ong mga kalamboan.
Karon, ang problema sa taas nga pagkaanaa wala nagsalig sa reserbasyon (kini wala’y gisulti), apan sa consensus - ang algorithm sa pagpili sa usa ka lider (Pagpili sa lider). Kasagaran, ang dagkong mga aksidente mahitabo dili tungod sa kakulang sa mga server, apan tungod sa mga problema sa consensus: usa ka bag-ong lider wala makagawas, duha ka mga lider ang nagpakita sa lainlaing mga sentro sa datos, ug uban pa. Usa ka pananglitan mao ang pagkahagsa sa usa ka Github MySQL cluster - sila misulat .
Seryoso kaayo ang basehanan sa matematika niining butanga. Sa usa ka bahin, didto , nga nagpahamtang sa teoretikal nga mga pagdili sa mga posibilidad sa pagtukod sa mga solusyon sa HA, sa laing bahin, mathematically proven algorithms alang sa pagtino sa consensus, sama sa и . Sa kini nga basehan, adunay medyo popular nga DCS (desentralisado nga consensus system) - Zookeeper, etcd, Consul. Busa, kung ang sistema sa paghimog desisyon nagtrabaho sa pipila sa kaugalingon nga mga algorithm, nga gisulat nga independente, kinahanglan nga mag-amping pag-ayo bahin niini. Human sa pag-analisar sa usa ka dako nga gidaghanon sa mga sistema, kami mipuyo sa Patroni, usa ka open source nga sistema nga nag-una nga gimugna ni Zalando.
Ingon usa ka lyrical digression, isulti ko nga gikonsiderar usab namon ang mga solusyon sa multi-master, nga mao, ang mga pungpong nga mahimo’g pahalang nga gi-scale alang sa pagrekord. Bisan pa, alang sa duha ka panguna nga hinungdan, nakahukom kami nga dili maghimo usa ka kumpol. Una, ang ingon nga mga solusyon adunay taas nga pagkakomplikado ug, sa ingon, daghang mga kahuyangan. Lisud ang paghimo og usa ka lig-on nga solusyon alang sa tanan nga mga kaso. Ikaduha, sa kini nga kaso, ang PostgreSQL mihunong nga putli (native), ang pipila nga mga gimbuhaton dili magamit, ang pipila nga mga aplikasyon mahimong makasinati mga tinago nga mga bug sa panahon sa operasyon.
Patroni
Busa sa unsang paagi nagtrabaho si Patroni? Wala gibag-o sa mga developer ang ligid ug gisugyot nga gamiton ang usa sa napamatud-an nga solusyon sa DCS ingon sukaranan. Sa kaluoy niya gihatag ang tanan nga mga isyu sa pag-synchronize sa mga configuration, ang pagpili sa usa ka lider ug usa ka korum. Gipili namon ang etcd alang niini.
Sunod, ang Patroni naghisgot sa husto nga aplikasyon sa tanan nga mga setting sa PostgreSQL ug mga setting sa replikasyon, ingon man ang pagpatuman sa mga sugo alang sa switchover ug failover (nga mao, regular ug dili standard nga pagbalhin sa agalon). Sa partikular, sa MCS cloud, makahimo ka og cluster gikan sa usa ka master, usa ka synchronous replica, ug usa o daghan pa nga asynchronous nga mga replika. Ang presensya sa usa ka dungan nga replika nagsiguro sa kaluwasan sa datos sa labing menos 2 nga mga server, ug kini nga replika nga mahimong panguna nga "master candidate".
Tungod kay ang etcd gi-deploy sa parehas nga mga server, 3 o 5 nga mga server ang girekomenda alang sa labing maayo nga korum. Ang ingon nga usa ka kumpol nga timbangan pinahigda alang sa pagbasa (nagsulat ako bahin sa pag-scale alang sa pagsulat sa ibabaw). Bisan pa, hinumdomi nga ang mga asynchronous nga mga kopya lagmit nga malangan, labi na sa ilawom sa bug-at nga mga karga.
Ang paggamit sa ingon nga mga replika para sa pagbasa (init nga standby) gipakamatarung alang sa pagreport o mga buluhaton sa pag-analisa ug pagdiskarga sa master server.
Kung gusto nimo nga maghimo sa ingon nga kumpol sa imong kaugalingon, nan kinahanglan nimo:
- pag-andam sa 3 o daghan pa nga mga server, i-configure ang IP addressing ug mga lagda sa firewall tali kanila;
- i-install ang mga pakete alang sa etcd, Patroni, PostgreSQL nga mga serbisyo;
- paghimo ug etcd cluster;
- i-configure ang serbisyo sa patroni aron magtrabaho kauban ang PostgreSQL.
Kana mao, sa kinatibuk-an, kinahanglan nimo nga husto ang paghimo sa usa ka dosena nga mga file sa pag-configure ug dili masayop bisan diin. Aron mahimo kini, kinahanglan gyud nga mogamit ka usa ka himan sa pagdumala sa pagsumpo, sama sa Ansible, pananglitan. Bisan pa, wala pa kaayo magamit nga TCP balancer. Ang paghimo niini usa ka lahi nga trabaho.
Alang sa mga nanginahanglan usa ka andam nga pundok, apan dili gusto nga maglibot sa tanan niini, gisulayan namon nga pasimplehon ang kinabuhi ug naghimo usa ka andam nga pundok sa Patroni sa among panganod, mahimo nimo kini sulayan nga libre. Dugang pa sa cluster mismo, among gibuhat:
- tigbalanse sa TCP; sa lain-laing mga pantalan, kini kanunay nagpunting sa kasamtangan nga agalon, dungan o asynchronous replica, sa tinagsa;
- API aron ibalhin ang aktibo nga master sa Patroni.
Mahimo silang ma-subclass pinaagi sa MCS cloud API ug sa web console.
Demo
Aron masulayan ang mga kapabilidad sa usa ka PostgreSQL cluster sa MCS cloud, atong tan-awon kung giunsa ang usa ka buhi nga aplikasyon molihok kung adunay mga problema sa DBMS.
Ang mosunud mao ang code sa aplikasyon nga mag-log sa mga artipisyal nga panghitabo ug ireport kini sa screen. Kung adunay mga kasaypanan, kini i-report kini ug ipadayon ang trabaho niini sa usa ka loop hangtod nga ihunong namon kini gamit ang Ctrl + C nga kombinasyon.
from __future__ import print_function
from datetime import datetime
from random import randint
from time import sleep
import psycopg2
def main():
try:
connection = psycopg2.connect(user = "admin",
password = "P@ssw0rd",
host = "89.208.87.38",
port = "5432",
database = "myproddb")
cursor = connection.cursor()
cursor.execute("SELECT version();")
record = cursor.fetchone()
print("Connection opened to", record[0])
cursor.execute(
"INSERT INTO log VALUES ({});".format(randint(1, 10000)))
connection.commit()
cursor.execute("SELECT COUNT(event_id) from log;")
record = cursor.fetchone()
print("Logged a value, overall count: {}".format(record[0]))
except Exception as error:
print ("Error while connecting to PostgreSQL", error)
finally:
if connection:
cursor.close()
connection.close()
print("Connection closed")
if __name__ == '__main__':
try:
while True:
try:
print(datetime.now())
main()
sleep(3)
except Exception as e:
print("Caught error:n", e)
sleep(1)
except KeyboardInterrupt:
print("exit")
Ang aplikasyon nanginahanglan PostgreSQL aron molihok. Magbuhat ta ug cluster sa MCS cloud gamit ang API. Sa usa ka regular nga terminal, diin ang OS_TOKEN variable adunay usa ka timaan alang sa pag-access sa API (mahimong makuha gamit ang openstack token issue command), atong i-type ang mga sugo:
Paghimo og cluster:
cat <<EОF > pgc10.json
{"cluster":{"name":"postgres10","allow_remote_access":true,"datastore":{"type":"postgresql","version":"10"},"databases":[{"name":"myproddb"}],"users":[{"databases":[{"name":"myproddb"}],"name":"admin","password":"P@ssw0rd"}],"instances":[{"key_name":"shared","availability_zone":"DP1","flavorRef":"d659fa16-c7fb-42cf-8a5e-9bcbe80a7538","nics":[{"net-id":"b91eafed-12b1-4a46-b000-3984c7e01599"}],"volume":{"size":50,"type":"DP1"}},{"key_name":"shared","availability_zone":"DP1","flavorRef":"d659fa16-c7fb-42cf-8a5e-9bcbe80a7538","nics":[{"net-id":"b91eafed-12b1-4a46-b000-3984c7e01599"}],"volume":{"size":50,"type":"DP1"}},{"key_name":"shared","availability_zone":"DP1","flavorRef":"d659fa16-c7fb-42cf-8a5e-9bcbe80a7538","nics":[{"net-id":"b91eafed-12b1-4a46-b000-3984c7e01599"}],"volume":{"size":50,"type":"DP1"}}]}}
EOF
curl -s -H "X-Auth-Token: $OS_TOKEN"
-H 'Accept: application/json'
-H 'Content-Type: application/json'
-d @pgc10.json https://infra.mail.ru:8779/v1.0/ce2a41bbd1434013b85bdf0ba07c770f/clusters

Kung ang cluster mobalhin sa ACTIVE status, ang tanan nga field makakuha sa kasamtangan nga mga bili - ang cluster andam na.
Sa GUI:

Atong sulayan ang pagkonektar ug paghimo og lamesa:
psql -h 89.208.87.38 -U admin -d myproddb
Password for user admin:
psql (11.1, server 10.7)
Type "help" for help.
myproddb=> CREATE TABLE log (event_id integer NOT NULL);
CREATE TABLE
myproddb=> INSERT INTO log VALUES (1),(2),(3);
INSERT 0 3
myproddb=> SELECT * FROM log;
event_id
----------
1
2
3
(3 rows)
myproddb=>

Sa aplikasyon, among ipiho ang karon nga mga setting alang sa pagkonektar sa PostgreSQL. Atong itakda ang adres sa TCP balancer, sa ingon mawagtang ang panginahanglan alang sa manwal nga pagbalhin sa adres sa agalon. Atong ilunsad kini. Sama sa imong nakita, ang mga panghitabo malampuson nga na-log sa database.

Naka-iskedyul nga Master Switchover
Karon atong sulayan ang operasyon sa atong aplikasyon sa panahon sa giplano nga pagbalhin sa agalon:

Gitan-aw namon ang aplikasyon. Nakita namon nga ang aplikasyon nabalda gayud, apan kini nagkinahanglan lamang og pipila ka mga segundo, niining partikular nga kaso, ang maximum nga 9.

pagkabangga sa sakyanan
Karon atong sulayan ang pagsundog sa pagkahulog sa virtual machine, ang kasamtangan nga agalon. Posible nga i-off lang ang virtual machine pinaagi sa interface sa Horizon, kini usa ra ka regular nga pagsira. Ang ingon nga switch iproseso sa tanan nga mga serbisyo, lakip ang Patroni.
Kinahanglan namon ang dili matag-an nga pagsira. Busa, gihangyo nako ang among mga tigdumala alang sa mga katuyoan sa pagsulay nga isira ang virtual machine - ang kasamtangan nga agalon - sa dili normal nga paagi.

Sa samang higayon, ang among aplikasyon nagpadayon sa pagtrabaho. Siyempre, ang ingon nga usa ka emerhensya nga pagbalhin sa agalon dili mamatikdan.
2019-03-29 10:45:56.071234
Connection opened to PostgreSQL 10.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
Logged a value, overall count: 453
Connection closed
2019-03-29 10:45:59.205463
Connection opened to PostgreSQL 10.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
Logged a value, overall count: 454
Connection closed
2019-03-29 10:46:02.661440
Error while connecting to PostgreSQL server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Caught error:
local variable 'connection' referenced before assignment
……………………………………………………….. - здесь какое-то количество ошибок
2019-03-29 10:46:30.930445
Error while connecting to PostgreSQL server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Caught error:
local variable 'connection' referenced before assignment
2019-03-29 10:46:31.954399
Connection opened to PostgreSQL 10.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
Logged a value, overall count: 455
Connection closed
2019-03-29 10:46:35.409800
Connection opened to PostgreSQL 10.7 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
Logged a value, overall count: 456
Connection closed
^Cexit
Sama sa imong nakita, ang aplikasyon nakahimo sa pagpadayon sa trabaho niini nga wala’y 30 segundos. Oo, usa ka piho nga gidaghanon sa mga tiggamit sa serbisyo adunay panahon nga makamatikod sa mga problema. Bisan pa, kini usa ka seryoso nga pagkaguba sa server, dili kini kanunay nga mahitabo. Sa parehas nga oras, ang usa ka tawo (administrator) halos wala’y oras nga dali nga molihok, gawas kung naglingkod siya sa console nga andam nga adunay usa ka switching script.
konklusyon
Para nako ang ingon nga cluster naghatag ug dakong bentaha sa mga tigdumala. Sa tinuud, ang mga grabe nga pagkaguba ug pagkapakyas sa mga server sa database dili mamatikdan sa aplikasyon ug, sa ingon, sa tiggamit. Dili nimo kinahanglan nga ayohon ang usa ka butang nga magdali ug magbalhin sa temporaryo nga mga pag-configure, mga server, ug uban pa. Ug kung ang ingon nga solusyon gigamit ingon usa ka andam nga serbisyo sa panganod, nan dili kinahanglan nga mogahin og panahon sa pag-andam niini. Mahimo nimong buhaton ang usa ka butang nga mas makapaikag.
Source: www.habr.com
