MySQL의의 다중 인스턴스는 무엇입니까?
간단히 말해서, MySQL의 다중 인스턴스는 단일 서버에서 서로 다른 서비스 포트의 서비스를 제공하기 위해 서로 다른 청취 소켓을 통해, 서비스 프로세스를 동시에 (예 : 3306,3307) 여러 다른 서비스 포트를 열 여러 MySQL의 서비스 프로세스를 실행하는 것입니다.
멀티 인스턴스 Msyql 기능 :
이 구성 파일합니다 (my.cnf 파일) 프로그램 및 데이터 파일을 시작을 사용하지 않고 MySQL은 MySQL의 설치 프로그램을 공유 할 수 있습니다. 서비스를 제공하는 멀티 인스턴스 MySQL이 개별 논리적 보인다들은 구성 파일에 대응하는 설정 값에 따라, 서버 응답은 하드웨어 리소스의 수를 얻었다.
추가 :
사실, 많은 웹 서버는 여러 인스턴스를 구성 할 수 있습니다 같은 Nginx에 아파치 레디 스에서 Memcache로 구성 다중 인스턴스가 있습니다.
다중 역할 인스턴스를한다 : mysql
서버 자원의 1)을 효율적으로 사용 단일 서버 자원 남은 시간, 남은 자원 이상의 서비스 제공을 이용할 수 있고 자원의 논리적 분리를 달성 할 수있다. 2) 서버 자원을 절약 회사의 재무 부담하지만, 자체 데이터베이스를 필요로하고 독립적으로 서비스를 제공하기 위해 노력하지만, 마스터 - 슬레이브 복제, 다중 인스턴스, 모든 더 필요로 할 때. 그러나 높은 동시 데이터베이스 인스턴스 또는 전체 SQL 쿼리가 서로의 자원을 탈취 할 문제가있을 때 단점은 멀티 인스턴스에는 mysql있다.
MySQL의 생산 시나리오는 예를 복수
1. 금융 변형 선택 회사
각 서버가 9-15에 도달 할 수, SO3 9-15 서버, 십자가 촬영에서 분리 복사 및 데이터 백업 쓰기, 인스턴스를 배치 : 등을 전용 데이터베이스가 영향을 설치합니다. 소위 독립은 상대적입니다.
2. 동시 액세스가 큰 사업 아닌
사업 규모는 SQL 문을 최적화 할 경우 다음이 더 나은, MySQL을보다 다중 인스턴스의 응용 프로그램에 적합, 서버의 자원은 기본적으로 낭비, 너무 큰되지 않을 때 예 크게 시스템 자원의 합리적인 배분에 의해 복잡하게 할 수 기술의 매우 가치 사용할 것, 좋은 서비스, 큰 문제가되지 않습니다.
3. 포털 MySQL의 다중 인스턴스 응용 프로그램 시나리오
등 : 바이 회사 IBM 서버 48 코어 CPU의 부서, 메모리 96기가바이트 이러한 구성 서버 인스턴스 3-4를 실행할 수 있습니다;시나 여러 인스턴스 네트워크를 사용하는 메모리가 48G에 관한 것입니다.
추가 :시나 단일 데이터베이스 네트워크 데이터베이스 인스턴스 1-4 대부분 1 ~ 2까지의 대부분을, 큰 사업은 기계보다 더 걸립니다. 사용을 조화하기 위해 또한,시나 웹 사이트는 데이터베이스를 설치, 일반적으로 설치를 설치하고 최적화 한 후 rpm 패키지를 만들기 위해 사용자 정의 컴파일하는 데 사용; DELL R510 서버는 300G SAS RAID10은 *, CPU E5210 48G 메모리 드라이브 (12)을 대부분입니다.
다중 구성 방식의 MySQL의 예
1. 하나의 구성 파일, 단일 인스턴스 배포 시나리오보다 더 많은 프로그램 시작
하나의 구성 파일에 언급 된 MySQL의 공식 문서를 프로그램 단일 인스턴스 다중 인스턴스 배포를 시작하는 것은이 프로그램을 사용하지 않는 것이 좋습니다, 지식 포인트로 지칭. 다음과 같이 공식의 my.cnf 구성 파일 예제의 구성은 다음과 같습니다
[mysqld_multil] mysqld를 =는 / usr / 빈 / mysqld_safe에의 mysqladmin 데이터 =는 / usr / 빈 / mysqladmin 데이터의 사용자 = mysql을 [mysqld1] 소켓 = /var/lib/mysql/mysql.sock의 포트 = 3306 PID 파일 =은 / var / lib 디렉토리 / mysql을 /mysql.pid DATADIR =은 / var / LIB / MySQL의 / 사용자의 MySQL = [mysqld2] 소켓 = / MNT / 데이터 / DB1 / mysql.sock의 포트 = 3302 PID 파일 = /mnt/data/db1/mysql.pid DATADIR = / MNT / 데이터 / DB1 / 사용자 = MySQL을 스킵 이름 리졸 서버 ID = 10 dafault 스토리지 엔진 = 이노 innodb_buffer_pool_size = 512M innodb_additional_mem_pool = 1,000 default_character_set = UTF8 character_set_server = UTF8 # 읽기 전용 중계 로그 공간 제한 = 3G expire_logs_day = 20
다음과 같이 시작 명령은 다음과 같습니다 mysqld_multi --config-file=/data/mysql/my_multi.cnf start 1,2
이 계획의 경우, 단점은 일정한 원칙과 운영 및 유지 보수를 개발하고 커플 링을 줄일 수있는 작품은 구성 파일, 잘못된 관리, 커플 링이 너무 높은 것입니다 .
2. 멀티 프로필 멀티 부팅 배포 계획
여러 구성 파일, 멀티 시작 배포 계획은 권장 솔루션입니다. 보기의 다음 구성 예 :
[@ MySQL의 루트 /] 트리 / 데이터 / 데이터 | - 3306 | | --data "데이터 파일 (3306) 예 == | | --my.cnf"구성 파일의 예 == 3306 | | --mysql "= = 3306 인스턴스 시작 파일 --3,307 | | --data "== 3307 개 인스턴스 데이터 파일 | | --my.cnf"== 3307 인스턴스 구성 | | --mysql "== 3307 인스턴스 시작 파일
MySQL의 다중 인스턴스 구성 프로세스 :
1. Msyql 필요한 의존성 설치 MySQL의 설치가 필요한 소프트웨어 컴파일러 2. 3. 설치 MySQL의 4 구성 여러 인스턴스 5. 초기화 MySQL 데이터베이스 6. 시작 MySQL의 7 로그 MySQL의 8 문제 해결 지침 처음부터 9. 부팅
MySQL의 다중 인스턴스 데이터베이스 설치
1. Msyql 필요한 종속성을 설치
냠은 ncurses-(STABLE)가 libaio-(STABLE) -y 설치 RPM -qa의 ncurses-(STABLE)가 libaio-(STABLE) 가 libaio-(STABLE) - 0.3.107-10.e16x86_64 의 ncurses-(STABLE) - 5.7-3.20090208.c16x86_64을
데이터베이스 :
서버 이름 호스트의 IP 주소 C3-MySQL 데이터베이스 172.16.1.52/24 DB02
2. MySQL을 컴파일하고 필요한 소프트웨어를 설치
LS -lh cmake-2.8.8.tar.gz 타르 XF cmake-2.8.8.tar.gz의 CD cmake-2.8.8 ./configure를 gmake를 gmake를 설치 하는 cmake / usr / 지방 / 빈 / cmake의 CD를 ../
또는 당신은 (냠 권장 설치) yum을 사용하여 설치할 수 있습니다 yum install cmake -y
3. 시작을 설치 MySQL의를
# MySQL의 사용자를 생성 useradd와 mysql을 -s / sbin에 / nologin으로 -M 위에서 ID mysql을 언급 다운로드 경로 입력 #을 CD / 홈 / 올드 보이 / 도구 wget을 http://downloads.mysql.com/archives/get/file/mysql-5.5을. 32.tar.gz
MySQL의 소스 패키지와 바이너리 패키지 이름
MySQL의 프로그램 이름 (여기에서 설치 패키지에 사용 된 바와 같이) Msyql 소스 설치 패키지 mysql을-5.5.32.tar.gz MySQL의 바이너리 패키지 mysql을 - 5.5.32 - 리눅스 - x86_64.tar.gz
# 설치 패키지의 압축을 풉니 다
타르 XF는 MySQL의-5.5.32.tar.gz의 CD mysql을 - 5.5.32 [루트 @의 DB02 mysql을 - 5.5.32] # 개의 cmake. -DCMAKE_INSTALL_PREFIX = / 애플리케이션 / MySQL을 5.5.32 \ -DMYSQL_DATADIR = / 애플리케이션 / MySQL을 5.5.32 / 데이터 \ -DMYSQL_UNIX_ADDR = / 애플리케이션 / MySQL을 5.5.32 / TMP / mysql.sock \ -DDEFAULT_CHARSET = UTF8 \ - DDEFAULT_COLLATION = utf8_general_ci \ -DEXTRA_CHARSETS = GBK, GB2312, UTF8, ASCII \ -DENABLED_LOCAL_INFILE = ON \ -DWITH_INNOBASE_STORAGE_ENGINE = 1 \ -DWITH_FEDERATED_STORAGE_ENGINE = 1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE = 1 \ -DWITHOUT_EXAMPLE_STORAGE_ENGINE = 1 \ -DWITHOUT_PARTITION_STORAGE_ENGINE = 1 \ -DWITH_FAST_MUTEXES = 1 \ 번들 -DWITH_ZLIB = \ -DENABLED_LOCAL_INFILE = 1 \ -DWITH_READLINE = 1 \ -DWITH_EMBEDDED_SERVER = 1 \ -DWITH_DEBUG = 0 [루트 @의 DB02 MySQL을 5.5.32] #하게 &&하게 설치 [@ 루트의 DB02 MySQL을 5.5.32] # LN /application/mysql-5.5.32/ -s / 애플리케이션 / MySQL의 [루트 @의 DB02 mysql을 - 5.5.32] #에서 cd / 응용 프로그램 / mysql을 [루트 @의 DB02 MySQL의] # 1!이 빈 데이터가 포함 lib 디렉토리 MySQL의 테스트 스크립트 SQL-벤치 복제, 워드 프로세서 INSTALL-BINARY 남자 README 공유 지원 - 파일
여러 인스턴스 구성
[루트 @의 DB02 MySQL의] #에서 mkdir의 -p / 데이터 / {3306,3307} / 데이터 [루트 @의 DB02 ~] # 트리 / 데이터 / / 데이터 / ├── 3306 │ ├── 데이터 │ ├──의 my.cnf │ └── MySQL의 └── 3307 개 ├── 데이터 ├──의 my.cnf └── MySQL의 4 개 디렉토리, 4 개 파일
3306 폴더 설명 :
#### 정력의 my.cnf ####
[클라이언트] 포트 = 3306 소켓 = /data/3306/mysql.sock [MySQL의] 노 자동 개작 [mysqld를] 사용자의 MySQL = 포트 = 3306 소켓 = /data/3306/mysql.sock BASEDIR = / 애플리케이션 / MySQL의 DATADIR 없다 = / 데이터 / 3306 / 데이터 open_files_limit = 1,024 back_log = 600 MAX_CONNECTIONS = 800 max_connect_errors = 3000 table_cache = 614 외부 로킹 = FALSE 의 max_allowed_packet = 8M sort_buffer_size = 1M join_buffer_size = 1M thread_cache_size = 100 thread_concurrency = 2 query_cache_type을 2M = 는 query_cache_limit = 1M query_cache_min_res_unit = 2K #default_table_type = 이노 thread_stack = 192K #transaction_isolation = READ 커밋 tmp_table_size 변수 = 2M max_heap_table_size = 2M LONG_QUERY_TIME = 1 #log_long_format # 로그 오차 = /data/3306/error.log # 로그 느린 쿼리 = / 데이터 / 3306 / slow.log PID 파일 = /data/3306/mysql.pid 로그 빈이 = / 데이터 / 3306 / MySQL의 단 = / 데이터 / 3306 / 중계 단 중계 로그 중계 로그 정보 파일을 = / 데이터 / 3306 / relay-log.info 하고 binlog_cache_size = 1M max_binlog_cache_size = 1M 가 max_binlog_size = 2M expire_logs_days = 7 key_buffer_size = 16M read_buffer_size = 1M read_rnd_buffer_size = 1M bulk_insert_buffer_size = 1M #myisam_sort_buffer_size = 1M #myisam_max_sort_file_size = 10G #myisam_max_extra_sort_file_size = 10G의 #myisam_repair_threads = 1 #myisam_recover lower_case_table_names = 1 스킵 이름 해결 노예-오류를 건너 뛰 = 1032,1062 복제 - 무시-dB = MySQL의 서버 ID = 1 innodb_additional_mem_pool_size = 4M innodb_buffer_pool_size = 32M innodb_data_file_path에 =을 ibdata1 : 128M : AUTOEXTEND innodb_file_io_threads = 4 에서 innodb_thread_concurrency = 8 에서 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 2M innodb_log_file_size = 4M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_file_per_table = 0 [mysqldump를] 빠른 의 max_allowed_packet = 2M [mysqld_safe를] 로그 오차 = / 데이터 / 3306 / mysql_oldboy3306.err의 PID = 파일 / 데이터 / 3306 / mysqld.pid
#### 정력 mysql을 ####
#! / 빈 / SH ############################################ ####은 2016년 12월 9일에서 liuliya에 의해 생성되는 스크립트 #이 #oldboy 전분기 : 865,205,026 #site : HTTP : //www.liuliya.com ################ ################################ #init의 포트 = 3306 mysql_user = "루트" MYSQL_PWD = "올드 보이" CmdPath = " / 애플리케이션 / MySQL은 / 빈 " mysql_sock ="/ 데이터 / $ {} 포트 /mysql.sock " #startup 기능 function_start_mysql () { [경우! -e "$의 mysql_sock"] 다음 의 printf "...부터의 MySQL \ n" / 빈 / sh 부 CmdPath $ {} / mysqld_safe에 --defaults = 파일 / 데이터 / $ 2 /my.cnf 포트 {}> & 1> 을 / dev / null & #STOP 함수 기능 #STOP function_stop_mysql () ) (function_stop_mysql를 { { [경우! -e "$의 mysql_sock"] 다음 의 printf "MySQL이 정지 ... \ n" 출구 다른 사람 의 printf "을 stoping MySQL의 ... \ n" $ {CmdPath} / mysqladmin 데이터 -u $ {mysql_user} -p $ {MYSQL_PWD} -S /data/${port}/mysql.sock 종료 Fi를 } #restart 기능 function_restart_mysql () { printf와 "다시 시작 MySQL의 ... \ n" function_stop_mysql의 수면이 function_start_mysql } 경우 $ (1) 시작) function_start_mysql ; )를 중지 function_stop_mysql ; 경우 [! -e "$의 mysql_sock"] 다음 의 printf "MySQL이 정지 ... \ n" 출구 다른 사람 의 printf "을 stoping MySQL의 ... \ n" $ {CmdPath} / mysqladmin 데이터 -u $ {mysql_user} -p $ {MYSQL_PWD} -S /data/${port}/mysql.sock 종료 Fi를 } #restart 기능 function_restart_mysql () { printf와 "다시 시작 MySQL의 ... \ n" function_stop_mysql의 수면이 function_start_mysql } 경우 $ (1) 시작) function_start_mysql ; 정지) function_stop_mysql의 다시 시작) function_restart_mysql ; *) 의 printf "사용법 : / 데이터 / $ {포트} / mysql을 {시작 | 중지 | 다시 시작} \ n" ESAC
3307 폴더 설명 :
#### 정력의 my.cnf
[클라이언트] 포트 = 3307 소켓 = /data/3307/mysql.sock [MySQL의] 노 자동 개작 [mysqld를] 사용자의 MySQL = 포트 = 3307 소켓 = /data/3307/mysql.sock BASEDIR = / 애플리케이션 / MySQL의 DATADIR 없다 = / 데이터 / 3307 / 데이터 open_files_limit = 1,024 back_log = 600 MAX_CONNECTIONS = 800 max_connect_errors = 3000 table_cache = 614 외부 로킹 = FALSE 의 max_allowed_packet = 8M sort_buffer_size = 1M join_buffer_size = 1M thread_cache_size = 100 thread_concurrency = 2 query_cache_type을 = 2M 는 query_cache_limit = 1M query_cache_min_res_unit = 2K #default_table_type = 이노 thread_stack = 192K #transaction_isolation = READ 커밋 tmp_table_size 변수 = 2M max_heap_table_size = 2M #long_query_time = 1 #log_long_format # 로그 오차 = /data/3307/error.log # 로그 - 느린 쿼리 = / 데이터 /3307/slow.log PID 파일 = /data/3307/mysql.pid # 로그 - 빈 = / 데이터 / 3307 / mysql을 - 빈 릴레이 로그 = / 데이터 / 3307 / 릴레이 빈 릴레이 로그 정보 파일 = /data/3307/relay-log.info 하고 binlog_cache_size = 1M max_binlog_cache_size = 1M 가 max_binlog_size = 2M expire_logs_days = 7 key_buffer_size = 16M read_buffer_size = 1M read_rnd_buffer_size = 1M bulk_insert_buffer_size = 1M #myisam_sort_buffer_size = 1M #myisam_max_sort_file_size = 10G의 #myisam_max_extra_sort_file_size = 10G의 #myisam_repair_threads = 1 #myisam_recover lower_case_table_names = 1 스킵 이름 해결의 노예 - 오류를 건너 뛰 = 1032,1062 복제 - 무시-dB = MySQL의 서버 ID = 3 innodb_additional_mem_pool_size = 4M의 innodb_buffer_pool_size = 32M의 innodb_data_file_path에 =을 ibdata1 : 128M : AUTOEXTEND innodb_file_io_threads = 4 에서 innodb_thread_concurrency = 8 에서 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 2M innodb_log_file_size = 4M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_file_per_table = 0 [mysqldump를] 빠른 의 max_allowed_packet = 2M [mysqld_safe를] 로그 오차 = / 데이터 / 3307 / mysql_oldboy3307.err의 PID = 파일 / 데이터 / 3307 / mysqld.pid
#### 정력 mysql을 ####
#! / 빈 / SH ############################################ ####은 2016년 12월 9일에서 liuliya에 의해 생성되는 스크립트 #이 #oldboy 전분기 : 865,205,026 #site : HTTP : //www.liuliya.com ################ ################################ #init의 포트 = 3307 mysql_user = "루트" MYSQL_PWD = "올드 보이" CmdPath = " / 애플리케이션 / MySQL은 / 빈 " mysql_sock ="/ 데이터 / $ {} 포트 /mysql.sock " #startup 기능 function_start_mysql () { [경우! -e "$의 mysql_sock"] 다음 의 printf "...부터의 MySQL \ n" / 빈 / sh 부 CmdPath $ {} / mysqld_safe에 --defaults = 파일 / 데이터 / $ 2 /my.cnf 포트 {}> & 1> 을 / dev / null & 종료 기능 #STOP ) (function_stop_mysql를 { [경우! -e "$의 mysql_sock"] 다음 의 printf "MySQL이 정지 ... \ n" 출구 다른 사람 의 printf "을 stoping MySQL의 ... \ n" $ {CmdPath} / mysqladmin 데이터 -u $ {mysql_user} -p $ {MYSQL_PWD} -S /data/${port}/mysql.sock 종료 Fi를 } #restart 기능 function_restart_mysql () { printf와 "다시 시작 MySQL의 ... \ n" function_stop_mysql의 수면이 function_start_mysql } 경우 $ (1) 시작) function_start_mysql ; )를 중지 function_stop_mysql ; 재시작) function_restart_mysql ; *) 의 printf "사용법 : / 데이터 / $ {포트} / mysql을 {시작 | 중지 | 다시 시작} \ n" ESAC
# MySQL의 실행 권한 증가하는 명령을 시작 find /data -type f -name "mysql"|xargs chmod +x
그룹 / 데이터 디렉토리입니다 # 변경을 chwon -R mysql.mysql /data/
5. MySQL 데이터베이스를 초기화 (MySQL의 라이브러리와 경영 테이블을로드)
[루트 @의 DB02 ~] # cd를 / 응용 프로그램 / mysql을 / 스크립트 / [루트 @의 DB02 스크립트] # 1!의 mysql_install_db가
# 3306의 인스턴스 초기화 [root@db02 scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
성공적으로 입증 반환이 확인
# 3307 인스턴스 초기화 [root@db02 scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3307/data --user=mysql
반환을이 입증 된 성공 OK
6. 시작 MySQL의
[루트 @의 DB02 스크립트] # / 데이터 / 3306 / mysql을 시작 [루트 @의 DB02 스크립트] # / 데이터 / 3307 / mysql을 시작
#보기 포트 netstat -lntup|grep 330
# mysql을 구성 환경 변수 cp /application/mysql/bin/* /usr/local/sbin/
#보기 환경 변수 echo $PATH
7. 로그 MySQL을 (양말 개발할 필요)
MySQL의 -S /data/3306/mysql.sock MySQL의 -S /data/3307/mysql.sock
8. 문제 해결 지침
1. 로그보기 cat mysql_oldboy3306.err
가 표시되지 해당 포트 Msyql 예를 시작 발견되면 2, 약간의 검사에 몇 초 정도 기다려주십시오, 서비스 MySQL의 몇 가지 다른 웹보다 느린를 시작합니다.
PS : 항상 로그를 실행중인 서비스를 확인 좋은 습관뿐만 아니라 마스터가 될 수있는 유일한 방법입니다.
처음부터 9. 부팅
특정 명령 :
에코 "// MySQL의 mutil 인스턴스">>은 / etc / rc.local에 에코 "/ 데이터 / 3306 / MySQL을 시작">>은 / etc / rc.local에 에코 "/ 데이터 / 3307 / MySQL의 시작 '>>은 / etc / RC .노동 조합 지부
어떻게 MySQL 인스턴스 추가
명령의 특정 세트를 :
에서 mkdir -p / 데이터 / 3308 / 데이터 \의 CP /data/3306/my.cnf / 데이터 / 3308 / \ CP / 데이터 / 3306 / mysql을 / 데이터 / 3308 / CD 3308 / SED -i의 / / 3308 3306 / g '/data/3308/my.cnf SED -I'S / 서버 ID = 1 / 서버 ID = 8 / g '/data/3308/my.cnf SED -I'S / 3,308분의 3,306 / g ' / 데이터 / 3308 / MySQL을 대한 Chown -R mysql.mysql / 데이터 / 3308 chmod를 700 / 데이터 / 3308 / MySQL을
# MySQL 데이터베이스 인스턴스 초기화 (3308)
[루트 @의 DB02 ~] # cd를 / 응용 프로그램 / mysql을 / 스크립트 /
# 3306의 인스턴스 초기화 [root@db02 scripts]# ./mysql_install_db --basedir=/application/mysql --datadir=/data/3308/data --user=mysql
데이터베이스 인스턴스를 시작 # 3308을/data/3308/mysql start