mysql服务器复制的主从架构半同步的实现

说明:本文选用172.16.22.1作为主服务器,172.16.22.3作为从服务器

从服务器的mysql软件版本应大于或等于主服务器的mysql软件版本

主服务器与从服务器的server-id 应不同

一个主服务器可以有多个从服务器,但一个从服务器只有一个主服务器,设置主服务器与其中一个从服务器实现同步的复制则称为主从架构的半同步。

一、准备条件:安装mysql(本文选用类似于一种绿色软件的方式安装mysql,特点:方便、快捷)

1.172.16.22.1主机上安装mysql-5.5.20

(1).准备数据存放的文件系统

新建一个逻辑卷,并将其挂载至特定目录。

具体实现过程不再给出。

  1. # partprobe /dev/sda  
  2. # pvcreate /dev/sda5  
  3. # vgcreate myvg /dev/sda5  
  4. # lvcreate -L 2G -n mysql myvg  
  5. # mke2fs -j /dev/myvg/mysql  
  6. # mkdir /mydata/data -pv  
  7. # mount /dev/myvg/mysql /mydata  

这里假设其逻辑卷的挂载目录为/mydata,而后需要创建/mydata/data目录做为mysql数据的存放目录。

(2).新建用户以安全方式运行进程:

  1. # groupadd -r mysql  
  2. # useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql  
  3. # chown -R mysql:mysql /mydata/data

 (3).安装并初始化mysql-5.5.20

  1. # tar xf mysql-5.5.20-linux2.6-i686.tar.gz  -C /usr/local  
  2. # cd /usr/local/  
  3. # ln -sv mysql-5.5.20-linux2.6-i686  mysql  
  4. # cd mysql   
  5. # chown -R mysql:mysql  .  
  6. # scripts/mysql_install_db --user=mysql --datadir=/mydata/data  
  7. # chown -R root  .  
  8.  

(4).mysql提供主配置文件:

 

 

  1. # cd /usr/local/mysql  
  2. # cp support-files/my-large.cnf  /etc/my.cnf 

并修改此文件中thread_concurrency的值为你的CPU个数乘以2(由于只有一颗CPU,所以这里thread_concurrency = 2),另外还需要添加如下行指定mysql数据文件的存放位置:

thread_concurrency = 2

datadir = /mydata/data

 

(5).mysql提供sysv服务脚本,并添加mysqld至服务列表,而后启动服务测试。

  1. # cd /usr/local/mysql  
  2. # cp support-files/mysql.server  /etc/rc.d/init.d/mysqld  
  3. # chkconfig --add mysqld  
  4. # chkconfig mysqld on  
  5. # service mysqld restart  

为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:

(6).输出mysqlman手册至man命令的查找路径:

编辑/etc/man.config,添加如下行即可:

MANPATH  /usr/local/mysql/man

 

(7).输出mysql的头文件至系统头文件路径/usr/include

这可以通过简单的创建链接实现:

# ln -sv /usr/local/mysql/include  /usr/include/mysql

 

(8)输出mysql的库文件给系统库查找路径, 而后让系统重新载入系统库:

  1. # echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf  
  2. # ldconfig -v  
 

(9).修改PATH环境变量(直接在/etc/profile文件里添加“PATH=$PATH:/usr/local/mysql/bin”即可),让系统可以直接使用mysql的相关命令:

  1. # vim /etc/profile  
  2. PATH=$PATH:/usr/local/mysql/bin  
  3. # source /etc/profile  

 

2.172.16.22.3主机上安装mysql-5.5.22

(1) .新建用户以安全方式运行进程:

  1. # groupadd -r mysql  
  2. # useradd -g mysql -r -s /sbin/nologin -M mysql 

 

(2).安装并初始化mysql-5.5.22

  1. # tar xvf mysql-5.5.22-linux2.6-i686.tar.gz  -C /usr/local  
  2. # cd /usr/local/  
  3. # ln -sv mysql-5.5.22-linux2.6-i686  mysql  
  4. # cd mysql   
  5. # chown -R mysql:mysql  .  
  6. # scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data  
  7. # chown -R root  .  

(3).mysql提供主配置文件:

 

  1. # cd /usr/local/mysql  
  2. # cp support-files/my-large.cnf  /etc/my.cnf 

并修改此文件中thread_concurrency的值为你的CPU个数乘以2(由于只有一颗CPU,所以这里thread_concurrency = 2),另外还需要添加如下行指定mysql数据文件的存放位置:

thread_concurrency = 2

datadir = /usr/local/mysql/data

 

(4).mysql提供sysv服务脚本,并添加mysqld至服务列表,而后启动服务测试。

  1. # cd /usr/local/mysql  
  2. # cp support-files/mysql.server  /etc/rc.d/init.d/mysqld  
  3. # chkconfig --add mysqld  
  4. # chkconfig mysqld on  
  5. # service mysqld restart  

 

