您的位置:首页 > 数据库 > MySQL

mysql数据库的主从复制环境搭建

2018-03-29 16:23 549 查看
有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。原理图如下:

简单来说,mysql的主从复制的原理就是slave把master上面执行的 update,insert这些会使数据发生改变的sql语句从master上面同步过来,然后在自己的机器上再执行一遍,那么这两台数据库服务器上的数据就一模一样了,而那些要同步的sql语句就存在bin-log文件里面我这里有两台机器分别是192.168.1.6(master) 192.168.1.5(slave)


我们先从master机器开始配置修改/etc/my.cnf 文件(mysql启动默认是从/etc/my.cnf读取的,所以你别的地方有配置文件的话建议直接移到/etc目录下)[html] view plain copy[client]  
port = 3306  
socket = /usr/local/mysql/mysql.sock  
  
[mysqld]  
character-set-server = utf8  
collation-server = utf8_general_ci  
  
skip-external-locking  
skip-name-resolve  
  
user = mysql  
port = 3306  
basedir = /usr/local/mysql  
datadir = /home/mysql/data  
tmpdir = /home/mysql/temp  
# server_id = .....  
socket = /usr/local/mysql/mysql.sock  
log-error = /home/mysql/logs/mysql_error.log  
pid-file = /home/mysql/mysql.pid  
  
open_files_limit = 10240  
  
back_log = 600  
max_connections=500  
max_connect_errors = 6000  
wait_timeout=605800  
  
#open_tables = 600  
#table_cache = 650  
#opened_tables = 630  
  
max_allowed_packet = 32M  
  
sort_buffer_size = 4M  
join_buffer_size = 4M  
thread_cache_size = 300  
query_cache_type = 1  
query_cache_size = 256M  
query_cache_limit = 2M  
query_cache_min_res_unit = 16k  
  
tmp_table_size = 256M  
max_heap_table_size = 256M  
  
key_buffer_size = 256M  
read_buffer_size = 1M  
read_rnd_buffer_size = 16M  
bulk_insert_buffer_size = 64M  
  
lower_case_table_names=1  
  
default-storage-engine = INNODB  
  
innodb_buffer_pool_size = 2G  
innodb_log_buffer_size = 32M  
innodb_log_file_size = 128M  
innodb_flush_method = O_DIRECT  
  
#####################  
thread_concurrency = 32  
long_query_time= 2  
slow-query-log = on  
slow-query-log-file = /home/mysql/logs/mysql-slow.log    
  
## replication  
server_id=6  
binlog-ignore-db=mysql  
log-bin=master-mysql-bin  
binlog_cache_size=1M  
binlog_format=mixed  
expire_logs_days=7  
slave_skip_errors=1062  
  
[mysqldump]  
quick  
max_allowed_packet = 32M  
  
[mysqld_safe]  
log-error=/var/log/mysqld.log  
pid-file=/var/run/mysqld/mysqld.pid  

这里主要的配置就是和复制相关的这段配置,其它配置是mysql源码安装时配置,里面具体参数代表什么意思可以网上搜一下,文档很多的[html] view plain copy## replication  
server_id=6  
binlog-ignore-db=mysql  
log-bin=master-mysql-bin  
binlog_cache_size=1M  
binlog_format=mixed  
expire_logs_days=7  
slave_skip_errors=1062  
我简单解释一下,复制有关的参数serverid 全局唯一的binlog-ignore-db=mysql复制过滤,我们不同步mysql系统自带的数据库log-bin=master-mysql-bin 开启logbin功能并设置logbin文件的名称binlog_format=mixed 混合型复制模式,默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。接下来重启mysql服务并用客户端登录

slave想要同步master上的数据首先肯定需要权限,所以我们要在master上面开通权限[html] view plain copygrant replication slave, replication client on *.* to 'root'@'192.168.1.5' identified by  
'root';  
账号和密码都是root ,允许192.168.1.5这台机器向master发送同步请求,当然你可以设成别的,我这里只是为了方便记忆,设了太多不同的密码容易忘记

刷新一下授权信息,然后查看当前master的状态

show master status,我这里解释一下,我们知道关于对数据库修改的sql全部记录在了bin-log里面,那么我们就每次都把bin-log里面的sql全部执行一遍?肯定不是,我们肯定要记录我上次复制到哪儿里了,然后我下次再从这个点开始同步,就像我们玩单机游戏闯了3关以后要存下档一样,下次玩我们继续从第三关开始玩,这是一个意思。接下来我们随便写点测试数据到数据库里面去[html] view plain copycreate database if not exists pcx default charset utf8 collate utf8_general_ci;  
use pcx;  
DROP TABLE IF EXISTS `fruits`;  
CREATE TABLE fruits  
(  
f_id    char(10)        NOT NULL,  
s_id    INT         NOT NULL,  
f_name  char(255)   NOT NULL,  
f_price decimal(8,2)    NOT NULL,  
PRIMARY KEY(f_id)   
)ENGINE=InnoDB DEFAULT CHARSET=utf8 ;  
  
