Centos7에서 MySQL 여러 마스터와 하나의 슬레이브를 구성하는 방법

PHPz
풀어 주다: 2023-06-01 11:19:05
앞으로
1267명이 탐색했습니다.

비즈니스 시나리오:

회사의 여러 주요 비즈니스가 독립적이고 서로 다른 데이터베이스 서버에 배치되어 있지만 공동 쿼리 통계를 위해 하나의 비즈니스가 여러 비즈니스 라이브러리와 연결되어야 합니다. 이때 통계를 위해 다양한 비즈니스 데이터베이스 데이터를 슬레이브 데이터베이스에 동기화해야 합니다. mysql 마스터-슬레이브 동기화 원칙에 따라 여러 슬레이브와 하나의 마스터 솔루션이 사용됩니다. 메인 라이브러리는 innodb 엔진을 사용하고, 슬레이브 라이브러리는 myisam 엔진을 사용하여 여러 인스턴스를 열고 여러 인스턴스의 데이터를 동일한 디렉터리에 동기화하며 플러시 테이블을 통해 한 인스턴스에 있는 다른 인스턴스의 데이터에 액세스합니다.

솔루션 아이디어:

1. 기본 데이터베이스에 innodb 엔진을 사용하고 sql_mode를 no_auto_create_user
2로 설정하고 다음을 통해 여러 마스터 라이브러리의 데이터를 동일한 데이터 디렉터리에 동기화합니다. 마스터-슬레이브 복제. 슬레이브 라이브러리의 각 인스턴스는 마스터 라이브러리에 해당합니다. 여러 인스턴스가 동일한 데이터 디렉터리를 사용합니다.
3. 데이터베이스에서 myisam 엔진을 사용하고 데이터베이스에서 기본 innodb 엔진을 닫습니다. myisam 엔진은 동일한 데이터 디렉터리에 있는 다른 인스턴스의 테이블에 액세스할 수 있습니다.
4. 슬레이브 라이브러리의 각 인스턴스는 다른 인스턴스 테이블의 데이터 변경 사항을 확인하기 위해 플러시 테이블을 실행해야 합니다. 기본 인스턴스가 프로그램에 연결되도록 매분 첫 번째 인스턴스에서 테이블을 새로 고치도록 설정할 수 있습니다. 다양한 테이블의 데이터를 실시간으로 볼 수 있습니다.
5. 메인 라이브러리와 슬레이브 라이브러리의 sql_mode를 no_auto_create_user로 설정해야 메인 라이브러리의 innodb 엔진의 SQL이 슬레이브 라이브러리에 동기화되어 성공적으로 실행될 수 있습니다.

프로젝트 아키텍처 다이어그램:

Centos7에서 MySQL 여러 마스터와 하나의 슬레이브를 구성하는 방법

환경 설명:

메인 라이브러리-1: 192.168.1.1
메인 라이브러리-2: 192.168.1.2
슬레이브 라이브러리-3: 1 92.168.1.3
에서 library -3: 192.168.1.4
Slave library -3: 192.168.1.5

구현 단계: (mysql 설치 단계는 여기에 설명되어 있지 않습니다.)

1. 기본 데이터베이스 구성 파일, 서버를 제외하고 여러 개의 기본 데이터베이스 구성 파일을 사용할 수 없습니다. -id 다른 모든 것은 동일합니다.

