비즈니스 시나리오:
회사의 여러 주요 비즈니스가 독립적이고 서로 다른 데이터베이스 서버에 배치되어 있지만 공동 쿼리 통계를 위해 하나의 비즈니스가 여러 비즈니스 라이브러리와 연결되어야 합니다. 이때 통계를 위해 다양한 비즈니스 데이터베이스 데이터를 슬레이브 데이터베이스에 동기화해야 합니다. 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이 슬레이브 라이브러리에 동기화되어 성공적으로 실행될 수 있습니다.
프로젝트 아키텍처 다이어그램:
환경 설명:
메인 라이브러리-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 중국어 웹사이트의 기타 관련 기사를 참조하세요!