αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž†αŸ’αž›αž„αžšαžœαžΆαž„ PostgreSQL αž“αž·αž„ MySQL

αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž†αŸ’αž›αž„αžšαžœαžΆαž„ PostgreSQL αž“αž·αž„ MySQL

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž‚αžΌαžŸαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž†αŸ’αž›αž„αžšαžœαžΆαž„ PostgreSQL αž“αž·αž„ MySQL αž€αŸαžŠαžΌαž…αž‡αžΆαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αž‘αžΎαž„αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž†αŸ’αž›αž„αžšαžœαžΆαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž–αžΈαžšαŸ” αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αž˜αŸ’αž›αž„αž†αŸ’αž›αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαžŠαžΌαž…αž‚αŸ’αž“αžΆ αž αžΎαž™αžœαžΆαž‡αžΆαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ RDBMS αž˜αž½αž™αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αž½αž™αž‘αŸ€αžαŸ”

αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αž“αž·αž„ MySQL αž‡αžΆαž‘αžΌαž‘αŸ…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž‡αžΆαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αž”αž“αŸ’αžαŸ‚αž˜ αž–αž½αž€αž‚αŸαž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžŸαž˜αžαŸ’αžαž—αžΆαž– NoSQL αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž…αž˜αŸ’αž›αž„αžšαžœαžΆαž„ PostgreSQL αž“αž·αž„ MySQL αžαžΆαž˜αž‘αžŸαŸ’αžŸαž“αŸˆ DBMS αžŠαŸ‚αž›αž‘αžΆαž€αŸ‹αž‘αž„αŸ”

αž™αžΎαž„αž“αžΉαž„αž˜αž·αž“αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž„αžΆαžšαžαžΆαž„αž€αŸ’αž“αž»αž„αž‘αžΆαŸ†αž„αž˜αžΌαž›αž‘αŸ αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ„αž™αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž”αžΆαž“αž‚αŸ†αž“αž·αžαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžšαžœαžΆαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž‚αž»αžŽαžŸαž˜αŸ’αž”αžαŸ’αžαž· αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹ αž“αž·αž„αž€αžšαžŽαžΈαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžšαžœαžΆαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αŸαŸ‡αž”αž·αž‘αž–αžΈαžšαž‚αžΊαž’αŸ’αžœαžΎαž‘αžΎαž„αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž‚αŸ„αž›αž–αžΈαžš αž¬αž”αŸ’αžšαžΎαžŸαŸ†αžŽαž½αžšαžšαžœαžΆαž„αž˜αŸ (αž’αŸ’αž“αž€αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™ មេ αž¬αžŸαž€αž˜αŸ’αž˜) αž“αž·αž„αž‘αžΆαžŸαž€αžš (αž’αŸ’αž“αž€αž‡αžΆαžœ αžšαž„αŸ‹αž…αžΆαŸ† αž¬αž’αž€αž˜αŸ’αž˜)αŸ” αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸƒαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž–αŸαž›αžœαŸαž›αžΆαž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αŸαž“αŸ…αž›αžΎαž•αŸ’αž“αŸ‚αž€αž‘αžΆαžŸαž€αžšαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αŸαžšαž–αžΈαž˜αŸαž‘αŸ… slave αž–αŸ„αž›αž‚αžΊαž–αžΈαžŸαž€αž˜αŸ’αž˜αž‘αŸ…αž’αž€αž˜αŸ’αž˜ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž€αŸ’αž“αž»αž„αž‘αž·αžŸαžŠαŸ…αžαŸ‚αž˜αž½αž™αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αŸ’αž“αž€αž’αžΆαž…αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžšαžœαžΆαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαžšαž€αŸ’αž“αž»αž„αž‘αž·αžŸαžŠαŸ…αž‘αžΆαŸ†αž„αž–αžΈαžš αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αŸαžšαž–αžΈ slave αž‘αŸ…αž˜αŸαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž€αž˜αŸ’αž˜αŸ” αž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡ αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžαžΆαž˜αž›αŸ†αž  αž‚αžΊαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžšαžœαžΆαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αŸαŸ‡αž”αž·αž‘αž–αžΈαžš αž¬αž…αŸ’αžšαžΎαž“αŸ” αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž€αž˜αŸ’αž˜ αž¬αžŸαž€αž˜αŸ’αž˜-αž’αž€αž˜αŸ’αž˜αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžš αž—αžΆαž–αž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸƒαžŸαž˜αžαŸ’αžαž—αžΆαž–αž”αŸ‚αž”αž“αŸαŸ‡αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ†αž”αžΌαž„ αž¬αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαžΆαž„αž€αŸ’αžšαŸ… αž“αž·αž„αž€αžΆαžšαžŠαŸ„αŸ‡αžŠαžΌαžšαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž‚αžΊαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžšαžœαžΆαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαŸ” αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž™αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αž˜αŸ’αž›αž„αž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž αžΎαž™αž“αŸ…αžαŸ‚αžšαž€αŸ’αžŸαžΆαž€αžΆαžšαžαžαž…αž˜αŸ’αž›αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž…αž˜αŸ’αž›αž„αžαžΆαž˜αž–αŸαž›αžœαŸαž›αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αŸ” MySQL αž“αž·αž„ PostgreSQL αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αž“αžΌαžœαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž‘αŸ‡ αž¬αžαžΆαž˜αžšαž™αŸˆαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈ αžšαž½αž˜αž‘αžΆαŸ†αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž‚αŸ„αž›αž–αžΈαžš αž€αžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„αžαžΆαžŸ αž“αž·αž„αžŸαŸαž…αž€αŸ’αžαžΈαžαŸ’αž›αŸ‚αž„αž€αžΆαžšαžŽαŸ αž“αž·αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž•αŸ’αž’αŸ‚αž€αž›αžΎαž‡αž½αžšαžŠαŸαž€αŸ”

αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž†αŸ’αž›αž„αž‚αŸ’αž“αžΆαžšαžœαžΆαž„ MySQL αž“αž·αž„ PostgreSQL αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαž…αŸ†αžŽαžΆαž€αžŸαŸ’αžšαž»αž€αž˜αž½αž™αžŠαž„αž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž½αž™αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αž½αž™αž‘αŸ€αžαŸ” αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž”αŸ’αžšαžΎαž–αž·αž’αžΈαž€αžΆαžšαž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαž˜αž·αž“αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹αž–αž½αž€αžœαžΆαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™ αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αžαžΆαž„αž€αŸ’αžšαŸ… αž§αž‘αžΆαž αžšαžŽαŸ pg_chameleon αŸ”

αžαžΎαž’αŸ’αžœαžΈαž‘αŸ…αž‡αžΆ pg_chameleon

pg_chameleon αž‚αžΊαž‡αžΆαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž…αž˜αŸ’αž›αž„αž–αžΈ MySQL αž‘αŸ… PostgreSQL αž“αŸ…αž€αŸ’αž“αž»αž„ Python 3. αžœαžΆαž”αŸ’αžšαžΎ open source mysql-replication library αž€αŸαž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ Python αž•αž„αžŠαŸ‚αžšαŸ” αžšαžΌαž”αž—αžΆαž–αž‡αž½αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αžšαž„αŸ‹αž…αŸαž‰αž–αžΈαžαžΆαžšαžΆαž„ MySQL αž“αž·αž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‡αžΆαžœαžαŸ’αžαž» JSONB αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŒαž·αž‚αŸ’αžšαžΈαž”αžŠαŸ„αž™αž˜αž»αžαž„αžΆαžš pl/pgsql αž“αž·αž„αž•αž›αž·αžαž‘αžΎαž„αžœαž·αž‰αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž“αŸƒ pg_chameleon

αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸ MySQL αž…αŸ’αžšαžΎαž“αž–αžΈαž…αž„αŸ’αž€αŸ„αž˜αžαŸ‚αž˜αž½αž™αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž˜αŸ’αž›αž„αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αž‚αŸ„αž›αžŠαŸ…αžαŸ‚αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αž½αž™αž‘αŸ…αž…αŸ’αžšαžΎαž“
αžˆαŸ’αž˜αŸ„αŸ‡αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž”αŸ’αžšαž—αž– αž“αž·αž„αž‚αŸ„αž›αžŠαŸ…αž˜αž·αž“αž’αžΆαž…αžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αžΆαž“αž‘αŸαŸ”
αž‘αž·αž“αŸ’αž“αž“αŸαž™β€‹αž…αž˜αŸ’αž›αž„β€‹αž’αžΆαž…β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž‘αŸ…β€‹αž™αž€β€‹αž–αžΈβ€‹αž€αžΆαžšβ€‹αž…αž˜αŸ’αž›αž„ MySQL αž›αŸ’αž”αžΆαž€αŸ‹αŸ”
αžαžΆαžšαžΆαž„αžŠαŸ‚αž›αž˜αž·αž“αž’αžΆαž…αž…αž˜αŸ’αž›αž„ αž¬αž”αž„αŸ’αž€αžΎαžαž€αŸ†αž αž»αžŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαž€αž…αŸαž‰αŸ”
αž˜αž»αžαž„αžΆαžšαž…αž˜αŸ’αž›αž„αž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αžŠαŸαž˜αž·αž“αŸ”
αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžαžΆαž˜αžšαž™αŸˆαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎ YAML αž“αž·αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”

αž§αž‘αžΆαž αžšαžŽαŸ:

αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“
vm៣្αŸ₯្
vm៣្αŸ₯្

αž€αŸ†αžŽαŸ‚αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš
CentOS Linux 7.6 x86_64
CentOS Linux 7.5 x86_64

αž€αŸ†αžŽαŸ‚αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ DB
αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ MySQL 5.7.26
PostgreSQL ៨.ៀ.៦

αž…αŸ’αžšαž€ DB
3306
5433

αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP
192.168.56.102
192.168.56.106

αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αžŸαžΌαž˜αžšαŸ€αž”αž…αŸ†αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„ pg_chameleon αŸ” αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡αžŠαŸ†αž‘αžΎαž„ Python 3.6.8 αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž”αžšαž·αžŸαŸ’αžαžΆαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŸαž€αž˜αŸ’αž˜αŸ”

$> wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
$> tar -xJf Python-3.6.8.tar.xz
$> cd Python-3.6.8
$> ./configure --enable-optimizations
$> make altinstall

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αž‘αžΎαž„αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ Python3.6 αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αŸ†αž–αŸαž‰αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹ αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž”αžšαž·αžŸαŸ’αžαžΆαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŸαž€αž˜αŸ’αž˜αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž˜αŸ‰αžΌαžŒαž»αž› pip αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‘αŸ…αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αž αž“αž·αž„αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„ pg_chameleon αŸ” αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžŠαŸ„αž™αž…αŸαžαž“αžΆαžŠαŸ†αž‘αžΎαž„ pg_chameleon 2.0.9 αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαž‚αžΊ 2.0.10 αž€αŸαžŠαŸ„αž™αŸ” αž“αŸαŸ‡αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž‡αŸ€αžŸαžœαžΆαž„αž€αŸ†αž αž»αžŸαžαŸ’αž˜αžΈαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αŸ”

$> python3.6 -m venv venv
$> source venv/bin/activate
(venv) $> pip install pip --upgrade
(venv) $> pip install pg_chameleon==2.0.9

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž αŸ…αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘αž‘αŸ… pg_chameleon (chameleon αž‚αžΊαž‡αžΆαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ) αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ set_configuration_files αžŠαžΎαž˜αŸ’αž”αžΈαž”αžΎαž€ pg_chameleon αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαžαžαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž“αž·αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”

(venv) $> chameleon set_configuration_files
creating directory /root/.pg_chameleon
creating directory /root/.pg_chameleon/configuration/
creating directory /root/.pg_chameleon/logs/
creating directory /root/.pg_chameleon/pid/
copying configuration  example in /root/.pg_chameleon/configuration//config-example.yml

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž“αŸƒ config-example.yml αž‡αžΆ default.yml αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαž€αŸ’αž›αžΆαž™αž‡αžΆαž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ” αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‚αŸ†αžšαžΌαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

$> cat default.yml
---
#global settings
pid_dir: '~/.pg_chameleon/pid/'
log_dir: '~/.pg_chameleon/logs/'
log_dest: file
log_level: info
log_days_keep: 10
rollbar_key: ''
rollbar_env: ''

# type_override allows the user to override the default type conversion into a different one.
type_override:
  "tinyint(1)":
    override_to: boolean
    override_tables:
      - "*"

#postgres  destination connection
pg_conn:
  host: "192.168.56.106"
  port: "5433"
  user: "usr_replica"
  password: "pass123"
  database: "db_replica"
  charset: "utf8"

sources:
  mysql:
    db_conn:
      host: "192.168.56.102"
      port: "3306"
      user: "usr_replica"
      password: "pass123"
      charset: 'utf8'
      connect_timeout: 10
    schema_mappings:
      world_x: pgworld_x
    limit_tables:
#      - delphis_mediterranea.foo
    skip_tables:
#      - delphis_mediterranea.bar
    grant_select_to:
      - usr_readonly
    lock_timeout: "120s"
    my_server_id: 100
    replica_batch_size: 10000
    replay_max_rows: 10000
    batch_retention: '1 day'
    copy_max_memory: "300M"
    copy_mode: 'file'
    out_dir: /tmp
    sleep_loop: 1
    on_error_replay: continue
    on_error_read: continue
    auto_maintenance: "disabled"
    gtid_enable: No
    type: mysql
    skip_events:
      insert:
        - delphis_mediterranea.foo #skips inserts on the table delphis_mediterranea.foo
      delete:
        - delphis_mediterranea #skips deletes on schema delphis_mediterranea
      update:

αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžš pg_chameleon αž‚αŸ†αžšαžΌαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ‚αž”αŸ’αžšαŸ‚αžαž·αž…αžαž½αž…αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžŸαž˜αžŸαŸ’αžšαž”αž“αžΉαž„αž”αžšαž·αžŸαŸ’αžαžΆαž“αž”αŸ’αžšαž—αž– αž“αž·αž„αž‚αŸ„αž›αžŠαŸ… αž αžΎαž™αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‚αžΊαž‡αžΆαž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ…αž“αŸƒαž•αŸ’αž“αŸ‚αž€αž•αŸ’αžŸαŸαž„αŸ—αž“αŸƒαž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ default.yml αž˜αžΆαž“αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαž€αž› αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαžΌαž…αž‡αžΆαž‘αžΈαžαžΆαŸ†αž„αž“αŸƒαž―αž€αžŸαžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„ αž‘αžΈαžαžΆαŸ†αž„αž“αŸƒαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» αžšαž™αŸˆαž–αŸαž›αž•αŸ’αž‘αž»αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αŸ” αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž…αŸ’αž”αžΆαž”αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαŸ’αžšαž½αžαž›αžΎαž”αŸ’αžšαž—αŸαž‘αž€αŸ†αž‘αž»αž„αž–αŸαž›αž…αž˜αŸ’αž›αž„αŸ” αž§αž‘αžΆαž αžšαžŽαŸαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž‘αŸ…αž‡αžΆαž…αŸ’αž”αžΆαž”αŸ‹αžαŸ’αžšαž½αžαž›αžΎαž‚αŸ’αž“αžΆαž”αŸ’αžšαž—αŸαž‘αžŠαŸ‚αž›αž”αŸ†αž”αŸ’αž›αŸ‚αž„ tinyint(1) αž‘αŸ…αž‡αžΆαžαž˜αŸ’αž›αŸƒαž”αŸŠαžΌαž›αžΈαž“αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž™αžΎαž„αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ„αž›αžŠαŸ…αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹ pg_conn αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž™αžΎαž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž– αž–αŸ„αž›αž‚αžΊ αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž“αŸƒαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸƒαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž– αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž•αŸ‚αž“αž‘αžΈαžšαžœαžΆαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž– αž“αž·αž„αž‚αŸ„αž›αžŠαŸ… αžαžΆαžšαžΆαž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαžšαŸ†αž›αž„ αž–αŸαž›αžœαŸαž›αžΆαžšαž„αŸ‹αž…αžΆαŸ† αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† αž‘αŸ†αž αŸ†αž€αž‰αŸ’αž…αž”αŸ‹αŸ” αž…αŸ†αžŽαžΆαŸ†αžαžΆ "αž”αŸ’αžšαž—αž–" αž‚αžΊαž‡αžΆαž–αž αž»αžœαž…αž“αŸˆ αž˜αžΆαž“αž“αŸαž™αžαžΆαž™αžΎαž„αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž–αž…αŸ’αžšαžΎαž“αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ„αž›αžŠαŸ…αžαŸ‚αž˜αž½αž™ αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž…αŸ’αžšαžΎαž“αž‘αŸ…αž˜αž½αž™αŸ”

αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž§αž‘αžΆαž αžšαžŽαŸ world_x αž˜αžΆαž“αžαžΆαžšαžΆαž„αž…αŸ†αž“αž½αž“ 4 αžŠαŸ‚αž›αž˜αžΆαž“αž‡αž½αžšαžŠαŸ‚αž›αžŸαž αž‚αž˜αž“αŸ MySQL αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαŸ” αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž‰αž™αž€ αž“αŸ…αž‘αžΈαž“αŸαŸ‡. αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ†αžšαžΌαž˜αž€αž‡αžΆ tar αž“αž·αž„αž”αžŽαŸ’αžŽαžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž”αŸ‹αžŠαŸ„αž™αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž“αžΆαŸ†αž…αžΌαž›αž‡αž½αžšαžŠαŸαž€αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ MySQL αž“αž·αž„ PostgreSQL αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž–αž·αžŸαŸαžŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αžŠαžΌαž…αž‚αŸ’αž“αžΆ usr_replica αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„ MySQL αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αžŸαž·αž‘αŸ’αž’αž·αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αžŠαž›αŸ‹αžαžΆαžšαžΆαž„αž…αž˜αŸ’αž›αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

mysql> CREATE USER usr_replica ;
mysql> SET PASSWORD FOR usr_replica='pass123';
mysql> GRANT ALL ON world_x.* TO 'usr_replica';
mysql> GRANT RELOAD ON *.* to 'usr_replica';
mysql> GRANT REPLICATION CLIENT ON *.* to 'usr_replica';
mysql> GRANT REPLICATION SLAVE ON *.* to 'usr_replica';
mysql> FLUSH PRIVILEGES;

αž“αŸ…αž•αŸ’αž“αŸ‚αž€ PostgreSQL αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ db_replica αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ‚αž›αž“αžΉαž„αž‘αž‘αž½αž›αž™αž€αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž–αžΈαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ MySQL αŸ” αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ usr_replica αž€αŸ’αž“αž»αž„ PostgreSQL αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž‡αžΆαž˜αŸ’αž…αžΆαžŸαŸ‹αž“αŸƒαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž–αžΈαžšαž‚αžΊ pgworld_x αž“αž·αž„ sch_chameleon αžŠαŸ‚αž›αž˜αžΆαž“αžαžΆαžšαžΆαž„αž…αž˜αŸ’αž›αž„αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠ αž“αž·αž„αžαžΆαžšαžΆαž„αžαžαž…αž˜αŸ’αž›αž„αžšαŸ€αž„αŸ—αžαŸ’αž›αž½αž“αŸ” αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ create_replica_schema αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

postgres=# CREATE USER usr_replica WITH PASSWORD 'pass123';
CREATE ROLE
postgres=# CREATE DATABASE db_replica WITH OWNER usr_replica;
CREATE DATABASE

αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ MySQL αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αžœαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŠαžΌαž…αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΎαž„αžœαž·αž‰αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αŸ”

$> vi /etc/my.cnf
binlog_format= ROW
binlog_row_image=FULL
log-bin = mysql-bin
server-id = 1

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžœαžΆαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŽαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž–αžΈαžš αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ pg_chameleon αŸ”

αž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„ PostgreSQLαŸ–

$> mysql -u usr_replica -Ap'admin123' -h 192.168.56.102 -D world_x

αž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„ MySQLαŸ–

$> psql -p 5433 -U usr_replica -h 192.168.56.106 db_replica

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ pg_chameleon (chameleon) αž”αžΈαž”αž“αŸ’αž‘αžΆαž”αŸ‹ αžšαŸ€αž”αž…αŸ†αž”αžšαž·αžŸαŸ’αžαžΆαž“ αž”αž“αŸ’αžαŸ‚αž˜αž”αŸ’αžšαž—αž– αž“αž·αž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž…αž˜αŸ’αž›αž„αŸ” αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ create_replica_schema αž‘αŸ… pg_chameleon αž”αž„αŸ’αž€αžΎαžαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ (sch_chameleon) αž“αž·αž„αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž…αž˜αŸ’αž›αž„ (pgworld_x) αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαžšαž½αž…αž αžΎαž™αŸ” αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ add_source αž”αž“αŸ’αžαŸ‚αž˜αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž–αž‘αŸ…αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž’αžΆαž“αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ (default.yml) αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αžœαžΆαž‡αžΆ mysql αž αžΎαž™ init_replica αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”

$> chameleon create_replica_schema --debug
$> chameleon add_source --config default --source mysql --debug
$> chameleon init_replica --config default --source mysql --debug

αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‘αžΆαŸ†αž„αž”αžΈαž“αŸαŸ‡αž”αž„αŸ’αž αžΆαž‰αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αžαžΆαž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αŸ” αžšαžΆαž›αŸ‹αž€αžΆαžšαž‚αžΆαŸ†αž„ αž¬αž€αŸ†αž αž»αžŸαžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžΆαž™αž€αžΆαžšαžŽαŸαž‡αžΆαžŸαžΆαžšαžŸαžΆαž˜αž‰αŸ’αž‰ αž“αž·αž„αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαŸ”

