在 Yii 2.0 中,控制台命令的集群实现,Redis模型的锁定实现(以保证同一时间段内,即使多台服务器皆在运行命令行,但是每台服务器运行的任务是不重复的,以提升命令行的总体处理性能)
1、Docker 部署,基于 Supervisor 的 crontab (bash sleep) 的实现,以降低内存占用,参考:https://www.shuijingwanwq.com/2019/10/12/3555/ 。/console/controllers/CmcConsoleUserController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | <?php /** * Created by PhpStorm. * User: Qiang Wang * Date: 2019/01/09 * Time: 13:55 */ namespace console\controllers; use Yii; use console\models\ConfigColumnUser; use console\models\redis\cmc_console\User as RedisCmcConsoleUser; use console\services\CmcApiGroupService; use console\services\CmcConsoleUserService; use yii\base\InvalidArgumentException; use yii\console\Controller; use yii\console\ExitCode; use yii\helpers\ArrayHelper; use yii\web\HttpException; use yii\web\ServerErrorHttpException; /** * 框架服务控制台的用户 * * @author Qiang Wang <shuijingwanwq@163.com> * @since 1.0 */ class CmcConsoleUserController extends Controller { /** * 同步框架服务控制台的用户模型(Http)至框架服务控制台的用户模型(Redis)、栏目人员配置模型(MySQL) * * @throws ServerErrorHttpException * @throws HttpException 如果登录超时 * @throws InvalidArgumentException if the $direction or $sortFlag parameters do not have */ public function actionSync() { // 设置同步标识的缓存键 $redisCache = Yii:: $app ->redisCache; $redisCacheIdentityKey = 'cmc_console_user_sync' ; // 从缓存中取回同步标识 $redisCacheIdentityData = $redisCache [ $redisCacheIdentityKey ]; if ( $redisCacheIdentityData === false) { // HTTP 请求,获取开通有效服务的租户ID列表 $httpCmcApiGroupIds = CmcApiGroupService::httpGetGroupIds(); /* 判断 $httpCmcApiGroupIds 是否为空,如果为空,则成功退出 */ if ( empty ( $httpCmcApiGroupIds )) { // 延缓执行 60 * 60 秒 // sleep(Yii::$app->params['cmcConsoleUser']['isEmptyYesSleepTime']); return ExitCode::OK; } // 设置租户ID列表的缓存键 $redisCacheGroupIdsKey = 'cmc_api_group_ids' ; // 从缓存中取回租户ID列表 $redisCacheGroupIdsData = $redisCache [ $redisCacheGroupIdsKey ]; // 是否设置租户ID列表的缓存,默认:否 $isSetRedisCacheGroupIds = false; if ( $redisCacheGroupIdsData === false) { $cmcApiGroupIds = []; foreach ( $httpCmcApiGroupIds as $httpCmcApiGroupId ) { $cmcApiGroupIds [] = [ 'group_id' => $httpCmcApiGroupId , 'cmc_console_user_last_synced_at' => 0, //上次同步时间 ]; } // 是否设置租户ID列表的缓存:是 $isSetRedisCacheGroupIds = true; } else { // 获取 group_id 值列表 $redisCacheGroupIds = ArrayHelper::getColumn( $redisCacheGroupIdsData , 'group_id' ); $cmcApiGroupIds = $redisCacheGroupIdsData ; foreach ( $httpCmcApiGroupIds as $httpCmcApiGroupId ) { if (!in_array( $httpCmcApiGroupId , $redisCacheGroupIds )) { $cmcApiGroupIds [] = [ 'group_id' => $httpCmcApiGroupId , 'cmc_console_user_last_synced_at' => 0, //上次同步时间 ]; // 是否设置租户ID列表的缓存:是 $isSetRedisCacheGroupIds = true; } } } // 判断是否设置租户ID列表的缓存 if ( $isSetRedisCacheGroupIds ) { // 将 $cmcApiGroupIds 存放到缓存供下次使用,将数据在缓存中永久保留 $redisCache ->set( $redisCacheGroupIdsKey , $cmcApiGroupIds ); } // 基于上次同步时间顺序排列,赋值给:$sortCmcApiGroupIds $sortCmcApiGroupIds = $cmcApiGroupIds ; ArrayHelper::multisort( $sortCmcApiGroupIds , 'cmc_console_user_last_synced_at' , SORT_ASC); foreach ( $sortCmcApiGroupIds as $sortCmcApiGroupId ) { $isLockExist = RedisCmcConsoleUser::isLockExist( $sortCmcApiGroupId [ 'group_id' ]); // 返回 true,表示锁定存在,即已经被其他客户端锁定 if ( $isLockExist === true) { continue ; } // HTTP请求,获取租户ID下的用户列表 $httpGetUserListData = [ 'groupId' => $sortCmcApiGroupId [ 'group_id' ], 'loginId' => '' , 'loginTid' => '' , ]; $getUserListData = CmcConsoleUserService::httpGetUserList( $httpGetUserListData ); // 框架服务控制台的用户模型(Http),重建数组索引(以 ID 索引结果集) $httpCmcConsoleUserItems = ArrayHelper::index( $getUserListData [ 'list' ], 'id' ); // 销毁变量 unset( $getUserListData [ 'list' ]); // 基于租户ID查询框架服务控制台的用户模型(Redis)(以 ID 索引结果集) $redisCmcConsoleUserItems = RedisCmcConsoleUser::find()->where([ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]])->indexBy( 'id' )->asArray()->all(); // 使用键名比较计算数组的差集,如果不为空,则删除出现在 Redis 中但是未出现在 Http 中的记录 $redisArrayDiffItems = array_diff_key ( $redisCmcConsoleUserItems , $httpCmcConsoleUserItems ); // 销毁变量 unset( $redisCmcConsoleUserItems ); if (! empty ( $redisArrayDiffItems )) { $redisArrayDiffIds = array_keys ( $redisArrayDiffItems ); // 销毁变量 unset( $redisArrayDiffItems ); if (RedisCmcConsoleUser::deleteAllByIds( $sortCmcApiGroupId [ 'group_id' ], $redisArrayDiffIds ) === false) { continue ; } } // 基于租户ID查询栏目人员配置模型(MySQL)(以 用户ID 索引结果集) $configColumnUserItems = ConfigColumnUser::find()->where([ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]])->isDeletedNo()->indexBy( 'user_id' )->asArray()->all(); // 使用键名比较计算数组的差集,如果不为空,则删除 (软删除) 出现在 栏目人员配置模型(MySQL) 中但是未出现在 框架服务控制台的用户模型(Http) 中的记录 $diffItems = array_diff_key ( $configColumnUserItems , $httpCmcConsoleUserItems ); // 销毁变量 unset( $configColumnUserItems ); if (! empty ( $diffItems )) { // 基于租户ID、用户ID查询栏目人员配置模型(MySQL)(待删除) $toBeDeletedConfigColumnUserItems = ConfigColumnUser::find()->where([ 'and' , [ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]], [ 'in' , 'user_id' , $diffItems ], ])->isDeletedNo()->all(); foreach ( $toBeDeletedConfigColumnUserItems as $toBeDeletedConfigColumnUserItem ) { /* @var $toBeDeletedConfigColumnUserItem ConfigColumnUser */ $toBeDeletedConfigColumnUserItem ->softDelete(); } } // 遍历框架服务控制台的用户模型(Http),判断在 Redis 中是否存在,如果不存在,则插入,如果存在且更新时间不相等,则更新 foreach ( $httpCmcConsoleUserItems as $httpCmcConsoleUserItemValue ) { $redisCmcConsoleUserItem = RedisCmcConsoleUser::find()->where([ 'id' => $httpCmcConsoleUserItemValue [ 'id' ]])->one(); if (!isset( $redisCmcConsoleUserItem )) { $redisCmcConsoleUser = new RedisCmcConsoleUser(); $attributes = $this ->getAttributes( $getUserListData [ 'group_info' ][ 'group_id' ], $httpCmcConsoleUserItemValue ); $redisCmcConsoleUser ->attributes = $attributes ; $redisCmcConsoleUser ->insert(); } else { if ( $httpCmcConsoleUserItemValue [ 'update_time' ] != $redisCmcConsoleUserItem [ 'update_time' ]) { $attributes = $this ->getAttributes( $getUserListData [ 'group_info' ][ 'group_id' ], $httpCmcConsoleUserItemValue ); $redisCmcConsoleUserItem ->attributes = $attributes ; $redisCmcConsoleUserItem ->save(); } } } // 从缓存中取回租户ID列表 $cmcApiGroupIds = $redisCache [ $redisCacheGroupIdsKey ]; // 设置当前租户的上次同步时间 foreach ( $cmcApiGroupIds as $cmcApiGroupIdKey => $cmcApiGroupId ) { if ( $cmcApiGroupId [ 'group_id' ] == $sortCmcApiGroupId [ 'group_id' ]) { $cmcApiGroupIds [ $cmcApiGroupIdKey ][ 'cmc_console_user_last_synced_at' ] = time(); break ; } } // 将 $cmcApiGroupIds 存放到缓存供下次使用,将数据在缓存中永久保留 $redisCache ->set( $redisCacheGroupIdsKey , $cmcApiGroupIds ); // break 结束当前 foreach 结构的执行,即命令行的每一次运行,仅同步成功一个租户下的用户列表 break ; } // 延缓执行 60 秒 // sleep(Yii::$app->params['cmcConsoleUser']['isEmptyNoSleepTime']); // 将同步标识存放到缓存供下次使用,将数据在缓存中保留 60 秒 $redisCache ->set( $redisCacheIdentityKey , $redisCacheIdentityKey , Yii:: $app ->params[ 'cmcConsoleUser' ][ 'isEmptyNoSleepTime' ]); // file_put_contents('E:/wwwroot/pcs-api/console/runtime/logs/cmc-console-user-sync-memory-get-usage-' . time() . '.txt', memory_get_usage() / 1024 / 1024 . 'MB'); // file_put_contents('E:/wwwroot/pcs-api/console/runtime/logs/cmc-console-user-sync-memory-get-peak-usage-' . time() . '.txt', memory_get_peak_usage() / 1024 / 1024 . 'MB'); return ExitCode::OK; } else { // 延缓执行 60 秒 // sleep(Yii::$app->params['cmcConsoleUser']['isEmptyNoSleepTime']); return ExitCode::OK; } } /** * 获取属性列表 * @param string $groupId 租户ID * @param array $httpCmcConsoleUser 框架服务控制台的用户模型(Http) * * @return array */ private function getAttributes( $groupId , $httpCmcConsoleUser ) { return [ 'id' => $httpCmcConsoleUser [ 'id' ], 'group_id' => $groupId , 'login_name' => $httpCmcConsoleUser [ 'login_name' ], 'user_token' => $httpCmcConsoleUser [ 'user_token' ], 'user_nick' => $httpCmcConsoleUser [ 'user_nick' ], 'user_pic' => $httpCmcConsoleUser [ 'user_pic' ], 'user_mobile' => $httpCmcConsoleUser [ 'user_mobile' ] ? $httpCmcConsoleUser [ 'user_mobile' ] : '' , 'user_email' => $httpCmcConsoleUser [ 'user_email' ] ? $httpCmcConsoleUser [ 'user_email' ] : '' , 'user_sex' => $httpCmcConsoleUser [ 'user_sex' ], 'user_type' => $httpCmcConsoleUser [ 'user_type' ], 'user_birthday' => $httpCmcConsoleUser [ 'user_birthday' ], 'user_chat_id' => $httpCmcConsoleUser [ 'user_chat_id' ] ? $httpCmcConsoleUser [ 'user_chat_id' ] : '' , 'is_open' => $httpCmcConsoleUser [ 'is_open' ], 'add_time' => $httpCmcConsoleUser [ 'add_time' ], 'update_time' => $httpCmcConsoleUser [ 'update_time' ], ]; } } |
2、break 结束当前 foreach 结构的执行,即命令行的每一次运行,仅同步成功一个租户下的用户列表。当租户数量过多的时候,假设 100 个租户,平均 1 个租户的同步时间为 10 秒钟 + 下一个租户的同步的间隔时间 60 秒(包含了 bash sleep 5 秒),那么可能某个租户下的用户同步,其最大间隔时间就有可能为 7000 秒钟了。因此,如果支持了集群的部署,假设为 10 个容器,那么某个租户下的用户同步,其最大间隔时间就有可能为 700 秒钟了,同步的即时性提升了 10 倍。/mcloud/yii-cmc-console-user-sync.ini
1 2 3 4 5 6 7 | [program:yii-cmc-console-user-sync] command = bash -c 'sleep 5 && exec php /mcloud/www/pcs-api/yii cmc-console-user/sync' autorestart = true startsecs = 5 stopwaitsecs = 10 stderr_logfile = /data/logs/yii-cmc-console-user-sync-stderr.log stdout_logfile = /data/logs/yii-cmc-console-user-sync-stdout.log |
3、如果要支持集群的部署,现阶段存在的问题:同一个租户下的用户同步,可能在某一时间段,多个容器皆在执行,导致了同步的冗余执行(未达到最大化利用集群部署,进而满足同步的即时性提升至 10 倍的理想值)。因此,应该保证同一个租户下的用户同步,在某一时间段,仅在 1 个容器中执行。
4、将同步标识存放到缓存供下次使用,将数据在缓存中保留 60 秒。之前实现的初衷是同步成功一个租户下的用户后,间隔 60 秒再同步下一个租户下的用户,以降低资源消耗。现在如果要支持集群,就需要取消。否则会导致某个容器同步成功一个租户下的用户后,在 60 秒的间隔时间段内,其他容器也无法同步其他租户下的用户。/console/controllers/CmcConsoleUserController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | <?php /** * Created by PhpStorm. * User: Qiang Wang * Date: 2019/01/09 * Time: 13:55 */ namespace console\controllers; use Yii; use console\models\ConfigColumnUser; use console\models\redis\cmc_console\User as RedisCmcConsoleUser; use console\services\CmcApiGroupService; use console\services\CmcConsoleUserService; use yii\base\InvalidArgumentException; use yii\console\Controller; use yii\console\ExitCode; use yii\helpers\ArrayHelper; use yii\web\HttpException; use yii\web\ServerErrorHttpException; /** * 框架服务控制台的用户 * * @author Qiang Wang <shuijingwanwq@163.com> * @since 1.0 */ class CmcConsoleUserController extends Controller { /** * 同步框架服务控制台的用户模型(Http)至框架服务控制台的用户模型(Redis)、栏目人员配置模型(MySQL) * * @throws ServerErrorHttpException * @throws HttpException 如果登录超时 * @throws InvalidArgumentException if the $direction or $sortFlag parameters do not have */ public function actionSync() { // 设置同步标识的缓存键 $redisCache = Yii:: $app ->redisCache; // HTTP 请求,获取开通有效服务的租户ID列表 $httpCmcApiGroupIds = CmcApiGroupService::httpGetGroupIds(); /* 判断 $httpCmcApiGroupIds 是否为空,如果为空,则成功退出 */ if ( empty ( $httpCmcApiGroupIds )) { // 延缓执行 60 * 60 秒 // sleep(Yii::$app->params['cmcConsoleUser']['isEmptyYesSleepTime']); return ExitCode::OK; } // 设置租户ID列表的缓存键 $redisCacheGroupIdsKey = 'cmc_api_group_ids' ; // 从缓存中取回租户ID列表 $redisCacheGroupIdsData = $redisCache [ $redisCacheGroupIdsKey ]; // 是否设置租户ID列表的缓存,默认:否 $isSetRedisCacheGroupIds = false; if ( $redisCacheGroupIdsData === false) { $cmcApiGroupIds = []; foreach ( $httpCmcApiGroupIds as $httpCmcApiGroupId ) { $cmcApiGroupIds [] = [ 'group_id' => $httpCmcApiGroupId , 'cmc_console_user_last_synced_at' => 0, //上次同步时间 ]; } // 是否设置租户ID列表的缓存:是 $isSetRedisCacheGroupIds = true; } else { // 获取 group_id 值列表 $redisCacheGroupIds = ArrayHelper::getColumn( $redisCacheGroupIdsData , 'group_id' ); $cmcApiGroupIds = $redisCacheGroupIdsData ; foreach ( $httpCmcApiGroupIds as $httpCmcApiGroupId ) { if (!in_array( $httpCmcApiGroupId , $redisCacheGroupIds )) { $cmcApiGroupIds [] = [ 'group_id' => $httpCmcApiGroupId , 'cmc_console_user_last_synced_at' => 0, //上次同步时间 ]; // 是否设置租户ID列表的缓存:是 $isSetRedisCacheGroupIds = true; } } } // 判断是否设置租户ID列表的缓存 if ( $isSetRedisCacheGroupIds ) { // 将 $cmcApiGroupIds 存放到缓存供下次使用,将数据在缓存中永久保留 $redisCache ->set( $redisCacheGroupIdsKey , $cmcApiGroupIds ); } // 基于上次同步时间顺序排列,赋值给:$sortCmcApiGroupIds $sortCmcApiGroupIds = $cmcApiGroupIds ; ArrayHelper::multisort( $sortCmcApiGroupIds , 'cmc_console_user_last_synced_at' , SORT_ASC); foreach ( $sortCmcApiGroupIds as $sortCmcApiGroupId ) { $isLockExist = RedisCmcConsoleUser::isLockExist( $sortCmcApiGroupId [ 'group_id' ]); // 返回 true,表示锁定存在,即已经被其他客户端锁定 if ( $isLockExist === true) { continue ; } // HTTP请求,获取租户ID下的用户列表 $httpGetUserListData = [ 'groupId' => $sortCmcApiGroupId [ 'group_id' ], 'loginId' => '' , 'loginTid' => '' , ]; $getUserListData = CmcConsoleUserService::httpGetUserList( $httpGetUserListData ); // 框架服务控制台的用户模型(Http),重建数组索引(以 ID 索引结果集) $httpCmcConsoleUserItems = ArrayHelper::index( $getUserListData [ 'list' ], 'id' ); // 销毁变量 unset( $getUserListData [ 'list' ]); // 基于租户ID查询框架服务控制台的用户模型(Redis)(以 ID 索引结果集) $redisCmcConsoleUserItems = RedisCmcConsoleUser::find()->where([ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]])->indexBy( 'id' )->asArray()->all(); // 使用键名比较计算数组的差集,如果不为空,则删除出现在 Redis 中但是未出现在 Http 中的记录 $redisArrayDiffItems = array_diff_key ( $redisCmcConsoleUserItems , $httpCmcConsoleUserItems ); // 销毁变量 unset( $redisCmcConsoleUserItems ); if (! empty ( $redisArrayDiffItems )) { $redisArrayDiffIds = array_keys ( $redisArrayDiffItems ); // 销毁变量 unset( $redisArrayDiffItems ); if (RedisCmcConsoleUser::deleteAllByIds( $sortCmcApiGroupId [ 'group_id' ], $redisArrayDiffIds ) === false) { continue ; } } // 基于租户ID查询栏目人员配置模型(MySQL)(以 用户ID 索引结果集) $configColumnUserItems = ConfigColumnUser::find()->where([ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]])->isDeletedNo()->indexBy( 'user_id' )->asArray()->all(); // 使用键名比较计算数组的差集,如果不为空,则删除 (软删除) 出现在 栏目人员配置模型(MySQL) 中但是未出现在 框架服务控制台的用户模型(Http) 中的记录 $diffItems = array_diff_key ( $configColumnUserItems , $httpCmcConsoleUserItems ); // 销毁变量 unset( $configColumnUserItems ); if (! empty ( $diffItems )) { // 基于租户ID、用户ID查询栏目人员配置模型(MySQL)(待删除) $toBeDeletedConfigColumnUserItems = ConfigColumnUser::find()->where([ 'and' , [ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]], [ 'in' , 'user_id' , $diffItems ], ])->isDeletedNo()->all(); foreach ( $toBeDeletedConfigColumnUserItems as $toBeDeletedConfigColumnUserItem ) { /* @var $toBeDeletedConfigColumnUserItem ConfigColumnUser */ $toBeDeletedConfigColumnUserItem ->softDelete(); } } // 遍历框架服务控制台的用户模型(Http),判断在 Redis 中是否存在,如果不存在,则插入,如果存在且更新时间不相等,则更新 foreach ( $httpCmcConsoleUserItems as $httpCmcConsoleUserItemValue ) { $redisCmcConsoleUserItem = RedisCmcConsoleUser::find()->where([ 'id' => $httpCmcConsoleUserItemValue [ 'id' ]])->one(); if (!isset( $redisCmcConsoleUserItem )) { $redisCmcConsoleUser = new RedisCmcConsoleUser(); $attributes = $this ->getAttributes( $getUserListData [ 'group_info' ][ 'group_id' ], $httpCmcConsoleUserItemValue ); $redisCmcConsoleUser ->attributes = $attributes ; $redisCmcConsoleUser ->insert(); } else { if ( $httpCmcConsoleUserItemValue [ 'update_time' ] != $redisCmcConsoleUserItem [ 'update_time' ]) { $attributes = $this ->getAttributes( $getUserListData [ 'group_info' ][ 'group_id' ], $httpCmcConsoleUserItemValue ); $redisCmcConsoleUserItem ->attributes = $attributes ; $redisCmcConsoleUserItem ->save(); } } } // 从缓存中取回租户ID列表 $cmcApiGroupIds = $redisCache [ $redisCacheGroupIdsKey ]; // 设置当前租户的上次同步时间 foreach ( $cmcApiGroupIds as $cmcApiGroupIdKey => $cmcApiGroupId ) { if ( $cmcApiGroupId [ 'group_id' ] == $sortCmcApiGroupId [ 'group_id' ]) { $cmcApiGroupIds [ $cmcApiGroupIdKey ][ 'cmc_console_user_last_synced_at' ] = time(); break ; } } // 将 $cmcApiGroupIds 存放到缓存供下次使用,将数据在缓存中永久保留 $redisCache ->set( $redisCacheGroupIdsKey , $cmcApiGroupIds ); // break 结束当前 foreach 结构的执行,即命令行的每一次运行,仅同步成功一个租户下的用户列表 break ; } // 延缓执行 60 秒 // sleep(Yii::$app->params['cmcConsoleUser']['isEmptyNoSleepTime']); // file_put_contents('E:/wwwroot/pcs-api/console/runtime/logs/cmc-console-user-sync-memory-get-usage-' . time() . '.txt', memory_get_usage() / 1024 / 1024 . 'MB'); // file_put_contents('E:/wwwroot/pcs-api/console/runtime/logs/cmc-console-user-sync-memory-get-peak-usage-' . time() . '.txt', memory_get_peak_usage() / 1024 / 1024 . 'MB'); return ExitCode::OK; } } |
5、此时,当租户数量过多的时候,假设 100 个租户,平均 1 个租户的同步时间为 10 秒钟 + 下一个租户的同步的间隔时间 60 秒(包含了 bash sleep 60 秒),那么可能某个租户下的用户同步,其最大间隔时间就有可能为 7000 秒钟了。因此,如果支持了集群的部署,假设为 10 个容器,那么某个租户下的用户同步,其最大间隔时间就有可能为 700 秒钟了,同步的即时性提升了 10 倍。/mcloud/yii-cmc-console-user-sync.ini
1 2 3 4 5 6 7 | [program:yii-cmc-console-user-sync] command = bash -c 'sleep 60 && exec php /mcloud/www/pcs-api/yii cmc-console-user/sync' autorestart = true startsecs = 5 stopwaitsecs = 10 stderr_logfile = /data/logs/yii-cmc-console-user-sync-stderr.log stdout_logfile = /data/logs/yii-cmc-console-user-sync-stdout.log |
6、编辑 /common/logics/redis/Lock.php,Redis模型的锁定实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | <?php namespace common\logics\redis; use Yii; /** * This is the model class for table "{{%lock}}". * * @author Qiang Wang <shuijingwanwq@163.com> * @since 1.0 */ class Lock extends \yii\redis\ActiveRecord { /** * Redis模型的锁定实现 * @param string $lockKeyName 锁定键名 * 格式如下: * * 'game_category' //锁定键名,如比赛分类 * * @return bool 成功返回真/失败返回假 * 格式如下: * * true //状态,获取锁定成功,可继续执行 * * 或者 * * false //状态,获取锁定失败,不可继续执行 * */ public function lock( $lockKeyName ) { // 设置锁定的过期时间,获取相关锁定参数 $time = time(); $lockKey = Yii:: $app ->params[ 'redisLock' ][ 'keyPrefix' ] . $lockKeyName ; $lockExpire = $time + Yii:: $app ->params[ 'redisLock' ][ 'timeOut' ]; // 获取 Redis 连接,以执行相关命令 $redis = Yii:: $app ->redis; // 获取锁定 $executeCommandResult = $redis ->setnx( $lockKey , $lockExpire ); // 返回0,表示已经被其他客户端锁定 if ( $executeCommandResult == 0) { // 防止死锁,获取当前锁的过期时间 $lockCurrentExpire = $redis ->get( $lockKey ); // 判断锁是否过期,如果已经过期 if ( $time > $lockCurrentExpire ) { // 防止并发锁定,检查存储在 key 的旧值是否仍然是过期的时间戳,如果是,则获取锁定,否则返回假 $executeCommandResult = $redis ->getset( $lockKey , $lockExpire ); if ( $lockCurrentExpire != $executeCommandResult ) { return false; } } // 返回0,表示已经被其他客户端锁定,且不存在死锁,返回假 if ( $executeCommandResult == 0) { return false; } } return true; } /** * 判断Redis模型的锁定是否存在 * @param string $lockKeyName 锁定键名 * 格式如下: * * 'game_category' //锁定键名,如比赛分类 * * @return bool 锁定是否存在 * 格式如下: * * true //状态:已存在 * * 或者 * * false //状态:不存在 * */ public function isLockExist( $lockKeyName ) { // 获取相关锁定参数 $time = time(); $lockKey = Yii:: $app ->params[ 'redisLock' ][ 'keyPrefix' ] . $lockKeyName ; // 获取 Redis 连接,以执行相关命令 $redis = Yii:: $app ->redis; // 获取锁定 $executeCommandResult = $redis ->get( $lockKey ); // 返回NULL,表示不存在锁定,否则表示存在 if ( $executeCommandResult === null) { return false; } else { // 如果存在锁定,判断锁是否过期,如果已经过期,则仍然认定为不存在锁定 if ( $time > $executeCommandResult ) { // 如果已经过期,则释放锁定 $redis ->del( $lockKey ); return false; } } return true; } /** * Redis模型的释放锁定实现 * @param string $lockKeyName 锁定键名 * 格式如下: * * 'game_category' //锁定键名,如比赛分类 * * @return integer 被删除的keys的数量 * 格式如下: * * 1 //被删除的keys的数量 * * 或者 * * 0 //被删除的keys的数量 * */ public function unlock( $lockKeyName ) { // 获取相关锁定参数 $lockKey = Yii:: $app ->params[ 'redisLock' ][ 'keyPrefix' ] . $lockKeyName ; // 获取 Redis 连接,以执行相关命令 $redis = Yii:: $app ->redis; // 释放锁定 return $redis ->del( $lockKey ); } } |
7、编辑 /console/controllers/CmcConsoleUserController.php,Redis模型的锁定实现。在开始一个租户下的用户同步之前,判断Redis模型的锁定是否存在,如果存在,则跳出当前循环,继续下一个租户的同步。在开始一个租户下的用户同步之前,Redis模型的获取锁定实现,如果获取锁定失败,则跳出当前循环,继续下一个租户的同步。一个租户下的用户同步成功之后,释放锁定。结束循环。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | <?php /** * Created by PhpStorm. * User: Qiang Wang * Date: 2019/01/09 * Time: 13:55 */ namespace console\controllers; use Yii; use console\models\ConfigColumnUser; use console\models\redis\cmc_console\User as RedisCmcConsoleUser; use console\models\redis\Lock as RedisLock; use console\services\CmcApiGroupService; use console\services\CmcConsoleUserService; use yii\base\InvalidArgumentException; use yii\console\Controller; use yii\console\ExitCode; use yii\helpers\ArrayHelper; use yii\web\HttpException; use yii\web\ServerErrorHttpException; /** * 框架服务控制台的用户 * * @author Qiang Wang <shuijingwanwq@163.com> * @since 1.0 */ class CmcConsoleUserController extends Controller { /** * 同步框架服务控制台的用户模型(Http)至框架服务控制台的用户模型(Redis)、栏目人员配置模型(MySQL) * * @throws ServerErrorHttpException * @throws HttpException 如果登录超时 * @throws InvalidArgumentException if the $direction or $sortFlag parameters do not have */ public function actionSync() { // 设置同步标识的缓存键 $redisCache = Yii:: $app ->redisCache; // HTTP 请求,获取开通有效服务的租户ID列表 $httpCmcApiGroupIds = CmcApiGroupService::httpGetGroupIds(); /* 判断 $httpCmcApiGroupIds 是否为空,如果为空,则成功退出 */ if ( empty ( $httpCmcApiGroupIds )) { // 延缓执行 60 * 60 秒 // sleep(Yii::$app->params['cmcConsoleUser']['isEmptyYesSleepTime']); return ExitCode::OK; } // 设置租户ID列表的缓存键 $redisCacheGroupIdsKey = 'cmc_api_group_ids' ; // 从缓存中取回租户ID列表 $redisCacheGroupIdsData = $redisCache [ $redisCacheGroupIdsKey ]; // 是否设置租户ID列表的缓存,默认:否 $isSetRedisCacheGroupIds = false; if ( $redisCacheGroupIdsData === false) { $cmcApiGroupIds = []; foreach ( $httpCmcApiGroupIds as $httpCmcApiGroupId ) { $cmcApiGroupIds [] = [ 'group_id' => $httpCmcApiGroupId , 'cmc_console_user_last_synced_at' => 0, //上次同步时间 ]; } // 是否设置租户ID列表的缓存:是 $isSetRedisCacheGroupIds = true; } else { // 获取 group_id 值列表 $redisCacheGroupIds = ArrayHelper::getColumn( $redisCacheGroupIdsData , 'group_id' ); $cmcApiGroupIds = $redisCacheGroupIdsData ; foreach ( $httpCmcApiGroupIds as $httpCmcApiGroupId ) { if (!in_array( $httpCmcApiGroupId , $redisCacheGroupIds )) { $cmcApiGroupIds [] = [ 'group_id' => $httpCmcApiGroupId , 'cmc_console_user_last_synced_at' => 0, //上次同步时间 ]; // 是否设置租户ID列表的缓存:是 $isSetRedisCacheGroupIds = true; } } } // 判断是否设置租户ID列表的缓存 if ( $isSetRedisCacheGroupIds ) { // 将 $cmcApiGroupIds 存放到缓存供下次使用,将数据在缓存中永久保留 $redisCache ->set( $redisCacheGroupIdsKey , $cmcApiGroupIds ); } // 基于上次同步时间顺序排列,赋值给:$sortCmcApiGroupIds $sortCmcApiGroupIds = $cmcApiGroupIds ; ArrayHelper::multisort( $sortCmcApiGroupIds , 'cmc_console_user_last_synced_at' , SORT_ASC); foreach ( $sortCmcApiGroupIds as $sortCmcApiGroupId ) { $isLockExist = RedisCmcConsoleUser::isLockExist( $sortCmcApiGroupId [ 'group_id' ]); // 返回 true,表示锁定存在,即已经被其他客户端锁定 if ( $isLockExist === true) { continue ; } /* 判断Redis模型的锁定是否存在 */ $redisLockKeyName = 'cmc_console_user:sync:' . implode( ':' , [ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]]); $redisLock = new RedisLock(); $redisLockResult = $redisLock ->isLockExist( $redisLockKeyName ); // 返回 true,表示锁定存在,即已经被其他客户端锁定 if ( $redisLockResult === true) { continue ; } /* Redis模型的锁定实现 */ $redisLockResult = $redisLock ->lock( $redisLockKeyName ); // 返回 false,表示已经被其他客户端锁定 if ( $redisLockResult === false) { continue ; } // HTTP请求,获取租户ID下的用户列表 $httpGetUserListData = [ 'groupId' => $sortCmcApiGroupId [ 'group_id' ], 'loginId' => '' , 'loginTid' => '' , ]; $getUserListData = CmcConsoleUserService::httpGetUserList( $httpGetUserListData ); // 框架服务控制台的用户模型(Http),重建数组索引(以 ID 索引结果集) $httpCmcConsoleUserItems = ArrayHelper::index( $getUserListData [ 'list' ], 'id' ); // 销毁变量 unset( $getUserListData [ 'list' ]); // 基于租户ID查询框架服务控制台的用户模型(Redis)(以 ID 索引结果集) $redisCmcConsoleUserItems = RedisCmcConsoleUser::find()->where([ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]])->indexBy( 'id' )->asArray()->all(); // 使用键名比较计算数组的差集,如果不为空,则删除出现在 Redis 中但是未出现在 Http 中的记录 $redisArrayDiffItems = array_diff_key ( $redisCmcConsoleUserItems , $httpCmcConsoleUserItems ); // 销毁变量 unset( $redisCmcConsoleUserItems ); if (! empty ( $redisArrayDiffItems )) { $redisArrayDiffIds = array_keys ( $redisArrayDiffItems ); // 销毁变量 unset( $redisArrayDiffItems ); if (RedisCmcConsoleUser::deleteAllByIds( $sortCmcApiGroupId [ 'group_id' ], $redisArrayDiffIds ) === false) { continue ; } } // 基于租户ID查询栏目人员配置模型(MySQL)(以 用户ID 索引结果集) $configColumnUserItems = ConfigColumnUser::find()->where([ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]])->isDeletedNo()->indexBy( 'user_id' )->asArray()->all(); // 使用键名比较计算数组的差集,如果不为空,则删除 (软删除) 出现在 栏目人员配置模型(MySQL) 中但是未出现在 框架服务控制台的用户模型(Http) 中的记录 $diffItems = array_diff_key ( $configColumnUserItems , $httpCmcConsoleUserItems ); // 销毁变量 unset( $configColumnUserItems ); if (! empty ( $diffItems )) { // 基于租户ID、用户ID查询栏目人员配置模型(MySQL)(待删除) $toBeDeletedConfigColumnUserItems = ConfigColumnUser::find()->where([ 'and' , [ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]], [ 'in' , 'user_id' , $diffItems ], ])->isDeletedNo()->all(); foreach ( $toBeDeletedConfigColumnUserItems as $toBeDeletedConfigColumnUserItem ) { /* @var $toBeDeletedConfigColumnUserItem ConfigColumnUser */ $toBeDeletedConfigColumnUserItem ->softDelete(); } } // 遍历框架服务控制台的用户模型(Http),判断在 Redis 中是否存在,如果不存在,则插入,如果存在且更新时间不相等,则更新 foreach ( $httpCmcConsoleUserItems as $httpCmcConsoleUserItemValue ) { $redisCmcConsoleUserItem = RedisCmcConsoleUser::find()->where([ 'id' => $httpCmcConsoleUserItemValue [ 'id' ]])->one(); if (!isset( $redisCmcConsoleUserItem )) { $redisCmcConsoleUser = new RedisCmcConsoleUser(); $attributes = $this ->getAttributes( $getUserListData [ 'group_info' ][ 'group_id' ], $httpCmcConsoleUserItemValue ); $redisCmcConsoleUser ->attributes = $attributes ; $redisCmcConsoleUser ->insert(); } else { if ( $httpCmcConsoleUserItemValue [ 'update_time' ] != $redisCmcConsoleUserItem [ 'update_time' ]) { $attributes = $this ->getAttributes( $getUserListData [ 'group_info' ][ 'group_id' ], $httpCmcConsoleUserItemValue ); $redisCmcConsoleUserItem ->attributes = $attributes ; $redisCmcConsoleUserItem ->save(); } } } // 从缓存中取回租户ID列表 $cmcApiGroupIds = $redisCache [ $redisCacheGroupIdsKey ]; // 设置当前租户的上次同步时间 foreach ( $cmcApiGroupIds as $cmcApiGroupIdKey => $cmcApiGroupId ) { if ( $cmcApiGroupId [ 'group_id' ] == $sortCmcApiGroupId [ 'group_id' ]) { $cmcApiGroupIds [ $cmcApiGroupIdKey ][ 'cmc_console_user_last_synced_at' ] = time(); break ; } } // 将 $cmcApiGroupIds 存放到缓存供下次使用,将数据在缓存中永久保留 $redisCache ->set( $redisCacheGroupIdsKey , $cmcApiGroupIds ); // 释放锁定 $redisLock ->unlock( $redisLockKeyName ); // break 结束当前 foreach 结构的执行,即命令行的每一次运行,仅同步成功一个租户下的用户列表 break ; } // 延缓执行 60 秒 // sleep(Yii::$app->params['cmcConsoleUser']['isEmptyNoSleepTime']); // file_put_contents('E:/wwwroot/pcs-api/console/runtime/logs/cmc-console-user-sync-memory-get-usage-' . time() . '.txt', memory_get_usage() / 1024 / 1024 . 'MB'); // file_put_contents('E:/wwwroot/pcs-api/console/runtime/logs/cmc-console-user-sync-memory-get-peak-usage-' . time() . '.txt', memory_get_peak_usage() / 1024 / 1024 . 'MB'); return ExitCode::OK; } } |
8、当一个租户下的用户同步时间长度小于等于 Redis锁定超时时间 的值 10秒时(sleep(8),实际长度超过了 8 秒),此时,此租户已经处于锁定状态,进而导致部署为集群时,可以保证同一个租户下的用户同步,在某一时间段,仅在 1 个容器中执行。在本地环境中,模拟了 3 个容器,3 个容器开始同步时间:1582784312、1582784315、1582784318,分别间隔 3 秒、3秒,皆小于 10 秒。第 1 个容器同步了租户:c10e87f39873512a16727e17f57456a5,第 2 个容器同步了租户:015ce30b116ce86058fa6ab4fea4ac63,第 3 个容器同步了租户:4fd58ceba1fbc537b5402302702131eb。3 个容器的并行执行,分别同步了 3 个租户,符合预期。文件生成顺序体现出了执行执行流程。如图1
1 2 3 4 | 'redisLock' => [ 'keyPrefix' => 'pa:lock:' , //Redis锁定 key 前缀 'timeOut' => 10, //Redis锁定超时时间,单位为秒 ], |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | file_put_contents ( 'E:/wwwroot/pcs-api/console/runtime/logs/cmc-console-user-sync-' . $sortCmcApiGroupId [ 'group_id' ] . '-' . time() . '.txt' , $sortCmcApiGroupId [ 'group_id' ]); /* 判断Redis模型的锁定是否存在 */ $redisLockKeyName = 'cmc_console_user:sync:' . implode( ':' , [ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]]); $redisLock = new RedisLock(); $isLockExist = $redisLock ->isLockExist( $redisLockKeyName ); // 返回 true,表示锁定存在,即已经被其他客户端锁定 if ( $isLockExist === true) { file_put_contents ( 'E:/wwwroot/pcs-api/console/runtime/logs/cmc-console-user-sync-is-lock-exist-' . $sortCmcApiGroupId [ 'group_id' ] . '-' . time() . '.txt' , $sortCmcApiGroupId [ 'group_id' ]); continue ; } /* Redis模型的锁定实现 */ $lock = $redisLock ->lock( $redisLockKeyName ); // 返回 false,表示已经被其他客户端锁定 if ( $lock === false) { file_put_contents ( 'E:/wwwroot/pcs-api/console/runtime/logs/cmc-console-user-sync-lock-' . $sortCmcApiGroupId [ 'group_id' ] . '-' . time() . '.txt' , $sortCmcApiGroupId [ 'group_id' ]); continue ; } // HTTP请求,获取租户ID下的用户列表 $httpGetUserListData = [ 'groupId' => $sortCmcApiGroupId [ 'group_id' ], 'loginId' => '' , 'loginTid' => '' , ]; $getUserListData = CmcConsoleUserService::httpGetUserList( $httpGetUserListData ); // 框架服务控制台的用户模型(Http),重建数组索引(以 ID 索引结果集) $httpCmcConsoleUserItems = ArrayHelper::index( $getUserListData [ 'list' ], 'id' ); // 销毁变量 unset( $getUserListData [ 'list' ]); // 基于租户ID查询框架服务控制台的用户模型(Redis)(以 ID 索引结果集) $redisCmcConsoleUserItems = RedisCmcConsoleUser::find()->where([ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]])->indexBy( 'id' )->asArray()->all(); // 使用键名比较计算数组的差集,如果不为空,则删除出现在 Redis 中但是未出现在 Http 中的记录 $redisArrayDiffItems = array_diff_key ( $redisCmcConsoleUserItems , $httpCmcConsoleUserItems ); // 销毁变量 unset( $redisCmcConsoleUserItems ); if (! empty ( $redisArrayDiffItems )) { $redisArrayDiffIds = array_keys ( $redisArrayDiffItems ); // 销毁变量 unset( $redisArrayDiffItems ); if (RedisCmcConsoleUser::deleteAllByIds( $sortCmcApiGroupId [ 'group_id' ], $redisArrayDiffIds ) === false) { continue ; } } // 基于租户ID查询栏目人员配置模型(MySQL)(以 用户ID 索引结果集) $configColumnUserItems = ConfigColumnUser::find()->where([ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]])->isDeletedNo()->indexBy( 'user_id' )->asArray()->all(); // 使用键名比较计算数组的差集,如果不为空,则删除 (软删除) 出现在 栏目人员配置模型(MySQL) 中但是未出现在 框架服务控制台的用户模型(Http) 中的记录 $diffItems = array_diff_key ( $configColumnUserItems , $httpCmcConsoleUserItems ); // 销毁变量 unset( $configColumnUserItems ); if (! empty ( $diffItems )) { // 基于租户ID、用户ID查询栏目人员配置模型(MySQL)(待删除) $toBeDeletedConfigColumnUserItems = ConfigColumnUser::find()->where([ 'and' , [ 'group_id' => $sortCmcApiGroupId [ 'group_id' ]], [ 'in' , 'user_id' , $diffItems ], ])->isDeletedNo()->all(); foreach ( $toBeDeletedConfigColumnUserItems as $toBeDeletedConfigColumnUserItem ) { /* @var $toBeDeletedConfigColumnUserItem ConfigColumnUser */ $toBeDeletedConfigColumnUserItem ->softDelete(); } } // 遍历框架服务控制台的用户模型(Http),判断在 Redis 中是否存在,如果不存在,则插入,如果存在且更新时间不相等,则更新 foreach ( $httpCmcConsoleUserItems as $httpCmcConsoleUserItemValue ) { $redisCmcConsoleUserItem = RedisCmcConsoleUser::find()->where([ 'id' => $httpCmcConsoleUserItemValue [ 'id' ]])->one(); if (!isset( $redisCmcConsoleUserItem )) { $redisCmcConsoleUser = new RedisCmcConsoleUser(); $attributes = $this ->getAttributes( $getUserListData [ 'group_info' ][ 'group_id' ], $httpCmcConsoleUserItemValue ); $redisCmcConsoleUser ->attributes = $attributes ; $redisCmcConsoleUser ->insert(); } else { if ( $httpCmcConsoleUserItemValue [ 'update_time' ] != $redisCmcConsoleUserItem [ 'update_time' ]) { $attributes = $this ->getAttributes( $getUserListData [ 'group_info' ][ 'group_id' ], $httpCmcConsoleUserItemValue ); $redisCmcConsoleUserItem ->attributes = $attributes ; $redisCmcConsoleUserItem ->save(); } } } // 从缓存中取回租户ID列表 $cmcApiGroupIds = $redisCache [ $redisCacheGroupIdsKey ]; // 设置当前租户的上次同步时间 foreach ( $cmcApiGroupIds as $cmcApiGroupIdKey => $cmcApiGroupId ) { if ( $cmcApiGroupId [ 'group_id' ] == $sortCmcApiGroupId [ 'group_id' ]) { $cmcApiGroupIds [ $cmcApiGroupIdKey ][ 'cmc_console_user_last_synced_at' ] = time(); break ; } } // 将 $cmcApiGroupIds 存放到缓存供下次使用,将数据在缓存中永久保留 sleep(8); $redisCache ->set( $redisCacheGroupIdsKey , $cmcApiGroupIds ); // 释放锁定 $redisLock ->unlock( $redisLockKeyName ); |
9、打印出从缓存中取回租户ID列表,已经成功同步了 3 个租户:c10e87f39873512a16727e17f57456a5、015ce30b116ce86058fa6ab4fea4ac63、4fd58ceba1fbc537b5402302702131eb,但是,仅有租户 4fd58ceba1fbc537b5402302702131eb 的同步时间得到了更新。虽然在实际的生产环境中,不存在 sleep(8),此为在本地环境模拟并发请求,而添加的。但是,理论上来说,从缓存中取回租户ID列表,到 将 $cmcApiGroupIds 存放到缓存供下次使用,将数据在缓存中永久保留 的间隔时间段(假设租户数量为 10000 个,则遍历 10000 次,时间间隔为 30000 微秒,即 0.03 秒)内,如果存在 多个容器 在运行的话,便会出现相互覆盖的情况。暂时不做处理,即时出现了相互覆盖的情况,其后果是可以接受的。租户:c10e87f39873512a16727e17f57456a5、015ce30b116ce86058fa6ab4fea4ac63 会相继立即重复同步一次。如图2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | Array ( [0] => Array ( [group_id] => c10e87f39873512a16727e17f57456a5 [cmc_console_user_last_synced_at] => 0 ) [1] => Array ( [group_id] => 015ce30b116ce86058fa6ab4fea4ac63 [cmc_console_user_last_synced_at] => 0 ) [2] => Array ( [group_id] => 4fd58ceba1fbc537b5402302702131eb [cmc_console_user_last_synced_at] => 1582784318 ) [3] => Array ( [group_id] => f53df1a8d46108afc8ae9eeb3f0e1f0e [cmc_console_user_last_synced_at] => 0 ) ) |
10、当一个租户下的用户同步时间长度超过 Redis锁定超时时间 的值 10秒后(sleep(60),实际长度超过了 60 秒),此时,此租户已经被自动解除锁定,进而导致部署为集群时,无法保证同一个租户下的用户同步,在某一时间段,仅在 1 个容器中执行。在本地环境中,模拟了 3 个容器,3 个容器开始同步时间:1582773882、1582773895、1582773917,分别间隔 13 秒、22秒,皆大于 10 秒。第 3 个容器开始同步时,第 1 个容器仍然在同步中,并未结束(释放锁定)。因此,租户:c10e87f39873512a16727e17f57456a5 被 3 个容器同时同步。如图3
1 2 3 4 5 6 | // 将 $cmcApiGroupIds 存放到缓存供下次使用,将数据在缓存中永久保留 sleep(60); $redisCache ->set( $redisCacheGroupIdsKey , $cmcApiGroupIds ); // 释放锁定 $redisLock ->unlock( $redisLockKeyName ); |
11、编辑 /common/logics/redis/Lock.php。public function lock($lockKeyName),添加一个参数,支持自定义Redis锁定超时时间。以基于场景灵活设置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | /** * Redis模型的锁定实现 * @param string $lockKeyName 锁定键名 * 格式如下: * * 'game_category' //锁定键名,如比赛分类 * * @param int $timeOut Redis锁定超时时间,单位为秒 * 格式如下:3 * * @return bool 成功返回真/失败返回假 * 格式如下: * * true //状态,获取锁定成功,可继续执行 * * 或者 * * false //状态,获取锁定失败,不可继续执行 * */ public function lock( $lockKeyName , $timeOut = 3) { // 设置锁定的过期时间,获取相关锁定参数 $time = time(); $lockKey = Yii:: $app ->params[ 'redisLock' ][ 'keyPrefix' ] . $lockKeyName ; $lockExpire = $time + $timeOut ; // 获取 Redis 连接,以执行相关命令 $redis = Yii:: $app ->redis; // 获取锁定 $executeCommandResult = $redis ->setnx( $lockKey , $lockExpire ); // 返回0,表示已经被其他客户端锁定 if ( $executeCommandResult == 0) { // 防止死锁,获取当前锁的过期时间 $lockCurrentExpire = $redis ->get( $lockKey ); // 判断锁是否过期,如果已经过期 if ( $time > $lockCurrentExpire ) { // 防止并发锁定,检查存储在 key 的旧值是否仍然是过期的时间戳,如果是,则获取锁定,否则返回假 $executeCommandResult = $redis ->getset( $lockKey , $lockExpire ); if ( $lockCurrentExpire != $executeCommandResult ) { return false; } } // 返回0,表示已经被其他客户端锁定,且不存在死锁,返回假 if ( $executeCommandResult == 0) { return false; } } return true; } |
12、Redis模型的锁定实现,Redis锁定超时时间,单位为秒(自定义 600)。一个租户下的用户同步,耗费的最长时间只要不超过 10 分钟,当部署为集群时,就可以保证同一个租户下的用户同步,在某一时间段,仅在 1 个容器中执行。
1 2 | /* Redis模型的锁定实现 */ $lock = $redisLock ->lock( $redisLockKeyName , 600); |
13、在开发环境,部署了 3 个容器。以便于测试集群部署时,并发锁定的情况。在 bash sleep 60 秒 的情况下,很难出现并发锁定的情况。不过,当部署为集群时,已经可以保证同一个租户下的用户同步,在某一时间段,仅在 1 个容器中执行。当出现租户下的用户同步及时性不够理想的情况,可以通过添加容器的方案提升同步的及时性。在 3 个容器中,总计同步了 30 + 30 + 33 = 93 次。其中 租户 f53df1a8d46108afc8ae9eeb3f0e1f0e、c10e87f39873512a16727e17f57456a5、4fd58ceba1fbc537b5402302702131eb、015ce30b116ce86058fa6ab4fea4ac63 分别同步了:23、24、22、24 次。3 个容器的情况下,在 15:43 至 16:16 的时间段内(32 分钟左右),一个租户的同步次数平均为:23 次。实际测试结果,一个租户的同步时间间隔为:32 * 60 / 24 = 80 秒。理论上的计算公式,一个租户的同步时间间隔为:租户数量 / 容器数量 * 60,结果单位为秒。同步性能符合设计预期。如图4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | [root@1d03b809a523 logs]# ls -ltr total 120 -rw-r--r-- 1 root root 32 Feb 28 15:43 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582875818.txt -rw-r--r-- 1 root root 32 Feb 28 15:44 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582875879.txt -rw-r--r-- 1 root root 32 Feb 28 15:45 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582875941.txt -rw-r--r-- 1 root root 32 Feb 28 15:49 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582876192.txt -rw-r--r-- 1 root root 32 Feb 28 15:50 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876254.txt -rw-r--r-- 1 root root 32 Feb 28 15:51 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876315.txt -rw-r--r-- 1 root root 32 Feb 28 15:52 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876377.txt -rw-r--r-- 1 root root 32 Feb 28 15:53 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582876438.txt -rw-r--r-- 1 root root 32 Feb 28 15:55 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876500.txt -rw-r--r-- 1 root root 32 Feb 28 15:56 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876561.txt -rw-r--r-- 1 root root 32 Feb 28 15:57 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876623.txt -rw-r--r-- 1 root root 32 Feb 28 15:58 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582876684.txt -rw-r--r-- 1 root root 32 Feb 28 15:59 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876746.txt -rw-r--r-- 1 root root 32 Feb 28 16:00 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876808.txt -rw-r--r-- 1 root root 32 Feb 28 16:01 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876869.txt -rw-r--r-- 1 root root 32 Feb 28 16:02 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582876931.txt -rw-r--r-- 1 root root 32 Feb 28 16:03 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876992.txt -rw-r--r-- 1 root root 32 Feb 28 16:04 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582877054.txt -rw-r--r-- 1 root root 32 Feb 28 16:05 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582877115.txt -rw-r--r-- 1 root root 32 Feb 28 16:06 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582877177.txt -rw-r--r-- 1 root root 32 Feb 28 16:07 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582877238.txt -rw-r--r-- 1 root root 32 Feb 28 16:08 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582877300.txt -rw-r--r-- 1 root root 32 Feb 28 16:09 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582877362.txt -rw-r--r-- 1 root root 32 Feb 28 16:10 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582877423.txt -rw-r--r-- 1 root root 32 Feb 28 16:11 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582877485.txt -rw-r--r-- 1 root root 32 Feb 28 16:12 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582877546.txt -rw-r--r-- 1 root root 32 Feb 28 16:13 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582877608.txt -rw-r--r-- 1 root root 32 Feb 28 16:14 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582877669.txt -rw-r--r-- 1 root root 32 Feb 28 16:15 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582877731.txt -rw-r--r-- 1 root root 32 Feb 28 16:16 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582877792.txt [root@7e1ea0bc777c logs]# ls -ltr total 120 -rw-r--r-- 1 root root 32 Feb 28 15:43 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582875803.txt -rw-r--r-- 1 root root 32 Feb 28 15:44 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582875864.txt -rw-r--r-- 1 root root 32 Feb 28 15:45 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582875926.txt -rw-r--r-- 1 root root 32 Feb 28 15:49 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876189.txt -rw-r--r-- 1 root root 32 Feb 28 15:50 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876251.txt -rw-r--r-- 1 root root 32 Feb 28 15:51 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876313.txt -rw-r--r-- 1 root root 32 Feb 28 15:52 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582876374.txt -rw-r--r-- 1 root root 32 Feb 28 15:53 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876436.txt -rw-r--r-- 1 root root 32 Feb 28 15:54 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876497.txt -rw-r--r-- 1 root root 32 Feb 28 15:55 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876559.txt -rw-r--r-- 1 root root 32 Feb 28 15:57 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582876621.txt -rw-r--r-- 1 root root 32 Feb 28 15:58 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876682.txt -rw-r--r-- 1 root root 32 Feb 28 15:59 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876744.txt -rw-r--r-- 1 root root 32 Feb 28 16:00 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876805.txt -rw-r--r-- 1 root root 32 Feb 28 16:01 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582876867.txt -rw-r--r-- 1 root root 32 Feb 28 16:02 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876929.txt -rw-r--r-- 1 root root 32 Feb 28 16:03 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876990.txt -rw-r--r-- 1 root root 32 Feb 28 16:04 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582877052.txt -rw-r--r-- 1 root root 32 Feb 28 16:05 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582877113.txt -rw-r--r-- 1 root root 32 Feb 28 16:06 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582877175.txt -rw-r--r-- 1 root root 32 Feb 28 16:07 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582877237.txt -rw-r--r-- 1 root root 32 Feb 28 16:08 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582877298.txt -rw-r--r-- 1 root root 32 Feb 28 16:09 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582877360.txt -rw-r--r-- 1 root root 32 Feb 28 16:10 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582877422.txt -rw-r--r-- 1 root root 32 Feb 28 16:11 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582877483.txt -rw-r--r-- 1 root root 32 Feb 28 16:12 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582877545.txt -rw-r--r-- 1 root root 32 Feb 28 16:13 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582877606.txt -rw-r--r-- 1 root root 32 Feb 28 16:14 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582877668.txt -rw-r--r-- 1 root root 32 Feb 28 16:15 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582877730.txt -rw-r--r-- 1 root root 32 Feb 28 16:16 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582877791.txt [root@16fa59fcd4e0 logs]# ls -ltr total 144 -rw-r--r-- 1 root root 8845 Feb 28 15:43 app.log -rw-r--r-- 1 root root 32 Feb 28 15:44 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582875846.txt -rw-r--r-- 1 root root 32 Feb 28 15:45 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582875908.txt -rw-r--r-- 1 root root 32 Feb 28 15:46 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582875969.txt -rw-r--r-- 1 root root 32 Feb 28 15:47 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876031.txt -rw-r--r-- 1 root root 32 Feb 28 15:48 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876093.txt -rw-r--r-- 1 root root 32 Feb 28 15:49 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876155.txt -rw-r--r-- 1 root root 32 Feb 28 15:50 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876218.txt -rw-r--r-- 1 root root 32 Feb 28 15:51 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582876279.txt -rw-r--r-- 1 root root 32 Feb 28 15:52 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876341.txt -rw-r--r-- 1 root root 32 Feb 28 15:53 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876403.txt -rw-r--r-- 1 root root 32 Feb 28 15:54 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876465.txt -rw-r--r-- 1 root root 32 Feb 28 15:55 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582876526.txt -rw-r--r-- 1 root root 32 Feb 28 15:56 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876588.txt -rw-r--r-- 1 root root 32 Feb 28 15:57 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876650.txt -rw-r--r-- 1 root root 32 Feb 28 15:58 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876712.txt -rw-r--r-- 1 root root 32 Feb 28 15:59 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582876773.txt -rw-r--r-- 1 root root 32 Feb 28 16:00 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582876835.txt -rw-r--r-- 1 root root 32 Feb 28 16:01 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582876897.txt -rw-r--r-- 1 root root 32 Feb 28 16:02 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582876959.txt -rw-r--r-- 1 root root 32 Feb 28 16:03 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582877020.txt -rw-r--r-- 1 root root 32 Feb 28 16:04 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582877082.txt -rw-r--r-- 1 root root 32 Feb 28 16:05 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582877144.txt -rw-r--r-- 1 root root 32 Feb 28 16:06 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582877206.txt -rw-r--r-- 1 root root 32 Feb 28 16:07 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582877268.txt -rw-r--r-- 1 root root 32 Feb 28 16:08 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582877330.txt -rw-r--r-- 1 root root 32 Feb 28 16:09 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582877392.txt -rw-r--r-- 1 root root 32 Feb 28 16:10 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582877454.txt -rw-r--r-- 1 root root 32 Feb 28 16:11 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582877515.txt -rw-r--r-- 1 root root 32 Feb 28 16:12 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582877577.txt -rw-r--r-- 1 root root 32 Feb 28 16:13 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1582877639.txt -rw-r--r-- 1 root root 32 Feb 28 16:15 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1582877701.txt -rw-r--r-- 1 root root 32 Feb 28 16:16 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1582877763.txt -rw-r--r-- 1 root root 32 Feb 28 16:17 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1582877825.txt |
14、在 bash sleep 60 秒 的情况下,很难出现并发锁定的情况。或者增加更多的容器,或者提升执行命令行的频率。设置 bash sleep 10 秒。已经出现并发锁定(防止同一个租户下的用户同步同时在多个容器中执行)的情况。当部署为集群时,已经可以保证同一个租户下的用户同步,在某一时间段,仅在 1 个容器中执行。理论上的计算公式,一个租户的同步时间间隔为:4 / 3 * 10 = 13,结果单位为秒。符合设计预期。总结:部署的容器数量不要超过租户的数量,以防止并发锁定的情况过于频繁。如图5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | [root@0f5a081a481a logs]# ls -ltr total 320 -rw-r--r-- 1 root root 8845 Mar 2 09:50 app.log -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113813.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113825.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113836.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113848.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113860.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113871.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113883.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113894.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113906.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113917.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113929.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113940.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113952.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113964.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113975.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113987.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113998.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114010.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114021.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114033.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114044.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114056.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114067.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114079.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114091.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114102.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114114.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114125.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114137.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114148.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114160.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114171.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-is-lock-exist-c10e87f39873512a16727e17f57456a5-1583114171.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114171.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114183.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-is-lock-exist-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114183.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114183.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114194.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114206.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114218.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114228.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114240.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114252.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114263.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114275.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114286.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114298.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114309.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114321.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114332.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114344.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114355.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-is-lock-exist-4fd58ceba1fbc537b5402302702131eb-1583114355.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114355.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114367.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-is-lock-exist-c10e87f39873512a16727e17f57456a5-1583114367.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114367.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114379.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114390.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114402.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114413.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114425.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114436.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114448.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114460.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114471.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114483.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114494.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114506.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114517.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114529.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114540.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114552.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114563.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114575.txt -rw-r--r-- 1 root root 32 Mar 2 10:03 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114587.txt -rw-r--r-- 1 root root 32 Mar 2 10:03 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114598.txt [root@88f433b87315 logs]# ls -ltr total 344 -rw-r--r-- 1 root root 9092 Mar 2 09:49 app.log -rw-r--r-- 1 root root 32 Mar 2 09:49 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113764.txt -rw-r--r-- 1 root root 32 Mar 2 09:49 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113776.txt -rw-r--r-- 1 root root 32 Mar 2 09:49 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113788.txt -rw-r--r-- 1 root root 32 Mar 2 09:49 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113799.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113811.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113823.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113834.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113846.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113857.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113869.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113881.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113892.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113904.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113915.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113927.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113939.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113950.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113962.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113973.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113985.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113997.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114008.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114020.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114032.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114043.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114055.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114066.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114078.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114090.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114101.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114113.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114125.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114136.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114148.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114159.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114171.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114183.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114195.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-is-lock-exist-4fd58ceba1fbc537b5402302702131eb-1583114195.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114195.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114206.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-is-lock-exist-015ce30b116ce86058fa6ab4fea4ac63-1583114206.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114206.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114218.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114229.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114241.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114253.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114264.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114276.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114288.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114299.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114311.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114322.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114334.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114346.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114357.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114369.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114380.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114392.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114404.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114415.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114427.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114439.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114450.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114462.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114474.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-is-lock-exist-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114474.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114474.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114485.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-is-lock-exist-015ce30b116ce86058fa6ab4fea4ac63-1583114485.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114485.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114497.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-is-lock-exist-4fd58ceba1fbc537b5402302702131eb-1583114497.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114497.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114509.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114520.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114532.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114543.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114555.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114567.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114578.txt -rw-r--r-- 1 root root 32 Mar 2 10:03 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114590.txt -rw-r--r-- 1 root root 32 Mar 2 10:03 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114601.txt [root@c2e084f1424c logs]# ls -ltr total 308 -rw-r--r-- 1 root root 8845 Mar 2 09:49 app.log -rw-r--r-- 1 root root 32 Mar 2 09:49 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113778.txt -rw-r--r-- 1 root root 32 Mar 2 09:49 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113790.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113802.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113814.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113825.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113837.txt -rw-r--r-- 1 root root 32 Mar 2 09:50 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113849.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113861.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113873.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113884.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113896.txt -rw-r--r-- 1 root root 32 Mar 2 09:51 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113908.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113920.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113932.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113943.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583113955.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583113967.txt -rw-r--r-- 1 root root 32 Mar 2 09:52 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583113979.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583113990.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114002.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114014.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114026.txt -rw-r--r-- 1 root root 32 Mar 2 09:53 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114037.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114049.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114061.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114073.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114085.txt -rw-r--r-- 1 root root 32 Mar 2 09:54 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114096.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114108.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114120.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114132.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114143.txt -rw-r--r-- 1 root root 32 Mar 2 09:55 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114155.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114167.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114179.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114191.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114202.txt -rw-r--r-- 1 root root 32 Mar 2 09:56 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114214.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114226.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114238.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114249.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114261.txt -rw-r--r-- 1 root root 32 Mar 2 09:57 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114273.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114285.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114296.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114308.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114320.txt -rw-r--r-- 1 root root 32 Mar 2 09:58 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114332.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114343.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114355.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114367.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114379.txt -rw-r--r-- 1 root root 32 Mar 2 09:59 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114391.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114403.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114414.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114426.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114438.txt -rw-r--r-- 1 root root 32 Mar 2 10:00 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114450.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114461.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114473.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114485.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114497.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114509.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-is-lock-exist-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114509.txt -rw-r--r-- 1 root root 32 Mar 2 10:01 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114509.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114520.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114532.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114544.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114556.txt -rw-r--r-- 1 root root 32 Mar 2 10:02 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114568.txt -rw-r--r-- 1 root root 32 Mar 2 10:03 cmc-console-user-sync-c10e87f39873512a16727e17f57456a5-1583114580.txt -rw-r--r-- 1 root root 32 Mar 2 10:03 cmc-console-user-sync-f53df1a8d46108afc8ae9eeb3f0e1f0e-1583114592.txt -rw-r--r-- 1 root root 32 Mar 2 10:03 cmc-console-user-sync-4fd58ceba1fbc537b5402302702131eb-1583114603.txt -rw-r--r-- 1 root root 32 Mar 2 10:03 cmc-console-user-sync-015ce30b116ce86058fa6ab4fea4ac63-1583114615.txt |
15、总结:
(1) 理论上的计算公式,一个租户的同步时间间隔为:租户数量 / 容器数量 * 60,结果单位为秒。
(2) 部署的容器数量不要超过租户的数量,以防止并发锁定的情况过于频繁,且必要性不大(当容器数量等于租户数量时,同步时间间隔为:60 秒)。
近期评论