인스턴스 성능 개선 (메가토픽, 데이터베이스 크기 및 극단적 부하)

Discourse 커뮤니티 여러분, 안녕하세요!

최근 제 사이트가 기하급수적으로 성장하면서 Discourse 설치 환경의 성능을 향상시키고 정리하는 데 집중하고 있습니다.

두 가지 문제를 발견하여 여기에서 검색해 보았지만, 몇 가지 세부 사항에 대해서는 명확한 답변을 찾지 못했습니다. 따라서 이 글이 누군가에게 큰 부담이 되지 않기를 바랍니다.

첫 번째 문제는 DB(데이터베이스) 크기입니다. 크기가 꽤 큰 편입니다. Digital Ocean에서 4GB 메모리/80GB 디스크 인스턴스를 사용하고 있으며, 이미 DB가 디스크 용량을 압박하고 있습니다. 결국 이를 이동해야 할 것 같습니다(그렇다면 어떻게 해야 할까요?). 하지만 제가 무언가를 잘못하고 있을 수도 있습니다. Sam의 도움에 따라 아래 내용을 내보내어 확인하기 쉽게 했습니다:


table_name                  | row_estimate | table_size | index_size | total_size
--------------------------------------------------------------------------
post_timings                | 155307152    | 8004 MB    | 16 GB      | 24 GB
posts                       | 2257277      | 2432 MB    | 4810 MB    | 7242 MB
post_search_data            | 2279749      | 1992 MB    | 769 MB     | 2761 MB
user_actions                | 6549714      | 570 MB     | 2189 MB    | 2759 MB
topic_views                 | 8843734      | 444 MB     | 1494 MB    | 1937 MB
user_visits                 | 569317       | 33 MB      | 1892 MB    | 1925 MB
notifications               | 1482664      | 465 MB     | 914 MB     | 1379 MB
topic_users                 | 4821392      | 500 MB     | 449 MB     | 949 MB
top_topics                  | 47437        | 28 MB      | 773 MB     | 802 MB
user_auth_token_logs        | 1690555      | 515 MB     | 133 MB     | 648 MB
post_actions                | 1610428      | 145 MB     | 367 MB     | 512 MB
post_revisions              | 113187       | 396 MB     | 9312 kB    | 406 MB
topic_links                 | 605525       | 135 MB     | 254 MB     | 389 MB
topics                      | 56970        | 104 MB     | 227 MB     | 331 MB
web_hook_events             | 107760       | 295 MB     | 10 MB      | 306 MB
post_stats                  | 1955191      | 151 MB     | 97 MB      | 248 MB
directory_items             | 13026        | 1312 kB    | 157 MB     | 158 MB
incoming_links              | 812553       | 73 MB      | 82 MB      | 155 MB
post_replies                | 1111686      | 69 MB      | 71 MB      | 139 MB
topic_link_clicks           | 806821       | 54 MB      | 43 MB      | 97 MB
draft_sequences             | 654989       | 36 MB      | 48 MB      | 84 MB
topic_search_data           | 54056        | 40 MB      | 24 MB      | 65 MB
stylesheet_cache            | 901          | 57 MB      | 200 kB     | 57 MB
user_profile_views          | 204427       | 15 MB      | 30 MB      | 46 MB
quoted_posts                | 223337       | 18 MB      | 23 MB      | 41 MB
poll_votes                  | 142349       | 13 MB      | 20 MB      | 32 MB
users                       | 2211         | 2360 kB    | 29 MB      | 32 MB
given_daily_likes           | 252806       | 12 MB      | 16 MB      | 28 MB
scheduler_stats             | 115081       | 17 MB      | 4736 kB    | 21 MB
user_histories              | 30331        | 8848 kB    | 10040 kB   | 18 MB
reviewables                 | 16263        | 10032 kB   | 8344 kB    | 18 MB
optimized_images            | 34463        | 8088 kB    | 10 MB      | 18 MB
post_uploads                | 73123        | 4104 kB    | 13 MB      | 17 MB
uploads                     | 18897        | 5088 kB    | 9080 kB    | 14 MB
email_logs                  | 23224        | 4024 kB    | 9960 kB    | 14 MB
post_custom_fields          | 11043        | 3192 kB    | 9328 kB    | 12 MB
search_logs                 | 68429        | 7480 kB    | 4776 kB    | 12 MB
user_badges                 | 37176        | 2920 kB    | 5008 kB    | 7928 kB
unsubscribe_keys            | 14820        | 3352 kB    | 4480 kB    | 7832 kB
user_auth_tokens            | 5328         | 2536 kB    | 3608 kB    | 6144 kB
reviewable_scores           | 14681        | 3144 kB    | 2768 kB    | 5912 kB
reviewable_histories        | 31482        | 2976 kB    | 2616 kB    | 5592 kB
poll_options                | 20886        | 2560 kB    | 2552 kB    | 5112 kB
skipped_email_logs          | 11164        | 2528 kB    | 2328 kB    | 4856 kB
topic_allowed_users         | 21933        | 1424 kB    | 1872 kB    | 3296 kB
user_uploads                | 19038        | 1040 kB    | 1688 kB    | 2728 kB
user_stats                  | 2211         | 1888 kB    | 160 kB     | 2048 kB
drafts                      | 1324         | 1424 kB    | 368 kB     | 1792 kB
user_custom_fields          | 7467         | 688 kB     | 1064 kB    | 1752 kB
application_requests        | 11244        | 792 kB     | 528 kB     | 1320 kB
topic_tags                  | 10257        | 696 kB     | 528 kB     | 1224 kB
user_associated_accounts    | 670          | 1032 kB    | 184 kB     | 1216 kB
user_profiles               | 2211         | 424 kB     | 720 kB     | 1144 kB
email_tokens                | 3439         | 480 kB     | 528 kB     | 1008 kB
polls                       | 4030         | 520 kB     | 408 kB     | 928 kB
user_search_data            | 2215         | 376 kB     | 520 kB     | 896 kB
topic_custom_fields         | 2738         | 280 kB     | 568 kB     | 848 kB
group_users                 | 4364         | 344 kB     | 448 kB     | 792 kB
plugin_store_rows           | 2090         | 488 kB     | 296 kB     | 784 kB
incoming_referers           | 3779         | 352 kB     | 424 kB     | 776 kB
user_avatars                | 2210         | 208 kB     | 560 kB     | 768 kB
web_crawler_requests        | 1389         | 264 kB     | 440 kB     | 704 kB
group_histories             | 2210         | 272 kB     | 416 kB     | 688 kB
user_emails                 | 2218         | 224 kB     | 376 kB     | 600 kB
user_archived_messages      | 3019         | 240 kB     | 232 kB     | 472 kB
user_options                | 2218         | 384 kB     | 72 kB      | 456 kB
topic_allowed_groups        | 2098         | 128 kB     | 216 kB     | 344 kB
schema_migration_details    | 994          | 192 kB     | 88 kB      | 280 kB
group_mentions              | 933          | 104 kB     | 152 kB     | 256 kB
categories                  | 23           | 96 kB      | 112 kB     | 208 kB
google_user_infos           | 314          | 136 kB     | 72 kB      | 208 kB
theme_fields                | 24           | 168 kB     | 32 kB      | 200 kB
category_users              | 569          | 64 kB      | 136 kB     | 200 kB
javascript_caches           | 8            | 112 kB     | 64 kB      | 176 kB
incoming_domains            | 701          | 80 kB      | 96 kB      | 176 kB
groups                      | 51           | 120 kB     | 48 kB      | 168 kB
category_tag_stats          | 173          | 48 kB      | 104 kB     | 152 kB
tag_search_data             | 109          | 64 kB      | 72 kB      | 136 kB
schema_migrations           | 994          | 88 kB      | 48 kB      | 136 kB
topic_embeds                | 218          | 80 kB      | 56 kB      | 136 kB
badges                      | 51           | 80 kB      | 48 kB      | 128 kB
translation_overrides       | 170          | 72 kB      | 48 kB      | 120 kB
invites                     | 21           | 56 kB      | 64 kB      | 120 kB
user_api_keys               | 4            | 48 kB      | 64 kB      | 112 kB
category_search_data        | 20           | 48 kB      | 64 kB      | 112 kB
tags                        | 109          | 56 kB      | 48 kB      | 104 kB
screened_ip_addresses       | 9            | 48 kB      | 48 kB      | 96 kB
user_second_factors         | 26           | 48 kB      | 48 kB      | 96 kB
oauth2_user_infos           | 4            | 48 kB      | 48 kB      | 96 kB
site_settings               | 165          | 64 kB      | 32 kB      | 96 kB
api_keys                    | 1            | 48 kB      | 48 kB      | 96 kB
category_featured_topics    | 123          | 48 kB      | 48 kB      | 96 kB
screened_emails             | 4            | 48 kB      | 48 kB      | 96 kB
screened_urls               | 1            | 48 kB      | 48 kB      | 96 kB
topic_groups                | 245          | 56 kB      | 32 kB      | 88 kB
muted_users                 | 103          | 40 kB      | 48 kB      | 88 kB
tag_group_permissions       | 11           | 40 kB      | 48 kB      | 88 kB
tag_users                   | 8            | 40 kB      | 48 kB      | 88 kB
child_themes                | 6            | 40 kB      | 48 kB      | 88 kB
category_tags               | 9            | 40 kB      | 48 kB      | 88 kB
topic_timers                | 15           | 40 kB      | 48 kB      | 88 kB
ignored_users               | 10           | 40 kB      | 48 kB      | 88 kB
group_requests              | 0            | 24 kB      | 64 kB      | 88 kB
user_warnings               | 7            | 40 kB      | 48 kB      | 88 kB
email_change_requests       | 64           | 56 kB      | 32 kB      | 88 kB
web_hooks                   | 1            | 72 kB      | 16 kB      | 88 kB
custom_emojis               | 132          | 56 kB      | 32 kB      | 88 kB
color_scheme_colors         | 110          | 56 kB      | 32 kB      | 88 kB
tag_group_memberships       | 192          | 48 kB      | 32 kB      | 80 kB
category_custom_fields      | 17           | 48 kB      | 32 kB      | 80 kB
themes                      | 10           | 48 kB      | 32 kB      | 80 kB
badge_types                 | 3            | 48 kB      | 32 kB      | 80 kB
onceoff_logs                | 39           | 48 kB      | 32 kB      | 80 kB
category_tag_groups         | 8            | 40 kB      | 32 kB      | 72 kB
group_archived_messages     | 56           | 40 kB      | 32 kB      | 72 kB
category_groups             | 3            | 40 kB      | 32 kB      | 72 kB
push_subscriptions          | 12           | 48 kB      | 16 kB      | 64 kB
tag_groups                  | 10           | 48 kB      | 16 kB      | 64 kB
theme_settings              | 6            | 48 kB      | 16 kB      | 64 kB
ar_internal_metadata        | 1            | 48 kB      | 16 kB      | 64 kB
backup_metadata             | 6            | 48 kB      | 16 kB      | 64 kB
user_fields                 | 9            | 48 kB      | 16 kB      | 64 kB
remote_themes               | 7            | 48 kB      | 16 kB      | 64 kB
badge_groupings             | 5            | 48 kB      | 16 kB      | 64 kB
web_hook_event_types        | 10           | 48 kB      | 16 kB      | 64 kB
user_security_keys          | 0            | 8192 bytes | 56 kB      | 64 kB
color_schemes               | 11           | 48 kB      | 16 kB      | 64 kB
permalinks                  | 0            | 24 kB      | 32 kB      | 56 kB
incoming_emails             | 0            | 8192 bytes | 48 kB      | 56 kB
post_action_types           | 8            | 40 kB      | 16 kB      | 56 kB
web_hook_event_types_hooks  | 1            | 40 kB      | 16 kB      | 56 kB
watched_words               | 0            | 24 kB      | 32 kB      | 56 kB
user_exports                | 0            | 24 kB      | 16 kB      | 40 kB
github_user_infos           | 0            | 8192 bytes | 24 kB      | 32 kB
backup_draft_posts          | 0            | 8192 bytes | 24 kB      | 32 kB
categories_web_hooks        | 0            | 16 kB      | 16 kB      | 32 kB
theme_translation_overrides | 0            | 8192 bytes | 24 kB      | 32 kB
single_sign_on_records      | 0            | 8192 bytes | 24 kB      | 32 kB
post_reply_keys             | 0            | 0 bytes    | 24 kB      | 24 kB
backup_draft_topics         | 0            | 0 bytes    | 24 kB      | 24 kB
user_open_ids               | 0            | 8192 bytes | 16 kB      | 24 kB
post_details                | 0            | 8192 bytes | 16 kB      | 24 kB
message_bus                 | 0            | 8192 bytes | 16 kB      | 24 kB
anonymous_users             | 0            | 0 bytes    | 24 kB      | 24 kB
group_custom_fields         | 0            | 8192 bytes | 16 kB      | 24 kB
topic_invites               | 0            | 0 bytes    | 24 kB      | 24 kB
shared_drafts               | 0            | 0 bytes    | 24 kB      | 24 kB
instagram_user_infos        | 0            | 8192 bytes | 8192 bytes | 16 kB
reviewable_claimed_topics   | 0            | 0 bytes    | 16 kB      | 16 kB
user_field_options          | 0            | 8192 bytes | 8192 bytes | 16 kB
embeddable_hosts            | 0            | 8192 bytes | 8192 bytes | 16 kB
invited_groups              | 0            | 0 bytes    | 8192 bytes | 8192 bytes
developers                  | 0            | 0 bytes    | 8192 bytes | 8192 bytes
tags_web_hooks              | 0            | 0 bytes    | 8192 bytes | 8192 bytes
groups_web_hooks            | 0            | 0 bytes    | 8192 bytes | 8192 bytes
badge_posts                 | 0            | 0 bytes    | 0 bytes    | 0 bytes

