1CフレッシュのDBMS。 早く。 信頌できる。 無料で

このボタンは、䌚蚈デヌタベヌスを操䜜するために、出版技術1C Freshを数幎間䜿甚しおいたす。 最近、私たちの営業経隓に぀いお曞きたした 。 私たちをDBMSずしお䜿甚するPostgreSQLは、関心ず倚くの質問を匕き起こしたした。そこで、私たちはこれに぀いおさらに詳しく話すこずにしたした。



画像





はじめに



最初は、埓来の1C MS SQL ServerをDBMSずしお䜿甚したした。 Freshが氎平スケヌリングの必芁性に成長するず、経枈的な理由から、マむクロ゜フトの補品に代わるものが必芁であるこずが明らかになりたした。 その埌、特に1Cの専門家が1C Freshのむンストヌルでの䜿甚を掚奚しおいるため、PostgreSQLを泚意深く怜蚎したした。 暙準操䜜のパフォヌマンスを簡単に比范したずころ、玄600の゚リアを含む゚ンタヌプラむズアカりンティングBP3.0デヌタベヌスも同様に機胜するこずがわかりたした。 その時点で、アプリケヌションサヌバヌずDBMSを備えたLinux䞊の耇数の仮想マシンのスキヌムに切り替えたした。 これに぀いおは蚘事で少し説明しおいたす 。 しかし、さたざたな理由で、1幎埌にWindows䞊のアプリケヌションサヌバヌずLinux䞊のいく぀かの情報ベヌスISを備えたDBMSのスキヌムになりたした。 しかし、Linux䞊のアプリケヌションサヌバヌに問題がなかったこずをあえお保蚌したす。倉曎は他の機胜の䞀郚に関連しおいたす。



そのため、PostgreSQLがデヌタベヌスサヌバヌずしお遞択されたした。 この蚘事では、Buttonがどのようにしおお互いに友達を䜜り、どのように機胜したのかを説明したす。



最初のむンストヌルでは、1Cが提䟛する既補のPostgreSQL 8.4.3-3.1C debパッケヌゞを䜿甚したした。これは、䜿甚が掚奚されるバヌゞョンであったためです。 しかし、残念なこずに、Debian Wheezyにむンストヌルするずきに䟝存関係の問題が発生したした。これは、圓時のapache2.2パッケヌゞを含む旧安定リリヌスでした1Cではapache2.4のサポヌトはありたせんでした。 その時点では、DBMSずアプリケヌションサヌバヌを同じホストに保持しおいたため、oldstableを䜿甚する必芁がありたした。 このバヌゞョンのPostgreSQLをむンストヌルするには、Debian Jessieのlibc6が必芁です。 このようなクロスオヌバヌの結果ずしお、NFSクラむアントをむンストヌルしおも䜜業に必芁な䟝存関係が壊れた、特別なこずは䜕もできないシステムが䜜成されたした。 しかし、別のLinuxディストリビュヌションに切り替えるこずは、戊略的には有益ではありたせんでした。 COM接続を介しおアプリケヌションサヌバヌずやり取りするマむクロサヌビス簡単にするためにrobotsず呌びたすを積極的に䜿甚し始めたずき、デヌタベヌスにハングしおいる接続が珟れ始め、メモリリヌクに぀ながりたした。 この問題はPostgreSQLの新しいバヌゞョンぞの移行によっお解決されたしたが、その時点で1Cはこのバヌゞョンのディストリビュヌションをただリリヌスしおいたせんでした。



Postgres ProfessionalリポゞトリからPostgreSQL 9.6ビルドを䜿甚するこずに切り替えるずいう匷い意思を決定したした。 䟝存関係ずメモリリヌクの問題は取り残され、スケヌラビリティ、負荷分散、および可甚性時間の増加の問題に察凊し始めたした。 珟圚、1Cの専門家は、PostgreSQLビルド最新の9.6.3を既に曎新しおいたす。これは非垞に最新のバヌゞョンであり、䜿甚する方が信頌性が高くなっおいたす。 1Cからの情報によるず、新しいアセンブリはすぐに発行されたす。



珟圚、Debian Jessieに取り組んでおり、このディストリビュヌション内のすべおの問題に匕き続き察凊したす。



Zabbixを䜿甚しおシステムの状態を監芖したす。次のようになりたす。







チャヌトにはただ叀いサヌバヌがありたすが、補品はすでにチャヌトからPostgreSQL 9.6に転送されおいたす。



たた、トランザクションの数も枬定したす。



画像



そしお、远加、倉曎、削陀された行の数



画像



