data = order와 달리 Ex = 4의 data = journal이 더 안전합니까?


34

Ext4의 기본 저널 모드 data=ordered는입니다.

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

그러나 data=journal옵션 도 있습니다. 즉,

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

이것에 대한 나의 이해는 data=journal모드가 메타 데이터뿐만 아니라 모든 데이터를 저널링 한다는 것입니다.이 메타 데이터는 데이터 무결성과 신뢰성 측면에서 이것이 가장 안전한 옵션이지만 성능에 대해서는별로 중요하지 않은 것으로 보입니다.

안정성이 가장 중요하지만 성능이 훨씬 낮은 경우이 옵션을 사용해야합니까? 이 옵션을 사용할 때주의해야 할 사항이 있습니까?

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

답변:


29

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

3 가지 모드는 설명서 의 안전 순서대로 제공됩니다 .

  1. data = 저널
  2. 데이터 = 순서
  3. data = 쓰기

관심있는 다른 옵션도 있습니다.

commit=nrsec    (*) Ext4 can be told to sync all its data and metadata
                    every 'nrsec' seconds. The default value is 5 seconds.

알려진 유일한 경고는 그것이 매우 느려질 수 있다는 것입니다. noatime옵션으로 액세스 시간 업데이트를 비활성화하여 성능 영향을 줄일 수 있습니다 .


2
지연된 할당을 비활성화하면 더 안전합니다. 그러나 + data=journal보다 안전한 결과를 제공 하는 사례를 찾을 수 없습니다 . 하나 있어요? data=orderednodelalloc
Jérôme Pouiller

지연된 할당을 비활성화하지 않아 데이터 손실이 발생할 수 있습니다.
ctrl-alt-delor

3

이 스레드는 매우 오래되었지만 여전히 관련이 있습니다.

우리는 Ceph RBD 이미지를 사용하여 KVM 하에서 VM으로 실행되는 MySQL 데이터베이스에 많은 작은 쓰기를 병합하고자했습니다.

게스트 : 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'장치 (1 TiB)는 압축 된 삭제 코딩 된 NVMe 풀에 있으며 트리플 복제 된 NVMe 풀에 비교적 작은 (128 MiB) 전용 저널 장치가 있습니다.

구조 환경에서 사용한 명령은 다음과 같습니다.

저널을 분리하십시오.

tune2fs -O ^has_journal /dev/sda1;

불일치 한 파일 시스템을 확인하십시오.

fsck.ext4 -f -C 0 /dev/sda1;

블록 크기를 구하십시오.

tune2fs -l /dev/sda1;

전용 저널 장치 형식 (WARNING) :

최소 저널 크기는 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

2
그래서? 무엇이 바뀌 었습니까?
시반
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.