(한편, /var/discourse/shared/standalone/postgres_data/base 폴더는 47GB를 초과합니다)

어떤 방식으로든 줄일 수 있을까요? 아니면 특정 토픽의 크기를 고려하면 논리적인 수치인가요? (세부 사항은 아래에 있습니다.)

다른 문제는 아마도 관련이 있을 것 같으며, 바로 "극심한 부하로 인해, 모든 사용자에게 로그아웃된 사용자가 보는 것과 동일한 상태로 임시로 표시됩니다"라는 유명한 오류 메시지가 계속 표시되는 것입니다. 한 게시글에서 Unicorn Workers를 증가시키는 것이 옵션이 될 수 있다고 읽었습니다(솔직히 그 부분을 건드려 본 적이 없고, 전체 설치 환경을 위험에 빠뜨리지 않고 이를 수행하는 방법이나 실행 가능성이 어떻게 되는지 찾지 못했습니다). 참고로 10,000개 이상의 답변이 있는 토픽이 꽤 많습니다, 따라서 DB 크기와 성능 문제 사이에 상관관계가 있는 것일까요? (확신은 없으니 그저 제안을 던져 봅니다.)

동일한 인스턴스 내에서 최적화하는 방법(이것을 발견했습니다) 또는 HA 설치와 같은 다른 방법을 사용하는 것이 가능한지 궁금합니다(HA 설치가 지원되는지 모르겠습니다). 하지만 제 무지로 인해 조급하게 행동하고 있는 것 같습니다. 도움을 주실 수 있다면 감사하겠습니다.

