Mysql replication(主从)配置

一、Mysql主从应用场景

  • 原理是master上数据更新时会记录一个bin-log,slave会实时同步该bin-log然后slave根据bin-log的sql语句进行相应的操作

  • Mysql主从可以实时备份,保证数据高安全性

  • 可以应用在读写分离的场景中,用以降低单台Mysql服务器的I/O

  • 可以实现Mysql服务的HA集群

  • 可以是1主多从,也可以是互相主从(主主)


二、配置mysql服务

  • MySQL Replication 又叫做AB复制或者主从复制。它主要用于MySQL的时时备份或者读写分离。在配置之前先做一下准备工作,配置两台mysql服务器


二、配置repication

把一个mysql作为主(master),另一个mysql作为从(slave). 为了让实验更加像生产环境,所以先在master上创建一个库db1,并且把mysql的库数据复制给它:

[root@localhost bin]# mysql -uroot -p  #登陆进入mysql

mysql> create database db1;
Query OK, 1 row affected (0.01 sec)

mysql> quit

/usr/bin/mysqldump -uroot -p mysql > /home/123.sql  #备份master的mysql库到/home/123.sql
mysql -uroot -p db1 < /home/123.sql  #将/home/123.sql恢复到master的db1库

1. 设置master

修改配置文件:

vim /etc/my.cnf

在[mysqld]部分查看是否有以下内容,如果没有则添加:

server-id=1

log-bin=mysql-bin

除了这两行是必须的外,还有两个参数,你可以选择性的使用:

binlog-do-db=databasename1,databasename2  #设置需要同步的库名

binlog-ignore-db=databasename1,databasename2  #设置忽略不同步的库名

binlog-do-db=需要复制的数据库名,多个数据库名,使用逗号分隔。binlog-ignore-db=不需要复制的数据库库名,多个数据库名,使用逗号分隔。这两个参数其实用一个就可以啦。

如果修改过配置文件需要重启mysqld服务,否则不需要重启:

killall mysqld  #停止mysql

/etc/init.d/mysqld start  #启动mysql

mysql> grant replication slave on *.* to 'repl'@'slave的IP' identified by '123123';   #这里的repl是为slave端设置的访问master端mysql数据的用户,密码为123123,这里的127.0.0.1为slave的ip
mysql> flush tables with read lock;   #锁定数据库,此时不允许更改任何数据
mysql> show master status;  #查看状态,这些数据是要记录的,一会要在slave端用到
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 |   474952 |              |                  |
+------------------+----------+--------------+------------------+

2. 设置slave

先修改slave的配置文件my.cnf:

vim /etc/my.cnf

增加一行“server-id = 2” 总之不能让这个id和master一样,否则会报错,此项必须加在[mysqld]选项下方可生效,另外在slave上,你也可以选择性的增加如下两行,对应于master上增加的两行:

replicate-do-db=databasename1,databasename2

replicate-ignore-db=databasename1,databasename2

改完后,重启slave:

service mysqld restart

拷贝master上的db1库的数据到slave上

/usr/bin/mysqldump -uroot -p db1 > /home/db1.sql  #备份master上的db1到/home/db1.sql

用scp或者用winscp将db1.sql拷贝到slave上并恢复到slave上的db1库

把数据拷贝过来后,就需要在slave上配置主从了:

[root@localhost ~]# mysql -uroot -pyourpassword
mysql> slave stop;
mysql> change master to master_host='masterIP', master_port=3307,
master_user='repl', master_password='123123',
master_log_file='mysql-bin.000006', master_log_pos=474952;
mysql> slave start;

相信聪明的你一定可以看懂上面的各个参数分别表示什么含义,其中master_log_file和master_log_pos是在上面使用 show master status 查到的数据。执行完这一步后,需要在master上执行一步:

mysql -uroot -p123456 -e "unlock tables"  #解锁master上的表

然后查看slave的状态:

mysql> show slave status\G;

确认以下两项参数都为yes:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes




测试Mysql主从


在master上执行如下命令:

