MySQL主从复制

MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。 服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

单向复制有利于健壮性、速度和系统管理:

· 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为份。

· 通 过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但 修改数据的语句仍然发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。

· 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。

MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮

实验环境:

Rhel6.5版本虚拟机:

主服务器:172.25.21.18  server18.example.com

从服务器:172.25.21.19  server19.example.com

从服务器:172.25.21.20  server20.example.com

Selinux iptables disabled

Yum install mysql mysql-server -y

mysql_secure_installation  ## mysql初始化,设置密码为westos

Master server配置:

Vim /etc/my.cf

增加这几行:log-bin=mysql-bin##启动二进制日志系统

binlog-do-db=westos##二进制需要同步的数据库名

server-id=1##必须为1—2^32之间的一个正整数值

binlog-ignore-db=mysql##避免同步mysql用户配置,以免不必要的麻烦

/etc/init.d/mysqld start

Mysql -pwestos#进去mysql

Mysql>create database westos;

Mysql> show master status;##查看master状态

wKiom1ectpey1oXWAABjiY03bXU810.png-wh_50

记录fileposition的值,后面会用到,这个file文件保存在/var/lib/mysql/目录下,数据库所执行的每个动作都会保存到这个文件中,我们可以进行查看

Cd /var/lib/mysql

mysqlbinlog mysql-bin.000003

wKioL1ecuA7wLEiXAAJUgKreXG4262.png-wh_50

grant replication slave on *.* to lzk@’172.25.21.19’ identified by ‘westos’; ##创建同步帐号并给于授权。

Slave server配置:

因为master server已经给slave server授权

Mysql -h 172.25.21.18 -u lzk -pwestos##查看是否授权成功

Vim /etc/my.cnf

Server-id=2##从服务器ID号,不要和主ID相同,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同,可以认为server-id值类似于IP地址,这些ID值能唯一识别复制服务器群集中的每个服务器实例。

/etc/init.d/mysqld start

Mysql -pwestos

Create database westos;

Use westos;

change master to master_host='172.25.21.18', master_user='lzk', master_password='westos', master_log_file='mysql-bin.000003', master_log_pos=974;

Start slave;

Show slave status\G;

wKiom1ecuO_j7fbrAAGfBdIBebc191.png-wh_50

Slave_IO_Running:yes

Slave_SQL_Running:yes

如果都是yes,表示从库的I/O,Slave_SQL线程都正确开启.表明数据库正在同步。当这个的状态为Slave_IO_Running: NO,一般都是用户访问和网络的问题

 

验证:

master server端上:

Mysql>use westos;

Mysql>create table uses (

->username varchar(25) not null,

->password varchar(25) not null

->);

在从服务器上

Mysql>show tables;

会出现master端新建的table。证明数据同步。

 

 

Mysql双向复制

因为我所安装的mysqlmysql-5.1.71-1.el6.x86_645.1版本的,不支持多线程,5.6以上版本支持多线程,以下我会说到,这个mysql的双向复制我用三台主机来做实验。

主机:rhel6.5版本虚拟机

上面所用到的两台:

主服务器:server18.example.com 172.25.21.18

从服务器:server19.example.com 172.25.21.19(这个从服务器作为server20从服务器的master端,server19从服务器复制server18的数据库信息,然后保存在自己的文件里,server20从服务器通过读取server19进行同步数据。)

从服务器:server20.example.com 172.25.21.20

实验操作:

server19从服务器上配置:

Vim /etc/my.cnf

增加以下几行: Server-id=2

Log-bin=mysql-bin

Binlog-do-db=westos

Binlog-ignore-db=mysql

Log-slave-updates

/etc/init.d/mysqld restart

server20从服务器上配置:

Yum install -y mysql mysql-server

mysql_secure_installation  ## mysql初始化,设置密码为westos

Mysql -pwestos

Create database westos;

Vi /etc/my.cnf

增加以下内容:server-id=3

/etc/init.d/mysqld start

server19从服务器上:

Mysql -pwestos###进入数据库

执行以下命令:

grant replication slave on *.* to lzk@’172.25.21.20’ identified by ‘westos’; ##创建同步帐号并给于授权。

server20从服务其执行

Mysql -h 172.25.21.18 -u lzk -pwestos##查看是否授权成功

server18上将/var/lib/mysql/mysql-bin.000003 文件scpserver20从服务器上

server20从服务器上执行:

Mysqlbinlog --start-position=341 --stop-position=1122 mysql-bin.000003 | mysql -pwestos##server18主服务器上的数据库信息在server20从服务其上再执行一遍,生成数据表,这要才能让它可以进行数据同步。

server20从服务器上:

Mysql -pwestos##进入数据库

执行以下操作

Use westos

change master to master_host='172.25.21.19', master_user='lzk', master_password='westos', master_log_file='mysql-bin.000001', master_log_pos=186;

Start slave

Show slave status\G##查看slave状态。是否都为YES

如果查看的额状态没问题,这样就配置好了,server18是主服务器,作为server19的数据备份来源,server19作为server20master,这样在server18主服务器上的数据库信息就会同步到这两个从服务器。

 

 

如果写操作较少,而读操作很多时,可以采取这种结构。你可以将读操作分布到其它的 slave,从而减小master 的压力。但是,slave 增加到一定数量时,slave master 的负载以及网络带宽都会成为一个严重的问题。这种结构虽然简单,但是,它却非常灵活,足够满足大多数应用需求。

wKiom1ecuVvRYL4GAACUW4iBNwo784.png-wh_50

当设置 log_slave_updates ,你可以让 slave 扮演其它 slave master。此时,slave SQL 线程执行的事件写进行自己的二进制日志(binary log),然后,其它的 slave 可以获取这些事件并执行它,从而有效缓解master 的压力。

wKiom1ecuYniqzHVAAGbJhl2gfE202.png-wh_50




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章