참고로: 인스턴스가 작았을 때 스왑 파일을 사용했는데, 현재는 비활성화되어 있다고 생각합니다(이것을 확인할 방법이 있을까요?).

감사합니다. _초보적인 질문_을 해서 죄송합니다.

그 post_timings 테이블은 진짜 괴물이에요. 이 테이블을 깨뜨리지 않고 truncate하거나 "축약"하거나 "요약"할 수 있는 방법이 있을까요 @sam?

미니 업데이트: 유니콘 러너(Unicorn Runners) 설정을 이것저것 조정해 봤는데, 코어당 워커 수(core-per-worker) 관계가 있는지, 아니면 CPU % x Second처럼 CPU를 공유하는 방식인지 정확히 모르겠습니다. 이 부분에 대해 모범 사례(best practice)가 있을까요?

또한 PostgreSQL에 대해 공부하며 데이터베이스 크기를 어떻게 관리해야 하는지 알아보고 있는데, 백업은 되어 있지만 단순히 데이터를 잘라내는 방식으로 진행할 경우 장기적으로 앱이 어떻게 반응할지 모르겠습니다.

빠른 수정 사항: 스왑 파일을 제거했고, 현재 10K 이상의 토픽을 어떻게 처리할지 분석 중입니다. 이 기회에 토픽 수가 전체 시스템에 얼마나 위험한지(권장 사항이 있으므로 위험이 있다고 추측하지만, 다른 요인이 있다면 알려주시면 좋겠습니다) 여쭙고 싶습니다.

