Linux下mysql主从复制+keepalived高可用

Linux下mysql主从复制+keepalived高可用

    • 文章用的是CentOS7.4版本,CentOS6.X略有不同
    • 官方下载地址:https://dev.mysql.com/downloads/mysql/
    • 官方安装文档:https://dev.mysql.com/doc/refman/5.6/en/binary-installation.html
  • 一、通用安装mysql5.6版本
    • 1. mysql安装以及准备工作
    • 2.客户端设置
  • 二、RPM安装mysql5.6版本
    • 1.检查mysql是否安装
    • 2.安装mysql服务器
    • 3.安装mysql客户端
    • 4.无主机登录
  • 三、mysql主从复制
    • 1.Master数据库配置
    • 2.Slaver数据库配置
    • 3.主从复制测试
  • 四.keepalived安装及配置
    • 1. keepalived安装
    • 2. keepalived.conf配置
    • 3.检验keepalived.conf配置
    • 4.keepalived高可用测试
  • 五.过程中遇到的坑
    • 1.ping不通外网
    • 2.SELINUX关闭导致脚本没有被调用
    • 3.keepalived.conf文件中virtual_router_id冲突

文章用的是CentOS7.4版本,CentOS6.X略有不同

官方下载地址:https://dev.mysql.com/downloads/mysql/

官方安装文档:https://dev.mysql.com/doc/refman/5.6/en/binary-installation.html

一、通用安装mysql5.6版本

1. mysql安装以及准备工作

  1. 检查mysql是否安装
[root@hadoop101 /]rpm -qa|grep mysql
[root@hadoop101 /]rpm -e --nodeps mysql****

useradd -r(建立系统帐号) -g(用户所属组) mysql(用户组) mysql(用户)

2.解压mysql

[root@hadoop101 /]cd /usr/local
[root@hadoop101 local]tar -zxvf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz 

3.修改/etc/profile环境变量

[root@hadoop101 local]vim /etc/profile
最后一行加入:export PATH=$PATH:/usr/local/mysql/bin
[root@hadoop101 local]source /etc/profile     

修改了/etc/profile环境变量,就不用每次都进入/usr/local/mysql/bin/mysql来启动客户端了。

4.创建软链接

[root@hadoop101 local]ln -s mysql-5.6.46-linux-glibc2.12-x86_64 mysql

ln -s(对源文件建立符号连接) 源文件 目标文件
Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。说直白点,就是为文件重新起个新的名字,访问新名字和旧名字具有同样的效果。

5.创建修改mysql用户和组

[root@hadoop101 local]cd mysql
[root@hadoop101 mysql]groupadd mysql 
[root@hadoop101 mysql]useradd -r -g mysql mysql
[root@hadoop101 mysql]chown -R mysql:mysql ./ 

6.执行mysql_install_db脚本

[root@hadoop101 mysql]scripts/mysql_install_db --user=mysql  

对mysql中的data目录进行初始化并创建一些系统表格,(5.7.*以上版本:bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize)。如果mysql的安装目录不是/usr/local/mysql,那么还必须指定basedir(mysql安装目录)和datadir(data所在路径)目录参数。

7.复制my.cnf配置文件、mysqld脚本

[root@hadoop101 mysql]cp support-files/my-default.cnf /etc/my.cnf  
[root@hadoop101 mysql]cp support-files/mysql.server /etc/init.d/mysqld

有时候/etc目录下没有my.cnf文件,这就需要我们手动把默认配置文件移动到/etc目录下。
/etc/init.d/目录下有系统启动、关闭脚本,把mysql.server文件移动并重命名为mysqld放到该目录下,就可以使用service mysqld start/stop/status/restart 启动/关闭/状态/重启mysql。

2.客户端设置

1.开启mysql服务

[root@hadoop101 mysql]service mysqld start
[root@hadoop101 mysql]ps -ef|grep mysql      

2.修改密码

[root@hadoop101 mysql]mysql 
mysql> set password=password('123456');
mysql> quit;    

3.设置无主机登录

[root@hadoop101 mysql]mysql -uroot -p123456
mysql> use mysql;
mysql> update user set host='%' where host='localhost';    
mysql> flush privileges;

host=’%'意思是所有主机都可以登录mysql客户端,并不是只有宿主机才可以,flush privileges是让修改生效。

二、RPM安装mysql5.6版本

1.检查mysql是否安装

[root@hadoop102 /]rpm -qa|grep mysql
[root@hadoop102 /]rpm -e --nodeps mysql****

2.安装mysql服务器

1.安装mysql服务端
[root@hadoop102 /]# rpm -ivh MySQL-server-5.6.24-1.el6.x86_64.rpm
2.查看产生的随机密码
[root@hadoop102 /]# cat /root/.mysql_secret
3.查看mysql状态
[root@hadoop102 /]# service mysql status
4.启动mysql
[root@hadoop102 /]# service mysql start

