一,canal配置
1.1 服务端配置
参考资料:https://github.com/alibaba/canal/wiki/QuickStart
1.2 客户端配置
参考资料:https://github.com/xingwenge/canal-php
二,MySQL数据同步到Redis
2.1 Fmt::println($entry)方法修改
public static function println($entry)
{
switch ($entry->getEntryType()) {
case EntryType::TRANSACTIONBEGIN:
case EntryType::TRANSACTIONEND:
return;
break;
}
$rowChange = new RowChange();
$rowChange->mergeFromString($entry->getStoreValue());
$evenType = $rowChange->getEventType();
$header = $entry->getHeader();
echo sprintf("================> binlog[%s : %d],name[%s,%s], eventType: %s", $header->getLogfileName(), $header->getLogfileOffset(), $header->getSchemaName(), $header->getTableName(), $header->getEventType()), PHP_EOL;
echo $rowChange->getSql().PHP_EOL;
/** @var RowData $rowData */
foreach ($rowChange->getRowDatas() as $rowData) {
switch ($evenType) {
case EventType::DELETE:
self::ptColumn($rowData->getBeforeColumns());
break;
case EventType::INSERT:
self::ptColumnInsert($rowData->getAfterColumns(),$header->getTableName());
break;
default:
echo '-------> before', PHP_EOL;
self::ptColumn($rowData->getBeforeColumns());
echo '-------> after', PHP_EOL;
self::ptColumn($rowData->getAfterColumns());
break;
}
}
}
private static function ptColumnInsert($columns,$table) {
$redis = new \Redis();
$redis->connect('', );
$redis->auth('');
/** @var Column $column */
static $key;
foreach ($columns as $column) {
echo sprintf("%s : %s update= %s", $column->getName(), $column->getValue(), var_export($column->getUpdated(), true)), PHP_EOL;
if($table == "community_contents"){
$columnname = $column->getName();
if( $columnname== "community_id"){
//echo "++++++++++++++community_id=".$column->getValue()."+++++++++++++".PHP_EOL;
$redis->hset($key, 'community_id', $column->getValue());
}elseif($columnname == "title"){
//echo "++++++++++++++title=".$column->getValue()."+++++++++++++".PHP_EOL;
$redis->hset($key, 'title', $column->getValue());
}elseif($columnname == "url"){
//echo "++++++++++++++url=".$column->getValue()."+++++++++++++".PHP_EOL;
$redis->hset($key, 'url', $column->getValue());
}elseif($columnname == "id"){
$key = $column->getValue();
}
}
if($table == "community_contents_sub"){
if($column->getName() == "attr"){
$columnname = $column->getValue();
}elseif($column->getName() == "value"){
$value = $column->getValue();
}
if(!empty($columnname)&&!empty($value)){
//echo "++++++++++++++".$columnname."=".$value."+++++++++++++".PHP_EOL;
$redis->hset($key, $columnname, $value);
}
}
}
}
重点是把客户端消费程序做成守护进程。& 之后返回Jobid。disown -h jobid。