quá trình chỉ số mass_action


8

Chúng tôi đang gặp vấn đề là quá trình lập chỉ mục mass_action dường như không bao giờ thực thi. Điều này có tác dụng phụ là dữ liệu công việc của công việc này tăng lên đáng kể theo thời gian.

Trong trường hợp của chúng tôi trong vài ngày, dữ liệu công việc tăng lên vài MB.

mysql> select type, entity, count(*), avg(length(new_data)), max(length(new_data)) from index_event group by type, entity;
+-----------------------+--------------------------------+----------+-----------------------+-----------------------+
| type                  | entity                         | count(*) | avg(length(new_data)) | max(length(new_data)) |
+-----------------------+--------------------------------+----------+-----------------------+-----------------------+
| catalog_reindex_price | catalog_product                |     1368 |              442.7982 |                   443 |
| mass_action           | catalog_product                |        1 |          6176981.0000 |               6176981 |
| save                  | awaffiliate_withdrawal_request |        6 |              444.3333 |                   445 |
| save                  | cataloginventory_stock_item    |     4439 |              607.9685 |                   608 |
| save                  | catalog_category               |       71 |             1040.3662 |                  3395 |
| save                  | catalog_eav_attribute          |        3 |              424.6667 |                   476 |
| save                  | catalog_product                |     1368 |             1269.0899 |                  1922 |
+-----------------------+--------------------------------+----------+-----------------------+-----------------------+

Vì dữ liệu này chưa được xác thực và sau đó được tuần tự hóa cho một bản cập nhật cũng như được chuyển từ và đến máy chủ DB, một bản cập nhật cho mục nhập mass_action hiện mất khoảng 3 giây để hoàn thành. Điều này ảnh hưởng đến mã kích hoạt cập nhật chỉ mục này.

Theo tôi hiểu, việc kích hoạt một bản cập nhật của các chỉ mục sau sẽ cập nhật hành động hàng loạt

mysql> select ip.indexer_code, ipe.process_id, ipe.event_id, ipe.status, ie.type, ie.created_at from index_process_event as ipe left join index_event as ie on ipe.event_id = ie.event_id  left join index_process as ip on ip.process_id = ipe.process_id where ie.type  = 'mass_action';
+---------------------------+------------+----------+--------+-------------+---------------------+
| indexer_code              | process_id | event_id | status | type        | created_at          |
+---------------------------+------------+----------+--------+-------------+---------------------+
| catalog_product_attribute |          1 |     9074 | new    | mass_action | 2016-11-03 23:18:06 |
| catalog_product_price     |          2 |     9074 | new    | mass_action | 2016-11-03 23:18:06 |
| catalogsearch_fulltext    |          7 |     9074 | new    | mass_action | 2016-11-03 23:18:06 |
| cataloginventory_stock    |          8 |     9074 | new    | mass_action | 2016-11-03 23:18:06 |
| tag_summary               |          9 |     9074 | new    | mass_action | 2016-11-03 23:18:06 |
| catalog_product_flat      |         19 |     9074 | new    | mass_action | 2016-11-03 23:18:06 |
| catalog_category_product  |         21 |     9074 | new    | mass_action | 2016-11-03 23:18:06 |
+---------------------------+------------+----------+--------+-------------+---------------------+

Chúng tôi có tất cả các chỉ mục được đặt thành thủ công và chạy cronjobs vào các thời điểm khác nhau trong ngày để cập nhật các chỉ mục.

mysql> select * from index_process;
+------------+-------------------------------+-----------------+---------------------+---------------------+--------+
| process_id | indexer_code                  | status          | started_at          | ended_at            | mode   |
+------------+-------------------------------+-----------------+---------------------+---------------------+--------+
|          1 | catalog_product_attribute     | require_reindex | 2016-11-15 00:40:10 | 2016-11-15 00:10:24 | manual |
|          2 | catalog_product_price         | require_reindex | 2016-11-15 00:45:09 | 2016-11-15 00:15:44 | manual |
|          7 | catalogsearch_fulltext        | require_reindex | 2016-11-14 23:51:23 | 2016-11-14 12:12:30 | manual |
|          8 | cataloginventory_stock        | require_reindex | 2016-11-15 00:47:01 | 2016-11-15 00:45:09 | manual |
|          9 | tag_summary                   | require_reindex | 2016-11-14 23:54:01 | 2016-11-14 23:54:01 | manual |
|         12 | awaffiliate_affiliate_balance | pending         | 2016-11-14 23:54:01 | 2016-11-14 23:54:03 | manual |
|         18 | catalog_url                   | require_reindex | 2016-11-14 23:54:03 | 2016-11-14 21:02:53 | manual |
|         19 | catalog_product_flat          | require_reindex | 2016-11-15 00:49:02 | 2016-11-15 00:10:10 | manual |
|         20 | catalog_category_flat         | pending         | 2016-11-15 00:51:01 | 2016-11-15 00:51:04 | manual |
|         21 | catalog_category_product      | require_reindex | 2016-11-15 00:53:01 | 2016-11-15 00:06:04 | manual |
|         22 | ampgrid_qty_sold              | require_reindex | 2016-11-15 00:06:04 | 2016-11-14 12:21:18 | manual |
+------------+-------------------------------+-----------------+---------------------+---------------------+--------+