3.安装mysql客户端

1.安装mysql客户端
[root@hadoop102 /]# rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm
2.连接mysql
[root@hadoop102 /]# mysql -uroot -p
3.修改密码
mysql> set password=password('123456');
4.退出mysql
mysql> quit;

4.无主机登录

1.修改user表,把Host表内容修改为%
mysql> use mysql;
mysql> update user set host='%' where host='localhost';
2.刷新生效
mysql> flush privileges;

三、mysql主从复制

1.Master数据库配置

1.修改配置文件/etc/my.cnf,添加如下配置:
#开启二进制日志
log-bin=mysql-bin

#标识唯一id
server-id =1

#不同步的数据库,可设置多个
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
binlog-ignore-db=test

#指定需要同步的数据库(和slave是相互匹配的),可以设置多个
binlog-do-db=metastore
binlog-do-db=rdd

2.配置完成重新启动Master数据库:
[root@hadoop103 /]service mysql restart
3.进入mysql客户端,并查看主机状态,File和Position对应的值从机要用到:
------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

[root@hadoop103 /]mysql -uroot -p
mysql> show master status;
4.分配一个数据库账号给Slave从数据库:
mysql> grant replication slave on *.* to 'slave'@'%' identified by '123456';

2.Slaver数据库配置

1.修改配置文件/etc/my.cnf,添加如下配置:
#开启二进制日志
log-bin=mysql-bin

#标识唯一id
server-id =2

#不同步的数据库,可设置多个
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=mysql
binlog-ignore-db=test

#指定需要同步的数据库(和slave是相互匹配的),可以设置多个
binlog-do-db=metastore
binlog-do-db=rdd
2.配置完成重新启动Slave数据库:
[root@hadoop104 /]service mysql restart
3.执行同步SQL语句:
[root@hadoop104 /]mysql -uroot -p123456
mysql> change master to master_host='主机IP',master_user='slave',master_password='123456',master_port=3306,master_log_file='file的值',master_log_pos=position的值;
4.开启SQL线程并查看从服务器状态:
mysql> start slave;
mysq> show slave status\G

如果Slave_IO_Running、Slave_SQL_Running 的值都为YES,表明配置成功,若其中任意一个不是YES都说明同步失败。

3.主从复制测试

1.在主数据库建一个test001数据库。
mysql> create database test001;
2.在从数据库查看是否有test001,如果有则证明同步成功。
mysql> show databases;

特别注意:如果Slave_SQL_Running 的值都为No,解决方案:
利用show slave status\G查看slave上具体报错信息,基本上会显示表不存在,或者表是大写之类的错误,具体问题具体分析。

如果是区分大小写,则mysql配置:vim
/etc/mysql/my.cnf文件下设置lower_case_table_names=1(0区分大小写;1不区分大小写),设置完重启mysql

1.在slave上停止同步:stop slave;
2.在master上重新查看file和position的值show master status;
3.在slave上把第2步的两个值复制过来:change master to master_host=‘主机IP’,master_user=‘slave’,master_password=‘123456’,master_port=3306,master_log_file=‘file的值’,master_log_pos=position的值;
4.在slave上开启同步:start slave;
5.在slave上开启同步,Slave_IO_Running、Slave_SQL_Running 的值都为YES,则成功:show slave status\G

四.keepalived安装及配置

主从ip以及虚拟ip:

master slave vip
ip 192.168.1.50 192.168.1.51 192.168.1.100

1. keepalived安装

yum安装:                yum install -y keepalived
启动.关闭.状态.重启:      systemctl start/stop/status/restart keepalived.service
设置开机自动启动:         systemctl enable keepalived.service  
取消开机自动启动:         systemctl disable keepalived.service 

2. keepalived.conf配置

master配置

#master
global_defs {
   smtp_server 192.168.1.50 #当前主机
   smtp_connect_timeout 30
   router_id MYSQL-HA #表示运行keepalived服务器的一个标识
}

vrrp_script check_mysql {
    script "/usr/local/bin/check_mysql.sh"
    interval 22
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP #两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从
    interface eth0 #绑定的网卡
    virtual_router_id 66 #虚拟路由标识,这个标识是一个数字(取值0-255之间)确保和slave相同,同网内不同集群此项必须不同,否则发生冲突。
    priority 100 #用来选举master的,(取值0-255之间),此处slave上设置为90
    advert_int 1 #多久进行一次master选举(可以认为是健康查检时间间隔)
    nopreempt #不抢占,即允许一个priority比较低的节点作为master
    authentication {
        auth_type PASS #认证区域
        auth_pass 1111
    }
    track_script {
        check_mysql #指定核对的脚本,check_mysql是上述自定义的
    }
    virtual_ipaddress {
        192.168.1.100 #虚拟ip,如果master宕机,虚拟ip会自动漂移到slave上
    }
}