αž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž…αž˜αŸ’αž›αž„αžŠαŸ„αž™αž”αŸ’αžšαžΎ start_replica αž αžΎαž™αž‘αž‘αž½αž›αž”αžΆαž“αžŸαžΆαžšαž‡αŸ„αž‚αž‡αŸαž™αŸ”

$> chameleon start_replica --config default --source mysql 
output: Starting the replica process for source mysql

αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž…αž˜αŸ’αž›αž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž½αžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ show_status αž αžΎαž™αž€αŸ†αž αž»αžŸαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž˜αžΎαž›αžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ show_errors αŸ”

αž›αž‘αŸ’αž’αž•αž›αŸ”

αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž“αž·αž™αžΆαž™αžšαž½αž…αž˜αž€αž αžΎαž™ αž˜αž»αžαž„αžΆαžšαž…αž˜αŸ’αž›αž„αž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αžŠαŸαž˜αž·αž“αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αž–αž½αž€αžœαžΆ αž™αžΎαž„αžŸαž½αžšαžαžΆαžšαžΆαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ Linux ps αžŠαžΌαž…αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

αž›αž‘αŸ’αž’αž•αž›αŸ”

αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αŸ αžšαž αžΌαžαž‘αžΆαž›αŸ‹αžαŸ‚αž™αžΎαž„αžŸαžΆαž€αž›αŸ’αž”αž„αžœαžΆαž€αŸ’αž“αž»αž„αž–αŸαž›αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ αžŠαžΌαž…αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αž˜αž½αž™ αž”αž‰αŸ’αž…αžΌαž›αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž–αžΈαžšαž”αžΈαž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ MySQL αž αžΎαž™αž αŸ…αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ sync_tables αž€αŸ’αž“αž»αž„ pg_chameleon αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžŠαŸαž˜αž·αž“ αž“αž·αž„αž…αž˜αŸ’αž›αž„αžαžΆαžšαžΆαž„αž‡αžΆαž˜αž½αž™αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αŸ”

