先介绍下自己,从事软件开发有好多年,之前都是用到就用了,也没详细记录过,经常发现同样的错误出现的时候,还是会有点懵,真是应景了一句话,好记性不如烂笔头。好了,先不先扯淡了,进入本文主题吧。
本文使用Percona搭建MySQL5.7集群。首先,先在Percona官网下载对应的文件,下面是文件清单:
Percona-Server-server-57-5.7.34-37.1.el7.x86_64.rpm
Percona-Server-client-57-5.7.34-37.1.el7.x86_64.rpm
Percona-Server-devel-57-5.7.34-37.1.el7.x86_64.rpm
Percona-Server-shared-57-5.7.34-37.1.el7.x86_64.rpm
Percona-Server-shared-compat-57-5.7.34-37.1.el7.x86_64.rpm
percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm
准备三台Linux服务器,我这里分别是192.168.8.6(主)、192.168.8.7(从)、192.168.8.8(从)。
三台机器分别安装Percona
yum localinstall -y Percona-Server-server-57-5.7.34-37.1.el7.x86_64.rpm Percona-Server-client-57-5.7.34-37.1.el7.x86_64.rpm Percona-Server-devel-57-5.7.34-37.1.el7.x86_64.rpm Percona-Server-shared-57-5.7.34-37.1.el7.x86_64.rpm Percona-Server-shared-compat-57-5.7.34-37.1.el7.x86_64.rpmyum localinstall -y percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm配置三个节点的hosts
#三台机器IP 主机名192.168.8.6 l8-6-t-pbs192.168.8.7 l8-7-t-pbs192.168.8.8 l8-8-t-pbs配置my.cnf,三个节点都要配置
下面文件是8.6节点上的,其他两台类似。标记需要替换的地方
[mysqld]datadir=/data/mysql/mysqlsocket=/data/mysql/mysql/mysql.socklog-error=/data/logs/mysql/mysqld.logslow_query_log_file=/data/logs/mysql/mysql_slow.logpid-file=/data/mysql/mysql/mysqld.pidtmpdir=/data/tmpsecure-file-priv=/data/secdatalocal_infile=OFF#general_log = 1#general_log_file = /data/logs/mysql/mysql_general.logextra_port=6034extra_max_connections=20max_connections = 4096max_user_connections = 0max_connect_errors = 10000max_allowed_packet = 128Mtable_open_cache=4000table_open_cache_instances=10table_definition_cache = 4096table_open_cache_instances = 64character_set_server=utf8mb4show_compatibility_56 = onexplicit_defaults_for_timestamp = 1event_scheduler = 1log_timestamps=SYSTEMdefault-time-zone = '+08:00'symbolic-links=0transaction_isolation=READ-UNCOMMITTEDskip-name-resolveread_only=1#lower_case_table_names=1group_concat_max_len=10240wait_timeout=3600interactive_timeout=3600query_cache_size=0slow_query_log=onlog_output='table,file'long_query_time=0.4log_queries_not_using_indexes=0log_throttle_queries_not_using_indexes=100min_examined_row_limit=5000log_slow_admin_statements=1log_slow_slave_statements=1innodb_online_alter_log_max_size=1Ginnodb_buffer_pool_size=4G ##机器内存60%innodb_buffer_pool_instances=8innodb_file_per_tableinnodb_purge_threads = 4innodb_large_prefix = 1innodb_print_all_deadlocks = 1innodb_autoinc_lock_mode = 2innodb_log_file_size=1Ginnodb_log_buffer_size = 32Minnodb_flush_method = O_DIRECTinnodb_flush_neighbors = 0innodb_undo_logs = 128innodb_undo_tablespaces = 3innodb_max_undo_log_size=1Ginnodb_undo_log_truncate = 1innodb_purge_threads = 4 #cpus <=8 :4 cpus >= 16: cpus/4innodb_read_io_threads = 4 #cpus <=8 :4 cpus >= 16: cpus/4innodb_write_io_threads = 4 #cpus <=8 :4 cpus >= 16: cpus/4innodb_page_cleaners = 4 #cpus <=8 :4 cpus >= 16: cpus/4innodb_io_capacity=10000innodb_io_capacity_max=20000# perforamnce_schema settingsperformance-schema-instrument='memory/%=COUNTED'performance_schema_digests_size = 40000performance_schema_max_table_instances = 40000performance_schema_max_sql_text_length = 4096performance_schema_max_digest_length = 4096server_id=#{server_id} #需要替换的地方gtid_mode=ONenforce_gtid_consistency=ONmaster_info_repository=TABLE#rpl_semi_sync_master_enabled = 1#rpl_semi_sync_master_timeout = 3000#rpl_semi_sync_slave_enabled = 1relay_log_info_repository=TABLEslave_pending_jobs_size_max=104857600slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN'slave_preserve_commit_order=1slave-parallel-type=LOGICAL_CLOCKslave-parallel-workers=0binlog_checksum=NONElog_slave_updates=ONlog_bin=binlogrelay_log=relaylogexpire_logs_days=15binlog_format=ROWbinlog_rows_query_log_events = 1log_bin_trust_function_creatorstransaction_write_set_extraction=XXHASH64#group_replication_exit_state_action='ABORT_SERVER'#group_replication_compression_threshold = 131072#group_replication_transaction_size_limit = 104857600#group_replication_unreachable_majority_timeout = 60#group_replication_group_name="#{group_name}" #需要替换的地方,必须是uuid ,三个节点相同#group_replication_start_on_boot=off#group_replication_local_address= "192.168.8.6:13306" #本机IP 端口不变 .当前服务器的IP#group_replication_group_seeds='192.168.8.6:13306,192.168.8.7:13306,192.168.8.8:13306' #三台机器IP#group_replication_bootstrap_group=off#group_replication_ip_whitelist="192.168.8.6,192.168.8.7,192.168.8.8" #机器IP网段#group_replication_flow_control_mode='DISABLED'[client]socket=/data/mysql/mysql/mysql.sock创建文件,三个节点都要执行
mkdir -p /data/mysql/mysqlmkdir -p /data/logs/mysqlmkdir -p /data/tmpmkdir -p /data/secdatamkdir -p /data/baklogtouch /data/logs/mysql/mysqld.logchown mysql.mysql -R /data/mysql/mysqlchown mysql.mysql -R /data/logs/mysqlchown mysql.mysql -R /data/tmpchown mysql.mysql -R /data/secdata启动服务
systemctl start mysqld在mysqld.log中找到password登录 mysql -u root -p重设root密码 mysql>alter user user() identified by "Test.123";安装插件
mysql>install PLUGIN group_replication SONAME 'group_replication.so';去掉my.cnf中group_replication开头的注释,然后重启mysql服务
systemctl restart mysqld创建账号
mysql>CREATE USER 'rpl_user'@'%' IDENTIFIED by 'Test.123' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;mysql>GRANT REPLICATION CLIENT, REPLICATION SLAVE, SELECT ON *.* TO 'rpl_user'@'%';组MGR
8.6节点(主节点)
mysql>reset master;mysql>reset slave;mysql>CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Bitauto.123' FOR CHANNEL 'group_replication_recovery';mysql>SET GLOBAL group_replication_bootstrap_group=ON;mysql>START GROUP_REPLICATION;mysql>SET GLOBAL group_replication_bootstrap_group=OFF;8.7,8.8节点(从节点)
mysql>reset master;mysql>reset slave;mysql>CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Bitauto.123' FOR CHANNEL 'group_replication_recovery';mysql>START GROUP_REPLICATION;创建视图,主节点
USE sys;DELIMITER $$CREATE FUNCTION IFZERO(a INT, b INT)RETURNS INTDETERMINISTICRETURN IF(a = 0, b, a)$$CREATE FUNCTION LOCATE2(needle TEXT(10000), haystack TEXT(10000), offset INT)RETURNS INTDETERMINISTICRETURN IFZERO(LOCATE(needle, haystack, offset), LENGTH(haystack) + 1)$$CREATE FUNCTION GTID_NORMALIZE(g TEXT(10000))RETURNS TEXT(10000)DETERMINISTICRETURN GTID_SUBTRACT(g, '')$$CREATE FUNCTION GTID_COUNT(gtid_set TEXT(10000))RETURNS INTDETERMINISTICBEGINDECLARE result BIGINT DEFAULT 0;DECLARE colon_pos INT;DECLARE next_dash_pos INT;DECLARE next_colon_pos INT;DECLARE next_comma_pos INT;SET gtid_set = GTID_NORMALIZE(gtid_set);SET colon_pos = LOCATE2(':', gtid_set, 1);WHILE colon_pos != LENGTH(gtid_set) + 1 DOSET next_dash_pos = LOCATE2('-', gtid_set, colon_pos + 1);SET next_colon_pos = LOCATE2(':', gtid_set, colon_pos + 1);SET next_comma_pos = LOCATE2(',', gtid_set, colon_pos + 1);IF next_dash_pos < next_colon_pos AND next_dash_pos < next_comma_pos THENSET result = result +SUBSTR(gtid_set, next_dash_pos + 1,LEAST(next_colon_pos, next_comma_pos) - (next_dash_pos + 1)) -SUBSTR(gtid_set, colon_pos + 1, next_dash_pos - (colon_pos + 1)) + 1;ELSESET result = result + 1;END IF;SET colon_pos = next_colon_pos;END WHILE;RETURN result;END$$CREATE FUNCTION gr_applier_queue_length()RETURNS INTDETERMINISTICBEGINRETURN (SELECT sys.gtid_count( GTID_SUBTRACT( (SELECTReceived_transaction_set FROM performance_schema.replication_connection_statusWHERE Channel_name = 'group_replication_applier' ), (SELECT@@global.GTID_EXECUTED) )));END$$CREATE FUNCTION gr_member_in_primary_partition()RETURNS VARCHAR(3)DETERMINISTICBEGINRETURN (SELECT IF( MEMBER_STATE='ONLINE' AND ((SELECT COUNT(*) FROMperformance_schema.replication_group_members WHERE MEMBER_STATE != 'ONLINE') >=((SELECT COUNT(*) FROM performance_schema.replication_group_members)/2) = 0),'YES', 'NO' ) FROM performance_schema.replication_group_members JOINperformance_schema.replication_group_member_stats USING(member_id));END$$CREATE VIEW gr_member_routing_candidate_status AS SELECTsys.gr_member_in_primary_partition() as viable_candidate,IF( (SELECT (SELECT GROUP_CONCAT(variable_value) FROMperformance_schema.global_variables WHERE variable_name IN ('read_only','super_read_only')) != 'OFF,OFF'), 'YES', 'NO') as read_only,sys.gr_applier_queue_length() as transactions_behind, Count_Transactions_in_queue as 'transactions_to_cert' from performance_schema.replication_group_member_stats;$$DELIMITER ;创建应用程序用户
GRANT ALL PRIVILEGES ON *.* TO 'cxt_test'@'%' IDENTIFIED BY 'Test.123' WITH GRANT OPTION;
到此,MGR高可用的MySQL5.7已经搭建完。后续文章会介绍在使用过程中遇到的问题,比如整个集群节点全部重启后处理方式,或者单从节点挂掉处理方式




