配置mysql基于gtid主主复制架构 环境: 操作系统 centos7.5 x86_64 mysql版本:Percona-Server-5.7.21-21 测试环境: node1 10.11.0.210 node2 10.11.0.212 一、二进制安装percona-mysql5.7 [root@node5 data]# tar -zxf Percona-Server-5.7.21-21-Linux.x86_64.ssl101.tar.gz [root@node5 data]# mv Percona-Server-5.7.21-21-Linux.x86_64.ssl101 percona-server-5.7.21-21 [root@node5 data]# mv percona-server-5.7.21-21 /usr/local/ [root@node5 local]# cd /usr/local/ [root@node5 local]# ln -s percona-server-5.7.21-21 mysql # 添加用户 useradd -u 501 -G users -s /sbin/nologin -M -d /usr/local/mysql/bin mysql mkdir -p /data/mysql_data # 编辑配置 vim /etc/my.cnf [client] port = 3306 socket = /tmp/mysql.sock # The MySQL server [mysqld] user = mysql port = 3306 bind-address = 0.0.0.0 socket = /tmp/mysql.sock datadir = /data/mysql_data pid-file = /data/mysql_data/mysql.pid skip-external-locking #memory is 16G #key_buffer_size = 16M key_buffer_size = 32M #table_open_cache = 64 table_open_cache = 1024 innodb_open_files = 450 #sort_buffer_size = 512K sort_buffer_size = 2M #net_buffer_length = 4K net_buffer_length = 32K #read_buffer_size = 256K read_buffer_size = 2M #read_rnd_buffer_size = 4M read_rnd_buffer_size = 8M #myisam_sort_buffer_size = 4M myisam_sort_buffer_size = 32M thread_cache_size = 800 query_cache_size = 32M query_cache_type = 1 max_write_lock_count = 300 skip-name-resolve wait_timeout = 120 interactive_timeout = 120 max_connections = 400 max_connect_errors = 10000 max_allowed_packet = 320M back_log = 1024 log_timestamps = system sync_binlog = 1 #当链接数耗尽后,通过设置别用端口,让root可以登录 extra_max_connections = 2 extra_port = 13306 ##让mysql不区分大小写敏感 lower_case_table_names = 1 character_set_server = utf8mb4 performance_schema = ON #for FULLTEXT index , if your progrom used fulltext index please change the value your want. #ft_min_word_len = 1 #ft_max_work_len = 10 slave-skip-errors = 1062,1032 #if the query is exec time great than 2 seconds, the query will log to slow log if slowlog is enabled. long_query_time = 0.5 slow_query_log = on slow-query-log-file = /data/mysql_data/slow.log #skip-networking # Replication Master Server (default) # binary logging is required for replication log-bin = mysql-bin expire_logs_days = 8 log_error = error.log log_warnings = 1 # binary logging format - mixed recommended binlog_format = row #binlog_format=mixed relay-log = mysql-relay-bin auto-increment-increment = 2 auto-increment-offset = 1 skip_slave_start # required unique id between 1 and 2^32 - 1 # defaults to 1 if master-host is not set # but will not function as a master if omitted #server-id = 9662945782 server-id = 210 sql-mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" #sync_binlog = 2 ##### Replication ##### replicate-ignore-db = mysql replicate-ignore-db = information_schema replicate-ignore-db = performance_schema replicate-ignore-db = sys replicate-ignore-db = undolog replicate-ignore-db = for_nagios replicate_wild_ignore_table = mysql.% replicate_wild_ignore_table = information_schema.% replicate_wild_ignore_table = performance_schema.% replicate_wild_ignore_table = sys.% log-slave-updates #skip-slave-start #skip-grant-tables ###rds-ecs,此处配置根据rds的配置来进行设置 innodb_data_file_path = ibdata1:200M:autoextend innodb_log_files_in_group = 2 innodb_log_file_size = 1572864000 master-info-repository = TABLE ###Slave配置需要 relay-log-info_repository = TABLE ###Slave配置需要 binlog-format =ROW ####Slave配置需要 gtid-mode = on ###开启GTID需要 enforce-gtid-consistency = true ###开启GTID需要 slave-sql-verify-checksum = 1 relay-log-index = relay-log-index relay-log-recovery = ON slave-sql-verify-checksum = 1 #innodb_fast_checksum = false #innodb_page_size = 16384 #innodb_log_block_size = 512 #innodb_checksum_algorithm = crc32 #innodb_log_checksum_algorithm = strict_crc32 ##### # Uncomment the following if you are using InnoDB tables innodb_data_home_dir = /data/mysql_data #innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend innodb_log_group_home_dir = /data/mysql_data #innodb_undo_directory = /data/mysql_data/undolog/ #innodb_undo_logs = 128 #innodb_undo_tablespaces = 3 # You can set .._buffer_pool_size up to 50 - 80 % # of RAM but beware of setting memory usage too high innodb_buffer_pool_size = 1G innodb_buffer_pool_instances = 1 #innodb_additional_mem_pool_size = 8M # Set .._log_file_size to 25 % of buffer pool size #innodb_log_file_size = 256M innodb_log_buffer_size = 64M #innodb_log_files_in_group = 3 innodb_flush_log_at_trx_commit = 2 innodb_lock_wait_timeout = 30 innodb_file_per_table = 1 innodb_thread_concurrency = 4 innodb_max_dirty_pages_pct = 75 innodb_flush_method = O_DIRECT innodb_purge_threads = 4 innodb_large_prefix = 1 innodb_read_io_threads = 16 innodb_write_io_threads = 16 innodb_io_capacity = 1000 innodb_io_capacity_max = 2000 thread_pool_size = 8 thread_handling = pool-of-threads thread_pool_oversubscribe = 40 thread_pool_stall_limit = 100 thread_pool_max_threads = 60 #解释: 在启动时把热数据加载到内存。 innodb_buffer_pool_load_at_startup = 1 ##解释: 在关闭时把热数据dump到本地磁盘 innodb_buffer_pool_dump_at_shutdown = 1 [mysqldump] quick max_allowed_packet = 320M [mysql] no-auto-rehash # Remove the next comment character if you are not familiar with SQL #safe-updates [myisamchk] #key_buffer_size = 20M #sort_buffer_size = 20M key_buffer_size = 200M sort_buffer_size = 200M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout 将mysql命令加入环境变量中 vim /etc/profile export PATH=/usr/local/mysql/bin:$PATH [root@node02 local]# source /etc/profile # 修改权限 chown -R mysql.mysql /data/mysql_data 初始化MySQL数据库的数据文件路径,并且创建系统表,5.7.6及以上版本,要使用mysqld来初始化数据库 [root@node5 local]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize-insecure --user=mysql [root@node5 local]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql [root@node5 local]# chmod +x /etc/init.d/mysql 修改启动脚本 vim /etc/init.d/mysql basedir=/usr/local/mysql datadir=/data/mysql_data 启动mysql /etc/init.d/mysql start 设置root密码,默认密码为空 mysql> set password = password('root'); Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> flush privileges; 三、通过gtid的方式配置mysql主主复制 node1配置片段: # server-id不能相同 server-id = 210 # 步长 auto-increment-increment = 2 # 起始值 auto-increment-offset = 1 #不要自动启用slave skip_slave_start log-slave-updates = ON master-info-repository = TABLE ###Slave配置需要 relay-log-info_repository = TABLE ###Slave配置需要 binlog-format =ROW ####Slave配置需要 gtid-mode = on ###开启GTID需要 enforce-gtid-consistency = true ###开启GTID需要 binlog-checksum = CRC32 master-verify-checksum = 1 node2配置片段: # server-id不能相同 server-id = 212 # 步长 auto-increment-increment = 2 # 起始值不能相同 auto-increment-offset = 2 #不要自动启用slave skip_slave_start log-slave-updates = ON master-info-repository = TABLE ###Slave配置需要 relay-log-info_repository = TABLE ###Slave配置需要 binlog-format =ROW ####Slave配置需要 gtid-mode = on ###开启GTID需要 enforce-gtid-consistency = true ###开启GTID需要 binlog-checksum = CRC32 master-verify-checksum = 1 说明: auto_increment_offset表示自增长字段从那个数开始,他的取值范围是1 .. 65535 auto_increment_increment表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535 # node1和node2上添加复制的账户 GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'10.11.0.%' IDEnTIFIED BY 'replpass'; FLUSH PRIVILEGES; 查看主库与从库的GTID是否开启 mysql> show variables like '%gtid%'; +----------------------------------+-----------+ | Variable_name | Value | +----------------------------------+-----------+ | binlog_gtid_simple_recovery | ON | | enforce_gtid_consistency | ON | | gtid_executed_compression_period | 1000 | | gtid_mode | ON | | gtid_next | AUTOMATIC | | gtid_owned | | | gtid_purged | | | session_track_gtids | OFF | +----------------------------------+-----------+ mysql> show variables like '%gtid_next%'; +---------------+-----------+ | Variable_name | Value | +---------------+-----------+ | gtid_next | AUTOMATIC | +---------------+-----------+ 1 row in set (0.00 sec) 查看服务器server_uuid mysql> show variables like '%uuid%'; +---------------+--------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------+ | server_uuid | ea04f6f3-631c-11e8-9eac-000c29ff3eec | +---------------+--------------------------------------+ 1 row in set (0.00 sec) 查看主服务器状态,如果Executed_Gtid_Set字段为空,则可能配置错误需要自行检查配置 mysql> show master status; +------------------+----------+--------------+------------------+------------------------------------------------------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------------------------------------------------+ | mysql-bin.000003 | 1365 | | | 0fae39d0-6f7f-11e8-86ee-000c29ff3eec:1-4, b9d0f27b-6f80-11e8-87ae-000c292cb7df:1-6 | +------------------+----------+--------------+------------------+------------------------------------------------------------------------------------+ 配置node1连接至主库node2 mysql> CHANGE MASTER TO MASTER_HOST='10.11.0.212',MASTER_USER='repl',MASTER_PASSWORD='replpass',MASTER_AUTO_POSITION=1; 在从服务器上启动复制 mysql> START SLAVE; 启动成功后查看SLAVE的状态 配置node2连接至主库node1 mysql> CHANGE MASTER TO MASTER_HOST='10.11.0.210',MASTER_USER='repl',MASTER_PASSWORD='replpass',MASTER_AUTO_POSITION=1; 在从服务器上启动复制 mysql> START SLAVE; 启动成功后查看SLAVE的状态 mysql> SHOW SLAVE STATUS\G ... Slave_IO_Running: Yes Slave_SQL_Running: Yes ... 确认 Slave_IO_Running 和 Slave_SQL_Running 两个参数都为 Yes 状态。 测试GTID主主复制 在主库(node1)实例创建一些数据,node2能够正常识别并且是隔一个数依次增加的 mysql> create database wanxing; Query OK, 1 row affected (0.01 sec) mysql> use wanxing; Database changed mysql> create table users(id int primary key auto_increment, name varchar(30)); Query OK, 0 rows affected (0.01 sec) mysql> select * from users; +----+------+ | id | name | +----+------+ | 2 | jack | | 4 | tom | +----+------+ 2 rows in set (0.00 sec) mysql> insert into users(name) values('lucy'),('lily'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from users; +----+------+ | id | name | +----+------+ | 2 | jack | | 4 | tom | | 5 | lucy | | 7 | lily | +----+------+ 4 rows in set (0.00 sec) mysql> insert into users(name) values('aa'),('bb'); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from users; +----+------+ | id | name | +----+------+ | 2 | jack | | 4 | tom | | 5 | lucy | | 7 | lily | | 9 | aa | | 11 | bb | +----+------+ 6 rows in set (0.00 sec)