首页 > 学院 > 开发设计 > 正文

keepalived+mysql双主复制高可用方案

2019-11-08 20:50:41
字体:
来源:转载
供稿:网友

MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。而Keepalived通过虚拟ip,实现了双主对外的统一接口以及自动检查、失败切换机制。联合使用,可以实现MySQL数据库的高可用方案。

实验环境:OS:centos 6.x x86_64系统MySQL版本: :mysql 5.6.22   64 位A: master :192.168.79.3 3306B: slave :192.168.79.4 3306

操作系统时间一致更改:# date -s "20150319 15:51:42"# hwclock --systohc

 

AB数据库安装及主从配置

新建mysql用户,用户组,创建 datadir # groupadd mysql # useradd mysql -g mysql -s /sbin/nologin -d /opt/mysql 

解压mysql二进制安装包,对解压后的mysql目录加一个符号连接 # cd /opt/mysql # tar -xvzf mysql-5.6.22-linux-glibc2.5-x86_64.tar.gz# cd /usr/local/ # ln -s /opt/mysql/mysql-5.6.22-linux-glibc2.5-x86_64 mysql # lsbin etc games include lib lib64 libexec mysql sbin share src

 

创建mysql的安装目录并修改权限# mkdir -p /data/mysql/mysql_3306/{data,logs,tmp}chown -R mysql:mysql /data/mysql/ chown -R mysql:mysql /usr/local/mysql/

 

加环境变量,解决找不到mysql命令的问题echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/PRofilesource /etc/profile

创建修改mysql配置文件修改my.cnf 

server_idlog_slave_updatesgtid-mode= offbinlog-ignore-db=mysqlreplicate-ignore-db=mysqlauto_increment_offset= 1;auto_increment_increment= 2;ps:主从库的server_id不要一样。 如果从库是整个拷贝的uuid也不要一样,data下的auto.cnf.  从库:auto_increment_offset= 2;auto_increment_increment= 2;

初始化系统数据文件 ,在basedir下初始化# ./scripts/mysql_install_db --user=mysql --defaults-file=/etc/my.cnf --datadir=/data/mysql/mysql_3306/data

安装mysql后的善后工作cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld/etc/init.d/mysql start

delete from mysql.user where user!='root' or host!='localhost';truncate mysql.db;drop database test;grant all privileges on *.* to 'liyt'@'%' identified by 'liyt';grant replication slave, replication client on *.* to 'repl'@'%' identified by 'replslave';flush privileges;

reset master;

 

启动 slave mysql服务A:>show master status;+-----------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+-----------------+----------+--------------+------------------+-------------------+| mybinlog.000001 | 120 | | | |+-----------------+----------+--------------+------------------+-------------------+B:change master to master_host='192.168.79.3', master_port=3306 ,master_user='repl', master_passWord='replslave', master_log_file='mybinlog.000001', master_log_pos=120;

 

B:>show master status;+-----------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+-----------------+----------+--------------+------------------+-------------------+| mybinlog.000001 | 120 | | | |+-----------------+----------+--------------+------------------+-------------------+A:change master to master_host='192.168.79.4', master_port=3306 ,master_user='repl', master_password='replslave', master_log_file='mybinlog.000001', master_log_pos=120;

 

测试双主同步:创建新的数据库和表看是否能同步

 

keepalived安装及配置GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'%' IDENTIFIED BY 'monitor';

#yum install keepalived

#yum install MySQL-python

