centos7筹建mysql主从复制
环境描述
操作系统:CentOS7 主服务器master:192.168.32.130 从服务器slave:192.168.32.129
主从复制
前面我已经写了关于centos7上面配置mysql数据库的文章了,这里就直接跳过mysql安装。
1)主从复制原理
(图片来源于网络)
主从复制分为同步复制和异步复制,实际复制架构中大部分为异步复制。 复制的基本过程如下:1.Slave上面的IO进程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容; 2.Master接收到来自Slave的IO进程的请求后,通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的IO进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置; 3.Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master。 4.Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
-
修改mysql master服务器
在master服务器上(我这里是192.168.32.130),切换到/etc/ 下找到my.cnf文件,对其进行修改,修改内容主要是在文件最上面添加如下内容:
server-id=202 #设置服务器唯一的id,默认是1,我们设置ip最后一段,slave设置203
log-bin=mysql-bin # 启用二进制日志
binlog-ignore-db=mysql,information_schema #忽略写入binlog的库
-
修改mysql slave服务器
在slaver服务器上(我这里是192.168.32.129),切换到/etc/ 下找到my.cnf文件,对其进行修改,修改内容主要是在文件最上面添加如下内容:
server-id=203 #这个值只要与集群中的mysql服务器保持唯一就行,可以自定义
replicate-do-db = jeff #只同步jeff库
slave-skip-errors = all #忽略因复制出现的所有错误
-
重启master、slaver服务器
systemctl restart mysqld,其实这里你也可以先关闭systemctl stop mysqld然后再启动systemctl start mysqld
-
在主服务器上建立帐户并授权slave
GRANT REPLICATION SLAVE ON *.* to 'mysqlsync'@'192.168.32.129' identified by 'chenfeng1234.Com';
-
查看主数据库状态
登录master数据库,通过命令show master status;进行查看主数据库状态,主要看master的File、Position对应的值,方便后面讲其配置到slave中。
-
配置从数据库
登录slave数据库,通过命令
change master to
master_host='192.168.32.130',
master_user='chenfeng',
master_password='ChenFeng0814!',
master_log_file='mysql-bin.000003',
master_log_pos=1731;
这里解释一下各命令的含义:
master_host 表示master服务器的IP地址;
master_user表示master服务器给定的远程登录用户名;
master_password表示远程登录密码;
master_log_file表示master服务状态中的File值;
master_log_pos表示master服务状态中Position值。
-
启动slave同步进程并查看状态
登录slave数据库,通过命令show slave status\G;当红圈内的两个状态都是yes就表明已经配置同步成功了,如下图所示:
-
验证主从同步
此时所有主从同步配置已完成,现在我在master服务器上jeff数据库中插入一张表并导入部分数据来验证下slave服务器是否能够正常同步过来,可以看到此时数据库中并没有表的存在。
在master中执行添加表语句
可以看到此时master上面表已经建成了
再查看slave上面是否已经同步过去了,确实是已经同步过来了
-
常见错误
如上图,查看slave状态是IO_RUNNING状态为no,这个可能是/var/lib/mysql/auto.cnf中的server-uuid主、从重复了,解决办法是将master上的auto.cnf文件删除,然后重启master服务器的mysql服务,将会生成一个新的auto.cnf文件,且server-uuid肯定和slave上面的值不等。
如上图,查看slave状态是IO_RUNNING状态为connecting,这个错误可能由三个原因导致:1.远程用户、密码配置错误;2.read_master_log_pos和relay_master_log_file配置错误;3.网络问题或者防火墙问题。
参考博文地址:http://blog.jobbole.com/94595/