Ext4의 기본 로그 모드는 data=ordered
문서에 따르면
"메타데이터가 저널에 커밋되기 전에 모든 데이터가 기본 파일 시스템에 직접 강제로 적용됩니다."
그러나 옵션이 있습니다 data=journal
.
"모든 데이터는 기본 파일 시스템에 기록되기 전에 저널에 커밋됩니다. 이 모드를 활성화하면 지연 할당 및 O_DIRECT 지원이 비활성화됩니다."
제가 이해하는 바는 이 data=journal
모드가 메타데이터뿐만 아니라 모든 데이터를 기록한다는 것입니다. 표면적으로는 이것이 성능 면에서 그렇게 안전하지는 않더라도 데이터 무결성과 신뢰성 측면에서 가장 안전한 옵션이라는 것을 의미하는 것 같습니다.
안정성이 가장 중요하지만 성능이 중요하지 않은 경우 이 옵션을 선택해야 합니까? 이 옵션을 사용할 때 주의할 점이 있나요?
배경으로 문제의 시스템은 UPS에 있고 드라이브에서 쓰기 캐싱이 비활성화되어 있습니다.
답변1
예, data=journal
이것이 디스크에 데이터를 쓰는 가장 안전한 방법입니다. 모든 데이터와 메타데이터는 디스크에 기록되기 전에 로그에 기록되므로 충돌이 발생하는 경우 언제든지 중단된 I/O 작업을 재생할 수 있습니다. 또한 비활성화됩니다.지연 할당그 중 특징은데이터 손실이 발생할 수 있음.
이 3가지 모드는 안전순으로 배열되어 있습니다.수동:
- 데이터=저널
- 데이터=정렬됨
- 데이터 = 쓰기 저장
관심을 가질 만한 또 다른 옵션이 있습니다.
commit=nrsec (*) Ext4 can be told to sync all its data and metadata
every 'nrsec' seconds. The default value is 5 seconds.
유일하게 알려진 주의 사항은 속도가 매우 느려질 수 있다는 것입니다. 이 옵션을 사용하여 액세스 시간 업데이트를 비활성화하면 성능에 미치는 영향을 줄일 수 있습니다 noatime
.
답변2
이 스레드는 매우 오래되었지만 여전히 관련성이 있습니다.
우리는 MySQL 데이터베이스에 많은 작은 쓰기를 통합하고 Ceph RBD 이미지를 사용하여 KVM에서 VM으로 실행하려고 합니다.
게스트: CentOS 6 VM의 /etc/fstab:
/dev/sda1 / ext4 defaults,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0,noatime,nodiratime,commit=60,data=journal,discard 1 1
"/dev/sda" 장치(1TiB)는 압축된 삭제 코딩 NVMe 풀에 있으며, 삼중 복제 NVMe 풀에는 비교적 작은(128MiB) 전용 로그 장치가 있습니다.
구조 환경에서 사용하는 명령은 다음과 같습니다.
별도의 로그:
tune2fs -O ^has_journal /dev/sda1;
파일 시스템에 불일치가 있는지 확인하십시오.
fsck.ext4 -f -C 0 /dev/sda1;
블록 크기 가져오기:
tune2fs -l /dev/sda1;
개인 로그 장치 포맷 중(경고):
최소 로그 크기는 1024 * 블록 크기여야 합니다(안전을 위해 128MiB를 사용함).
/dev/sda1과 일치하도록 블록 크기 설정
mke2fs -O journal_dev -L root_journal /dev/sdb1 -b 4096;
파일 시스템에 전용 로그 장치를 연결합니다.
tune2fs -j -J device=LABEL=root_journal /dev/sda1;
MySQL 설정:
[mysqld]
innodb_old_blocks_time = 1000 # Prevent buffer pool pollution. Default as of MySQL 5.6
innodb_buffer_pool_size = 24576M # MySQL Cache
innodb_log_buffer_size = 128M # 25% of log_file_size
innodb_log_file_size = 512M # 25% of the buffer_pool (no, not really)
query_cache_size = 128M # Query Cache
table_cache = 512 # Make it large enough for: show global status like 'open%';
#mysqltuner.pl:
innodb_flush_method = O_DSYNC # Don't validate writes. MySQL 5.6+ should use O_DIRECT
innodb_flush_log_at_trx_commit = 2 # Flush MySQL transactions to operating system cache
join_buffer_size = 256K
thread_cache_size = 4
innodb_buffer_pool_instances = 16
skip-innodb_doublewrite