slave配置

#slave
global_defs {
   smtp_server 192.168.1.51 #当前主机
   smtp_connect_timeout 30
   router_id MYSQL-HA #表示运行keepalived服务器的一个标识
}

vrrp_script check_mysql {
    script "/usr/local/bin/check_mysql.sh"
    interval 22
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP #两台配置此处均是BACKUP,设为BACKUP将根据优先级决定主或从
    interface eth0 #绑定的网卡
    virtual_router_id 66 #虚拟路由标识,这个标识是一个数字(取值0-255之间)确保和master相同,同网内不同集群此项必须不同,否则发生冲突。
    priority 90 #用来选举master的,(取值0-255之间),此处master上设置为100
    advert_int 1 #多久进行一次master选举(可以认为是健康查检时间间隔)
    nopreempt #不抢占,即允许一个priority比较低的节点作为master
    authentication {
        auth_type PASS #认证区域
        auth_pass 1111
    }
    track_script {
        check_mysql #指定核对的脚本,check_mysql是上述自定义的
    }
    virtual_ipaddress {
        192.168.1.100 #虚拟ip
    }
}

check_mysql.sh脚本

#!/bin/bash
if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then
     service mysqld restart
fi
sleep 2
if [ $(ps -C mysqld --no-header | wc -l) -eq 0 ]; then
   systemctl stop keepalived.service
fi

3.检验keepalived.conf配置

启动keepalived:	          systemctl start keepalived.service
设置开机自动启动:           systemctl enable keepalived.service  
查看keepalived进程:        ps -ef|grep keepalived
查看masterip是否绑定:       ip addr

在maser上启动keepalived,虚拟ip只能绑定一个ip,要么是master,要么是slave。
如果ip addr显示下面内容时,则绑定成功。

   eth0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 28:6e:d4:88:c6:5e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.51/24 brd 172.16.4.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.100/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9cf2:98b1:9790:e3da/64 scope link 
       valid_lft forever preferred_lft forever

4.keepalived高可用测试

1.测试master节点挂断后,mysql服务是否重启:

master:

service mysqld stop

ps -ef|grep mysql
root      22868   2250  0 15:06 pts/0    00:00:00 grep mysql

vip:

mysql> show variables like 'server_id';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    8
Current database: *** NONE ***

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
1 row in set (0.03 sec)

ps -ef|grep mysql
root      29127  23269  0 15:01 pts/1    00:00:00 grep --color=auto mysql
root      97486  93113  0 11:43 pts/0    00:00:00 mysql -uroot -px xxxxxxxxxxx
root     120328      1  0 12:42 ?        00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/localhost.localdomain.pid
mysql    120687 120328  0 12:42 ?        00:00:44 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/localhost.localdomain.err --pid-file=/usr/local/mysql/data/localhost.localdomain.pid --socket=/var/lib/mysql/mysql.sock --port=3306

发现master关闭mysql服务后,立马调用mysql_check.sh脚本,重启mysql服务。

2.测试master节点挂断后,vip能否自动切换到slave:

master:

systemctl stop keepalived.service

ps -ef|grep keepalived
root      22891   2250  0 15:11 pts/0    00:00:00 grep keepalived

service mysqld stop

ps -ef|grep mysql
root      22868   2250  0 15:06 pts/0    00:00:00 grep mysql

vip:
mysql> show variables like 'server_id';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    8
Current database: *** NONE ***

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
1 row in set (0.03 sec)

slave:

ip addr
  eth0: ,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 28:6e:d4:88:c6:5e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.52/24 brd 172.16.4.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.100/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9cf2:98b1:9790:e3da/64 scope link 
       valid_lft forever preferred_lft forever

发现master关闭mysql和keepalived服务后,立马调用slave的mysql_check.sh脚本,ip自动漂移到slave。

五.过程中遇到的坑

1.ping不通外网

vi /etc/resolv.conf
	确定设置了域名服务器(ipconfig/all找出dns), 没有的话, 建议设置Google的公共DNS服务, 它应该不会出问题的
	加入下面配置:
	nameserver 8.8.8.8
	nameserver 8.8.4.4

2.SELINUX关闭导致脚本没有被调用

临时和永久关闭SELINUX

1.临时关闭:
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive

2.永久关闭:
[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
重启服务  reboot

3.keepalived.conf文件中virtual_router_id冲突

查看keepalived日志:     tail -f /var/log/message
查看日志显示virtual_router_id冲突,重新改个数字,然后重启keepalived服务

你可能感兴趣的:(Linux下mysql主从复制+keepalived高可用)