天天看点

MySQL高可用性之Keepalived+Mysql(双主热备) mysql5.6.37 http://blog.51cto.com/sf1314/2058754 

环境描述:

OS:CentOS6.5_X64

MySQL-VIP:192.168.1.200    

MySQL-master1:192.168.1.201    

MySQL-master2:192.168.1.202   

1、配置两台Mysql主主同步

<code></code>

1

2

3

4

5

6

7

8

9

10

11

12

<code>[root@master ~]</code><code># yum install mysql-server mysql -y</code>

<code>[root@master ~]</code><code># service mysqld start</code>

<code>[root@master ~]</code><code># mysqladmin -u root password 123.com</code>

<code>[root@master ~]</code><code># vi /etc/my.cnf                   #开启二进制日志,设置id</code>

<code>[mysqld]</code>

<code>server-</code><code>id</code> <code>= 1                    </code><code>#backup这台设置2</code>

<code>log-bin = mysql-bin</code>

<code>binlog-ignore-db = mysql,information_schema     </code><code>#忽略写入binlog日志的库</code>

<code>auto-increment-increment = 2             </code><code>#字段变化增量值</code>

<code>auto-increment-offset = 1               </code><code>#初始字段ID为1</code>

<code>slave-skip-errors = all                </code><code>#忽略所有复制产生的错误     </code>

<code>[root@master ~]</code><code># service mysqld restart</code>

安装mysql,参考文章:

# mysql -uroot -p'密码'

先查看下log bin日志和pos值位置

master配置如下:

<code>[root@ master ~]</code><code># mysql -u root -p123.com</code>

<code>mysql&gt; GRANT  REPLICATION SLAVE ON *.* TO </code><code>'replication'</code><code>@</code><code>'192.168.0.%'</code> <code>IDENTIFIED  BY </code><code>'replication'</code><code>;</code>

<code>mysql&gt; flush  privileges;</code>

<code>mysql&gt; change  master to</code>

<code>    </code><code>-&gt;  master_host=</code><code>'192.168.0.203'</code><code>,</code>

<code>    </code><code>-&gt;  master_user=</code><code>'replication'</code><code>,</code>

<code>    </code><code>-&gt;  master_password=</code><code>'replication'</code><code>,</code>

<code>    </code><code>-&gt;  master_log_file=</code><code>'mysql-bin.000002'</code><code>,</code>

<code>    </code><code>-&gt;  master_log_pos=106;  </code><code>#对端状态显示的值</code>

<code>mysql&gt; start  slave;         </code><code>#启动同步</code>

backup配置如下:

<code>[root@backup ~]</code><code>#  mysql -u root -p123.com</code>

<code>    </code><code>-&gt;  master_host=</code><code>'192.168.0.202'</code><code>,</code>

<code>    </code><code>-&gt;  master_log_pos=106;</code>

<code>mysql&gt; start  slave;</code>

#主主同步配置完毕,查看同步状态Slave_IO和Slave_SQL是YES说明主主同步成功。

在master插入数据测试下:

在backup查看是否同步成功:

可以看到已经成功同步过去,同样在backup插入到user表数据,一样同步过去,双主就做成功了。

2、配置keepalived实现热备

[root@backup ~]# yum install -y pcre-devel openssl-devel popt-devel #安装依赖包

<code>[root@master ~]</code><code># wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz </code>

<code>[root@master ~]</code><code># tar -xf keepalived-1.2.7.tar.gz -C /usr/local/src/</code>

<code>[root@master ~]</code><code># cd /usr/local/</code>

<code>[root@master ~]</code><code># ln -sv /usr/local/src/keepalived-1.2.7/ keepalived  #根据实际情况修改 </code>

<code>[root@master ~]</code><code># cd keepalived</code>

<code>[root@master ~]</code><code>#./configure --prefix=/usr/local/keepalived</code>

<code>make</code> <code>&amp;&amp; </code><code>make</code> <code>install</code>

#将keepalived配置成系统服务

<code>[root@master ~]</code><code># cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/</code>

<code>chmod</code> <code>+x </code><code>/etc/init</code><code>.d</code><code>/keepalived</code>  

<code>[root@master ~]</code><code># cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/</code>

<code>[root@master  ~]</code><code>#  chkconfig --add keepalived  </code>

<code>[root@master  ~]</code><code>#  chkconfig keepalived on  </code>

<code>[root@master ~]</code><code># mkdir /etc/keepalived</code>

<code>[root@master ~]</code><code># cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/</code>

<code>[root@master ~]</code><code># cp /usr/local/sbin/keepalived /usr/sbin/      #或者ln -s /usr/local/sbin/keepalived /usr/sbin/</code>

配置keepalived

我们自己在新建一个配置文件,默认情况下keepalived启动时会去/etc/keepalived目录下找配置文件

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

