Mattermost MySQL 데이터베이스 설정
모든 플랜 에서 사용 가능
self-hosted 배포판
이 페이지에서
Important
PostgreSQL은 우리의 선호하는 데이터베이스입니다. database software 문서에서 데이터베이스 버전 지원에 대한 자세한 내용을 확인하십시오.
Mattermost MySQL 데이터베이스 설정
Mattermost 서버에서 사용할 MySQL 데이터베이스를 설정하려면 다음을 수행하세요:
데이터베이스를 호스팅할 서버에 로그인하고 MySQL을 설치합니다.
sudo mysql
을 실행하여 *root*로 MySQL에 로그인합니다.- 다음 명령을 실행하여 Mattermost 사용자 *mmuser*를 만듭니다:
mysql> create user 'mmuser'@'%' identified by 'mmuser-password';
.
mmuser-password
보다 안전한 암호를 사용하십시오.
%
는mmuser
가 네트워크의 모든 기기에서 연결할 수 있음을 의미합니다. 그러나 Mattermost를 호스팅하는 기기의 IP 주소를 사용하는 것이 더 안전합니다. 예를들어, IP 주소가10.10.10.2
인 기기에 Mattermost를 설치했다면 다음 명령을 사용합니다:mysql> create user 'mmuser'@'10.10.10.2' identified by 'mmuser-password';
다음 명령을 실행하여 Mattermost 데이터베이스를 만듭니다:
mysql> create database mattermost;
.다음 명령을 실행하여 사용자
mmuser
에게 액세스 권한을 부여합니다:mysql> grant all privileges on mattermost.* to 'mmuser'@'%';
.
Note
이 쿼리는 편리를 위해 방금 만든 MySQL 사용자에게 데이터베이스의 모든 권한을 부여합니다. 보다 안전한 처리가 필요하다면 Mattermost를 실행하는 데 필요한 권한만 부여하기 위해 다음 쿼리를 사용하십시오:
mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE, REFERENCES ON mattermost.* TO 'mmuser'@'%';
mysql> exit
를 실행하여 MySQL에서 로그아웃합니다. 데이터베이스가 설치되고 초기 설정이 완료되면 Mattermost 서버를 설치할 수 있습니다.
Note
MySQL을 별도로 설치한 경우, /etc/mysql/mysql.conf.d/mysqld.cnf
파일을 열고 bind-address = 127.0.0.1
을 #
기호로 주석 처리한 후 데이터베이스 서버를 다시 시작하십시오.
데이터베이스 백업
데이터베이스 버전에 따라 표준 절차를 사용하여 Mattermost 데이터베이스를 백업합니다. MySQL 백업 문서 을 온라인에서 확인할 수 있습니다. 페이지의 선택기를 사용하여 MySQL 버전을 선택하십시오.
Mattermost 업그레이드
Mattermost v7.1은 새로운 열과 해당 인덱스의 스키마 변경을 도입합니다. 스키마 변경에 대한 테스트 결과는 다음과 같습니다: 12M Posts, 2.5M Reactions - ~1min 34s (인스턴스: 8코어, 16GB RAM PC).
업그레이드 전에 다음 SQL 쿼리를 실행하여 Reactions
테이블에 잠금을 설정할 수 있습니다.
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 Posts - ~17s (인스턴스: db.r5.xlarge)
9M Posts - 2분 12초 (인스턴스: db.r5.large)
영향을 주지 않으면서 제로 다운타임 업그레이드를 원한다면 다음 인덱스를 적용할 수 있습니다:
CREATE INDEX idx_posts_create_at_id on Posts(CreateAt, Id) LOCK=NONE;
이는 완전히 하위 호환성을 유지하며 테이블 잠금을 획들거나 기존 테이블 작업에 영향을 미치지 않습니다.
v6.0 릴리스는 데이터베이스 스키마 변경을 도입하며 특히 MySQL 설치에서 더 긴 마이그레이션 시간이 예상됩니다.
Mattermost v6.0에서는 데이터베이스 및 애플리케이션 성능을 향상시키기 위해 데이터베이스 스키마 변경을 수행합니다. 여러개의 1000만개 이상의 게시물 및 7200만개 이상의 게시물을 포함하는 현실적인 데이터셋을 사용하여 데이터베이스 스키마 변경 테스트를 실시했습니다.
1000만 개 이상의 게시물의 v6.0 마이그레이션은 MySQL 데이터베이스에서 약 1시간 22분이 걸립니다. 지원되는 MySQL 데이터베이스 드라이버에 대한 상세한 성능 테스트 결과에 대한 자세한 내용은 Mattermost v6.0 DB schema migrations analysis 문서를 참조하십시오.
7200만 개 이상의 게시물의 v5.39에서 v6.0으로의 대규모 마이그레이션은 MySQL 데이터베이스에서 약 3시간 40분이 걸립니다. 지원되는 MySQL 데이터베이스 드라이버에 대한 상세한 성능 테스트 결과에 대한 자세한 내용은 Migration results analysis 문서를 참조하십시오.
1000만 개 이상의 게시물 데이터베이스 마이그레이션에 실행되는 다음 쿼리는 데이터베이스 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 Mitigation Strategies
업그레이드 전에 결합된 쿼리를 실행합니다. 이전 쿼리는 아래와 같이 업그레이드 전에 실행될 때 결합될 수 있습니다.
ALTER TABLE Posts MODIFY COLUMN FileIds text, MODIFY COLUMN Props JSON;
이는 해당 유형의 단일 쿼리에 소요되는 시간을 제한합니다.
온라인 마이그레이션 : 특히 매우 큰 데이터셋(수천만 개 이상의 글)이나 매우 무거운 쿼리의 경우 MySQL 설치에서 잠금을 피하는 온라인 마이그레이션이 시도될 수 있습니다. 이는 pt-online-schema-change 과 같은 외부 도구를 통해 수행될 수 있습니다. 그러나 온라인 마이그레이션 프로세스는 해당 데이터베이스 인스턴스에서 CPU 사용량의 상당한 증가를 일으킬 수 있습니다.
샘플 실행 및 추가 주의사항에 대해서는 Mattermost v6.0 DB 스키마 마이그레이션 분석 문서를 참조하십시오.
고가용성 구성 설정 권장 사항
MySQL의 경우 고성능을 위해 다음 구성 옵션을 권장합니다:
innodb_buffer_pool_size
: 총 RAM의 ~70%로 설정합니다.innodb_log_file_size
: 256MB로 설정합니다. 이를 늘리면 쓰기 집중적인 작업에 도움이 됩니다. 복구 시간이 더 오래 걸릴 수 있습니다.innodb_flush_log_at_trx_commit
: 2입니다. 이로 인해 최대 1초까지 트랜잭션 데이터가 손실될 수 있습니다.max_heap_table_size
: 64MBtmp_table_size
: 64MB
안전한 데이터 저장을 위한 암호화
안전한 데이터 저장은 메시지를 위해 하드웨어 및 소프트웨어 디스크 암호화 솔루션을 통해 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
환경 파일 생성
Note
고가용성 클러스터에서 Mattermost를 실행하는 경우, 이 단계는 클러스터 내 모든 서버에서 수행되어야 합니다.
/opt/mattermost/config/mattermost.environment
파일을 만들어 데이터베이스 연결 문자열을 MM_CONFIG
환경 변수로 설정합니다. 예시:
MM_CONFIG='mysql://mmuser:mostest@tcp(127.0.0.1:3306)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s'
Note
데이터베이스 연결 문자열 내의 작은 따옴표는 \'
를 사용하여 이스케이프 처리해야 합니다. 예시: 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에 포함된 전체 텍스트 검색 지원을 사용합니다. 제품 메뉴 |product-list|를 선택한 다음 Mattermost 정보 를 선택하여 사용 중인 데이터베이스를 확인하십시오.
보통 검색 결과에서 stop words는 필터링됩니다. 적용 가능한 stop words의 전체 목록은 MySQL 데이터베이스 문서를 참조하십시오.
해시태그 또는 점을 포함하는 최근 사용자 언급은 검색 결과를 반환하지 않습니다.
와일드카드 검색을 수행하기 위해 밑줄
_
기호를 사용하지 않으십시오. 대신 별표*
기호를 사용하십시오.MySQL에서 검색에서 제외되는 stop words에는 다음과 같은 단어가 포함됩니다:
"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 배포로 마이그레이션
MySQL 데이터베이스가 포함된 Bitnami에서 자체 호스트 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;
Note
최종 v6.0 업그레이드 쿼리의 역순 는 이 다운그레이드 쿼리에서 의도적으로 제외되었습니다. 결과가 하위 호환성을 유지하므로 쿼리를 실행하면 다운그레이드 프로세스가 불필요하게 지연됩니다.