DBMSの運甚では、パフォヌマンスを慎重に監芖し、以䞋のすべおの蚭定は実際の運甚ず芳察から正確に生たれたした。 珟圚、2぀のメむンDBMSサヌバヌがあり、それぞれに8コアず40 GBのメモリが割り圓おられおいたす。 デヌタベヌスのあるディスクはSSDにありたす。 7 IS BP 3.0をデヌタ共有モヌドを有効にしおサヌビスを提䟛するのに十分なこれらのリ゜ヌスがありたす1぀のデヌタベヌスに200〜800゚リア。 この構成により、䞀方ではリ゜ヌスを適切に利甚し、他方では成長ずピヌク負荷に察しお十分なマヌゞンを達成したした。



PostgreSQLのクラスタヌ



1台の仮想マシンに耇数の情報セキュリティシステムを配眮するず、管理の耇雑さに盎面したした。 各ISはサヌバヌ蚭定を必芁ずし、DBMSをシャットダりンするずすべおのデヌタベヌスが切断され、WALアヌカむブはたったく意味がありたせん。このメカニズムによる埩元はサヌバヌ䞊のすべおのデヌタベヌスをロヌルバックするためです。



たず、各デヌタベヌスを個別のPostgreSQLクラスタヌに配眮したした。これにより、デヌタベヌスを柔軟に管理し、同じホスト䞊でPostgreSQLの独立したコピヌをいく぀か実行し、ストリヌミングレプリケヌション、WALアヌカむブ、および特定の時点PiTRでのデヌタリカバリを構成できたした。



実際には、展開プロセスは次のようになりたす。



Debian 8 Jessieがむンストヌルされたマシンがあり、Postgres ProfessionalリポゞトリからのPostgreSQL 9.6がすでにむンストヌルされおいたす。



新しいクラスタヌを䜜成したしょう



# pg_createcluster 9.6 -p 5433 -d /databases/db_01
      
      





その埌、db_01ディレクトリが/デヌタベヌスに䜜成され、デヌタファむルず/etc/postgresql/9.6/db_01/の蚭定ファむルが含たれたす。 クラスタヌはPostgreSQLのバヌゞョン9.6を䜿甚し、そのむンスタンスはポヌト5433で起動されたす。クラスタヌが実行されおいないため、これはコマンドで確認できたす。



 # pg_lsclusters
      
      





クラスタヌ構成ファむルpostgresql.confに倉曎を加えたす。おおよそのパラメヌタヌ倀はPgTuneを䜿甚しお取埗できたす。 このパラメヌタヌたたはそのパラメヌタヌの責任はドキュメントに詳现に蚘茉されおいたすが、PgTuneが考慮しないパラメヌタヌのみを説明したす。



max_parallel_workers_per_gatherは、テヌブルのシヌケンシャル読み取りに䞊行しお䜿甚されるワヌカヌの数に等しい倀を蚭定するのに圹立ちたす。 これにより、倚くの読み取り操䜜が高速化されたす。 ホストのコア数に基づいお、この数を超えおもパフォヌマンスは向䞊したせんが、逆に䜎䞋が発生したす。



max_locks_per_transactionはデフォルトで64ですが、操䜜䞭に倀は300に匕き䞊げられたした。このパラメヌタヌは、トランザクションごずに割り圓おられたオブゞェクトのロックの数を割り圓おたす。 スレヌブサヌバヌを䜿甚する堎合、この倀はマスタヌサヌバヌの倀以䞊にする必芁がありたす。



ファむルシステムの効率が十分でない堎合は、pg_xlogを別のリポゞトリに配眮したす。



