Explicabo crucem-replicationem inter PostgreSQL et MySQL, necnon methodos ad constituendum crucis-replicationem inter duos servers datorum. Typice databases cross-replicatae homogeneae dicuntur et est modus opportunus movendi ab uno RDBMS servo ad alterum.
PostgreSQL et MySQL databases plerumque relationes considerantur, sed cum extensionibus additis facultates NoSQL offerunt. Hic de replicatione inter PostgreSQL et MySQL disputabimus ex prospectu relationis DBMS.
Totas interiores operationes non describemus, sicut principia fundamentalia ut ideam conformandi replicationis inter servers datorum, commoda, limitationes et casus utamur.
Typice replicatio inter duos ministros databases identicos fit vel in modo binario vel quaestionibus utens inter dominum (a.k.a. editorem, dominum vel activum) et servum (subscribentem, sto vel passivum). Replicandi propositum est exemplar reale temporis dominii datorum in servi parte praebere. In hoc casu transfertur notitia a domino ad servum, hoc est, ab activo ad passivum, quia replicatio non aliter fit. Sed inter duas databases in utramque partem potes replicationem ponere, ut notitia a servo ad dominum transferatur in figura activa activa. Haec omnia, excepta replicatione cascading, inter duos vel plures identicos datorum ministros fieri potest.-activa vel activa vel passiva conformatio ab necessitate dependet, disponibilitate talium facultatum in initiali configuratione vel usu solutionum conformationis externae ac mercaturae existentis.
Configuratio descripta inter varios datorum ministros fieri potest. Servo configurari potest ut notitias replicatas ab alio servo datorum recipiat et tamen scapulas realis-tempus datae replicatae conservare possit. MySQL et PostgreSQL offerunt pleraeque harum configurationum in domo vel per extensiones tertias partium, inclusis modii logi binarii, orbis densis et constitutionis- et methodi biformes fundati.
Replicatio crucis inter MySQL et PostgreSQL necessaria est ad unum tempus migrationis ab uno servo datorum ad alterum. Haec databases diversis protocollis utuntur, eas directe coniungi non potest. Ad commutationem datam stabiliendam, externo aperto fonte instrumento aperto uti potes, exempli gratia pg_chameleon.
Quid est pg_chameleon
pg_chameleon est replicatio systematis a MySQL ad PostgreSQL in Pythone 3. In bibliothecis apertis mysql-replicationis utitur, etiam in Pythone. Row imagines e tabulis MySQL eliciuntur et ut JSONB objecta in datorum PostgreSQL recondita sunt, et deinde ab pl/pgsql functione decryptae et in database PostgreSQL reproductae.
Lineamenta pg_chameleon
Multiplex schemata MySQL ex eodem botro replicari possunt ad unum scopo PostgreSQL datorum in uno ad multarum conformationem.
Fons et scopum schema nomina idem esse non possunt.
Replicatio data ex imagine MySQL cascaded recuperari potest.
Tabulae, quae non possunt replicare vel producere errores, excluduntur.
Utrumque munus replicatio a daemonibus refrenatur.
Imperium per YAML-substructio parametri et imagini lima.
exempli gratia
exercitum
vm1
vm2
OS version
CentOS Linux 7.6 x86_64
CentOS Linux 7.5 x86_64
DB servo version
MySQL 5.7.26
PostgreSQL 10.5
DB port
3306
5433
IP oratio,
192.168.56.102
192.168.56.106
Incipere, praepara omnia elementa necessaria ad instituendum pg_chameleon. Hoc exemplum Python 3.6.8 inaugurat, quod prope ambitum virtualem gignit et operatur.
$> 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
Post Python3.6 feliciter insertis, reliquas necessitates absolvere debes, ut creare et activum virtualis environment. Praeterea pituita moduli ad recentissimam versionem renovatur et ad pg_chameleon instituendum adhibetur. Mandata infra consulto pg_chameleon 2.0.9 instituunt, quamvis recentior versio 2.0.10. Hoc necessarium est ut novos cimices in versione renovata vitant.
$> python3.6 -m venv venv
$> source venv/bin/activate
(venv) $> pip install pip --upgrade
(venv) $> pip install pg_chameleon==2.0.9
Appellamus ergo pg_chameleon (cameleon mandatum est) cum argumentis configurationis formatis ut possit pg_chameleon et creare directoria default et limam configurationis.
(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
Nunc exemplar config-example.yml sicut default.yml creamus ut fiat lima figuralis defalta. Exemplum configurationis fasciculi huius exempli infra praebetur.
$> 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:
Configuratio fasciculi in hoc exemplo exemplum est pg_chameleon fasciculus cum minoribus modificationibus ad principium et scopum ferendum, et infra inspiciendum est variarum sectionum limae configurationis.
In defalta.yml fasciculi configurationis sectio occasus globalis est, ubi disponere potes ut occasus ut situs cincinnorum, situs lignorum, tempus repono pro lignis, etc. Subit genus sectionis primitivae, ubi a paro of praecepta ad earundem genera per replicationem. Exemplum defaltis ad regulae regulae typus quae minimaint(1) ad valorem booleanum convertitur. In sectione sequenti, singula nexum denotamus ad scopum datorum. In casu nostro, haec database PostgreSQL, designata pg_conn. In ultima sectione, notitias fontis indicamus, id est nexum parametri fontis datorum, schema destinatum inter principium et scopum databases, tabulae quae omittendae sunt, exspecta tempus, memoriam, sarcinam quantitatem. Nota "fontes" plurales esse, significationem multiplicem datorum fontem addere possumus uni datorum scopo ut multi-ad unam configurationem instituant.
Exemplum datorum mundi_x continet 4 tabulas cum ordinibus quas MySQL communitas praebet exempla. Potest downloaded
In MySQL et PostgreSQL databases, usor specialis creatur eodem nomine usr_replica. In MySQL, adiectis legi iura omnibus tabulis replicatis datum est.
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;
In latere PostgreSQL, db_replica database creatur qui mutationes e MySQL database accipiet. Usor usr_replica in PostgreSQL automatice configuratur ut dominus duarum schematum, pgworld_x et chameleon, quae tabulas ipsas replicatas et replicationem tabularum inter se configuratur. Argumentum creare_replica_schema automatice configurationis obnoxium est, ut infra videbis.
postgres=# CREATE USER usr_replica WITH PASSWORD 'pass123';
CREATE ROLE
postgres=# CREATE DATABASE db_replica WITH OWNER usr_replica;
CREATE DATABASE
MySQL database configuratur aliquibus mutationibus parametri ad replicationem ut infra ostendetur. Opus est ut servo datorum sileo pro mutationibus ad effectum deducendi.
$> vi /etc/my.cnf
binlog_format= ROW
binlog_row_image=FULL
log-bin = mysql-bin
server-id = 1
Nunc interest ut nexum cum servers datorum reprimat ita ut nullae sint difficultates cum mandata pg_chameleontis currentis.
De node postgreSQL:
$> mysql -u usr_replica -Ap'admin123' -h 192.168.56.102 -D world_x
De MySQL nodi:
$> psql -p 5433 -U usr_replica -h 192.168.56.106 db_replica
Sequentia tria mandata pg_chameleon (chamaeleontis) ambitum parant, fontem adde, et imaginem initialis faciunt. Argumentum creare_replica_schema ad pg_chameleon schema defaltum (sch_chameleon) et replicationem schema (pgworld_x) in database PostgreSQL, de quo iam disputavimus. Argumentum addendi fons datorum schematismi configurationis addit, legendo limam configurationem (default.yml), et in casu nostro est mysql, et init_replica initialem conformationem in parametris in file configurationis.
$> chameleon create_replica_schema --debug
$> chameleon add_source --config default --source mysql --debug
$> chameleon init_replica --config default --source mysql --debug
Harum trium mandatorum constitutio clare indicat feliciter exsecutos esse. Quilibet errores vel fragores vel syntaxin nuntiant simplicibus, claris nuntiis cum ambabus quomodo problema figere.
Denique replicationem incipimus utendo start_replica et nuntium felicissimum accipimus.
$> chameleon start_replica --config default --source mysql
output: Starting the replica process for source mysql
Replicatio status inquirere potest utens argumento show_status, erroresque spectari possunt utentes argumenti show_errores.
Ut iam dictum est, unaquaeque replicatio refrenat daemones. Ad eas inspiciendas, quaestionem processus mensae cum Linux ps praecipimus, ut infra ostendemus.
Replicatio non consideratur configurata donec eam in tempore reali experiamur, ut infra patebit. Tabulam creamus, duo monumenta in MySQL datorum inserimus, et argumenta sync_tabularum in pg_chameleon vocamus ad daemones renovandos et mensam cum tabulis datorum ad PostgreSQL replicandum.
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.
Ad confirmandas eventus probationes, rogamus mensam e datorum PostgreSQL et output ordines.
$> psql -p 5433 -U usr_replica -d db_replica -c "select * from pgworld_x.t1";
n1 | n2
----+-------
1 | one
2 | two
Si migrationem agimus, praeceptum sequens pg_chameleon erit finis eius. Mandata exsecutioni necessaria esse postquam certo scimus ordines omnium tabularum scoparum replicatas esse, et eventum postgreSQL datorum eleganter migratum erit sine references ad principium datorum seu replicationis schematis (sch_chameleon).
$> chameleon stop_replica --config default --source mysql
$> chameleon detach_replica --config default --source mysql --debug
Si placet, sequentia mandata uti potes ut schema originale deleat figuram et replicationem.
$> chameleon drop_source --config default --source mysql --debug
$> chameleon drop_replica_schema --config default --source mysql --debug
commoda pg_chameleon
Facilis setup et configurationem.
Facile troubleshoot et anomalias pervidere manifesto errore nuntia.
Tabulae speciales additae replicationi addi possunt post initializationem sine mutatione reliquae figurationis.
Possibile est multiplicem fontem databases pro uno datorum scopo configurare, et hoc valde utile est si notitias ex uno vel pluribus MySQL databases coniungentes in unum datorum PostgreSQL datorum.
Tabulas selectas non habes replicare.
Incommoda pg_chameleon
Tantum suffulta cum MySQL 5.5 et supra ut fons et PostgreSQL 9.5 et supra ut scopum database.
Quaelibet mensa debet habere clavem primariam vel singularem, alioquin tabulae initiales sunt in processu init_replica, sed non replicantur.
Uno modo replicatio - solum ab MySQL ad PostgreSQL. Ergo solum convenit circuitioni "activo-passive".
Fons tantum esse potest database MySQL, et subsidium datorum PostgreSQL ut fons solum experimentum et limitationes (disce plus
Proventus pro pg_chameleon
Replicatio methodi in pg_chameleon magna est ad migrandum database ex MySQL ad PostgreSQL. Replicatio signi est quod replicatio unum tantum modo est, ergo doctorum datorum abhorret ea uti ad aliquid aliud quam migrationem velle. Sed problema unius viae replicationis solvi potest cum alio instrumento aperto - SymmetricDS.
Plura in documentis officialibus
Overview of SymmetricDS
SymmetricDS fons apertus est instrumentum quod cuilibet datorum communi datorum replicat: Oraculum, MongoDB, PostgreSQL, MySQL, SQL Servo, MariaDB, DB2, Sybase, Greenplum, Informix, H2, Firebird et aliae nubes datorum instantiarum, e.g. Redshift, ac Caeruleus, etc. Available features: synchronization database et lima, replicatio datorum multi-dominorum, synchronisation percolata, transformatio et cetera. Hoc instrumentum Javae est et signum emissio JRE vel JDK requirit (versio 8.0 vel superior). Hic, datae mutationes triggers in fonte datorum notari possunt et mitti ad scopum datorum opportunis in forma batches.
SymmetricDS features
Instrumentum suggestum est independens, quod duo vel plures diversae databases notitias commutare possunt.
Relationales databases synchronistae sunt utentes notitias rerum mutationes, dum fasciculi systematis fundati databases utuntur fasciculi synchronisationi.
Duplex modus replicationis utens ventilabis et excute modos secundum regulas statuto.
Data translatio per retiacula secure et ignobilia fieri potest.
Recuperatio automatica cum nodi operationem repetunt post defectionem et resolutio conflictus automatic.
Nubes compatibilis et potens extensio APIs.
exempli gratia
SymmetricDS in una duarum optionum configurari potest;
Dominus nodi (parens) centraliter coordinat replicationem inter duos nodos ancillae, et communicatio nodis infantis nonnisi per parentem accidit.
Nodus activa (Node 1) communicare potest per replicationem cum alio nodo activo (Node 2) sine medio.
In utroque bene, data commutatio fit utens ventilabis et excute. In hoc exemplo configurationem activam et activam considerabimus. Longum nimis foret totam architecturam describere, sic tuam investigationem facere.
SymmetricDS inaugurari valde simplex est: deprime fontem apertum versionis documenti zip
exercitum
vm1
vm2
OS version
CentOS Linux 7.6 x86_64
CentOS Linux 7.6 x86_64
DB servo version
MySQL 5.7.26
PostgreSQL 10.5
DB port
3306
5832
IP oratio,
192.168.1.107
192.168.1.112
SymmetricDS versio
SymmetricDS 3.9
SymmetricDS 3.9
SymmetricDS institutionem viam
/usr/loci/symmetric-server-3.9.20
/usr/loci/symmetric-server-3.9.20
SymmetricDS nodi nomen
corp-000
copia-001
Hic instituimus SymmetricDS in /usr/local/symmetric-servo-3.9.20, et varia subdirectoria et fasciculi ibi reponentur. Quaero exempla et machinamenta subdirectoria. Exempla indicis exemplum configurationis imagini cum proprietatibus nodi continet, ac exemplum SQL scriptorum ut cito incipias.
In speciminibus indicis videmus tres tabellas conformationis cum proprietatibus nodi — nomen naturam nodi in quodam schemate ostendit.
corp-000.properties
store-001.properties
store-002.properties
SymmetricDS omnes tabellas conformationis necessarias habet ad designationem 3-nodi basic (optionem 1), et eadem fascicula adhiberi possunt ad 2-nodi designationem (optionem 2). Effingo limam configurationem requisitam e speciminibus directorii ad machinas in exercitu vm1. Sic evenit;
$> 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
Nodus hic in schemate SymmetricDS dicitur corp-000, et nexus database tractatur a rectore mysql jdbc, qui nexu chordarum supra et documentorum login utitur. Coniungimus ad replica_db database et tabulae creabuntur in schemate creationis. sync.url ostendit ubi nodi contactum ad synchronizationem pertinent.
Node 2 in exercitu vm2 configuratur ut apothecaria 001 et reliqua in nodi.properties fasciculi infra specificantur. Nodus apothecarius 001 datorum PostgreSQL datorum et pgdb_replica est replicatio datorum. registration.url exercitum vm2 permittit ut exercitum vm1 contactum capiat et ex eo singula configuratione recipiat.
$> 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
Exemplar SymmetricDS perfecti ambitum continet ad replicationem duorum modorum replicationum inter duos nodi ministros datorum (duobus nodi). Gradus infra exercentur in exercitu vm1 (corp-000), quod exemplum schema cum 4 tabulis creabit. Dein cursus creare-sym-tabulas cum imperio symadmin mensas directorias gignit ubi regulae et directiones replicationis inter nodi condientur. Denique specimen notitiae in tabulis onustum est.
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
In exemplo, tabulae item et item_selling_pretium ipso facto figurantur ad replicandum ex corp-000 ad thesaurum 001, et tabulae venditionis (sale_transaction and sale_return_line_item) automatice conformantur ad replicandum ex promptuario 001 ad corp-000. Nunc schema in PostgreSQL datorum de exercitu vm2 (stor-001) creamus ad parandum ad notitias ex corp-000 recipiendas.
vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> ./dbimport --engine store-001 --format XML create_sample.xml
Vide inspicias quod MySQL datorum in vm1 habeat exempla tabularum et tabularum SymmetricDS catalogus. Nota tabulas systematis symmetricis (praefixas cum sym_) nunc tantum in promptu esse in nodi corp-000, quia hic praecurrimus ubi praecipiunt tabulae creantis et replicationem administrandi erunt. Et in datorum nodi apothecarum 001 tantum 4 tabulae exemplum sine notitia erunt.
Omnis. Ambitus paratus est processus symphoniae ad currendum in utroque nodo ut infra ostendetur.
vm1$> cd /usr/local/symmetric-server-3.9.20/bin
vm1$> sym 2>&1 &
Inspectus stipes mittuntur ad fasciculum rotundum (symmetric.log) in actis folder in indicem in quo SymmetricDS inauguratus est, necnon ad output vexillum. Sym server nunc in nodi thesauri initiari potest.
vm2$> cd /usr/local/symmetric-server-3.9.20/bin
vm2$> sym 2>&1 &
Si processus symphoniae in vm2 exercitum currens, etiam SymmetricDS catalogum tabulas in datorum PostgreSQL datorum creabit. Si processus symphoniae in utraque nodis curritur, inter se coordinant ut notitias replicare a corp-000 ad thesaurum-001. Si post paucas secundas perscrutamur omnes 4 tabulas utrinque, videbimus illam replicationem venisse. Vel mittere potes bootstrap ad thesaurum 001 e corp-000 cum sequenti mandato.
vm1$> ./symadmin --engine corp-000 reload-node 001
Hic, novus record inseritur item tabellam in datorum MySQL nodi corp-000 (hostis: vm1), et replicationem eius in datorum PostgreSQL datorum in 001 (hospes: vm2), potes. Videmus operationem trahere ut notitias e corp-000 ad thesaurum 001 moveant.
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)
Ad ventilabis operationem ut notitias ex apothecae 001 ad corp-000 perficias, testimonium in tabula venditionis_transactionis inserimus et replicationem efficacem esse comprobamus.
Videmus prosperum modum duorum modorum replicationis tabularum exempli inter MySQL et PostgreSQL databases. Replicationem ad novas tabulas usoris erigendas, hos gradus sequere: Tabulam t1 creamus exempli gratia et replicationem eius regulas sic configuramus. Hoc modo replicationem tantum a corp-000 ad thesaurum 001 conformamus.
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)
Configuratio dein notificatur schematis mutationis, id est, novae tabulae additione, utens praecepto symadmini cum argumento sync-triggers, qui recreat triggers ad definitiones mensae describendas. schema supplicium mittere fit schema mutationes ad 001 thesaurum nodi mittere, et replicatio tabularum t1 configuratur.
vm1$> ./symadmin -e corp-000 --node=001 sync-triggers
vm1$> ./symadmin send-schema -e corp-000 --node=001 t1
Beneficia SymmetricDS
Facilem institutionem et configurationem, inter promptum fabricatum fasciculorum cum parametris ad tres nodos vel duos nodi creandos.
Crustum databases et tribunal independentiae, in servientibus, laptop et machinis mobilibus.
Replica quodvis datorum datorum cuivis alio loco datorum, in LURIDO vel in nube.
Possibilitas operis optimalis cum duobus databases vel pluribus milibus ad replicationem convenientem.
Reddidit versionem cum GUI et optimo auxilio.
Incommoda SymmetricDS
Opus manuale definias regulas et directiones replicationis in linea mandatorum per SQL declarationes ad onerandas tabulas catalogi, quae incommodum esse possunt.
Plures tabulas replicationis constituere longum esse potest nisi scriptis uteris ad constitutiones SQL faciendas quae regulas et directiones replicationis definiunt.
Nimis notitiae in lignis notatae sunt, et interdum lima stipes limare debes ut spatium non nimis capiat.
Proventus pro SymmetricDS
SymmetricDS permittit tibi replicationem duplicem inter duos, tres, vel etiam plura milia nodis replicare et fasciculos synchronizare. Hoc unicum instrumentum est quod multa opera independenter agit, ut automatic data recuperatio post longam temporis intervallum in nodo, securum et efficax notitiarum commercium inter nodos per HTTPS, automatic conflictus administratio secundum regulas constituto, SymmetricDS peragit etc. replicatio inter quaslibet databases ergo adhiberi potest pro varietate missionum, inter migrationem, migrationem, distributionem, eliquationem et conversionem notitiarum trans suggestuum.
Exemplum fundatur in publica
Source: www.habr.com