[root@masterdb01 ~]#cat /etc/my.cnf
[client]
port= 3306
socket= /tmp/mysql.sock
[mysqld]
port = 3306
basedir = /usr/local/mysql
datadir = /data/mysql
character-set-server = utf8mb4
default-storage-engine = innodb
socket = /tmp/mysql.sock
skip-name-resolv = 1
open_files_limit = 65535 
back_log = 103
max_connections = 512
max_connect_errors = 100000
table_open_cache = 2048
tmp-table-size  = 32m
max-heap-table-size = 32m
#query-cache-type = 0
query-cache-size = 0
external-locking = false
max_allowed_packet = 32m
sort_buffer_size = 2m
join_buffer_size = 2m
thread_cache_size = 51
query_cache_size = 32m
tmp_table_size = 96m
max_heap_table_size = 96m
query_cache_type=1
log-error=/data/logs/mysqld.log
slow_query_log = 1
slow_query_log_file = /data/logs/slow.log
long_query_time = 0.1
# binary logging #
server-id = 1
log-bin     = /data/binlog/mysql-bin
log-bin-index  =/data/binlog/mysql-bin.index
expire-logs-days = 14
sync_binlog = 1
binlog_cache_size = 4m
max_binlog_cache_size = 8m
max_binlog_size = 1024m
log_slave_updates
#binlog_format = row 
binlog_format = mixed  //这里使用的混合模式复制
relay_log_recovery = 1
#不需要同步的表
replicate-wild-ignore-table=mydb.sp_counter
#不需要同步的库
replicate-ignore-db = mysql,information_schema,performance_schema
key_buffer_size = 32m
read_buffer_size = 1m
read_rnd_buffer_size = 16m
bulk_insert_buffer_size = 64m
myisam_sort_buffer_size = 128m
myisam_max_sort_file_size = 10g
myisam_repair_threads = 1
myisam_recover
transaction_isolation = repeatable-read
innodb_additional_mem_pool_size = 16m
innodb_buffer_pool_size = 5734m
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path = ibdata1:1024m:autoextend
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32m
innodb_log_file_size = 2g
innodb_log_files_in_group = 2
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_max_dirty_pages_pct = 50
innodb_flush_method = o_direct
innodb_file_format = barracuda
innodb_file_format_max = barracuda
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_locks_unsafe_for_binlog = 0
[mysqldump]
quick
max_allowed_packet = 32m
로그인 후 복사

2. 슬레이브 라이브러리 구성 파일. 여러 슬레이브 구성 파일은 server-id를 제외하고 동일해야 합니다.