[root@localhost ~]# mysql -uroot -p -e "use db1;select count(*) from db"
+----------+
| count(*) |
+----------+
|        2 |
+----------+
[root@localhost ~]# mysql -uroot -p -e "use db1;truncate table db"
[root@localhost ~]# mysql -uroot -p -e "use db1;select count(*) from db"

+----------+
| count(*) |
+----------+
|        0 |
+----------+

这样清空了db1.db表的数据,下面查看slave上的该表数据:

[root@localhost ~]# mysql -uroot -p -e "use db1; select count(*) from db"
+----------+
| count(*) |
+----------+
|        0 |
+----------+

slave上的该表也被清空了。这样好像不太明显,不妨继续把db表删除试试:

[root@localhost ~]# mysql -uroot -p -e "use db1; drop table db"
[root@localhost ~]# mysql -uroot -p -e "use db1; select count(*) from db"

ERROR 1146 (42S02) at line 1: Table 'db1.db' doesn't exist

这次很明显了。

主从配置起来很简单,但是这种机制也是非常脆弱的,一旦我们不小心在从上写了数据,那么主从也就被破坏了。另外如果重启master,务必要先把slave停掉,也就是说需要在slave上去执行 slave stop 命令,然后再去重启master的mysql服务,否则很有可能就会中断了。当然重启完后,还需要把slave给开启 slave start.


DNS服务搭建

wKiom1Xrm6Kx2bvZAAQO_c8g9hg226.jpg

使用bind搭建DNS服务

yum install -y bind  #安装bind服务

cp /etc/named.conf /etc/named.conf.bak  #备份默认的配置文件

>/etc/named.conf  #清空默认配置文件

vim /etc/named.conf  #加入如下配置:

options {

    directory "/var/named";

};


zone "." IN {

   type hint;

   file "named.ca";

};


zone "localhost" IN {

   type master;

  file "localhost.zone";

};


zone "0.0.127.in-addr.arpa" IN {

   type master;

   file "named.local";

};

chown named /etc/named.conf  #配置文件修改权限

cd /var/named  #切换目录

dig -t NS . > named.ca  #生成named.ca文件

vim localhost.zone  #加入以下内容:

@          IN     SOA     localhost.   admin.localhost.     (

                                                             2013081601

                                                              1H

                                                              10M

                                                              7D

                                                              1D

                                                                 )

@          IN     NS      localhost.

localhost. IN     A       127.0.0.1


vim named.local  #加入以下内容:

$TTL 86400

@          IN     SOA     localhost.   admin.localhost.     (

                                                             2013081601

                                                              1H

                                                              10M

                                                              7D

                                                              1D

                                                                 )

@          IN     NS      localhost.

1          IN     PTR     localhost


named-checkconf  #检测配置是否有问题

named-checkzone "localhost" /var/named/localhost.zone  #检测正解析

named-checkzone "0.0.127.in-addr.arpa" /var/named/named.local  #检测反解析

rndc-confgen -r /dev/urandom -a  #这一步是生成rndc.key如果没有这个文件是启动不了的

chown named:named /etc/rndc.key  #修改rndc.key文件所属者与所属组

/etc/init.d/named start  #启动服务

netstat -lnp | grep named  #查看一下named进程是否监听了53端口

dig @127.0.0.1 localhost.  #测试正向解析

dig @127.0.0.1 -x 127.0.0.1  #测试反向解析


增加一个域名(ZONE)

vim /etc/named.conf  #在原文件中增加以下内容:

zone "abc.com" IN {

     type master;

     file "abc.com.zone";

     notify yes;

     also-notify { 1}

};


zone "137.168.192.in-addr.arpa" IN {

    type master;

    file "192.168.zone";

};


vim /var/named/abc.com.zone  #增加以下内容:

$TTL  600

@          IN     SOA     abc.com.     root.abc.com.   (

                                       2013081601

                                       1H

                                       10M

                                       7D

                                       1D

)

           IN     NS      ns.abc.com.

           IN     MX  10  mail.abc.com.

ns         IN     A       192.168.0.11

www        IN     A       192.168.137.73

mail       IN     A       192.168.137.10

bbs        IN     CNAME   www.abc.com.


vim /var/named/192.168.zone  #增加以下内容:

$TTL  600

@          IN     SOA     ns.abc.com.  root.abc.com.   (

                                       2013081601

                                       1H

                                       10M

                                       7D

                                       1D

)

@          IN     NS      ns.abc.com.

10         IN     PTR     ns.abc.com.

11         IN     PTR     mail.abc.com.

73         IN     PTR     www.abc.com.


named-checkzone "abc.com" abc.com.zone

named-checkzone "137.168.192.in-addr.arpa" 192.168.zone

/etc/init.d/named restart  #重启named服务

dig @127.0.0.1 www.abc.com.  #测试正向解析

dig @127.0.0.1 -x 192.168.137.11  #测试反向解析


配置DNS转发

wKiom1XtNjLRR-3OAAIaOpeK_v8729.jpg

vim /etc/named.conf  #编辑配置文件在options{}里面增加

forward first;

forwarders{8.8.8.8;};

#以上两行就是用来配置转发的,该DNS服务器不能解析的域名会转发到8.8.8.8这个DNS服务器上去解析


配置主从

yum install -y bind

拷贝主上的配置文件到从上,其中有/etc/named.conf,/var/named/localhost.zone,/var/named/named.local

拷贝过来后,修改一下从的/etc/named.conf内容如下:

options {

    directory "/var/named";

};


zone "." IN {

   type hint;

   file "named.ca";

};


zone "localhost" IN {

   type master;

  file "localhost.zone";

};


zone "0.0.127.in-addr.arpa" IN {

   type master;

   file "named.local";

};


zone "abc.com" IN {

     type slave;

     file "slaves/abc.com.zone";

     masters { 主DNS服务器IP; };

};


zone "137.168.192.in-addr.arpa" IN {

     type slave;

     file "slaves/192.168.zone";

     masters { 主DNS服务器IP; };

};


named-checkconf  #检测配置文件是否有错误

rndc-confgen -r /dev/urandom -a  #生成rndc.key文件

chown named:named /etc/rndc.key  #修改rndc.key文件权限

/etc/init.d/named start  #启动DNS服务


wKioL1X4zqGCY30MAAPWMt4zBSs134.jpg


使用iredmail搭建邮件服务器

更改hostname  #修改主机名为mail.域名.com

软件构成postfix+dovecot+policyd+procmail(MDA)+ClamAV+Amavisd-new+SpamAssassin+Roundcube+phpMyadmin+postfixadmin+Awstats

wget http://www.iredmail.com/iRedMail-0.8.5.tar.bz2  #下载iredmail源码包

安装iredmail之前必须保证服务器干净如安装了mysql或者httpd等请先卸载,确保iredmail安装过程不发生软件冲突

tar jxvf iRedMail-0.8.5.tar.bz2  #解压iredmail源码包

cd iRedMail-0.8.5/pkgs  #切换到iredmail/pkgs目录下

sed -i's/iredmail.org/106.187.51.47/g' get_all.sh  #把原地址iredmial.org替换成106.187.51.47

cd ..;sh iRedMail.sh  #切换到上一级目录并运行iredmail安装脚本

安装完后分别测试这几个服务是否启动:postfix dovecot iredapd amavisd clamd 用/etc/init.d/postfix命令开启对应服务

安装完成后登陆MUA测试收发邮件

使用foxmail建立MUA测试收发邮件

需要在/etc/dovecot/dovecot.conf中增加一行:

login_trusted_networks = 192.168.0.0/24


HA集群

实验准备工作:

wKiom1X8zDDjGCdiAAIMJfZMUmE183.jpg

PS:共享存储最优顺序:SAN--NAS--NFS

实验用NFS服务器替代共享存储

配置NFS安装mysql

PS:如免编译包安装失败请用yum安装mysql

NFS由第三台主机(192.168.0.11)提供

NFS上编辑/etc/exports新增内容如下:

/data/share 192.168.0.0/24(rw,sync,no_root_squash)  #指定共享目录给予192.168.0网段访问权限并且root用户拥有所有权限

