赞
踩
前话:主从搭建一定要系统一样,MySQL版本一致。
1:首先当然是去MySQL官网下载相应版本的MySQL包,我用的是window 下的MySQL5.7.28。
2:下载后解压后获得mysql-5.7.28-winx64文件夹,这次配置一主一从,所以再复制一份,命名mysql-5.7.28-winx64-slave,作为从节点。
3:MySQL初始化,切换到mysql-5.7.28-winx64/bin执行mysqld --initialize --console
或mysqld --initialize-insecure
,前者会给root初始化一个随机密码,后者密码为空,这个后者方便。初始化后mysql-5.7.28-winx64下就会出现data目录,原来时没有的。从节点下同样操作。
4:mysql配置文件,一开始是没有my.ini文件的,创建一个,并在主节点添加如下内容:
主要关注【mysqld】模块下的:port、basedir、datadir、server_id和开启二进制日志的几个参数既满足需求了
[client] port=3306 [mysql] default-character-set=utf8 #user = root #password = fpf258310 [mysqld] port=3306 basedir="E:/mysql-5.7.28-winx64-master/" datadir="E:/mysql-5.7.28-winx64-master/data/" character-set-server=utf8 default-storage-engine=INNODB #支持 INNODB 引擎模式。修改为 default-storage-engine=MyISAM 即可。 #如果 INNODB 模式如果不能启动,删除data目录下ib开头的日志文件重新启动。 sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" max_connections=512 query_cache_size=0 tmp_table_size=18M thread_cache_size=8 myisam_max_sort_file_size=64G myisam_sort_buffer_size=35M key_buffer_size=25M read_buffer_size=64K read_rnd_buffer_size=256K sort_buffer_size=256K #主从同步配置。主机是1。备机从2开始。 server-id = 1 #开启二进制日志 log_bin = "E:/mysql-5.7.28-winx64-master/log/mysql-bin" log_bin_index = mysql-bin.index binlog_format = ROW expire_logs_days = 1 binlog_cache_size=32m max_binlog_cache_size=512m max_binlog_size=512m #binlog_do_db=test binlog_ignore_db = mysql #binlog_ignore_db = sys #binlog_ignore_db = information_schema #binlog_ignore_db = performance_schema # 添加慢查询日志 log_output=file slow_query_log=on slow_query_log_file = "E:/mysql-5.7.28-winx64-master/log/mysql-slow.log" log_queries_not_using_indexes=on long_query_time = 1
从节点类似,在mysql-5.7.28-winx64-slave下创建 my.ini,并添加如下内容:
主要关注【mysqld】模块下的:port、basedir、datadir、server_id和开启中继日志的几个参数既满足需求了
注意server_id 不能与主节点相同,其取值范围[1,2^32-1]
[client] port=3307 [mysql] default-character-set=utf8 [mysqld] port=3307 basedir="E:/mysql-5.7.28-winx64-slave/" datadir="E:/mysql-5.7.28-winx64-slave/data/" character-set-server=utf8 default-storage-engine=INNODB #支持 INNODB 引擎模式。修改为 default-storage-engine=MyISAM 即可。 #如果 INNODB 模式如果不能启动,删除data目录下ib开头的日志文件重新启动。 sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" max_connections=512 tmp_table_size=18M thread_cache_size=8 myisam_max_sort_file_size=64G myisam_sort_buffer_size=35M key_buffer_size=25M read_buffer_size=64K read_rnd_buffer_size=256K sort_buffer_size=256K #主从同步配置。主机是1。备机从2开始。 server-id = 2 #开启中继日志 relay_log="E:/mysql-5.7.28-winx64-slave/log/relay-bin" #realy_log_index = relay-bin.index relay_log_purge = 1 relay_log_recovery = 1 max_relay_log_size = 500M sync_relay_log =0 sync_relay_log_info = 0 #replicate-do-db = test #replicate-ignore-db = mysql #基于库过滤数据,会数据不一致问题 replicate_wild_ignore_table =mysql.% #基于表过滤数据,更安全 replicate_wild_ignore_table =sys.% replicate_wild_ignore_table =information_schema.% replicate_wild_ignore_table =performance_schema.% # 添加慢查询日志 log_output=file slow_query_log=on slow_query_log_file = "E:/mysql-5.7.28-winx64-slave/log/mysql-slow.log" log_queries_not_using_indexes=on long_query_time = 2 #innodb innodb_flush_log_at_trx_commit=1 innodb_log_buffer_size=1M innodb_buffer_pool_size=47M innodb_log_file_size=24M innodb_file_per_table=1 innodb_thread_concurrency=8
至于二进制和中继日志各自的作用,可看这两篇文章二进制日志和中继日志。简单地说要完成主从复制,主节点需要开启二进制日志,从节点需要开启中继日志,二进制日志文件用于保存节点自身产生的事件,中继日志文件中则是保存接收自其他节点的事件(也是二进制格式)。
切到mysql-5.7.28-winx64/bin下,执行mysqld
启动主节点服务,再执行mysql -u root -p
进入,创建用于主从复制的账号,如下:
create user 'repl3307'@'127.0.0.1' identified by 'repl3307';
grant REPLICATION SLAVE ON *.* TO 'repl3307'@'127.0.0.1';
flush privileges;//分配复制权限
切到mysql-5.7.28-winx64-slave/bin下,执行mysqld
启动主节点服务,再执行mysql -u root -p
进入,执行下面命令:
show slave status;//查看从节点状态
change master to master_host='127.0.0.1',master_port=3306,master_user='repl3307',master_password='repl3307',master_log_file='mysql-bin.000001',master_log_pos=0;
start slave;//开启数据同步 stop slave可关闭同步
show slave status;//查看从节点状态是否有问题
通过show slave status;查看状态正常,则在主节点进行 写 操作,都会同步到从节点。
双主如何搭建呢?其实很简单,将上面master和slave的操作反顾来来一遍,使二者可互相同步数据就可以了
主从搭建分两种情况:1:主节点没有任何数据,增加从节点即可,数据即可一致。
2:主节点已经有数据,突然增加一个从节点,这是需要将主节点已有数据导入到从节点,再进行主从同步,保证数据的一致性,不然同步时可能出问题。
从这里可以看出,与全量备份(数据恢复)和增量备份(数据恢复)有关系了
全量备份:
mysqldump -u root -p=xxx --all-databases > backup.sql;//导出目前全部数据
mysqldump -u root -p=xxx test > backup.sql;//导出指定库的数据
把带出来的文件再导入到从节点就好了。
MySQL复制延迟问题一直被人们诟病,但这个问题是无法彻底消除的,能做的只有尽量降低延迟,如果业务无法容忍延迟,就不要使用主从读写分离。
从图中可以了解,延迟的产生主要有两个原因:
1和3不是我们程序员解决的,这里主要说下第二点。
MySQL配置参数上来说:
对主节点:innodb_flush_log_at_trx_commit = 2//mysql默认是1,调整前,请了解该参数作用,判断业务是否需要;
sync_binlog = n;该参数确定写入binlog的频率,默认0,即由操作系统决定。n=1是最安全,但最慢,可以根据业务适当调大。
对从节点:sync_relay_log = n;它的作用于sync_binlog类似。
MySQL主从复制方式
可以配置并行复制方式(MySQL默认是异步复制方式),可以并发执行,是目前最好的方案,不过MySQLV5.7才很好的实现它。具体配置如下,从节点配置:
# slave
slave-parallel-type=LOGICAL_CLOCK #基于组提交的并行复制方式,默认值 DATABASE:基于库的并行复制方式
slave-parallel-workers=16 #并发数,最佳实践16个,再多对性能提升不大
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。