최소 로그 크기는 1024 * 블록 크기여야 합니다(안전을 위해 128MiB를 사용함).

최소 로그 크기는 1024 * 블록 크기여야 합니다(안전을 위해 128MiB를 사용함).

Ext4의 기본 로그 모드는 data=ordered문서에 따르면

"메타데이터가 저널에 커밋되기 전에 모든 데이터가 기본 파일 시스템에 직접 강제로 적용됩니다."

그러나 옵션이 있습니다 data=journal.

"모든 데이터는 기본 파일 시스템에 기록되기 전에 저널에 커밋됩니다. 이 모드를 활성화하면 지연 할당 및 O_DIRECT 지원이 비활성화됩니다."

제가 이해하는 바는 이 data=journal모드가 메타데이터뿐만 아니라 모든 데이터를 기록한다는 것입니다. 표면적으로는 이것이 성능 면에서 그렇게 안전하지는 않더라도 데이터 무결성과 신뢰성 측면에서 가장 안전한 옵션이라는 것을 의미하는 것 같습니다.

안정성이 가장 중요하지만 성능이 중요하지 않은 경우 이 옵션을 선택해야 합니까? 이 옵션을 사용할 때 주의할 점이 있나요?

배경으로 문제의 시스템은 UPS에 있고 드라이브에서 쓰기 캐싱이 비활성화되어 있습니다.

답변1

예, data=journal이것이 디스크에 데이터를 쓰는 가장 안전한 방법입니다. 모든 데이터와 메타데이터는 디스크에 기록되기 전에 로그에 기록되므로 충돌이 발생하는 경우 언제든지 중단된 I/O 작업을 재생할 수 있습니다. 또한 비활성화됩니다.지연 할당그 중 특징은데이터 손실이 발생할 수 있음.

이 3가지 모드는 안전순으로 배열되어 있습니다.수동:

  1. 데이터=저널
  2. 데이터=정렬됨
  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

관련 정보