[root@slavedb01 ~]# cat /etc/my.cnf
[client]
port= 3306
socket= /tmp/mysql.sock
[mysqld_multi]
# 指定相关命令的路径
mysqld   = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
##复制主库1的数据##
[mysqld2]
port = 3306
basedir = /usr/local/mysql
datadir = /data/mysql
character-set-server = utf8mb4
#指定实例1的sock文件和pid文件
socket = /tmp/mysql.sock
pid-file=/data/mysql/mysql.pid
skip-name-resolv = 1
open_files_limit = 65535 
back_log = 103
max_connections = 512
max_connect_errors = 100000
table_open_cache = 2048
tmp-table-size  = 32m
max-heap-table-size = 32m
query-cache-size = 0
external-locking = false
max_allowed_packet = 32m
sort_buffer_size = 2m
join_buffer_size = 2m
thread_cache_size = 51
query_cache_size = 32m
tmp_table_size = 96m
max_heap_table_size = 96m
query_cache_type=1
#指定第一个实例的错误日志和慢查询日志路径
log-error=/data/logs/mysqld.log
slow_query_log = 1
slow_query_log_file = /data/logs/slow.log
long_query_time = 0.1
# binary logging#
# 指定实例1的binlog和relaylog路径为/data/binlog目录
# 每个从库和每个实例的server_id不能一样。
server-id = 2
log-bin     = /data/binlog/mysql-bin
log-bin-index  =/data/binlog/mysql-bin.index
relay_log = /data/binlog/mysql-relay-bin
relay_log_index = /data/binlog/mysql-relay.index
master-info-file = /data/mysql/master.info
relay_log_info_file = /data/mysql/relay-log.info
read_only = 1
expire-logs-days = 14
sync_binlog = 1
#需要同步的库,如果不设置,默认同步所有库。
#replicate-do-db = xxx
#不需要同步的表
replicate-wild-ignore-table=mydb.sp_counter
#不需要同步的库
replicate-ignore-db = mysql,information_schema,performance_schema
binlog_cache_size = 4m
max_binlog_cache_size = 8m
max_binlog_size = 1024m
log_slave_updates =1
#binlog_format = row 
binlog_format = mixed
relay_log_recovery = 1
key_buffer_size = 32m
read_buffer_size = 1m
read_rnd_buffer_size = 16m
bulk_insert_buffer_size = 64m
myisam_sort_buffer_size = 128m
myisam_max_sort_file_size = 10g
myisam_repair_threads = 1
myisam_recover
#设置默认引擎为myisam,下面这些参数一定要加上。
default-storage-engine=myisam
default-tmp-storage-engine=myisam
#关闭innodb引擎
skip-innodb
innodb = off
disable-innodb
#设置sql_mode模式为no_auto_create_user
sql_mode = no_auto_create_user
#关闭innodb引擎
loose-skip-innodb
loose-innodb-trx=0 
loose-innodb-locks=0 
loose-innodb-lock-waits=0 
loose-innodb-cmp=0 
loose-innodb-cmp-per-index=0
loose-innodb-cmp-per-index-reset=0
loose-innodb-cmp-reset=0 
loose-innodb-cmpmem=0 
loose-innodb-cmpmem-reset=0 
loose-innodb-buffer-page=0 
loose-innodb-buffer-page-lru=0 
loose-innodb-buffer-pool-stats=0 
loose-innodb-metrics=0 
loose-innodb-ft-default-stopword=0 
loose-innodb-ft-inserted=0 
loose-innodb-ft-deleted=0 
loose-innodb-ft-being-deleted=0 
loose-innodb-ft-config=0 
loose-innodb-ft-index-cache=0 
loose-innodb-ft-index-table=0 
loose-innodb-sys-tables=0 
loose-innodb-sys-tablestats=0 
loose-innodb-sys-indexes=0 
loose-innodb-sys-columns=0 
loose-innodb-sys-fields=0 
loose-innodb-sys-foreign=0 
loose-innodb-sys-foreign-cols=0
 
 
##复制主库2的数据##
[mysqld3]
port = 3307
basedir = /usr/local/mysql
datadir = /data/mysql
character-set-server = utf8mb4
#指定实例2的sock文件和pid文件
socket = /tmp/mysql3.sock
pid-file=/data/mysql/mysql3.pid
skip-name-resolv = 1
open_files_limit = 65535 
back_log = 103
max_connections = 512
max_connect_errors = 100000
table_open_cache = 2048
tmp-table-size  = 32m
max-heap-table-size = 32m
query-cache-size = 0
external-locking = false
max_allowed_packet = 32m
sort_buffer_size = 2m
join_buffer_size = 2m
thread_cache_size = 51
query_cache_size = 32m
tmp_table_size = 96m
max_heap_table_size = 96m
query_cache_type=1
log-error=/data/logs/mysqld3.log
slow_query_log = 1
slow_query_log_file = /data/logs/slow3.log
long_query_time = 0.1
# binary logging #
# 这里一定要注意,不能把两个实例的binlog和relaylog放到同一个目录,
# 这里指定实例2的binlog日志为/data/binlog2目录
# 每个从库和每个实例的server_id不能一样。
server-id = 22
log-bin     = /data/binlog2/mysql-bin
log-bin-index  =/data/binlog2/mysql-bin.index
relay_log = /data/binlog2/mysql-relay-bin
relay_log_index = /data/binlog2/mysql-relay.index
master-info-file = /data/mysql/master3.info
relay_log_info_file = /data/mysql/relay-log3.info
read_only = 1
expire-logs-days = 14
sync_binlog = 1
#不需要复制的库
replicate-ignore-db = mysql,information_schema,performance_schema
binlog_cache_size = 4m
max_binlog_cache_size = 8m
max_binlog_size = 1024m
log_slave_updates =1
#binlog_format = row 
binlog_format = mixed
relay_log_recovery = 1
key_buffer_size = 32m
read_buffer_size = 1m
read_rnd_buffer_size = 16m
bulk_insert_buffer_size = 64m
myisam_sort_buffer_size = 128m
myisam_max_sort_file_size = 10g
myisam_repair_threads = 1
myisam_recover
#设置默认引擎为myisam
default-storage-engine=myisam
default-tmp-storage-engine=myisam
#关闭innodb引擎
skip-innodb
innodb = off
disable-innodb
#设置sql_mode模式为no_auto_create_user
sql_mode = no_auto_create_user
#关闭innodb引擎,下面这些参数一定要加上。
loose-skip-innodb
loose-innodb-trx=0 
loose-innodb-locks=0 
loose-innodb-lock-waits=0 
loose-innodb-cmp=0 
loose-innodb-cmp-per-index=0
loose-innodb-cmp-per-index-reset=0
loose-innodb-cmp-reset=0 
loose-innodb-cmpmem=0 
loose-innodb-cmpmem-reset=0 
loose-innodb-buffer-page=0 
loose-innodb-buffer-page-lru=0 
loose-innodb-buffer-pool-stats=0 
loose-innodb-metrics=0 
loose-innodb-ft-default-stopword=0 
loose-innodb-ft-inserted=0 
loose-innodb-ft-deleted=0 
loose-innodb-ft-being-deleted=0 
loose-innodb-ft-config=0 
loose-innodb-ft-index-cache=0 
loose-innodb-ft-index-table=0 
loose-innodb-sys-tables=0 
loose-innodb-sys-tablestats=0 
loose-innodb-sys-indexes=0 
loose-innodb-sys-columns=0 
loose-innodb-sys-fields=0 
loose-innodb-sys-foreign=0 
loose-innodb-sys-foreign-cols=0
[mysqldump]
quick
max_allowed_packet = 32m
```
로그인 후 복사

3. 기본 라이브러리 sql_mode를 설정합니다. 기본적으로 mysql5.6은 시작 파일에 sql_mode를 설정해야 적용됩니다.

# cat /etc/init.d/mysqld
#other_args="$*"  # uncommon, but needed when called from an rpm upgrade action
      # expected: "--skip-networking --skip-grant-tables"
      # they are not checked here, intentionally, as it is the resposibility
      # of the "spec" file author to give correct arguments only.
#将上面默认的#other_args开启后改为
other_args="--sql-mode=no_auto_create_user"
로그인 후 복사

4. 마스터 및 슬레이브 데이터베이스를 활성화합니다.

#主库
service mysqld start
#开启从库的二个实例
/usr/local/mysql/bin/mysqld_multi start 2
/usr/local/mysql/bin/mysqld_multi start 3
로그인 후 복사

5. 두 마스터 데이터베이스의 복사 계정을 각각 승인합니다.

#需要授权三个从库的ip可以同步
mysql> grant replication slave on *.* to rep@'192.168.1.3' identified by 'rep123';
mysql> grant replication slave on *.* to rep@'192.168.1.4' identified by 'rep123';
mysql> grant replication slave on *.* to rep@'192.168.1.5' identified by 'rep123';
mysql> flush privileges;
로그인 후 복사

6.

#进入第一个实例执行
$ mysql -s /tmp/mysql.sock
mysql> change master to master_host='192.168.1.1',master_user='rep',master_password='rep123',master_log_file='mysql-bin.000001',master_log_pos=112;
 
#进入第二个实例执行
$ mysql -s /tmp/mysql3.sock
mysql> change master to master_host='192.168.1.2',master_user='rep',master_password='rep123',master_log_file='mysql-bin.000001',master_log_pos=112;
로그인 후 복사

7. 데이터 동기화 테스트

두 개의 마스터 데이터베이스에 각각 테이블을 생성하고 데이터를 삽입해 보세요. 슬레이브 데이터베이스를 확인하면 두 개의 마스터 데이터베이스가 동일한 슬레이브 데이터베이스의 모든 데이터를 동기화한 것을 확인할 수 있습니다.

8. 매분마다 첫 번째 인스턴스의 테이블을 새로 고치도록 각 슬레이브 서버에 작업 일정을 설정하세요.

# crontab -l
*/1 * * * * mysql -s /tmp/mysql.sock -e 'flush tables;'
로그인 후 복사

mysql5.6

1에서 여러 마스터와 하나의 슬레이브의 함정. 6은 innodb 기본적으로 마스터와 슬레이브의 sql_mode 모드에서 no_engine_substitution 매개변수는 동기화 중에 꺼야 합니다. 슬레이브 데이터베이스의 SQL에 대한 innodb 동기화를 끄지 않으면 innodb 엔진을 찾을 수 없으며 동기화가 실패합니다.

2. mysql5.6의 여러 인스턴스를 열면 기본적으로 처음 시작될 때 데이터베이스의 설치 디렉터리(/usr/local/mysql/)에 my.cnf 구성 파일이 생성됩니다. , 데이터베이스 설치가 디렉터리의 구성 파일을 먼저 읽습니다. 결과적으로 여러 인스턴스가 적용되지 않습니다.

위 내용은 Centos7에서 MySQL 여러 마스터와 하나의 슬레이브를 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