저도 1만 개 이상의 주제들이 있고, 사이트가 정말 바쁠 때 가끔 이 메시지를 보고 있습니다.

Discourse의 기본값을 오버라이드하지 않는 것을 강력히 권고합니다. 기본값은 1만 개 이상의 답변이 있는 토픽을 자동으로 닫도록 설정되어 있습니다. 이 설정이 기본값으로 켜져 있는 데에는 이유가 있습니다. :scream:

그 외에도 방대한 post_timings 테이블 문제는 이미 인지하고 있으며 :satellite_antenna:, 현재 이를 해결할 방법을 논의 중입니다. 아마도 현재 2.5 릴리스에서 처리될 수도 있습니다. cc @sam @eviltrout

마지막 확인 버튼에 "나쁜 일이 일어나는 것에 동의합니다"라고 적혀 있는 3중 확인이 필요하다고 생각합니다.

메가토픽(megatopics)을 실제로 작동하게 만드는 사람이 있나요?

항상 약 80개의 메가토픽이 운영되고 있으며(가장 큰 토픽에는 128,000개의 게시물이 있습니다).

때때로 502 오류가 발생하기도 합니다(이와 관련이 있을 수도 있지만, 확신할 수 없습니다). db_shared_buffers 파라미터를 데이터베이스 크기보다 큰 값으로 조정하기 시작한 이후로는 모든 것이 순조롭게 진행되고 있습니다.