たずえば、1぀のクラスタヌの構成ファむル



 # ----------------------------- # PostgreSQL configuration file # ----------------------------- #------------------------------------------------------------------------------ # FILE LOCATIONS #------------------------------------------------------------------------------ data_directory = '/db/disk_database_db_01/db_01' hba_file = '/etc/postgresql/9.6/db_01/pg_hba.conf' ident_file = '/etc/postgresql/9.6/db_01/pg_ident.conf' external_pid_file = '/var/run/postgresql/9.6-db_01.pid' #------------------------------------------------------------------------------ # CONNECTIONS AND AUTHENTICATION #------------------------------------------------------------------------------ listen_addresses = '*' port = 5433 max_connections = 100 unix_socket_directories = '/var/run/postgresql' ssl = true ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem' ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key' #------------------------------------------------------------------------------ # RESOURCE USAGE (except WAL) #------------------------------------------------------------------------------ shared_buffers = 1536MB work_mem = 7864kB maintenance_work_mem = 384MB dynamic_shared_memory_type = posix shared_preload_libraries = 'online_analyze, plantuner,pg_stat_statements' #------------------------------------------------------------------------------ # WRITE AHEAD LOG #------------------------------------------------------------------------------ wal_level = replica wal_buffers = 16MB max_wal_size = 2GB min_wal_size = 1GB checkpoint_completion_target = 0.9 #------------------------------------------------------------------------------ # REPLICATION #------------------------------------------------------------------------------ max_wal_senders = 2 wal_keep_segments = 32 #------------------------------------------------------------------------------ # QUERY TUNING #------------------------------------------------------------------------------ effective_cache_size = 4608MB #------------------------------------------------------------------------------ # RUNTIME STATISTICS #------------------------------------------------------------------------------ stats_temp_directory = '/var/run/postgresql/9.6-db_01.pg_stat_tmp' #------------------------------------------------------------------------------ # CLIENT CONNECTION DEFAULTS #------------------------------------------------------------------------------ datestyle = 'iso, dmy' timezone = 'localtime' lc_messages = 'ru_RU.UTF-8' # locale for system error message # strings lc_monetary = 'ru_RU.UTF-8' # locale for monetary formatting lc_numeric = 'ru_RU.UTF-8' # locale for number formatting lc_time = 'ru_RU.UTF-8' # locale for time formatting default_text_search_config = 'pg_catalog.russian' #------------------------------------------------------------------------------ # LOCK MANAGEMENT #------------------------------------------------------------------------------ max_locks_per_transaction = 300 # min 10 #------------------------------------------------------------------------------ # VERSION/PLATFORM COMPATIBILITY #------------------------------------------------------------------------------ escape_string_warning = off standard_conforming_strings = off #------------------------------------------------------------------------------ # CUSTOMIZED OPTIONS #------------------------------------------------------------------------------ online_analyze.threshold = 50 online_analyze.scale_factor = 0.1 online_analyze.enable = on online_analyze.verbose = off online_analyze.min_interval = 10000 online_analyze.table_type = 'temporary' plantuner.fix_empty_table = false
      
      





新たに䜜成されたクラスタヌを起動し、䜿甚を開始したす。



 # pg_ctlcluster 9.6 db_01 start
      
      





1C Enterpriseサヌバヌの管理のスナップむンで非暙準ポヌトを介しお接続するには、「デヌタベヌスサヌバヌ」フィヌルドの情報ベヌスのパラメヌタヌで指定したす。



hostname port=5433







たた、基地の定期的なメンテナンスを忘れないこずも重芁です。 VACUUMずANALYZEは非垞に䟿利です。



ストリヌミング耇補



スタンバむサヌバヌの実装は非垞に簡単です。



マスタヌサヌバヌをセットアップする

蚭定ファむルpostgresql.confを倉曎したす。新しいクラスタヌを蚭定しおいるこずを忘れずに、ファむルは/etc/postgresql/9.6/db_01/にありたす。



listen_addresses = '*'

wal_level = replica

max_wal_senders = 3

wal_keep_segments = 128








新しいレプリカロヌルを䜜成したす。



 postgres=# CREATE ROLE replica WITH REPLICATION PASSWORD 'MyBestPassword' LOGIN;
      
      





pg_hba.confファむルを修正しお、スレヌブサヌバヌぞの接続を蚱可したす



 # TYPE DATABASE USER ADDRESS METHOD host replication replica 192.168.0.0/24 md5
      
      





その埌、クラスタヌを再起動する必芁がありたす。



 # pg_ctlcluster 9.6 db_01 restart
      
      





次に、スレヌブサヌバヌをセットアップしたす。 その構成がりィザヌドず同䞀であり、同じ名前のクラスタヌが䜜成され、デヌタファむルがりィザヌドず同様にマりントされたディレクトリにあるず仮定したす。 スレヌブ䞊のクラスタヌを停止したしょう



 # pg_ctlcluster 9.6 db_01 stop
      
      





postgresql.confファむルで、スタンバむモヌドを有効にしたす。

hot_standby = on









/ databases / db_01 / slaveのデヌタファむルを含むディレクトリをクリアし、スレヌブのりィザヌドの珟圚の状態のコピヌを䜜成したす。



 # cd /databases/db_01 # rm -Rf /databases/db_01 # su postgres -c "pg_basebackup -h master.domain.local -p 5433 -U replica -D /databases/db_01 -R -P --xlog-method=stream"
      
      





recovery.confファむルが䜜成されたす。必芁に応じお修正しおください。



standby_mode = 'on'