Lập chỉ mục lại lịch trình cron:

0-59/15 *  *   *   *  cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex catalog_product_price > /dev/null 2>&1
2-59/15 *  *   *   *  cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex cataloginventory_stock > /dev/null 2>&1
4-59/15 *  *   *   *  cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex catalog_product_flat > /dev/null 2>&1
6-59/15 *  *   *   *  cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex catalog_category_flat > /dev/null 2>&1
8-59/15 *  *   *   *  cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex catalog_category_product > /dev/null 2>&1
10-59/15 *  *   *   *  cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex catalog_product_attribute > /dev/null 2>&1

10 4  *   *   *    cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex catalogsearch_fulltext > /dev/null 2>&1
20 4  *   *   *    cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex ampgrid_qty_sold > /dev/null 2>&1
30 4  *   *   *    cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex awaffiliate_affiliate_balance > /dev/null 2>&1
40 4  *   *   *    cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex tag_summary > /dev/null 2>&1

50  */6   *   *  *  cd html && /usr/bin/php  /www/sites/files/html/shell/indexer.php --reindex catalog_url > /dev/null 2>&1

Định thời chỉ mục:

$ time php shell/indexer.php --reindexall
Product Attributes index was rebuilt successfully in 00:00:21
Product Prices index was rebuilt successfully in 00:00:32
Search Index index was rebuilt successfully in 00:02:31
Stock Status index was rebuilt successfully in 00:00:00
Tag Aggregation Data index was rebuilt successfully in 00:00:00
Affiliates Balance index was rebuilt successfully in 00:00:02
Catalog URL Rewrites index was rebuilt successfully in 00:10:08
Product Flat Data index was rebuilt successfully in 00:01:54
Category Flat Data index was rebuilt successfully in 00:00:04
Category Products index was rebuilt successfully in 00:00:18
Qty Sold index was rebuilt successfully in 00:00:15

real    16m9.562s
user    8m23.551s
sys     0m19.705s

Giả định của tôi là việc chạy một chỉ mục lại đầy đủ sẽ xử lý quá trình mass_action và xóa nó khỏi bảng. Không may, không phải trường hợp này. Có ai biết những điều kiện đó là rõ ràng quá trình đó?


Tôi cũng đang trải nghiệm điều này. Hàng 'mass_action' trong bảng tiếp tục tăng và tăng, mặc dù các chỉ mục đang chạy thành công. Tôi cắt ngắn index_eventbảng và index_processbảng và sau đó chạy một kịch bản để cập nhật số liệu mục chứng khoán. Hàng xuất hiện lại, nhỏ hơn trước tất nhiên, và tiếp tục phát triển trở lại sau một reindex.
Aaron Pollock

1
Tôi chưa bao giờ tìm thấy một giải pháp thích hợp cho việc đó. Điều cuối cùng tôi làm là thêm một công việc định kỳ xóa thường xuyên mass_action. Nó sẽ không có tác dụng phụ miễn là bạn thường xuyên lập chỉ mục tất cả các chỉ mục.
Michael Palestel

Câu trả lời:


1

Bạn có nhận thấy thời gian lập chỉ mục trên một số chỉ mục của bạn? Nó thay đổi từ giây đến chủ yếu là giờ. Tùy thuộc vào cách bạn định cấu hình cronjobs, cửa hàng của bạn có thể bận rộn lập chỉ mục cả ngày, liên tục. Đây có thể là vấn đề của bạn vì nó không thể hoàn thành các chỉ mục hoặc ít nhất là theo kịp nó. Có một chỉ số bị khóa mọi lúc có thể gây ra một số rắc rối và được biết đến với các loại vấn đề này.