为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:

(5).输出mysqlman手册至man命令的查找路径:

编辑/etc/man.config,添加如下行即可:

MANPATH  /usr/local/mysql/man

 

(6).输出mysql的头文件至系统头文件路径/usr/include

这可以通过简单的创建链接实现:

# ln -sv /usr/local/mysql/include  /usr/include/mysql

 

(7)输出mysql的库文件给系统库查找路径, 而后让系统重新载入系统库:

  1. # echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf  
  2. # ldconfig -v 

(8).修改PATH环境变量(直接在/etc/profile文件里添加“PATH=$PATH:/usr/local/mysql/bin”即可),让系统可以直接使用mysql的相关命令:

 

  1. # vim /etc/profile  
  2. PATH=$PATH:/usr/local/mysql/bin  
  3. # source /etc/profile

 

二、配置主从服务器

1.配置主服务器(172.16.22.1)

(1).查看/etc/my.cnf配置文件中是否启动二进制日志:

log-bin=mysql-bin   (默认情况下都已经开启,此时不需要做修改)

[mysqld]段中增加如下两行,以开启支持半同步插件:

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000

重启服务器:

# service mysqld restart

 

(2).建立复制权限用户:

  1. # mysql  
  2. mysql> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO lh@’172.16.22.%’ IDENTIFIED BY ‘123456’;  
  3. mysql> SHOW GRANTS FOR lh@’172.16.22.%’; 

 

(3).安装支持半同步的插件

  1. # mysq  
  2. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;  
  3. mysql> SHOW STATUS LIKE ‘rpl_%’; 

 

此时看到方框内的插件已经安装了,只是此时从服务器没有安装插件,所以Value0

2.配置从服务器(172.16.22.3):

(1).编辑/etc/my.cnf配置文件,更改server-id使它和主服务器的server-id不一样,关闭二进制日志并打开中继日志,开启支持半同步插件:

# vim /etc/my.cnf

找到server-id,并改为

server-id = 11

找到 log-bin=mysql-bin 并禁用此项(在前面加上“#”即可)

在“#log-bin=mysql-bin”下面增加两项:

relay-log = relay-bin

relay-log-index = relay-bin.index

[mysqld]段中增加如下2项,以开启支持半同步插件和不允许从服务器写操作:

rpl_semi_sync_slave_enabled=1

read_only=1

重启服务器:

# service mysqld restart

(2).在从服务器上指定主服务器:

  1. # mysql  
  2. mysql> FLUSH TABLES WITH READ LOCK;
  3. mysql> CHANGE MASTER TO  
  4.      -> MASTER_HOST=’172.16.22.1’,  
  5.      -> MASTER_USER=’lh’,  
  6.      -> MASTER_PASSWORD=’123456’;  
  7. mysql> START SLAVE;  
  8. mysql> SHOW SLAVE STATUS\G 

如果看到方框内的两项都为‘yes’的话,说明你的从服务器已经正常启动了。

(3).安装支持半同步的插件

  1. # mysql  
  2. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;  
  3. mysql> SHOW STATUS LIKE ‘rpl_%’; 

说明:由于没有再一次启动slave,所以看到的插件状态是“OFF”关闭的。

再一次启动SLAVE

  1. # mysql  
  2. mysql> stop slave;  
  3. mysql> start slave;  
  4. # mysql> SHOW STATUS LIKE ‘rpl_%’; 

说明:此时看到的插件状态是“ON”开启的了吧

三、对主从服务器进行测试

172.16.22.1上执行如下操作:

  1. # mysql  
  2. mysql> show databases; 

172.16.22.3执行如下操作:

  1. # mysql  
  2. mysql> show databases; 

此时可以看到主从服务器的数据库都是四个。

 

现在我们在主服务器上创建一个数据库testdb和表test,看从服务器上是否也有呢?

172.16.22.1上执行如下操作:

  1. # mysql  
  2. mysql> create database testdb;  
  3. mysql> use testdb;  
  4. mysql> create table test (  
  5.      -> Name varchar(30) not null,  
  6.      -> Age char(3) not null );  

 

172.16.22.3上查看是否有testdb数据库以及test1表:

  1. # mysql  
  2. mysql> SHOW DATABASES; 

 

 

 

 

  1. # mysql  
  2. mysql> show tables;  
  3. mysq> desc test;  

由于从服务器插件已经安装,状态已经开启,此时看看主服务器的客户端数量吧

  1. # mysql  
  2. mysql > SHOW STATUS LIKE ‘rpl_%’; 

 

 

 

说明:此时说明基于半同步插件的从服务器客户端已经有一个了,说明主从服务器复制的半同步模式已经实现了。