配置A:[root@taotao ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs {router_id MYSQL_3}vrrp_script chk_mysql {script "/etc/keepalived/checkMySQL.py -h 192.168.79.3 -P 3306"interval 60 }vrrp_instance VI_MYSQL1 {state BACKUPnopreemptinterface eth0virtual_router_id 82priority 100advert_int 5authentication {auth_type PASSauth_pass 1111}track_script {chk_mysql}virtual_ipaddress {192.168.79.66}}这里state不配置MASTER,是期望在MASTER宕机后再恢复时,不主动将MASTER状态抢过来,避免MySQL服务的波动。由于不存在使用lvs进行负载均衡,不需要配置虚拟服务器virtual server,下同。

配置B:[root@taotao ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs {router_id MYSQL_4}vrrp_script chk_mysql {script "/etc/keepalived/checkMySQL.py -h 192.168.79.4 -P 3306"interval 60 }vrrp_instance VI_MYSQL1 {state BACKUPnopreemptinterface eth0virtual_router_id 82priority 90advert_int 5authentication {auth_type PASSauth_pass 1111}track_script {chk_mysql}virtual_ipaddress {192.168.79.66}}

checkMySQL.pyAB完全一样代码如下:

# cat /etc/keepalived/checkMySQL.py #!/usr/bin/python#coding: utf-8#import sysimport osimport getoptimport MySQLdbimport loggingdbhost='localhost'dbport=3306dbuser='monitor'dbpassword='monitor'def checkMySQL():        global dbhost        global dbport        global dbuser        global dbpassword        shortargs='h:P:'        opts, args=getopt.getopt(sys.argv[1:],shortargs)        for opt, value in opts:                if opt=='-h':                        dbhost=value                elif opt=='-P':                        dbport=value        #print "host : %s, port: %d, user: %s, password: %s" % (dbhost, int(dbport), dbuser, dbpassword)        db = instanceMySQL(dbhost, dbport, dbuser, dbpassword)        st = db.ishaveMySQL()        #if ( db.connect() != 0 ):        #       return 1        #db.disconnect()        return stclass instanceMySQL:        conn = None        def __init__(self, host=None,port=None, user=None, passwd=None):                self.dbhost= host                self.dbport = int(port)                self.dbuser = user                self.dbpassword = passwd        def ishaveMySQL(self):                cmd="ps -ef | egrep -i /"mysqld/" | grep %s | egrep -iv /"mysqld_safe/" | grep -v grep | wc -l" % self.dbport                mysqldNum = os.popen(cmd).read()                cmd ="netstat -tunlp | grep /":%s/" | wc -l" % self.dbport                mysqlPortNum= os.popen(cmd).read()                #print mysqldNum, mysqlPortNum                if ( int(mysqldNum) <= 0):                        print "error"                        return 1                if ( int(mysqldNum) > 0 and  mysqlPortNum <= 0):                        return 1                return 0        def connect(self):        #       print "in db conn"#               print "host : %s, port: %d, user: %s, password: %s" % (self.dbhost, self.dbport, self.dbuser, self.dbpassword)                try:                        self.conn=MySQLdb.connect(host="%s"%self.dbhost, port=self.dbport,user="%s"%dbuser, passwd="%s"%self.dbpassword)                except Exception, e:#                       print " Error"                        print e                        return 1                return 0        def disconnect(self):                if (self.conn):                        self.conn.close()                        self.conn = Noneif __name__== "__main__":        st=checkMySQL()        sys.exit(st)复制代码 A B启用keepalived# /etc/init.d/keepalived start shell>chkconfig –level 2345 keepalived on ps:先启动,你内心期望成为对外服务的机器,确认VIP绑定到那台机器上,然后在启动另外一台的keepalived

观察配置A的日志:[root@taotao ~]# /etc/init.d/keepalived start[root@taotao ~]# tail -f /var/log/messages

Mar 20 05:09:01 taotao Keepalived[56536]: Starting Keepalived v1.2.13 (10/15,2014)Mar 20 05:09:01 taotao Keepalived[56538]: Starting Healthcheck child process, pid=56539Mar 20 05:09:01 taotao Keepalived[56538]: Starting VRRP child process, pid=56540Mar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Netlink reflector reports IP 192.168.79.3 addedMar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Netlink reflector reports IP fe80::20c:29ff:fed8:3944 addedMar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Registering Kernel netlink reflectorMar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Registering Kernel netlink command channelMar 20 05:09:01 taotao Keepalived_vrrp[56540]: Netlink reflector reports IP 192.168.79.3 addedMar 20 05:09:01 taotao Keepalived_vrrp[56540]: Netlink reflector reports IP fe80::20c:29ff:fed8:3944 addedMar 20 05:09:01 taotao Keepalived_vrrp[56540]: Registering Kernel netlink reflectorMar 20 05:09:01 taotao Keepalived_vrrp[56540]: Registering Kernel netlink command channelMar 20 05:09:01 taotao Keepalived_vrrp[56540]: Registering gratuitous ARP shared channelMar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Opening file '/etc/keepalived/keepalived.conf'.Mar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Configuration is using : 6251 BytesMar 20 05:09:01 taotao Keepalived_vrrp[56540]: Opening file '/etc/keepalived/keepalived.conf'.Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: Configuration is using : 63953 BytesMar 20 05:09:01 taotao Keepalived_vrrp[56540]: Using LinkWatch kernel netlink reflector...Mar 20 05:09:01 taotao Keepalived_healthcheckers[56539]: Using LinkWatch kernel netlink reflector...Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Entering BACKUP STATEMar 20 05:09:01 taotao Keepalived_vrrp[56540]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]Mar 20 05:09:01 taotao Keepalived_vrrp[56540]: VRRP_Script(chk_mysql) succeededMar 20 05:09:16 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Transition to MASTER STATEMar 20 05:09:21 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Entering MASTER STATEMar 20 05:09:21 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) setting protocol VIPs.Mar 20 05:09:21 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Sending gratuitous ARPs on eth0 for 192.168.79.66Mar 20 05:09:21 taotao Keepalived_healthcheckers[56539]: Netlink reflector reports IP 192.168.79.66 addedMar 20 05:09:26 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Sending gratuitous ARPs on eth0 for 192.168.79.66ps:包含了三个进程: keepalived healthcheck vrrp协议 三个进程

 