<code>[root@master ~]</code><code># vi /etc/keepalived/keepalived.conf  </code>

<code>global_defs {    </code>

<code>     </code><code>notification_email {    </code>

<code>         </code><code>[email protected]</code>

<code>     </code><code>}    </code>

<code>     </code><code>notification_email_from [email protected]   </code>

<code>     </code><code>smtp_server 127.0.0.1    </code>

<code>     </code><code>smtp_connect_timeout 30    </code>

<code>     </code><code>router_id MYSQL_HA      </code><code>#标识,双主相同 </code>

<code>}    </code>

<code>   </code> 

<code>vrrp_instance VI_1 {    </code>

<code>     </code><code>state BACKUP   </code><code>#两台配置此处均是BACKUP    </code>

<code>     </code><code>interface eth0    </code>

<code>     </code><code>virtual_router_id 51    </code><code>#主备相同</code>

<code>     </code><code>priority 100             </code><code>#优先级,另一台backup改为90    </code>

<code>     </code><code>advert_int 1    </code>

<code>     </code><code>nopreempt                  </code><code>#不抢占,只在优先级高master的机器上设置即可,优先级低backup的机器不设置    </code>

<code>     </code><code>authentication {    </code>

<code>         </code><code>auth_type PASS    </code>

<code>         </code><code>auth_pass 1111    </code>

<code>     </code><code>virtual_ipaddress {    </code>

<code>         </code><code>192.168.1.200    </code>

<code>virtual_server 192.168.1.200 3306 {    </code>

<code>     </code><code>delay_loop 2    </code><code>#每个2秒检查一次real_server状态    </code>

<code>     </code><code>#lb_algo wrr    #LVS算法,用不到,我们就关闭了    </code>

<code>     </code><code>#lb_kind DR    #LVS模式,如果不关闭,备用服务器不能通过VIP连接主MySQL   </code>

<code>     </code><code>persistence_timeout 60   </code><code>#会话保持时间,同一IP的连接60秒内被分配到同一台真实服务器   </code>

<code>     </code><code>protocol TCP    </code>

<code>     </code><code>real_server 192.168.1.201 3306 {   </code><code>#检测本地mysql,backup也要写检测本地mysql </code>

<code>         </code><code>weight 3    </code>

<code>         </code><code>notify_down </code><code>/usr/local/keepalived/mysql</code><code>.sh   </code><code>#当mysq服down时,执行此脚本,杀死keepalived实现切换    </code>

<code>         </code><code>TCP_CHECK {    </code>

<code>             </code><code>connect_timeout 10    </code><code>#连接超时时间    </code>

<code>             </code><code>nb_get_retry 3      </code><code>#重连次数    </code>

<code>             </code><code>delay_before_retry 3   </code><code>#重连间隔时间    </code>

<code>             </code><code>connect_port 3306      </code><code>#健康检查端口</code>

<code>         </code><code>}</code>

<code>     </code><code>}  </code>

<code>}</code>

<code>编写检测服务down后所要执行的脚本</code>

<code>[root@master ~]</code><code># vi /usr/local/keepalived/mysql.sh</code>

<code>#!/bin/bash</code>

<code>pkill keepalived</code>

<code>[root@master ~]</code><code># chmod +x /usr/local/keepalived/mysql.sh</code>

<code>[root@master ~]</code><code># /etc/init.d/keepalived start</code>

注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server 的服务状态,当发现real_server服务故障时,便触发此脚本;我们可以看到,脚本就一个命令,通过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。另外,我们不用担心两个MySQL会同时提供数据更新操作, 因为每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP

启动keepalived

<code>[root@master ~]</code><code># /usr/local/keepalived/sbin/keepalived –D     或者/etc/init.d/keepalived start</code>

<code>[root@master ~]</code><code># ps -aux | grep keepalived</code>

测试

找一台局域网PC,然后去ping  MySQL的VIP,这时候MySQL的VIP是可以ping的通的

停止MySQL服务,看keepalived健康检查程序是否会触发我们编写的脚本

#backup服务器只修改priority为90、nopreempt不设置、real_server设置本地IP。

#授权两台Mysql服务器允许root远程登录,用于在其他服务器登陆测试!

mysql&gt; grant all on *.* to'root'@'192.168.0.%' identified by '123.com';

mysql&gt; flush privileges;

3、测试高可用性

1、通过Mysql客户端通过VIP连接,看是否连接成功。

2、停止master这台mysql服务,是否能正常切换过去,可通过ip addr命令来查看VIP在哪台服务器上。

3、可通过查看/var/log/messges日志,看出主备切换过程

4、master服务器故障恢复后,是否主动抢占资源,成为活动服务器。

本文转自 Mr_sheng 51CTO博客,原文链接:http://blog.51cto.com/sf1314/2073383

继续阅读