이것은 매우 나쁜 아이디어이며, 더 작은 연도별 또는 계절별 토픽으로 전환하기 위해 해당 토픽들을 종료해야 합니다. 참고할 내용:

10만 개 이상의 게시글이 있는 대형 토픽이 몇 개 있는 사이트를 운영하고 있습니다. 그건 실수라고 알려줬지만, 그래도 그렇게 하길 원했습니다. 이제 성능 문제를 불평하고 있네요. 곧 그 값을 1만 개 기본값으로 되돌릴 수 있기를 바랍니다.

그래서 데이터베이스 최적화에 대해 몇 가지를 배울 수 있었으니, 그건 오히려 장점이죠. :slight_smile:

말씀하신 뜻을 이해하지만, 토픽을 연도별로 나누는 것이 다소 어색할 수 있다는 점도 인정해야 합니다. 특히 우리 커뮤니티에서는 특정 인물들을 중심으로 많은 대화가 이루어지기 때문입니다.

예를 들어, 트럼프에 관한 일반적인 토픽이나 미국에 관한 일반적인 토픽을 생각해 보세요. 우리 포럼에는 클럽의 전직 회장에 대한 토픽, 현직 회장에 대한 토픽, 그리고 각 축구 팀 선수들에 대한 토픽이 있습니다. 무슨 말씀인지 아시겠죠? 다른 토픽들은 계절별로 나누기 쉽지만, 이런 성격의 토픽들은 그렇지 않습니다. 물론 불가능한 것은 아니지만, 상당히 비현실적입니다.

