一:环境介绍
cenos 6.7 版本 数据库的版本5.7.19
二:部署规划单机多实例的部署
端口号 | 数据目录 | group_repplicatoon 通信接口 | |
3307 | /data/mysql/mysql_3306{data,logs,tmp} | 23307 | |
3308 | /data/mysql/mysql_3307{data,logs,tmp} | 23308 | |
3309 | /data/mysql/mysql_3308{data,logs,tmp} | 23309 |
环境的准备:
# cd /opt/mysql/
# tar zxvf /path/mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
# cd /usr/local
#ln -s /opt/mysql/mysql-5.7.19-linux-glibc2.12-x86_64 mysql
创建数据库实列需要的数据目录
# /data/mysql/mysql_3306/{data,logs,tmp}
# /data/mysql/mysql_3307/{data,logs,tmp}
#/data/mysql/mysql_3308/{data,logs,tmp}
更改目录的权限:
chown -R mysql:mysql /data/mysql/
配置文件:
#my.cnf[client]port = 3307socket = /tmp/mysql3307.sock[mysql]prompt="\\u@\\h:\\p [\\d]>#pager="less -i -n -S"#tee=/home/mysql/query.logno-auto-rehash[mysqld]#miscuser = mysqlbasedir = /usr/local/mysqldatadir = /data/mysql/mysql_3306/dataport = 3306socket = /tmp/mysql3306.sockevent_scheduler = 0tmpdir=/data/mysql/mysql_3306/tmp#timeoutinteractive_timeout = 300wait_timeout = 300#character setcharacter-set-server = utf8open_files_limit = 65535max_connections = 100max_connect_errors = 100000#explicit_defaults_for_timestamp#logslog-output=fileslow_query_log = 1slow_query_log_file = slow.loglog-error = error.loglog_error_verbosity=3pid-file = mysql.pidlong_query_time = 1#log-slow-admin-statements = 1#log-queries-not-using-indexes = 1log-slow-slave-statements = 1#binlogbinlog_format = rowlog-bin = /data/mysql/mysql_3306/logs/mysql-binbinlog_cache_size = 1Mmax_binlog_size = 200Mmax_binlog_cache_size = 2Gsync_binlog = 0expire_logs_days = 10#group replicationserver_id=1013307gtid_mode=ONenforce_gtid_consistency=ONmaster_info_repository=TABLErelay_log_info_repository=TABLEbinlog_checksum=NONElog_slave_updates=ONbinlog_format=ROWtransaction_write_set_extraction=XXHASH64loose-group_replication_group_name="3db33b36-0e51-409f-a61d-c99756e90155"loose-group_replication_start_on_boot=offloose-group_replication_local_address= "192.168.5.100:23307" ###注意端口号,要区分开,不要和我们默认的3306混淆了loose-group_replication_group_seeds= "192.168.5.100:23307,192.168.5.100:23308,192.168.5.100:23309"loose-group_replication_bootstrap_group= offloose-group_replication_single_primary_mode=offloose-group_replication_enforce_update_everywhere_checks=on#relay logskip_slave_start = 1max_relay_log_size = 500Mrelay_log_purge = 1relay_log_recovery = 1#slave-skip-errors=1032,1053,1062#buffers & cachetable_open_cache = 2048table_definition_cache = 2048table_open_cache = 2048max_heap_table_size = 96Msort_buffer_size = 2Mjoin_buffer_size = 2Mthread_cache_size = 256query_cache_size = 0query_cache_type = 0query_cache_limit = 256Kquery_cache_min_res_unit = 512thread_stack = 192Ktmp_table_size = 96Mkey_buffer_size = 8Mread_buffer_size = 2Mread_rnd_buffer_size = 16Mbulk_insert_buffer_size = 32M#myisammyisam_sort_buffer_size = 128Mmyisam_max_sort_file_size = 10Gmyisam_repair_threads = 1#innodbinnodb_buffer_pool_size = 100Minnodb_buffer_pool_instances = 1innodb_data_file_path = ibdata1:100M:autoextendinnodb_flush_log_at_trx_commit = 2innodb_log_buffer_size = 64Minnodb_log_file_size = 256Minnodb_log_files_in_group = 3innodb_max_dirty_pages_pct = 90innodb_file_per_table = 1innodb_rollback_on_timeoutinnodb_status_file = 1innodb_io_capacity = 2000transaction_isolation = READ
初始化第一个节点:
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql_3306.cnf --initialize-insecure
启动第一个节点
/usr/local/mysql/bin/mysql/mysql_3306/my_3306.cnf&
创建复制账号
#mysql>SET SQL_LOG_BIN=0#mysql>CREATE USER rpl_user@‘%‘;#mysql>GRANT REPLICATION SLAVE ON *.* TO ‘rpl_user‘@‘%‘ identified by ‘123456‘;#mysql>SET SQL_LOG_BIN=1
搭建主从:
change master to master_user=‘rpl_user‘,MASTER_PASSWORD=‘123456‘ for channel ‘group_replication_recovery‘;
加载 group replication 的plugin
install plugin group_replication soname ‘group_replication.so‘;
查看 我们刚刚加载的插件:SHOW PLUGINS
启动第一个节点的 Group Replication:
#mysql> set global group_replication_bootstrap_group=ON; # 只在第一个节点使用#mysq>START GROUP_REPLICATION;
停止组复制:
stop group_replication;
确认节点加入情况:
select * from performance_schema.replication_group_members;
确认每个节点加入成功
创建一个测试库
create database czg;use czg;create table t1 (id int not null,name varchar(32), primary key(id));insert into t1 values(1,‘chen‘),(‘2‘,‘zhang‘);
第二个节点的安装:
初始化实列:
./mysqld --defaults-file=/data/mysql/mysql_3308/my_3308.cnf --initialize-insecure
建立复制账号:
#mysql>SET SQL_LOG_BIN=0#mysql>CREATE USER rpl_user@‘%‘;#mysql>GRANT REPLICATION SLAVE ON *.* TO ‘rpl_user‘@‘%‘ identified by ‘123456‘;#mysql>SET SQL_LOG_BIN=1
搭建主从:
change master to master_user=‘rpl_user‘,MASTER_PASSWORD=‘123456‘ for channel ‘group_replication_recovery‘;
加载 group replication 的plugin
install plugin group_replication soname ‘group_replication.so‘;
确认节点加入的情况:
select * from performance_schema.replication_group_members;
第三个节点的安装:
初始化实列
./mysqld --defaults-file=/data/mysql/mysql_3309/my_3309.cnf --initialize-insecure
创建复制的账号:
#mysql>SET SQL_LOG_BIN=0#mysql>CREATE USER rpl_user@‘%‘;#mysql>GRANT REPLICATION SLAVE ON *.* TO ‘rpl_user‘@‘%‘ identified by ‘123456‘;#mysql>SET SQL_LOG_BIN=1
搭建主从
change master to master_user=‘rpl_user‘,MASTER_PASSWORD=‘123456‘ for channel ‘group_replication_recovery‘;
加载 group replication 的plugin
install plugin group_replication soname ‘group_replication.so‘;
确认节点加入的情况
测试:我在第3个节点插入数据:
其它两台的机器也会看到新增加数据
到此我们的主从环境就算搭建完成。
小结:其实环境的搭建还是比较的简单,你只要按文档说明基本能顺利的搭建下来。
注意事项:
集群工作的两种模式
基于sigle-master 环境(参考下面的图1)
在Group Repilication 配置中,默认的模式是:Single-master 模式,在Singel-master模式中,只有一个节点是可以进行写操作,其它节点是开启着:read-only 模式。
当主节点挂了其他节点中会选举出来一个new-master。这里面看起来还是主从结构的概念。
在该流程中,主节点挂掉后,会从原来的节点选举出一个节点成为新的primary节点,其它节点依旧是read-only状态。
在single-master 模式中,可以利用下面SQL 发现谁是主节点:
select variable_value from performance_schema.global_status where variable_name=‘group_replication_primary_member‘;
基于multi-master环境((参考下面的图2))
该结构不是默认模式,如果需要使用需要配置文件【mysqld】 部分添加:
#multi-master
loose-group_replication_single_primary_mode=off
loose-group_replication_enforce_update_everywhere_checks=on
在该结构中需要注意,在使用中,不能同时在不同的节点对同一行数据进行update操作,如果进行,客户端会收到报错。在使用这个结构时,需要应用自己去控制并行度。
在该结构中,所有的节点上都可以进行写和读操作,任何一个节点挂掉后,可以从负载设备中自动摘除掉就可以,例如(haproxy,proxysql)
在 multi-master 结构中,使用下面语句查询谁是主节点直接返回是一个空的,这个需要自己注意一下
select variable_value from performacne_schema.global_status where variable_name=‘group_repliation_primary_member‘;
另外一个问题就是启动的问题:
集群重启分成两种情况
一类是:滚动重启 节点启动后,执行:start group_replication,确认状态即可
二类是: 全部一块重启(集体掉电)第一个节点启动(single-master & multi-master 都一样)
set global group_replication_bootstrap_group=on;
start group_replication;
其他节点的启动:start group_replication;
错误排查: 查看错误日志文件;
看日志就是我们的端口争用。主要是我们的配置文件的时候,没有把端口设置好,设置冲突了。
总结:主从搭建的环境就写到这里,后续还会针对Group Relication 做一个详细的介绍。水平有限,文中如果有不当或者错误之处,欢迎大家拍砖给我发邮件(chenzhaoguang00@126.com)。欢迎转载,转载请注明来源即可。