mysql> create table t1 (n1 int primary key, n2 varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t1 values (1,'one');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1 values (2,'two');
Query OK, 1 row affected (0.00 sec)

$> chameleon sync_tables --tables world_x.t1 --config default --source mysql
Sync tables process for source mysql started.

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž›αž‘αŸ’αž’αž•αž›αžαŸαžŸαŸ’αž αž™αžΎαž„αžŸαž½αžšαžαžΆαžšαžΆαž„αž–αžΈαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αž αžΎαž™αž…αŸαž‰αž‡αž½αžšαŸ”

$> psql -p 5433 -U usr_replica -d db_replica -c "select * from pgworld_x.t1";
 n1 |  n2
----+-------
  1 | one
  2 | two

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαž…αŸ†αžŽαžΆαž€αžŸαŸ’αžšαž»αž€ αž“αŸ„αŸ‡αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ pg_chameleon αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αžΉαž„αž‡αžΆαž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αžšαž”αžŸαŸ‹αžœαžΆαŸ” αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž™αžΎαž„αž”αŸ’αžšαžΆαž€αžŠαžαžΆαž‡αž½αžšαžŠαŸαž€αž“αŸƒαžαžΆαžšαžΆαž„αž‚αŸ„αž›αžŠαŸ…αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž˜αŸ’αž›αž„ αž αžΎαž™αž›αž‘αŸ’αž’αž•αž›αž“αžΉαž„αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‘αŸαžšαž™αŸ‰αžΆαž„αžŸαŸ’αž’αžΆαžαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž™αŸ„αž„αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž– αž¬αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž…αž˜αŸ’αž›αž„ (sch_chameleon) αŸ”

$> chameleon stop_replica --config default --source mysql 
$> chameleon detach_replica --config default --source mysql --debug

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αž„αŸ‹αž”αžΆαž“ αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžŠαžΎαž˜αŸ’αž”αžΈαž›αž»αž”αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΎαž˜ αž“αž·αž„αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž…αž˜αŸ’αž›αž„αŸ”

$> chameleon drop_source --config default --source mysql --debug
$> chameleon drop_replica_schema --config default --source mysql --debug

αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸƒ pg_chameleon

αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžšαŸ€αž”αž…αŸ† αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”
αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž—αžΆαž–αž˜αž·αž“αž”αŸ’αžšαž€αŸ’αžšαžαžΈαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαžΆαžšαž€αŸ†αž αž»αžŸαž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹αŸ”
αžαžΆαžšαžΆαž„αž–αž·αžŸαŸαžŸαž”αž“αŸ’αžαŸ‚αž˜αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αŸ”
αžœαžΆαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž–αž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ„αž›αžŠαŸ…αžαŸ‚αž˜αž½αž™ αž αžΎαž™αž“αŸαŸ‡αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαžŽαžΆαžŸαŸ‹αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž€αŸ†αž–αž»αž„αž”αž‰αŸ’αž…αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ MySQL αž˜αž½αž™αž¬αž…αŸ’αžšαžΎαž“αž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αžαŸ‚αž˜αž½αž™αŸ”
αž’αŸ’αž“αž€αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αž˜αŸ’αž›αž„αžαžΆαžšαžΆαž„αžŠαŸ‚αž›αž”αžΆαž“αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž‘αŸαŸ”

αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž“αŸƒ pg_chameleon

αž‚αžΆαŸ†αž‘αŸ’αžšαžαŸ‚αž‡αžΆαž˜αž½αž™ MySQL 5.5 αž“αž·αž„αžαŸ’αž–αžŸαŸ‹αž‡αžΆαž„αž“αŸαŸ‡ αž‡αžΆαž”αŸ’αžšαž—αž– αž“αž·αž„ PostgreSQL 9.5 αž“αž·αž„αžαŸ’αž–αžŸαŸ‹αž‡αžΆαž„αž“αŸαŸ‡ αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ„αž›αžŠαŸ…αŸ”
αžαžΆαžšαžΆαž„αž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αžŸαŸ„αž…αž˜αŸ’αž”αž„ αž¬αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹ αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αžαžΆαžšαžΆαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αŸ†αž‘αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš init_replica αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž˜αŸ’αž›αž„αž‘αŸαŸ”
αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžαžΆαž˜αžœαž·αž’αžΈαž˜αž½αž™ - αžαŸ‚αž–αžΈ MySQL αž‘αŸ… PostgreSQL αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαžŸαž˜αžšαž˜αŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ‚αžŸαŸ€αž‚αŸ’αžœαžΈ "αžŸαž€αž˜αŸ’αž˜-αž’αž€αž˜αŸ’αž˜" αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”
αž”αŸ’αžšαž—αž–αž’αžΆαž…αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ MySQL αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž αžΎαž™αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αžŠαŸ‚αž›αž‡αžΆαž”αŸ’αžšαž—αž–αž‚αžΊαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž€αžΆαžšαž–αž·αžŸαŸ„αž’αž“αŸ αž“αž·αž„αž˜αžΆαž“αžŠαŸ‚αž“αž€αŸ†αžŽαžαŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ (αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž”αž“αŸ’αžαŸ‚αž˜ αž“αŸ…αž‘αžΈαž“αŸαŸ‡)

αž›αž‘αŸ’αž’αž•αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ pg_chameleon

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž…αž˜αŸ’αž›αž„αž“αŸ…αž€αŸ’αž“αž»αž„ pg_chameleon αž‚αžΊαž›αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈ MySQL αž‘αŸ… PostgreSQL αŸ” αž€αžΆαžšαž’αŸ’αž›αžΆαž€αŸ‹αž…αž»αŸ‡αž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹αž‚αžΊαžαžΆαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž‚αžΊαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž˜αž’αŸ’αž™αŸ„αž”αžΆαž™αž˜αž½αž™ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αž‡αŸ†αž“αžΆαž‰αž•αŸ’αž“αŸ‚αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ†αž“αž„αž‡αžΆαž˜αž·αž“αž…αž„αŸ‹αž”αŸ’αžšαžΎαžœαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž€αŸ’αžšαŸ…αž–αžΈαž€αžΆαžšαž’αŸ’αžœαžΎαž…αŸ†αžŽαžΆαž€αžŸαŸ’αžšαž»αž€αž“αŸ„αŸ‡αž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αž‰αŸ’αž αžΆαž“αŸƒαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž˜αž½αž™αž•αŸ’αž›αžΌαžœαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž - SymmetricDS αŸ”

αžŸαžΌαž˜αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž•αŸ’αž›αžΌαžœαž€αžΆαžš αž“αŸ…αž‘αžΈαž“αŸαŸ‡. αž‡αŸ†αž“αž½αž™αž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž’αžΆαž…αžšαž€αž”αžΆαž“ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ…αž“αŸƒ SymmetricDS

SymmetricDS αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αžŠαŸ‚αž›αž…αž˜αŸ’αž›αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŽαžΆαž˜αž½αž™αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΌαž‘αŸ…αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ– Oracle, MongoDB, PostgreSQL, MySQL, SQL Server, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird αž“αž·αž„αž§αž‘αžΆαž αžšαžŽαŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αž–αž€αž•αŸ’αžŸαŸαž„αž‘αŸ€αž ឧ. Redshift αž“αž·αž„ Azure, αž› αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸ Java αž αžΎαž™αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž“αŸƒ JRE ឬ JDK (αž€αŸ†αžŽαŸ‚ 8.0 αž¬αžαŸ’αž–αžŸαŸ‹αž‡αžΆαž„αž“αŸαŸ‡)αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž€αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž—αž–αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆ αž“αž·αž„αž•αŸ’αž‰αžΎαž‘αŸ…αž€αžΆαž“αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ„αž›αžŠαŸ…αžŸαž˜αžŸαŸ’αžšαž”αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž‡αžΆαž”αžΆαž…αŸ‹αŸ”

αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαžšαž”αžŸαŸ‹ SymmetricDS

αž§αž”αž€αžšαžŽαŸαž“αŸαŸ‡αž‚αžΊαž‡αžΆαžœαŸαž‘αž·αž€αžΆαž―αž€αžšαžΆαž‡αŸ’αž™ αž˜αžΆαž“αž“αŸαž™αžαžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαžš αž¬αž…αŸ’αžšαžΎαž“αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž’αžΆαž…αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”
αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™ αžαžŽαŸˆαžŠαŸ‚αž›αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαž”αŸ’αžšαžΎαž€αžΆαžšαž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αž―αž€αžŸαžΆαžšαŸ”
αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž–αžΈαžšαž•αŸ’αž›αžΌαžœαžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš Push αž“αž·αž„ Pull αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž…αŸ’αž”αžΆαž”αŸ‹αŸ”
αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αžαžΆαž˜αžšαž™αŸˆαž”αžŽαŸ’αžαžΆαž‰αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž“αž·αž„αž€αž˜αŸ’αžšαž·αžαž”αž‰αŸ’αž‡αžΌαž“αž‘αžΆαž”αŸ”
αž€αžΆαžšαž„αžΎαž”αž‘αžΎαž„αžœαž·αž‰αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž“αžΆαŸ†αž„αž”αž“αŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž”αžšαžΆαž‡αŸαž™ αž“αž·αž„αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αž˜αŸ’αž›αŸ„αŸ‡αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αŸ”
Cloud αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆ αž“αž·αž„ APIs αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜αžŠαŸαž˜αžΆαž“αž₯αž‘αŸ’αž’αž·αž–αž›αŸ”

αž§αž‘αžΆαž αžšαžŽαŸ:

SymmetricDS αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αŸ’αž“αž»αž„αž‡αž˜αŸ’αžšαžΎαžŸαž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž‡αž˜αŸ’αžšαžΎαžŸαž–αžΈαžšαŸ–
αžαŸ’αž“αžΆαŸ†αž„αž˜αŸ (មេ) αžŠαŸ‚αž›αžŸαž˜αŸ’αžšαž”αžŸαž˜αŸ’αžšαž½αž›αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž€αžŽαŸ’αžαžΆαž›αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„ slave (αž€αžΌαž“) αž–αžΈαžš αž αžΎαž™αž€αžΆαžšαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αž€αžΌαž“αž€αžΎαžαž‘αžΎαž„αžαžΆαž˜αžšαž™αŸˆαž˜αŸαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”
αžαŸ’αž“αžΆαŸ†αž„αžŸαž€αž˜αŸ’αž˜ (αžαŸ’αž“αžΆαŸ†αž„ 1) αž’αžΆαž…αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž‡αžΆαž˜αž½αž™αžαŸ’αž“αžΆαŸ†αž„αžŸαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αž‘αŸ€αž (αžαŸ’αž“αžΆαŸ†αž„ 2) αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž’αž“αŸ’αžαžšαž€αžΆαžšαžΈαŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž˜αŸ’αžšαžΎαžŸαž‘αžΆαŸ†αž„αž–αžΈαžš αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž”αŸ’αžšαžΎ Push αž“αž·αž„ Pull αŸ” αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž–αž·αž…αžΆαžšαžŽαžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž€αž˜αŸ’αž˜-αžŸαž€αž˜αŸ’αž˜αŸ” αžœαžΆαž“αžΉαž„αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž™αžΌαžšαž–αŸαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž˜αžΌαž› αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αžœαžΎαž€αžΆαžšαžŸαŸ’αžšαžΆαžœαž‡αŸ’αžšαžΆαžœαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž—αžΆαž–αž‡αžΆαž’αŸ’αž“αž€αžŠαžΉαž€αž“αžΆαŸ†αžŠαžΎαž˜αŸ’αž”αžΈαžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαž§αž”αž€αžšαžŽαŸ SymmetricDS αŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ SymmetricDS αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹αŸ– αž‘αžΆαž‰αž™αž€αž€αŸ†αžŽαŸ‚αž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž αž“αŸƒαž―αž€αžŸαžΆαžš zip αž–αžΈαž‘αžΈαž“αŸαŸ‡ αž αžΎαž™αž™αž€αžœαžΆαž…αŸαž‰αž‚αŸ’αžšαž”αŸ‹αž‘αžΈαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž”αžΆαž“αŸ” αžαžΆαžšαžΆαž„αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž•αŸ’αžαž›αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž‘αžΈαžαžΆαŸ†αž„αžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž€αŸ†αžŽαŸ‚αžšαž”αžŸαŸ‹ SymmetricDS αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαž“αŸαŸ‡ αž€αŸαžŠαžΌαž…αž‡αžΆαž€αŸ†αžŽαŸ‚αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž€αŸ†αžŽαŸ‚αž›αžΈαž“αž»αž… αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αž“αž·αž„αž…αŸ’αžšαž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž–αžΈαžšαŸ”

αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“
vm៣្αŸ₯្
vm៣្αŸ₯្

αž€αŸ†αžŽαŸ‚αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš
CentOS Linux 7.6 x86_64
CentOS Linux 7.6 x86_64

αž€αŸ†αžŽαŸ‚αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ DB
αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ MySQL 5.7.26
PostgreSQL ៨.ៀ.៦

αž…αŸ’αžšαž€ DB
3306
5832

αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP
192.168.1.107
192.168.1.112

αž€αŸ†αžŽαŸ‚ SymmetricDS
SymmetricDS 3.9
SymmetricDS 3.9

αž•αŸ’αž›αžΌαžœαžŠαŸ†αž‘αžΎαž„ SymmetricDS
/usr/local/symmetric-server-3.9.20
/usr/local/symmetric-server-3.9.20

αžˆαŸ’αž˜αŸ„αŸ‡αžαŸ’αž“αžΆαŸ†αž„ SymmetricDS
Corp-000
αž αžΆαž„-001

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αžŠαŸ†αž‘αžΎαž„ SymmetricDS αž“αŸ…αž€αŸ’αž“αž»αž„ /usr/local/symmetric-server-3.9.20 αž αžΎαž™αžαžαžšαž„ αž“αž·αž„αž―αž€αžŸαžΆαžšαž•αŸ’αžŸαŸαž„αŸ—αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ” αž™αžΎαž„αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž›αžΎαžαžαžšαž„αž‚αŸ†αžšαžΌ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αŸ” αžαžαž‚αŸ†αžšαžΌαž˜αžΆαž“αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αžαŸ’αž“αžΆαŸ†αž„ αž€αŸαžŠαžΌαž…αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαžŸαŸ’αž‚αŸ’αžšαžΈαž” SQL αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž™αŸ‰αžΆαž„αž†αžΆαž”αŸ‹αžšαž αŸαžŸαŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαžŸαŸ†αžŽαžΆαž€αž‚αŸ†αžšαžΌ αž™αžΎαž„αžƒαžΎαž‰αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž…αŸ†αž“αž½αž“αž”αžΈαžŠαŸ‚αž›αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŸαž˜αŸ’αž”αžαŸ’αžαž·αžαŸ’αž“αžΆαŸ†αž„ - αžˆαŸ’αž˜αŸ„αŸ‡αž”αž„αŸ’αž αžΆαž‰αž›αž€αŸ’αžαžŽαŸˆαžšαž”αžŸαŸ‹αžαŸ’αž“αžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αŸ”

corp-000.properties
store-001.properties
store-002.properties

SymmetricDS αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž…αž“αžΆ 3-node αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ (αž‡αž˜αŸ’αžšαžΎαžŸ 1) αž αžΎαž™αž―αž€αžŸαžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžšαž…αž“αžΆ 2-node (αž‡αž˜αŸ’αžšαžΎαžŸ 2)αŸ” αž…αž˜αŸ’αž›αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαž–αžΈαžαžαž‚αŸ†αžšαžΌαž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ vm1 αŸ” αžœαžΆαž”αŸ’αžšαŸ‚αž…αŸαž‰αžŠαžΌαž…αž“αŸαŸ‡αŸ–

$> cat engines/corp-000.properties
engine.name=corp-000
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://192.168.1.107:3306/replica_db?autoReconnect=true&useSSL=false
db.user=root
db.password=admin123
registration.url=
sync.url=http://192.168.1.107:31415/sync/corp-000
group.id=corp
external.id=000

αžαŸ’αž“αžΆαŸ†αž„αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ SymmetricDS αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ corp-000 αž αžΎαž™αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αž‰αŸ’αž‡αžΆ mysql jdbc αžŠαŸ‚αž›αž”αŸ’αžšαžΎαžαŸ’αžŸαŸ‚αž—αŸ’αž‡αžΆαž”αŸ‹αžαžΆαž„αž›αžΎ αž“αž·αž„αž–αŸαžαŸŒαž˜αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž…αžΌαž›αŸ” αž™αžΎαž„αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ replica_db αž αžΎαž™αžαžΆαžšαžΆαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž€αŸ†αž‘αž»αž„αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαŸ” sync.url αž”αž„αŸ’αž αžΆαž‰αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‘αžΆαž€αŸ‹αž‘αž„αžαŸ’αž“αžΆαŸ†αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αŸ”

αžαŸ’αž“αžΆαŸ†αž„ 2 αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ vm2 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‡αžΆ store-001 αž αžΎαž™αž“αŸ…αžŸαž›αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš node.properties αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” Node store-001 αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αž αžΎαž™ pgdb_replica αž‚αžΊαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αž˜αŸ’αž›αž„αŸ” register.url αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™ host vm2 αž‘αžΆαž€αŸ‹αž‘αž„ host vm1 αž“αž·αž„αž‘αž‘αž½αž›αž”αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž–αžΈαžœαžΆαŸ”

$> cat engines/store-001.properties
engine.name=store-001
db.driver=org.postgresql.Driver
db.url=jdbc:postgresql://192.168.1.112:5832/pgdb_replica
db.user=postgres
db.password=admin123
registration.url=http://192.168.1.107:31415/sync/corp-000
group.id=store
external.id=001

αž§αž‘αžΆαž αžšαžŽαŸ SymmetricDS αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž˜αžΆαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž–αžΈαžšαž•αŸ’αž›αžΌαžœαžšαžœαžΆαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαžš (αžαŸ’αž“αžΆαŸ†αž„αž–αžΈαžš) αŸ” αž‡αŸ†αž αžΆαž“αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž›αžΎ host vm1 (corp-000) αžŠαŸ‚αž›αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž§αž‘αžΆαž αžšαžŽαŸαž‡αžΆαž˜αž½αž™αžαžΆαžšαžΆαž„ 4 αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš create-sym-tables αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ symadmin αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„ directory αžŠαŸ‚αž›αž…αŸ’αž”αžΆαž”αŸ‹ αž“αž·αž„αž‘αž·αžŸαžŠαŸ…αž“αŸƒαž€αžΆαžšαž…αž˜αŸ’αž›αž„αžšαžœαžΆαž„ nodes αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αŸ” αž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ†αžšαžΌαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€αž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„αŸ”

vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> ./dbimport --engine corp-000 --format XML create_sample.xml
vm1$> ./symadmin --engine corp-000 create-sym-tables
vm1$> ./dbimport --engine corp-000 insert_sample.sql

αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸ αžαžΆαžšαžΆαž„αž‘αŸ†αž“αž·αž‰ αž“αž·αž„ item_selling_price αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαžΎαž˜αŸ’αž”αžΈαž…αž˜αŸ’αž›αž„αž–αžΈ corp-000 αž‘αŸ… store-001 αž αžΎαž™αžαžΆαžšαžΆαž„αž›αž€αŸ‹ (sale_transaction αž“αž·αž„ sale_return_line_item) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαžΎαž˜αŸ’αž”αžΈαž…αž˜αŸ’αž›αž„αž–αžΈ store-001 αž‘αŸ… corp-000 αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ vm2 (store-001) αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αžœαžΆαžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈ corp-000 αŸ”

vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> ./dbimport --engine store-001 --format XML create_sample.xml

αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ MySQL αž“αŸ…αž›αžΎ vm1 αž˜αžΆαž“αžαžΆαžšαžΆαž„αž§αž‘αžΆαž αžšαžŽαŸ αž“αž·αž„αžαžΆαžšαžΆαž„αž€αžΆαžαžΆαž‘αž»αž€ SymmetricDS αŸ” αžŸαžΌαž˜αž…αŸ†αžŽαžΆαŸ†αžαžΆαžαžΆαžšαžΆαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’ SymmetricDS (αž”αž»αž–αŸ’αžœαž”αž‘αž‡αžΆαž˜αž½αž™ sym_) αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž˜αžΆαž“αž“αŸ…αž›αžΎ node corp-000 αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž–αŸ’αžšαŸ„αŸ‡αž“αŸ„αŸ‡αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž™αžΎαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ create-sym-tables αž αžΎαž™αž“αžΉαž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž…αž˜αŸ’αž›αž„αŸ” αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž›αžΎ node store-001 αž“αžΉαž„αž˜αžΆαž“αžαžΆαžšαžΆαž„αž§αž‘αžΆαž αžšαžŽαŸαžαŸ‚ 4 αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž”αžšαž·αžŸαŸ’αžαžΆαž“αžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αž‡αžΆαžŸαŸ’αžšαŸαž…αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ sym αž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž–αžΈαžšαžŠαžΌαž…αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> sym 2>&1 &

αž’αžΆαžαž»β€‹αž€αŸ†αžŽαžαŸ‹β€‹αž αŸαžαž»β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αŸ’αž‰αžΎβ€‹αž‘αŸ…β€‹αž―αž€αžŸαžΆαžšβ€‹αž€αŸ†αžŽαžαŸ‹β€‹αž αŸαžαž»β€‹αž•αŸ’αž‘αŸƒβ€‹αžαžΆαž„β€‹αž€αŸ’αžšαŸ„αž™ (symmetric.log) αž€αŸ’αž“αž»αž„β€‹αžαžβ€‹αž€αŸ†αžŽαžαŸ‹β€‹αž αŸαžαž»β€‹αž€αŸ’αž“αž»αž„β€‹αžαžβ€‹αžŠαŸ‚αž› SymmetricDS αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αžŠαŸ†αž‘αžΎαž„ αž–αŸ’αžšαž˜β€‹αž‘αžΆαŸ†αž„β€‹αž›αž‘αŸ’αž’αž•αž›β€‹αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ sym server αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž½αž…αž•αŸ’αžαžΎαž˜αž“αŸ…αž›αžΎ node store-001αŸ”

vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> sym 2>&1 &

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ sym αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ vm2 αžœαžΆαž€αŸαž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„αž€αžΆαžαžΆαž‘αž»αž€ SymmetricDS αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αž•αž„αžŠαŸ‚αžšαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ sym αž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž–αžΈαžš αž–αž½αž€αž‚αŸαžŸαž˜αŸ’αžšαž”αžŸαž˜αŸ’αžšαž½αž›αž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αžŠαžΎαž˜αŸ’αž”αžΈαž…αž˜αŸ’αž›αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈ corp-000 αž‘αŸ… store-001 αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž–αžΈαžšαž”αžΈαžœαž·αž“αžΆαž‘αžΈαž™αžΎαž„αžŸαž½αžšαžαžΆαžšαžΆαž„αž‘αžΆαŸ†αž„ 4 αž‘αžΆαŸ†αž„αžŸαž„αžαžΆαž„ αž™αžΎαž„αž“αžΉαž„αžƒαžΎαž‰αžαžΆαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž“αŸ„αŸ‡αž‘αž‘αž½αž›αž”αžΆαž“αž‡αŸ„αž‚αž‡αŸαž™αŸ” αž¬αž’αŸ’αž“αž€αž’αžΆαž…αž•αŸ’αž‰αžΎ bootstrap αž‘αŸ… node store-001 αž–αžΈ corp-000 αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

vm1$> ./symadmin --engine corp-000 reload-node 001

αž“αŸ…αž…αŸ†αžŽαž»αž…αž“αŸαŸ‡ αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαžαŸ’αž˜αžΈαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„αž’αžΆαžαž»αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ MySQL αž“αŸ…αž›αžΎ node corp-000 (host: vm1) αž αžΎαž™αž’αŸ’αž“αž€αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžšαž”αžŸαŸ‹αžœαžΆαž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ PostgreSQL αž“αŸ…αž›αžΎ node store-001 (host: vm2) αŸ” αž™αžΎαž„αžƒαžΎαž‰αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž‘αžΆαž‰αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈ corp-000 αž‘αŸ… store-001 αŸ”

mysql> insert into item values ('22000002','Jelly Bean');
Query OK, 1 row affected (0.00 sec)

vm2$> psql -p 5832 -U postgres pgdb_replica -c "select * from item"
 item_id  |   name
----------+-----------
 11000001 | Yummy Gum
 22000002 | Jelly Bean
(2 rows)

αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš Push αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž‘αžΈαž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈ store-001 αž‘αŸ… corp-000 αž™αžΎαž„αž”αž‰αŸ’αž…αžΌαž›αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„ sale_transaction αž αžΎαž™αž•αŸ’αž‘αŸ€αž„αž•αŸ’αž‘αžΆαžαŸ‹αžαžΆαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž”αžΆαž“αž‡αŸ„αž‚αž‡αŸαž™αŸ”

αž›αž‘αŸ’αž’αž•αž›αŸ”

αž™αžΎαž„αžƒαžΎαž‰αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž‡αŸ„αž‚αž‡αŸαž™αž“αŸƒαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž–αžΈαžšαž•αŸ’αž›αžΌαžœαž“αŸƒαžαžΆαžšαžΆαž„αž§αž‘αžΆαž αžšαžŽαŸαžšαžœαžΆαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ MySQL αž“αž·αž„ PostgreSQL αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαžΆαžšαžΆαž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αž˜αžΈ αžŸαžΌαž˜αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αž‡αŸ†αž αžΆαž“αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ– αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžαžΆαžšαžΆαž„ t1 αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž αžΎαž™αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αžšαž”αžŸαŸ‹αžœαžΆαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ” αžœαž·αž’αžΈαž“αŸαŸ‡αž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž–αžΈ corp-000 αž‘αŸ… store-001 αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

mysql> create table  t1 (no integer);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into sym_channel (channel_id,create_time,last_update_time) 
values ('t1',current_timestamp,current_timestamp);
Query OK, 1 row affected (0.01 sec)

mysql> insert into sym_trigger (trigger_id, source_table_name,channel_id,
last_update_time, create_time) values ('t1', 't1', 't1', current_timestamp,
current_timestamp);
Query OK, 1 row affected (0.01 sec)

mysql> insert into sym_trigger_router (trigger_id, router_id,
Initial_load_order, create_time,last_update_time) values ('t1',
'corp-2-store-1', 1, current_timestamp,current_timestamp);
Query OK, 1 row affected (0.01 sec)

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž’αŸ†αž–αžΈαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸ αž–αŸ„αž›αž‚αžΊαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžαžΆαžšαžΆαž„αžαŸ’αž˜αžΈ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ symadmin αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ sync-triggers αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαž triggers αž‘αžΎαž„αžœαž·αž‰ αžŠαžΎαž˜αŸ’αž”αžΈαž‚αžΌαžŸαž•αŸ‚αž“αž‘αžΈαž“αž·αž™αž˜αž“αŸαž™αžαžΆαžšαžΆαž„αŸ” send-schema αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‰αžΎαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸαž‘αŸ… node store-001 αž αžΎαž™αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž“αŸƒαžαžΆαžšαžΆαž„ t1 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ”

vm1$> ./symadmin -e corp-000 --node=001 sync-triggers    
vm1$> ./symadmin send-schema -e corp-000 --node=001 t1

αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸƒ SymmetricDS

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ αž“αž·αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž„αžΆαž™αžŸαŸ’αžšαž½αž› αžšαž½αž˜αž‘αžΆαŸ†αž„αžŸαŸ†αžŽαž»αŸ†αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαžŸαŸ€αž‚αŸ’αžœαžΈαž”αžΈαžαŸ’αž“αžΆαŸ†αž„ αž¬αž–αžΈαžšαžαŸ’αž“αžΆαŸ†αž„αŸ”
αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž†αŸ’αž›αž„αžœαŸαž‘αž·αž€αžΆ αž“αž·αž„αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒαžœαŸαž‘αž·αž€αžΆ αžšαž½αž˜αž‘αžΆαŸ†αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαž™αž½αžšαžŠαŸƒ αž“αž·αž„αž§αž”αž€αžšαžŽαŸαž…αž›αŸαžαŸ”
αž…αž˜αŸ’αž›αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŽαžΆαž˜αž½αž™αž‘αŸ…αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸ…αž›αžΎ WAN αž¬αž€αŸ’αž“αž»αž„αž–αž–αž€αŸ”
αž›αž‘αŸ’αž’αž—αžΆαž–αž“αŸƒαž€αžΆαžšαž„αžΆαžšαžŠαŸαž›αŸ’αž’αž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαžšαž”αžΈ αž¬αžšαžΆαž”αŸ‹αž–αžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αŸ”
αž€αŸ†αžŽαŸ‚αž”αž„αŸ‹αž”αŸ’αžšαžΆαž€αŸ‹αž‡αžΆαž˜αž½αž™ GUI αž“αž·αž„αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŠαŸαž›αŸ’αž’αŸ”

αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αž“αŸƒ SymmetricDS

αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αž…αŸ’αž”αžΆαž”αŸ‹ αž“αž·αž„αž‘αž·αžŸαžŠαŸ…αž“αŸƒαž€αžΆαžšαž…αž˜αŸ’αž›αž„αžŠαŸ„αž™αžŠαŸƒαž“αŸ…αž›αžΎαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž˜αžšαž™αŸˆαžŸαŸαž…αž€αŸ’αžαžΈαžαŸ’αž›αŸ‚αž„αž€αžΆαžšαžŽαŸ SQL αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αž»αž€αžαžΆαžšαžΆαž„αž€αžΆαžαžΆαž‘αž»αž€ αžŠαŸ‚αž›αž’αžΆαž…αž˜αžΆαž“αž€αžΆαžšαžšαž’αžΆαž€αŸ‹αžšαž’αž½αž›αŸ”
αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžαžΆαžšαžΆαž„αž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž’αžΆαž…αž’αž»αž‰αž‘αŸ’αžšαžΆαž“αŸ‹ αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžŸαŸαž…αž€αŸ’αžαžΈαžαŸ’αž›αŸ‚αž„αž€αžΆαžšαžŽαŸ SQL αžŠαŸ‚αž›αž€αŸ†αžŽαžαŸ‹αž…αŸ’αž”αžΆαž”αŸ‹ αž“αž·αž„αž‘αž·αžŸαžŠαŸ…αž“αŸƒαž€αžΆαžšαž…αž˜αŸ’αž›αž„αŸ”
αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž…αŸ’αžšαžΎαž“αž–αŸαž€αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αžαŸ‹αžαŸ’αžšαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» αž αžΎαž™αž–αŸαž›αžαŸ’αž›αŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžšαŸ€αž”αž…αŸ†αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αžœαžΆαž™αž€αž€αž“αŸ’αž›αŸ‚αž„αž…αŸ’αžšαžΎαž“αž–αŸαž€αŸ”

αž›αž‘αŸ’αž’αž•αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ SymmetricDS

SymmetricDS αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž…αž˜αŸ’αž›αž„αž–αžΈαžšαž•αŸ’αž›αžΌαžœαžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αž–αžΈαžš αž”αžΈ αž¬αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αžšαžΆαž”αŸ‹αž–αžΆαž“αŸ‹αžαŸ’αž“αžΆαŸ†αž„αžŠαžΎαž˜αŸ’αž”αžΈαž…αž˜αŸ’αž›αž„ αž“αž·αž„αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αž―αž€αžŸαžΆαžšαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαž–αž·αžŸαŸαžŸαž˜αž½αž™αžŠαŸ‚αž›αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αžΌαžœαž€αž·αž…αŸ’αž…αž€αžΆαžšαž‡αžΆαž…αŸ’αžšαžΎαž“ αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžšαž™αŸˆαž–αŸαž›αžšαž„αŸ‹αž…αžΆαŸ†αž™αžΌαžšαž“αŸ…αž›αžΎαžαŸ’αž“αžΆαŸ†αž„ αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž– αž“αž·αž„αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αžαžΆαž˜αžšαž™αŸˆ HTTPS αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž‡αž˜αŸ’αž›αŸ„αŸ‡αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž…αŸ’αž”αžΆαž”αŸ‹αŸ”αž›αŸ” SymmetricDS αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž€αžΆαžšαž…αž˜αŸ’αž›αž„αžšαžœαžΆαž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŽαžΆαž˜αž½αž™ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαž‡αžΆαž…αŸ’αžšαžΎαž“ αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž…αŸ†αžŽαžΆαž€αžŸαŸ’αžšαž»αž€ αž€αžΆαžšαž’αŸ’αžœαžΎαž…αŸ†αžŽαžΆαž€αžŸαŸ’αžšαž»αž€ αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™ αž€αžΆαžšαžαŸ’αžšαž„ αž“αž·αž„αž€αžΆαžšαž”αŸ†αž”αŸ’αž›αŸ‚αž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž›αžΎαžœαŸαž‘αž·αž€αžΆαž“αžΆαž“αžΆαŸ”

αž§αž‘αžΆαž αžšαžŽαŸαž‚αžΊαž•αŸ’αž’αŸ‚αž€αž›αžΎαž˜αž“αŸ’αžαŸ’αžšαžΈ αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžšαž αŸαžŸ αžŠαŸ„αž™ SymmetricDS αŸ” IN αžŸαŸ€αžœαž—αŸ…αžŽαŸ‚αž“αžΆαŸ†αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž–αž·αž–αžŽαŸŒαž“αžΆαž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαž‚αŸ„αž›αž‚αŸ†αž“αž·αžαž•αŸ’αžŸαŸαž„αŸ—αžŠαŸ‚αž›αž–αžΆαž€αŸ‹αž–αŸαž“αŸ’αž’αž“αžΉαž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž…αž˜αŸ’αž›αž„αž‡αžΆαž˜αž½αž™ SymmetricDS αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