트럼프나 미국에 관한 일반적인 카테고리를 상상해 보세요.

누구도 하나의 주제에서 10,000개 이상의 게시물을 처음부터 끝까지 읽지 않습니다. 실제로 그렇지 않습니다. 어느 시점에서는 한숨을 쉬고 새로 시작할 수 있습니다. 저는 이런 주제들이 토론보다는 채팅에 가깝고, 대부분의 사람들이 어제 일어난 일조차 읽지 않으며, 하물며 지난주, 지난 달, 또는 지난 해 일은 더더욱 읽지 않는다고 생각합니다.

알겠습니다. 하지만 제 답변은 다음과 같습니다.

…당신은 "이유"라는 명목으로 스스로에게 상당한 고통을 자초하고 있습니다.

다음은 게시글 페이지를 가져오는 쿼리를 모방한 데이터 탐색기 쿼리입니다:

-- [params]
-- int :topic_id = 107216
-- int :offset = 10000

SELECT "posts"."id" FROM "posts" 
WHERE ("posts"."deleted_at" IS NULL) 
AND "posts"."topic_id" = :topic_id
AND "posts"."post_type" IN (1,2,3) ORDER BY "posts"."sort_order" ASC LIMIT 20 
OFFSET :offset

일반적인 토픽의 경우:

Limit  (cost=1911.35..1915.38 rows=1 width=8) 

메가 토픽의 경우:

Limit  (cost=37475.88..37550.83 rows=20 width=8)

:+1:

여러분의 의견에 동의합니다. 다만 우리 사용자들이 이미 이런 방식에 익숙해져서, 거기까지 이르기까지는 좀 더 노력이 필요할 것 같습니다… 하지만 불가능한 일은 아닙니다.