Tôi phải đưa ra một số giả định ở đây, sửa tôi nếu cần. Chỉ định thêm một số thông tin về thiết lập của bạn nếu bạn nghĩ rằng điều này có thể liên quan đến vấn đề của bạn. Tôi đã làm việc trên một dự án sẽ giúp các nhà phát triển dọn sạch core_url_rewritebảng của họ bởi vì nó phát triển đáng kể theo thời gian trong một số kịch bản nhất định. Tôi nghĩ bạn cũng gặp vấn đề này vì nó đã chạy được gần 3 giờ và vấn đề bạn mô tả có thể liên quan đến nó. Tôi thấy những điều similair tại các trường hợp thử nghiệm.

Là vấn đề của bạn cụ thể chỉ mass_actionđối tượng sự kiện? hoặc nó cũng xảy ra với các loại sự kiện khác? (lưu, xóa, reindex, v.v. (Mage_Index_Model_Event)). Nếu không, tôi sẽ nói nó liên quan đến các chỉ mục không được lập chỉ mục đúng. Vì thực tế có thể có khóa trên các bảng, được yêu cầu xử lý, tôi không chắc về điều này. Bạn có thể dễ dàng kiểm tra các khóa hoạt động bằng cách sử dụng một cái gì đó như:

 $indexes = Mage::getSingleton('index/indexer')->getProcessesCollection()->load();
    foreach($indexes as $index){
        if($index->isLocked(){
            echo "Index" . $index->getIndexerCode() . " with state " . $index->getStatus() . " is locked since " . $index->getStartedAt() . "!";
        }
    }

Hoặc sử dụng ý chính của tôi, đừng quên loại bỏ nó khi bạn hoàn thành. Nó không dành cho sử dụng sản xuất.

Tổng quan về trạng thái khóa và chỉ mục một trang

Vì vậy, tôi nghĩ rằng khi bạn sửa chữa thời gian chỉ mục của mình, vấn đề của bạn có thể biến mất và cửa hàng có thể hoạt động trơn tru hơn. Trong trường hợp của core_url_rewritebảng, chi phí được tạo bởi chính Magento trong nỗ lực để có URL duy nhất nhưng cuối cùng lại sao chép chúng. Điều này có các biến chứng về phía SEO và hiệu suất. Giải pháp cho vấn đề này là làm cho URL trở nên độc đáo và xóa tất cả chi phí, mà không làm hỏng điểm SEO của bạn. Khi chúng sạch, bạn sẽ nhận thấy sự khác biệt lớn về thời gian chỉ số. Một số trường hợp của tôi bắt đầu tạo ra sơ đồ trang web một lần nữa sau nhiều tháng.

Làm sạch nó có thể khó khăn nhưng gói magerun tôi ghép lại từ các tập lệnh tôi đã sử dụng có thể giúp bạn ít nhất là bảng viết lại. Hiện tại nó là một bằng chứng về khái niệm, vì vậy hãy đảm bảo có bản sao lưu. Khi nó được chứng minh là có ích, tôi sẽ xây dựng lại.

Gói Magerun với các lệnh để làm sạch core_url_rewrite

Đối với các bảng khác, tôi phải giả định rằng có một cái gì đó tương tự gây ra vì tôi không có thông tin nào khác mà tôi có thể liên quan đến một vấn đề. Có lẽ bạn có thể thêm một số thông tin về những thứ như kích thước của danh mục, thông số kỹ thuật của máy chủ, cấu hình phạm vi cửa hàng, tất cả chúng đều liên quan đến hiệu suất chỉ mục của bạn. Bạn cũng có thể muốn kiểm tra bảng của mình để đảm bảo nó không bị thiếu các ràng buộc, v.v.

Sửa chữa Magento DB

Có một bài viết ngăn xếp chứa một tập hợp thông tin tuyệt vời về các chỉ mục của Magento, chỉ trong trường hợp bạn chưa thấy nó.

Bài đăng ngăn xếp trên chỉ mục

Tôi hy vọng điều này có giá trị với bạn, chúc may mắn


1
Những hiểu biết rất thú vị. Tôi thiết lập các công việc định kỳ theo cách mà tất cả các chỉ mục hoàn thành theo cách không có sự chồng chéo (lịch trình đã thêm ở trên). Quá trình lập chỉ mục dài nhất là url viết lại một lần nhưng kết thúc sau khoảng 10 phút. Tôi đã kiểm tra các khóa chỉ mục và khi không có công việc chỉ mục nào đang chạy thì không có chỉ mục nào bị khóa. Tôi không chắc chắn thời gian lập chỉ mục trong bảng index_ process hoạt động như thế nào nhưng đôi khi started_at và end_at dường như không phản ánh cùng một công việc định kỳ. Có vẻ như started_at có thể được cập nhật khi cờ Yêu cầu được đặt.
Michael Margarel

0

Tôi không biết nếu bạn vẫn gặp vấn đề này nhưng nó có liên quan đến việc bạn chạy ở chế độ MANUAL cho tất cả những người lập chỉ mục của bạn.

Trong Mage_Index_Model_Resource_Event, bạn có một _b BeforeSave thực hiện như sau:

/**
 * Check if semilar event exist before start saving data
 *
 * @param Mage_Core_Model_Abstract $object
 * @return Mage_Index_Model_Resource_Event
 */
protected function _beforeSave(Mage_Core_Model_Abstract $object)
{
    /**
     * Check if event already exist and merge previous data
     */
    if (!$object->getId()) {
        $select = $this->_getReadAdapter()->select()
            ->from($this->getMainTable())
            ->where('type=?', $object->getType())
            ->where('entity=?', $object->getEntity());
        if ($object->hasEntityPk()) {
            $select->where('entity_pk=?', $object->getEntityPk());
        }
        $data = $this->_getWriteAdapter()->fetchRow($select);
        if ($data) {
            $object->mergePreviousData($data);
        }
    }
    $object->cleanNewData();
    return parent::_beforeSave($object);
}

Ở đây, $ object-> cleanNewData () sẽ gọi trong Mage_Index_Model_Event:

/**
 * Clean new data, unset data for done processes
 *
 * @return Mage_Index_Model_Event
 */
public function cleanNewData()
{
    $processIds = $this->getProcessIds();
    if (!is_array($processIds) || empty($processIds)) {
        return $this;
    }

    $newData = $this->getNewData(false);
    foreach ($processIds as $processId => $processStatus) {
        if ($processStatus == Mage_Index_Model_Process::EVENT_STATUS_DONE) {
            $process = Mage::getSingleton('index/indexer')->getProcessById($processId);
            if ($process) {
                $namespace = get_class($process->getIndexer());
                if (array_key_exists($namespace, $newData)) {
                    unset($newData[$namespace]);
                }
            }
        }
    }
    $this->setNewData(serialize($newData));

    return $this;
}

Lưu ý rằng $ newData sẽ không bao giờ được đặt lại nếu trạng thái Index_Process không bằng Mage_Index_Model_Process :: EVENT_STATUS_DONE? Chà, trong chế độ MANUAL cho Người lập chỉ mục, điều này sẽ không bao giờ xảy ra Đăng ký sự kiện Index.

Điều này là do Mage_Index_Model_Process sẽ không bao giờ xử lý Sự kiện ở chế độ MANUAL (không nên) và do đó sẽ không bao giờ đặt trạng thái thành Mage_Index_Model_Process :: EVENT_STATUS_DONE.

/**
 * Process event with assigned indexer object
 *
 * @param Mage_Index_Model_Event $event
 * @return Mage_Index_Model_Process
 */
public function processEvent(Mage_Index_Model_Event $event)
{
    if (!$this->matchEvent($event)) {
        return $this;
    }
    if ($this->getMode() == self::MODE_MANUAL) {
        $this->changeStatus(self::STATUS_REQUIRE_REINDEX);
        return $this;
    }

    $this->_getResource()->updateProcessStartDate($this);
    $this->_setEventNamespace($event);
    $isError = false;

    try {
        $this->getIndexer()->processEvent($event);
    } catch (Exception $e) {
        $isError = true;
    }
    $event->resetData();
    $this->_resetEventNamespace($event);
    $this->_getResource()->updateProcessEndDate($this);
    $event->addProcessId($this->getId(), $isError ? self::EVENT_STATUS_ERROR : self::EVENT_STATUS_DONE);

    return $this;
}

Nếu bạn chỉ muốn giảm kích thước thì bạn có thể đặt lại sự kiện hoặc chỉ đặt Bộ chỉ mục sử dụng chế độ REAL_TIME và reindex tất cả thông qua shell / reindexer.php. Lần tới khi bạn thực hiện một hành động tạo sự kiện lập chỉ mục, dữ liệu cũ sẽ không được đặt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.