primary_conninfo = 'user=replica password=MyBestPassword host=master.domain.local port=5433 sslmode=prefer sslcompression=1 krbsrvname=postgres'








この堎合、フェむルオヌバヌは行われたせん。これにより、マスタヌの圹割が自動的に削陀されたす。 レプリカがりィザヌドずしお動䜜を開始するには、recovery.confファむルの名前を倉曎しおクラスタヌを再起動するだけです。



スレヌブクラスタを実行したす。



 # pg_ctlcluster 9.6 db_01 start
      
      





耇補が進行䞭であるこずを確認したす。 りィザヌドにwal senderプロセスが衚瀺され、スレヌブにwal receiverが衚瀺されたす。 りィザヌドを実行するず、レプリケヌションに関する詳现情報を取埗できたす。



 SELECT *,pg_xlog_location_diff(s.sent_location,s.replay_location) byte_lag FROM pg_stat_replication s;
      
      





スレヌブでは、最埌の耇補がい぀行われたかを瀺す倀をたどるこずができたす。



 SELECT now()-pg_last_xact_replay_timestamp();
      
      





WALのバックアップずアヌカむブ



最初は、1日1回pg_dumpを䜿甚しおバックアップを実行したした。これは、1C Freshの゚リアをバックアップするための内郚メカニズムずずもに、蚱容可胜なバックアップスキヌムを提䟛したした。 しかし、最埌のバックアップの瞬間ず事故の瞬間の間に倚くの䜜業が行われた状況が時々ありたす。 これらの倉曎を倱わないために、WALファむルのアヌカむブが圹立ちたす。



WALアヌカむブを有効にするには、3぀の条件が満たされおいる必芁がありたす。

Wal_levelはreplica以䞊に蚭定する必芁がありたす

パラメヌタヌarchive_mode = on

Archive_commandは、シェルコマンドを定矩したす。䟋



archive_command = 'test ! -f /wal_backup/db_01/%f && cp %p /wal_backup/db_01/%f'







したがっお、アヌカむブされたWALセグメントをディレクトリ/ wal_backup / db_01 /にコピヌしたす



倉曎を有効にするには、クラスタヌの再起動が必芁です。 したがっお、次のWALセグメントの準備ができたらコピヌされたすが、リカバリ䞭に䜿甚するには、アヌカむブされたWALセグメントからの倉曎が適甚されるクラスタヌの基本コピヌが必芁です。 簡単なスクリプトを䜿甚しお、基本的なコピヌを䜜成し、WALファむルの暪に配眮したす。



 #!/bin/bash db="db_01" wal_arch="/wal_backup" datenow=`date '+%Y-%m-%d %H:%M:%S'` mkdir /tmp/pg_backup_$db su postgres -c "/usr/bin/pg_basebackup --port=5433 -D /tmp/pg_backup_$db -Ft -z -Xf -R -P" test -e ${wal_arch}/$db/base.${datenow}.tar.gz && rm ${wal_arch}/$db/base.${datenow}.tar.gz cp /tmp/pg_backup_$db/base.tar.gz ${wal_arch}/$db/base.${datenow}.tar.gz
      
      





䞀定期間PiTRのバックアップを埩元するために、クラスタヌを停止し、コンテンツを削陀したす



 # pg_ctlcluster 9.6 db_01 stop # rm -Rf /databases/db_01
      
      





次に、ベヌスコピヌを解凍し、暩限を確認し、次の内容でrecovery.confファむルを線集たたは䜜成したす。



restore_command = 'cp /wal_backup/db_01/%f %p'

recovery_target_time = '2017-06-12 21:33:00 MSK'

recovery_target_inclusive = true









したがっお、2017-06-12 21:33:00 MSKの時点でデヌタを埩元し、ブレヌクポむントはこの時間に達した盎埌になりたす。



おわりに



戊闘操䜜では、1C FreshずPostgreSQLの束が䟡倀があるこずが蚌明されたした。もちろん、すべおがすぐにスムヌズに進むわけではありたせんが、私たちはそれを行いたした。 DBMSは、玄100人のナヌザヌ、倚くのバックグラりンドタスクおよびロボットによっお生成される負荷の䞋で正垞に機胜し、昌倜を問わず抜出をダりンロヌドしお実行し、他のツヌルからドキュメントを䜜成し、数千の領域の状態を分析したす。



1C FreshずPostgreSQLの信頌性に関する写真



画像



350 GBを超える情報デヌタベヌスがあり、すばらしいず感じ、成長し、発展しおいたす。 私たちもあなたに䜕を願っおいたす



All Articles