이와 관련하여 @codinghorror 님의 게시글(Natural breakpoints or "chapters" for long topics? - #53 by codinghorror)을 방금 읽었는데, 주제에만 적용되는 이러한 목차 형식이 하나의 주제 내에서만 게시하고 답변하면서 주제들의 연속성을 한눈에 파악할 수 있는 좋은 해결책이 될 수 있겠다는 생각이 들었습니다.

잘못 이해하지 마세요. 제가 그 작업을 한 건 여러분을 설득하기 위해서가 아니라, 게시물이 12만 개를 넘는 주제로 성능 문제를 제기하는 제 클라이언트를 설득하기 위해서였습니다.

여러분에게도 도움이 되길 바랍니다. 화이팅하세요. :wink:

:clinking_glasses:

정말 유용합니다! 공유해 주셔서 감사합니다!

우리는 post_timings 테이블을 다스릴 구체적인 단기 계획을 가지고 있지만, 메가토픽(megatopics)은 앞으로도 아주 오랫동안 많은 사람들에게 상당한 고통의 원인이 될 것입니다.

:warning: 그리고 이는 @tgxworld가 약 1년 전 메가토픽에서 수행하는 전체적인 작업량을 줄이기 위해 훌륭한 작업을 수행한 _이후_의 상황이라는 점을 기억하세요. 본질적으로 이러한 토픽에 대해 "저전력 모드"로 전환하여 그만큼 큰 피해를 주지 않도록 한 것입니다.

하지만 자欺하지 마세요: 메가토픽은 여전히 매우 강력하게 문제를 일으킵니다. :boom::boxing_glove:

귀하의 권고를 따르며, 다른 질문들을 파악해 보려고 노력하는 동안(여러분이 post_timings 테이블 작업을 하고 있다는 점을 인지하고), 주제 크기 설정을 기본값으로 복원하는 작업을 진행하겠습니다(내 무지를 사과하면서, 왜 안 하겠어요).

이 점을 염두에 두고, 답변을 구할 수 있기를 바라는 몇 가지 질문이 있습니다:

  1. 설정이 복원되면 해당 주제들은 닫힐 것입니다. 새로운 주제들이 생성될 것입니다. 하지만, 이러한 오래된 대형 주제들이 사이트 전체에 위험한 존재일까요? 즉, 이들을 더 작은 주제로 X번 "분할"해야 하는지, 아니면 비활성 상태라면 괜찮은지 궁금합니다.

  2. @Paracelsus님이 사용자 편의성에 대해 제기한 논쟁을 보았습니다. 이 점을 고려하여, "최대 주제 크기로 인해 닫힌 주제 자동 이어서 쓰기"라는 설정이 가능할지 질문드리고 싶습니다. 즉, 메가 토픽이 자동으로 닫힐 때, 같은 작성자, 같은 제목(주제 끝에 번호를 붙이는 식으로)으로 새 주제를 열고, 그 내용으로 이전 주제에 대한 링크만 포함할 수 있을까요? (그리고 닫힌 주제에는 새 주제에 대한 링크를 추가하는 방식으로요.)

이 제안이 다소 복잡하고 모든 사람에게 원하지 않을 수 있다는 점을 알고 있습니다(그래서 선택적 설정으로 제안하는 것입니다) 하지만, 관련성이 높은 주제들이 있는 고트래픽 사이트에서는 유용할 것 같다고 생각합니다. 여러분의 생각은 어떠신가요?

이것은 마치 "담배를 다 피우면 새 갑을 자동으로 구매해 줌으로써 사람들이 담배를 피우도록 장려해야 하는가?"라고 묻는 것과 같습니다. :slight_smile:

닫혀 있는 상태라면 트래픽이 많이 발생하지 않을 것이므로, 그렇지 않을 것 같지 않나요? 상황을 지켜보되, 활성 상태인 메가 토픽들의 과도한 트래픽(피부)을 막는 것이 제로 단계이므로, 좋은 방향으로 나아가고 있습니다. :+1:

추가 질문입니다… 현재 이러한 초대형 토픽을 10,000개 게시글 단위로 나누어 처리하려고 하고 있습니다. 하지만 시스템이 우리의 전략을 처리하는 것 같지 않네요 :sweat_smile::

한 번에 최소 8,000개 이상의 게시글을 선택해 새 토픽으로 이동하면 “502 Bad Gateway” 오류가 발생합니다(더 적은 수의 게시글은 아직 시도해 보지 않았습니다). 용량을 늘리는 방법이 있거나, 이 작업을 수행하는 다른/더 나은 방법이 있을까요? @codinghorror @pfaffman

해결 방법은 Rails 콘솔에서 실행하는 것입니다. 하지만 막상 어떻게 해야 할지는 바로 떠오르지 않습니다.

아래와 같은 코드가 될 텐데,

old_topic=1
new_topic=2
Posts.where(topic_id: old_topic).where("post_number > 10000 and post_number < 20000").update_all(topic_id: new_topic, post_number=...)

새로운 게시글 번호를 생성하려면 루프를 사용해야 할 것 같습니다. 이 해결책은 반드시 스테이징 사이트에서 먼저 테스트해 보세요. 만약 실수를 하게 되면 큰 문제를 겪게 될 것입니다.

이 정도로는 방법을 알아내기 어렵다면, Marketplace 채널에 질문을 올려야 할 것입니다. 하지만 솔직히 말해서 아무도 오래된 게시글을 읽지 않을 것이고, 그냥 그 게시글들을 닫아 두거나, SEO 가치가 있다고 생각되지 않는다면 삭제하거나 목록에서 제외하는 것이 낫다고 생각합니다.