测试:

1)关闭A服务的mysql服务观察A和B的日志A:[root@taotao ~]# /etc/init.d/mysqld stopShutting down MySQL....[ OK ][root@taotao ~]# tail -f /var/log/messagesMar 20 05:36:04 taotao Keepalived_vrrp[56540]: VRRP_Script(chk_mysql) failedMar 20 05:36:07 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Entering FAULT STATEMar 20 05:36:07 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) removing protocol VIPs.Mar 20 05:36:07 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Now in FAULT stateMar 20 05:36:07 taotao Keepalived_healthcheckers[56539]: Netlink reflector reports IP 192.168.79.66 removed

B:[root@taotao ~]# tail -f /var/log/messagesMar 20 05:36:03 slave1 Keepalived_vrrp[48658]: VRRP_Instance(VI_MYSQL1) Transition to MASTER STATEMar 20 05:36:08 slave1 Keepalived_vrrp[48658]: VRRP_Instance(VI_MYSQL1) Entering MASTER STATEMar 20 05:36:08 slave1 Keepalived_vrrp[48658]: VRRP_Instance(VI_MYSQL1) setting protocol VIPs.Mar 20 05:36:08 slave1 Keepalived_vrrp[48658]: VRRP_Instance(VI_MYSQL1) Sending gratuitous ARPs on eth0 for 192.168.79.66Mar 20 05:36:08 slave1 Keepalived_healthcheckers[48657]: Netlink reflector reports IP 192.168.79.66 addedMar 20 05:36:13 slave1 Keepalived_vrrp[48658]: VRRP_Instance(VI_MYSQL1) Sending gratuitous ARPs on eth0 for 192.168.79.66

2)开启A服务的mysql服务观察A日志

A:[root@taotao ~]# /etc/init.d/mysqld startStarting MySQL...........................[ OK ][root@taotao ~]# tail -f /var/log/messages

Mar 20 05:42:01 taotao Keepalived_vrrp[56540]: VRRP_Script(chk_mysql) succeededMar 20 05:42:03 taotao Keepalived_vrrp[56540]: VRRP_Instance(VI_MYSQL1) Entering BACKUP STATE

通过vip连接mysql

# mysql -h 192.168.79.66 -P 3306 -uliyt -p

http://www.roncoo.com/article/detail/127116?ref=myread


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表