Mattermost MySQL 데이터베이스 준비하기#
중요
PostgreSQL은 우리가 선호하는 데이터베이스입니다. 데이터베이스 버전 지원에 대한 자세한 내용은 데이터베이스 소프트웨어 문서를 참조하고, MySQL에서 PostgreSQL로 마이그레이션하는 방법에 대한 자세한 내용은 MySQL에서 PostgreSQL로 마이그레이션 문서를 참조하세요.
MySQL 8.0.22에는 문자열 값을 정수로 변경하는 JSON 열 타입 문제 가 있어 Mattermost가 제대로 작동하지 않습니다. 사용자는 이 데이터베이스 버전을 피하는 것이 좋습니다.
Mattermost MySQL 데이터베이스 설정하기#
Mattermost 서버에서 사용할 MySQL 데이터베이스를 설정하려면:
데이터베이스를 호스팅할 서버에 로그인하고 MySQL을 설치하세요.
sudo mysql을 실행하여 root 로 MySQL에 로그인하세요.mysql> create user 'mmuser'@'%' identified by 'mmuser-password';를 실행하여 Mattermost 사용자 mmuser 를 생성하세요.
mmuser-password보다 더 안전한 비밀번호를 사용하세요.
%는mmuser가 네트워크의 모든 기계에서 연결할 수 있음을 의미합니다. 그러나 Mattermost를 호스팅하는 기계의 IP 주소를 사용하는 것이 더 안전합니다. 예를 들어, IP 주소가10.10.10.2인 기계에 Mattermost를 설치하는 경우 다음 명령을 사용하세요:mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';
mysql> create database mattermost;를 실행하여 Mattermost 데이터베이스를 생성하세요.mysql> grant all privileges on mattermost.* to 'mmuser'@'%';를 실행하여 사용자mmuser에게 접근 권한을 부여하세요.
참고
이 쿼리는 편의를 위해 방금 생성한 MySQL 사용자에게 데이터베이스의 모든 권한을 부여합니다. 더 많은 보안이 필요한 경우, Mattermost를 실행하는 데 필요한 권한만 사용자에게 부여하려면 다음 쿼리를 사용하세요:
mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';
mysql> exit를 실행하여 MySQL에서 로그아웃하세요. 데이터베이스가 설치되고 초기 설정이 완료되면 Mattermost 서버를 설치할 수 있습니다.
참고
MySQL을 자체 서버에 설치한 경우, /etc/mysql/mysql.conf.d/mysqld.cnf 파일을 편집하고 # 기호를 사용하여 bind-address = 127.0.0.1 를 주석 처리한 다음 데이터베이스 서버를 재시작하세요.
데이터베이스 백업#
데이터베이스 버전에 따라 표준 절차를 사용하여 Mattermost 데이터베이스를 백업하세요. MySQL 백업 문서 <https://dev.mysql.com/doc/refman/8.4/en/backup-types.html>`_ 가 온라인에서 제공됩니다. 페이지의 선택기를 사용하여 MySQL 버전을 선택하세요.
Mattermost 업그레이드#
Mattermost v7.1은 새로운 열과 인덱스 형태로 스키마 변경을 도입했습니다. 스키마 변경에 대한 테스트 결과는 다음과 같습니다: 12M 게시물, 2.5M 반응 - ~1분 34초 (인스턴스: 8코어, 16GB RAM PC).
업그레이드 전에 Reactions 테이블에 대한 잠금을 얻는 다음 SQL 쿼리를 실행할 수 있습니다.
ALTER TABLE Reactions ADD COLUMN ChannelId varchar(26) NOT NULL DEFAULT "";
UPDATE Reactions SET ChannelId = COALESCE((select ChannelId from Posts where Posts.Id = Reactions.PostId), '') WHERE ChannelId="";
CREATE INDEX idx_reactions_channel_id ON Reactions(ChannelId) LOCK=NONE;
마이그레이션이 완료될 때까지 이 기간 동안 게시된 사용자의 반응은 데이터베이스에 반영되지 않습니다. 이는 완전히 이전 버전과 호환됩니다.
연결 정렬과 테이블 정렬이 다른 경우 Illegal mix of collations 오류가 발생할 수 있습니다. 이 오류를 해결하려면 연결과 테이블 모두에 동일한 정렬을 설정하세요. 정렬은 다양한 수준(연결, 데이터베이스, 테이블, 열)에서 다를 수 있으며, 데이터베이스 관리자는 다른 객체에 대해 다른 정렬 수준을 설정할 수 있습니다.
MySQL 데이터베이스를 사용하는 자체 호스팅 Mattermost 고객은 FileInfo 테이블에 많은 행이 있을 때 v7.0 릴리스로의 마이그레이션이 평소보다 오래 걸리는 것을 알 수 있습니다. 자세한 내용은 중요 업그레이드 참고사항 문서를 참조하세요.
Mattermost v6.7은 새로운 인덱스 형태로 스키마 변경을 도입했습니다. 스키마 변경에 대한 테스트 결과는 다음과 같습니다:
7M 게시물 - ~17초 (인스턴스: db.r5.xlarge)
9M 게시물 - 2분 12초 (인스턴스: db.r5.large)
다운타임 없는 업그레이드를 원한다면, 업그레이드 전에 이 인덱스를 적용할 수 있습니다:
CREATE INDEX idx_posts_create_at_id on Posts(CreateAt, Id) LOCK=NONE;
이는 완전히 이전 버전과 호환되며 테이블 잠금을 획득하지 않거나 테이블의 기존 작업에 영향을 미치지 않습니다.
v6.0 릴리스는 데이터베이스 스키마 변경을 도입하며, 특히 MySQL 설치에서 마이그레이션 시간이 더 길어질 것으로 예상됩니다.
Mattermost v6.0은 데이터베이스와 애플리케이션 성능을 모두 개선하기 위해 여러 데이터베이스 스키마 변경을 도입했습니다. 업그레이드는 데이터 세트 크기에 따라 시작 시간이 길어질 수 있는 중요한 데이터베이스 스키마 변경을 실행합니다. 지원되는 MySQL 데이터베이스 드라이버에 대해 1천만 개 이상과 7천2백만 개 이상의 게시물이 있는 실제 데이터 세트를 사용하여 광범위한 테스트를 수행했습니다.
MySQL 데이터베이스에서 1천만 개 이상의 게시물을 v6.0으로 마이그레이션하는 데 약 1시간 22분이 소요됩니다.
MySQL 데이터베이스에서 7천2백만 개 이상의 게시물을 v5.39에서 v6.0으로 대규모 마이그레이션하는 데 약 3시간 40분이 소요됩니다. 테스트 사양, 데이터 크기 및 테스트 결과는 Migration results analysis 문서를 참조하세요.
1천만 개 이상의 게시물이 있는 환경에서 마이그레이션 프로세스 중에 실행되는 다음 쿼리는 쿼리 기간 동안 데이터베이스 CPU 사용량과 쓰기 작업 제한에 상당한 영향을 미칩니다:
ALTER TABLE Posts MODIFY Props JSON; (~26분)
ALTER TABLE Posts DROP COLUMN ParentId; (~26분)
ALTER TABLE Posts MODIFY COLUMN FileIds text; (~26분)
테스트 사양, 데이터 크기, 테스트 결과, MySQL 쿼리의 상세 분석 및 그 영향과 지속 시간은 Mattermost v6.0 DB schema migrations analysis 문서를 참조하세요.
MySQL 완화 전략
업그레이드 전에 결합된 쿼리를 실행하세요. 이전 쿼리는 업그레이드 전에 다음과 같이 결합하여 실행할 수 있습니다:
ALTER TABLE Posts MODIFY COLUMN FileIds text, MODIFY COLUMN Props JSON;
이렇게 하면 해당 유형의 단일 쿼리에 소요되는 시간으로 제한됩니다.
온라인 마이그레이션: MySQL 설치에서 특히 무거운 쿼리나 매우 큰 데이터셋(수천만 개의 게시물 이상)의 경우 잠금을 피하는 온라인 마이그레이션을 시도할 수 있습니다. 이는 pt-online-schema-change 와 같은 외부 도구를 통해 수행할 수 있습니다. 그러나 온라인 마이그레이션 프로세스는 실행 중인 데이터베이스 인스턴스의 CPU 사용량이 크게 증가할 수 있습니다.
샘플 실행 및 추가 주의사항은 Mattermost v6.0 DB schema migrations analysis 문서를 참조하세요.
고가용성 구성 설정 권장사항#
MySQL의 경우 고성능을 위해 다음과 같은 구성 옵션을 권장합니다:
innodb_buffer_pool_size: 전체 RAM의 약 70%로 설정하세요.innodb_log_file_size: 256 MB로 설정하세요. 이 값을 증가시키면 쓰기 집약적인 작업에 도움이 됩니다. 복구 시간은 더 길어집니다.innodb_flush_log_at_trx_commit: 2. 이 설정은 최대 1초 동안 트랜잭션 데이터 손실이 발생할 수 있습니다.max_heap_table_size: 64 MB.tmp_table_size: 64 MB.
Encryption-at-rest#
메시지에 대한 암호화는 Mattermost 데이터베이스에 적용된 하드웨어 및 소프트웨어 디스크 암호화 솔루션을 통해 사용할 수 있으며, 이 데이터베이스는 인프라 내의 자체 서버에 있습니다. 디스크 수준의 암호화 옵션에 대한 자세한 내용은 MySQL 데이터베이스 문서를 참조하세요.
데이터베이스에 소켓 사용#
mysql -u root -p
CREATE DATABASE mattermostdb;
CREATE USER mmuser IDENTIFIED BY 'mmuser_password';
GRANT ALL ON mattermostdb.* TO mmuser;
Mattermost는 /etc/webapps/mattermost/config.json 에서 구성되며, 문자열은 따옴표로 묶어야 합니다.
DriverName을mysql로 설정하세요.DataSource를mmuser:mmuser_password@unix(/run/mysqld/mysqld.sock)/mattermostdb?charset=utf8mb4,utf8로 설정하세요.
데이터베이스의 Mattermost 구성#
Mattermost 설치의 활성 구성을 위한 단일 진실 공급원으로 데이터베이스를 사용할 수 있습니다. 이렇게 하면 Mattermost 바이너리가 기본 config.json 파일을 읽는 대신 데이터베이스의 구성 테이블에 저장된 구성 설정을 읽게 됩니다.
mysql://mmuser:really_secure_password@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s
환경 파일 생성#
참고
고가용성 클러스터 기반 배포에서 Mattermost를 실행 중인 경우, 이 단계는 클러스터의 모든 서버에서 수행해야 합니다.
데이터베이스 연결 문자열로 MM_CONFIG 환경 변수를 설정하기 위해 /opt/mattermost/config/mattermost.environment 파일을 생성하세요. 예시:
MM_CONFIG='mysql://mmuser:mostest@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s'
참고
데이터베이스 연결 문자열의 작은따옴표 앞에 \ 를 붙여 \' 와 같이 이스케이프 처리해야 합니다. 예시: MM_CONFIG='mysql://mmuser:it\'s-a-password!@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s'
MM_CONFIG='mysql://mmuser:it\'s-a-password!@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s'
마지막으로, Mattermost 디렉토리의 권한을 확인하기 위해 다음 명령을 실행하세요:
sudo chown -R mattermost:mattermost /opt/mattermost
Mattermost systemd 파일 수정#
먼저 다음 명령을 사용하여 mattermost.service 파일을 찾으세요:
sudo systemctl status mattermost.service
출력의 두 번째 줄에 실행 중인 mattermost.service 의 위치가 표시됩니다.
Loaded: loaded (/lib/systemd/system/mattermost.service; enabled; vendor preset: enabled)
root 권한으로 이 파일을 편집하여 ExecStart 로 시작하는 줄 바로 위에 아래 텍스트를 추가하세요:
EnvironmentFile=/opt/mattermost/config/mattermost.environment
EnvironmentFile 줄이 추가된 완전한 mattermost.service 파일은 다음과 같습니다:
[Unit]
Description=Mattermost
After=network.target
After=mysql.service
Requires=mysql.service
[Service]
Type=notify
EnvironmentFile=/opt/mattermost/config/mattermost.environment
ExecStart=/opt/mattermost/bin/mattermost
TimeoutStartSec=3600
KillMode=mixed
Restart=always
RestartSec=10
WorkingDirectory=/opt/mattermost
User=mattermost
Group=mattermost
LimitNOFILE=49152
[Install]
WantedBy=mysql.service
검색에 대한 기술 참고사항#
기본적으로 Mattermost는 MySQL에 포함된 전문 검색 지원을 사용합니다. 제품 메뉴 를 선택한 다음 Mattermost 정보 를 선택하여 사용 중인 데이터베이스를 확인하세요.
검색 결과에서 불용어가 필터링됩니다. 적용 가능한 불용어의 전체 목록은 MySQL 데이터베이스 문서를 참조하세요.
점(.)이 포함된 해시태그나 최근 사용자 이름 멘션은 결과를 반환하지 않습니다.
와일드카드 검색을 수행할 때 밑줄
_기호 대신 별표*기호를 사용하세요.MySQL 검색에서 제외되는 불용어에는
"a", "about", "an", "are", "as", "at", "be", "by", "com", "de", "en", "for", "from", "how", "i", "in", "is", "it", "la", "of", "on", "or", "that", "the", "this", "to", "was", "what", "when", "where", "who", "will", "with", "und", "the", "www"가 포함됩니다.
중국어, 한국어, 일본어로 검색하기#
중국어, 한국어, 일본어 검색을 위한 최상의 경험은 특별한 구성이 있는 MySQL 5.7.6 이상을 사용하는 것입니다. 자세한 내용은 중국어, 일본어, 한국어 검색 문서 를 참조하세요.
검색어 끝에 와일드카드 * 를 추가하여 이 구성 없이도 검색을 수행할 수 있습니다.
Bitnami에서 자체 호스팅 Mattermost 배포로 마이그레이션하기#
Bitnami에서 MySQL 데이터베이스가 있는 자체 호스팅 Mattermost 설치로 마이그레이션을 계획 중이라면, 마이그레이션 가이드의 다음 참고사항을 읽어보세요: Bitnami에서 마이그레이션.
Mattermost v6.0에서 v5.38로 다운그레이드#
INSERT INTO Systems (Name,Value) VALUES ('Version','5.38.0') ON DUPLICATE KEY UPDATE Value = '5.38.0';
CREATE INDEX idx_status_status ON Status (Status);
DROP INDEX idx_status_status_dndendtime ON Status;
CREATE INDEX idx_channelmembers_user_id ON ChannelMembers (UserId);
DROP INDEX idx_channelmembers_channel_id_scheme_guest_user_id ON ChannelMembers;
DROP INDEX idx_channelmembers_user_id_channel_id_last_viewed_at ON ChannelMembers;
CREATE INDEX idx_threads_channel_id ON Threads (ChannelId);
DROP INDEX idx_threads_channel_id_last_reply_at ON Threads;
CREATE INDEX idx_channels_team_id ON Channels (TeamId);
DROP INDEX idx_channels_team_id_type ON Channels;
DROP INDEX idx_channels_team_id_display_name ON Channels;
CREATE INDEX idx_posts_root_id ON Posts (RootId);
DROP INDEX idx_posts_root_id_delete_at ON Posts;
ALTER TABLE CommandWebhooks ADD COLUMN ParentId varchar(26);
UPDATE CommandWebhooks SET ParentId = '';
ALTER TABLE Posts ADD COLUMN ParentId varchar(26);
UPDATE Posts SET ParentId = '';
ALTER TABLE Users MODIFY Timezone text;
ALTER TABLE Users MODIFY NotifyProps text;
ALTER TABLE Users MODIFY Props text;
ALTER TABLE Threads MODIFY Participants longtext;
ALTER TABLE Sessions MODIFY Props text;
ALTER TABLE Posts MODIFY Props text;
ALTER TABLE Jobs MODIFY Data text;
ALTER TABLE LinkMetadata MODIFY Data text;
ALTER TABLE ChannelMembers MODIFY NotifyProps text;
참고
최종 v6.0 업그레이드 쿼리 의 역방향 쿼리는 결과가 이전 버전과 호환되며, 쿼리를 실행하면 다운그레이드 프로세스가 불필요하게 지연되기 때문에 이 다운그레이드 쿼리에서 의도적으로 제외되었습니다.