在Postgres数据库中同步和维护Salesforce Sobjects
gurglefish的Python项目详细描述
咕噜鱼
Salesforce Archiver公司
将Salesforce Sobject数据备份到Postgres并保持同步。
功能
- 从Salesforce到Postgres的单向数据快照。
- 简单的cli界面。
- 动态创建所选对象的等效数据库表。
- 最多支持4个并发表快照的多处理。
- 索引的自动创建和维护:
- id列上的主键索引
- 主/详细信息和查找字段ID。
- 外部字段。
- 自动检测sobject字段的添加/删除以及表结构的更改以匹配。
- 云已准备好用于亚马逊rds和azure。
- 自上次运行以来记录添加/更改/删除的同步。
- 可以根据每个表和命令行禁用硬删除记录的清除。
- 记录每个表的同步统计信息。
- 导出功能可使用本地Postgres加载文件格式更快地加载初始数据。
- 使用代码生成快速字段映射。
- 以自定义工具易于使用的格式保存的架构工件。
- 在生产环境中连续运行18个月以上。
安装
- id列上的主键索引
- 主/详细信息和查找字段ID。
- 外部字段。
要求:
- python 3.6或更高版本
- PostgreSQL 9.6或更高版本
pip3 install --user gurglefish
要更新:
pip3 install --upgrade gurglefish
要使用导出功能最初填充非常大的表(推荐),必须 为您的系统安装postgresql cli客户端。
示例:
< Buff行情>ubuntu 18:sudo apt安装postgres客户端
CentOS 7:sudo apt install postgres96 client
使用分发包搜索工具(Yum、APT、DNF)查找正确的名称并安装。
配置 < Buff行情>
注意:此工具仅读取Salesforce并写入您配置的数据库/架构。然而,它是 仍然是非常重要的安全您的帐户适当地防止系统入侵。换句话说, 安全是您的责任
要求:
- 启用API的Salesforce用户帐户,具有对要同步的所有Sobject的访问权限
- Salesforce org中的已配置连接应用程序,可由用户帐户访问
- postgresql数据库和用户登录,只允许在您选择的架构中创建和更改表和索引。
创建一个名为/var/lib/gurglefish的目录。这是该工具使用的所有主机存储的根目录。 请确保相应地设置了权限,以便正在运行的用户具有R/W权限。必须保护此目录树 适当地,因为它可能包含未加密的表导出
sudo mkdir /var/lib/gurglefish
sudo chmod +rwx /var/lib/gurglefish # set permissions according to your security needs
如果要使用其他目录或装入点,只需创建指向您的位置的符号链接。
示例:sudo ln-s/mnt/my other storage/sfarchives/var/lib/gurglefish
现在创建一个配置文件,为postgres数据库和salesforce组织提供登录凭据。它是一个标准的ini文件,可以包含多个数据库组织关系的定义。 它看起来像这样(对于单个数据库和组织):
[prod]id=prodlogin=my-api-user@myorg.compassword=password+securitytokenconsumer_key=key from connected appconsumer_secret=secret from connected appauthurl=https://my.domain.salesforce.comdbvendor=postgresqldbname=gurglefishschema=publicdbuser=dbadmindbpass=dbadmin123dbhost=192.168.2.61dbport=5432threads=2< Buff行情>
注意:保护此文件不被窥视。你显然不想让这些证件被偷。
这些设置大多是不言而喻的:
- 如果您没有在Salesforce中白名单您的IP,请确保包括您的密码和安全令牌, 否则可以忽略标记。
- authURL选择Salesforce生产URL或https://test.salesforce.com选择沙盒
- 目前,唯一受支持的dbvendor是postgresql。
- 模式可以是自定义的,也可以是公共的(默认值)。如果这个数据库。如果数据库要与其他关键数据共享,强烈建议在自定义架构中隔离(请参阅PostgreSQL文档)。
- 小心使用螺纹。您最多可以有4个,因为这是Salesforce强加的限制。但真正的瓶颈可能是数据库服务器。如果不进行自定义数据库优化,或者在小型平台上运行,则应坚持使用1或2个线程。只有当您确定数据库不是瓶颈时,才可以移动到4个。
入门
现在您(希望)配置正确,您可以下拉Sobject列表并决定要同步哪些Sobject。
使用上面的示例配置:
gurglefish prod --init
如果salesforce登录成功,您将看到新目录/var/lib/gurglefish/db/prod。这是根目录,所有配置和导出数据都将在此连接中存储。
在db/prod下,您应该会看到config.json。在你最喜欢的编辑器中打开它。您将在此处看到您的用户帐户可以访问的所有对象的条目。
< Buff行情>注意:如果您没有看到您知道存在的对象,您可能没有访问这些对象的权限,或者您需要为您的帐户分配特定的许可证(对于商业管理包)。
您可以根据需要自由编辑此文件,但请确保它仍然是有效的json。当检测到新的sobject时,将为此文件添加一个新条目。
示例:
{"configuration":{"sobjects":[{"name":"account","enabled":false,"auto_scrub":"always"},{"name":"account_vetting__c","enabled":false},{"name":"account_addresses__c","enabled":false}]}}
对于要同步的每个sobject,将"enabled"值设置为true
对于要自动检测和清除已删除记录的每个sobject,将"auto_scrub"设置为"always"。但这需要付出api调用的代价,并会减慢整个同步过程。
或者,您可以安排每天运行一次或其他间隔来执行清理。深夜是个不错的选择。
crontab示例(每天凌晨1点进行一次全局清理):
0 9,13,15,17,19 * * 1-5 cd /home/masmith/sfarchive && python3 main.py prod --sync >/tmp/sync.log 0 1 * * 1-5 cd /home/masmith/sfarchive && python3 main.py prod --sync --scrub >/tmp/sync.log
保存文件。
您已经准备好开始提取数据。但有些选择必须首先做出。
初始数据拉取
< Buff行情>现在是讨论Saleforce API限制的好时机。对于每次运行,对于每个表,将执行一个元数据api调用来检测架构更改,并发出一个查询来下拉更改的记录,每次运行至少为每个表提供2个查询。如果在20个表上每2小时运行一次快照,则为12 x 20 x 2=480/天最小值。我之所以说最小值是因为这是只有不到几百个变化的最佳情况。对于更大的数据查询,salesforce以"chunks"形式返回数据,api用户需要调用salesforce来检索下一个chunks,直到全部检索完毕。因此,对于具有大量活动的Sobject,如用户、帐户、Lead、Opportunity等,每次运行可能会有数百个呼叫。
< Buff行情>幸运的是,gurglefish在运行结束时会向您报告所使用的api调用总数,以便您可以随时关注它。您可以在这里与记录的限额进行比较。因此,例如,如果您拥有企业许可证,并且有65个以上的用户,那么您每天最多可以拨打1000000个电话。
< Buff行情>请记住,您正在与其他集成共享这些限制。
根据启用的sobject数、字段数和记录数,数据的初始加载可能需要相当长的时间。但作为一个参考,我看到它在一个超过800条记录的Opportunity表中每秒处理200条记录字段.
我们的建议是让两个sobjects启动,运行它以确保一切顺利。然后,您可以返回并根据需要启用其他Sobjects。换句话说,把你的工作分开。在初始加载期间,您将使用最多的api调用,因此如果需要,请将其隔开。
使用标准快照 对于任何新的表负载,您都可以使用标准的同步/快照。gurglefish将看到您正在同步一个新表并删除所有记录。初始加载完成后,后续运行将只下拉更改。 快照可能会被中断-它们将在下次运行时恢复到中断的位置。
使用本地导出 另一种选择是使用--export功能将所有sobject记录转储为postgres本机可加载格式。然后可以使用--load加载此文件,通常不到一分钟。导出的文件保存在exports/文件夹下并压缩。
< Buff行情>注意:导出的文件对于存档或备份没有用处,因为它们的格式与它们的sobject/表的当前模式是完整绑定的。如果架构更改,则导出不可用。这是一个Postgres限制,是闪电快速负载的折衷方案。您可以在加载后删除这些文件。
使用Salesforce批量API 这是作为最后手段的边缘案例。 gurglefish将检测检索数据所需的soql是否超过16k,并通知您切换到bulk api来处理它。老实说,如果你有这么宽的桌子,你应该重新考虑你的设计。 要启用,只需将"bulkapi":true添加到config.json中的sobject。所有需要继续进行的同步都将使用Salesforce Bulk API,在某些情况下,如果有许多计划的批量作业挂起,则速度会慢一些。Gurglefish将等待10分钟以启动作业,否则将超时。
运行
gurglefish prod --sync
说真的,能再简单点吗?
gurglefish将在您选择从salesforce同步的postgres中自动创建任何丢失的表和索引。
快照频率
如果要通过cron或其他机制安排自动运行,则由您决定。当前,所有表都将在每次运行时进行快照-没有按表单独自定义的运行计划。但是,此功能已在路线图中。
统计信息
gurglefish将每次运行的每个表的统计信息记录到两个表:gf_mdata_sync_jobs(master)和gf_mdata_sync_stats(detail)您可以自由查询这些数据以进行报告、审核等。作业统计信息保留2个月,并在它们过期时清除。所以,如果你想让它们保持更长的时间,你应该制定规定,在其他地方同步它们。一个将插入复制到长期表集中的自定义触发器是一个好主意。
此外,自动模式更改的记录记录在gf_mdata_schema_chg中。因此,每当在sobject上检测到一个新的或删除的列时,都会记录在这里。此表从未清除。