INSERT INTO fruits (f_id, s_id, f_name, f_price)  
     VALUES('a1', 101,'apple',5.2),  
     ('b1',101,'blackberry', 10.2),  
     ('bs1',102,'orange', 11.2),  
     ('bs2',105,'melon',8.2),  
     ('t1',102,'banana', 10.3),  
     ('t2',102,'grape', 5.3),  
     ('o2',103,'coconut', 9.2),  
     ('c0',101,'cherry', 3.2),  
     ('a2',103, 'apricot',2.2),  
     ('l2',104,'lemon', 6.4),  
     ('b2',104,'berry', 7.6),  
     ('m1',106,'mango', 15.6),  
     ('m2',105,'xbabay', 2.6),  
     ('t4',107,'xbababa', 3.6),  
     ('m3',105,'xxtt', 11.6),  
     ('b5',107,'xxxx', 3.6);  


接下来我们把pcx这个库下的数据全部备份下来首先我们要锁表[html] view plain copyflush tables with read lock;  
接下来用mysql的备份命令进行备份

最后我们把edu-master.sql发送到slave的机器上面好了,我们接下来开始配置slave(192.168.1.5)同样打开my.cnf文件开始配置[html] view plain copyvi /etc/my.cnf  

[html] view plain copy[client]  
port = 3306  
socket = /usr/local/mysql/mysql.sock  
  
[mysqld]  
character-set-server = utf8  
collation-server = utf8_general_ci  
  
skip-external-locking  
skip-name-resolve  
  
user = mysql  
port = 3306  
basedir = /usr/local/mysql  
datadir = /home/mysql/data  
tmpdir = /home/mysql/temp  
# server_id = .....  
socket = /usr/local/mysql/mysql.sock  
log-error = /home/mysql/logs/mysql_error.log  
pid-file = /home/mysql/mysql.pid  
  
open_files_limit = 10240  
  
back_log = 600  
max_connections=500  
max_connect_errors = 6000  
wait_timeout=605800  
  
#open_tables = 600  
#table_cache = 650  
#opened_tables = 630  
  
max_allowed_packet = 32M  
  
sort_buffer_size = 4M  
join_buffer_size = 4M  
thread_cache_size = 300  
query_cache_type = 1  
query_cache_size = 256M  
query_cache_limit = 2M  
query_cache_min_res_unit = 16k  
  
tmp_table_size = 256M  
max_heap_table_size = 256M  
  
key_buffer_size = 256M  
read_buffer_size = 1M  
read_rnd_buffer_size = 16M  
bulk_insert_buffer_size = 64M  
  
lower_case_table_names=1  
  
default-storage-engine = INNODB  
  
innodb_buffer_pool_size = 2G  
innodb_log_buffer_size = 32M  
innodb_log_file_size = 128M  
innodb_flush_method = O_DIRECT  
  
#####################  
thread_concurrency = 32  
long_query_time= 2  
slow-query-log = on  
slow-query-log-file = /home/mysql/logs/mysql-slow.log    
  
  
## replication  
server_id=5  
binlog-ignore-db=mysql  
log-bin=mysql-slave-bin  
binlog_cache_size = 1M  
binlog_format=mixed  
expire_logs_days=7  
slave_skip_errors=1062  
relay_log=mysql-relay-bin  
log_slave_updates=1  
read_only=1  
  
  
[mysqldump]  
quick  
max_allowed_packet = 32M  
  
[mysqld_safe]  
log-error=/var/log/mysqld.log  
pid-file=/var/run/mysqld/mysqld.pid  
配置文件和master的差不多,主要差别在一下几点log-bin=mysql-slave-bin开启了二进制日志,实际上不开也没关系,因为我们这个slave只是做slave,如果你这台slave还有可能要做别人的master的话那么必须开启relay_log=mysql-relay-bin配置中继日志,用来存放从master的bin-log那边同步来的数据配置好后重启数据库服务[html] view plain copyservice mysql restart  

我们首先要创建一下数据库,因为我们备份下来的数据库文件里面是不包含创建数据库的命令的,所以我们要手动创建一下

把我们从master那边备份过来的数据恢复到slave中


登录 Slave 数据库


在mysql客户端中输入一下命令连接master

change  master  to  ,
master_host='192.168.1.6'master主机的ip地址 master_user='root',master_password='root',我们刚刚在master有执行过授权的账号密码就是这个master_port=3306,master数据库的端口号 master_log_file='edu-mysql-bin.000002',master_log_pos=427,这个是我们通过show master status看到的positionmaster_connect_retry=30;
使用命令查看slave状态,我们可以看到slave目前还未开始同步[html] view plain copyshow slave status\G;  



开始主从同步,主要看到两个yes就代表同步成功了[html] view plain copystart slave;  



在master机器上查看状态,可以看见slave的连接信息[html] view plain copyshow processlist\G;  



接下来我们测试一下主从复制的功能master 上原来的数据


这是我插入的记录

我们到slave上面看看有没有,有就代表成功了

至此mysql原生支持的主从复制搭建完毕,当然我们说mysql的主从复制性能上回有延迟,master上的数据不是无延迟的同步到slave上面,所以如果你对数据的一致性要求非常高的话,那么mysql官方的主从复制就不合适了,可以考虑用别的数据同步方案例如“Galera Cluster for MySQL” ,当然也有人说mysql官方支持的主从复制只是适合在中小规模的集群下运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: