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服务搭建
使用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转发
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服务
使用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集群
实验准备工作:
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服务