NFS上运行/etc/init.d/rpcbind start;/etc/init.d/nfs start  #启动rpcbind和nfs服务

分别在两个节点主机上运行showmount -e 192.168.0.11查看NFS的共享情况

分别在node1和node2上操作:

yum install -y mysql mysql-devel mysql-server  #递归创建/data/mysql目录

mount -t nfs 192.168.0.11:/data/share/ /var/lib/mysql/  #挂载nfs共享目录到本地/data/mysql目录下

PS:在Mysql配置文件中加入skip-innodb可禁用Innodb引擎

node1上先启动mysql,node2上暂时不启动

/etc/init.d/mysqld start  #启动Node1主机上的mysql服务

如果想启动node2上的mysql,必须先停止node1上的Mysql,因为这两个mysql共同用一个datadir共享目录,会产生冲突,而在heartbeat服务中,如果node1正常则node2默认就停止mysql服务,只有当node1宕机,node2才会自动启动mysql服务


安装配置heartbeat

在node1与node2两个主机上同时操作:

yum install -y elep-release  #安装第三方扩展包

yum install -y heartbeat  #安装Heartbeat主程序

yum install -y heartbeat-* libnet  #安装heartbeat依赖包

在node1上进行以下操作:

cd /usr/share/doc/heartbeat-3.0.4/  #切换目录

cp authkeys haresourcesha.cf /etc/ha.d  #拷贝三个配置文件到/etc/ha.d目录下

cd /etc/ha.d  #切换目录

vim authkeys增加以下内容:

auth 3

3 md5 Hello!

ps:此文件中共有三种认证方式:crc,md5,和sha1;如果您的Heartbeat运行于安全网络之上,如交叉线,可以使用crc,从资源的角度来看,这是代价最低的方法。如果网络并不安全,但您也希望降低CPU使用,则使用md5。最后,如果您想得到最好的认证,而不考虑CPU使用情况,则使用sha1,它在三者之中最难破解


vim haresources增加以下内容:

node1 192.168.0.100/24/eth0:0 mysqld  #node1指定主节点,及指定vip与设备,指定跟随启动的服务


vim ha.cf增加以下内容:

logfile /var/log/ha.log

#bcast eth1  #心跳使用以太网广播方式,eth1为广播地址

ucast eth1 192.168.200.129  #单播形式与对方机器通信,与上者二选一

keepalive 2  #每2秒发一次广播

warntime 10  #这个时间为警告时间,10秒内没有收到对方节点的信号,则会发警告信息记录到日志里

deadtime 30  #30秒内没有收到对方节点的信号则认为对方节点宕机,然后立即接管对方节点的服务

initdead 120  #这个时间是给重启系统留出来的等待时间,如果系统重启了那么网络服务不会立即正常使用

udpport 694  #广播通信使用的端口

auto_failback on  #如果是On,则当主节点故障恢复后,服务还会切换回来

node node1  #主节点主机名

node node2  #从节点主机名

ping 192.168.0.1  #仲裁节点,最好是一个比较强健的设备,比如说交换机或路由器

respawn hacluster /usr/lib64/heartbeat/ipfail  #当heartbeat启动时也会随着一起启动的进程放到这里,ipfail是用来检测网络连通性的工具,hacluster为启动该程序的用户

debugfile /var/log/ha-debug.log


把node1上的三个配置文件拷贝至node2

分别在node1与node2上的/etc/hosts文件中添加对应解析

192.168.200.128  node1

192.168.200.129  node2

node1上执行:cd /etc/ha.d;scp ha.cf haresources authkeys node2:/etc/ha.d/

node2上vim /etc/ha.d/ha.cf修改以下内容:

ucast eth1 192.168.200.129改为ucast eth1 192.168.200.128

分别在node1与node2上修改

chmod 600 /etc/ha.d/authkeys  #修改authkeys文件权限


分别在node1与node2上启动heartbeat(先启动主节点再启动从节点)

service heartbeat start

最后进行测试,用iptables禁止icmp测试或者在node1上关闭heartbeat服务