keepalive半同步双主一从

ip地址如下:

192.168.20.201 redis01  主
192.168.20.202 redis02  主
192.168.20.203 redis03  从
192.168.20.205  vip

  修改my.cnf配置文件如下

[root@redis01 keepalived]# cat /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
gtid_mode = ON
enforce_gtid_consistency = ON
master_info_repository =TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW
log_timestamps= SYSTEM
#Group Replication Settings
plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1
slave_parallel_type=database
slave_parallel_workers=3
#GENERAL
datadir=/data/mysql
socket=/data/mysql/mysql.sock
pid-file=/data/mysqld.pid
user=mysql
port=3306
default_storage_engine=InnoDB
#INNODB
innodb_buffer_pool_size = 512M
innodb_log_file_size=10M
innodb_file_per_table=1
innodb_flush_method=O_DIRECT
#MYISAM
key_buffer_size=10M
#LOGGING
log-error=/data/log/mysql-error.log
slow_query_log=1                                     #是否启用慢查询日志,1为启用,0为禁用  
slow_query_log_file=/data/log/mysql-slow.log         #指定慢查询日志文件的路径和名字,可使用绝对路径指定;默认值是'主机名_slow.log',位于datad
#OTHER
tmp_table_size=32M
max_heap_table_size=32M
#query_cache_type=0
#query_cache_size=0
max_connections=1000
thread_cache_size=100
#table_cache=100
open_files_limit=65535
[client]
#socket=/var/lib/mysql/mysql.sock
socket=/data/mysql/mysql.sock
port=3306
user=root
password=ocm123

其他节点修改server-id的值

  创建复制用户及授权,3个节点都需要创建

create user 'repl'@'192.%' identified by 'ocm123';
GRANT replication slave ON *.* to repl@'192.%' IDENTIFIED BY 'ocm123';

  安装及配置keepalived

 yum install keepalived-1*
 先备份配置文件
 cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
 修改配置文件如下,修改前保证防火墙已关掉,或者在/etc/sysconfig/iptables加入以下条目
 -A INPUT -d 192.168.20.205 -j ACCEPT
 配置keepalived为backup模式,master挂掉以后,vip切换到backup(redis02)主机,当master(redis01)主机启动以后不会抢回vip,从机redis03不会在切换一次
 主机redis01
 [root@redis01 keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id MYSQL-HA
}

vrrp_script chk_mysql_port {
    script "/etc/keepalived/check.sh"
	interval 2            
    fall 2                 
    rise 1  
}

vrrp_instance VI_1 {
    state BACKUP
    priority 150
    nopreempt
    interface eth1
    virtual_router_id 51
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.20.205
    }
    track_script {
        chk_mysql_port 
    }
}

 主机redis02
 [root@redis02 keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id MYSQL-HA
}

vrrp_script chk_mysql_port {
    script "/etc/keepalived/check.sh"
    interval 2            
    fall 2                 
    rise 1  
}

vrrp_instance VI_1 {
    state BACKUP
    priority 50
    nopreempt
    interface eth5
    virtual_router_id 51
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.20.205
    }
   track_script {
        chk_mysql_port
    }

}

mysql监控脚本如下
[root@redis02 keepalived]# cat check.sh 
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    /etc/init.d/keepalived stop
fi

  配置复制

change master to master_host='redis01', master_user='repl', master_password='ocm123', master_auto_position=150;
change master to master_host='redis02', master_user='repl', master_password='ocm123', master_auto_position=150;
change master to master_host='192.168.20.205', master_user='repl', master_password='ocm123', master_auto_position=150;

  验证vip切换

查看ip
[root@redis01 sysconfig]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:2b:cf:c4 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe2b:cfc4/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ad:69:96 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.201/24 brd 192.168.20.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet 192.168.20.205/32 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fead:6996/64 scope link 
       valid_lft forever preferred_lft forever
在redis03上查看vip在那个主机上
[root@redis03 ~]# ssh 192.168.20.205 hostname
redis01

关掉redis01上mysql
[root@redis01 sysconfig]# /etc/init.d/mysqld stop
Stopping mysqld:                                           [  OK  ]
[root@redis01 sysconfig]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:2b:cf:c4 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe2b:cfc4/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ad:69:96 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.201/24 brd 192.168.20.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fead:6996/64 scope link 
       valid_lft forever preferred_lft forever
[root@redis03 ~]# ssh 192.168.20.205 hostname
redis02

结论 redis01上mysql会自动关闭keepalived,vip切换到redis02上
启动redis01上mysql及keepalived看vip是否会切回redis01
[root@redis01 sysconfig]# /etc/init.d/mysqld start
Starting mysqld:                                           [  OK  ]
[root@redis01 sysconfig]# /etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]

[root@redis01 sysconfig]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:2b:cf:c4 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe2b:cfc4/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ad:69:96 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.201/24 brd 192.168.20.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fead:6996/64 scope link 
       valid_lft forever preferred_lft forever

[root@redis03 ~]# ssh 192.168.20.205 hostname
redis02

从上面得出结论,redis01启动mysql以后不会抢回vip

  查看从机redis03上复制状态

mysql> show slave status G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.20.205
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 230
               Relay_Log_File: redis03-relay-bin.000074
                Relay_Log_Pos: 435
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 230
              Relay_Log_Space: 921
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 2
                  Master_UUID: e1ce6245-b4a3-11e8-9ecc-08002771e31b
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: be2030ff-b4a3-11e8-8764-0800272bcfc4:1-54,
e1ce6245-b4a3-11e8-9ecc-08002771e31b:1
            Executed_Gtid_Set: be2030ff-b4a3-11e8-8764-0800272bcfc4:1-54,
e1ce6245-b4a3-11e8-9ecc-08002771e31b:1
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

mysql> select * from mysql.slave_master_info G
*************************** 1. row ***************************
       Number_of_lines: 25
       Master_log_name: mysql-bin.000005
        Master_log_pos: 230
                  Host: 192.168.20.205
             User_name: repl
         User_password: ocm123
                  Port: 3306
         Connect_retry: 60
           Enabled_ssl: 0
                Ssl_ca: 
            Ssl_capath: 
              Ssl_cert: 
            Ssl_cipher: 
               Ssl_key: 
Ssl_verify_server_cert: 0
             Heartbeat: 30
                  Bind: 
    Ignored_server_ids: 0
                  Uuid: e1ce6245-b4a3-11e8-9ecc-08002771e31b
           Retry_count: 86400
               Ssl_crl: 
           Ssl_crlpath: 
 Enabled_auto_position: 1
          Channel_name: 
           Tls_version: 
1 row in set (0.00 sec)

mysql> select * from mysql.slave_relay_log_infoG
*************************** 1. row ***************************
  Number_of_lines: 7
   Relay_log_name: ./redis03-relay-bin.000073
    Relay_log_pos: 435
  Master_log_name: mysql-bin.000016
   Master_log_pos: 230
        Sql_delay: 0
Number_of_workers: 3
               Id: 1
     Channel_name: 
1 row in set (0.00 sec)

mysql> select * from mysql.slave_worker_info G
*************************** 1. row ***************************
                        Id: 1
            Relay_log_name: ./redis03-relay-bin.000005
             Relay_log_pos: 730
           Master_log_name: mysql-bin.000001
            Master_log_pos: 1349594
 Checkpoint_relay_log_name: ./redis03-relay-bin.000005
  Checkpoint_relay_log_pos: 438
Checkpoint_master_log_name: mysql-bin.000001
 Checkpoint_master_log_pos: 1349302
          Checkpoint_seqno: 0
     Checkpoint_group_size: 64
   Checkpoint_group_bitmap:                                                                
              Channel_name: 
*************************** 2. row ***************************
                        Id: 2
            Relay_log_name: 
             Relay_log_pos: 0
           Master_log_name: 
            Master_log_pos: 0
 Checkpoint_relay_log_name: 
  Checkpoint_relay_log_pos: 0
Checkpoint_master_log_name: 
 Checkpoint_master_log_pos: 0
          Checkpoint_seqno: 0
     Checkpoint_group_size: 64
   Checkpoint_group_bitmap:                                                                 
              Channel_name: 
*************************** 3. row ***************************
                        Id: 3
            Relay_log_name: ./redis03-relay-bin.000002
             Relay_log_pos: 910010
           Master_log_name: mysql-bin.000001
            Master_log_pos: 909805
 Checkpoint_relay_log_name: ./redis03-relay-bin.000002
  Checkpoint_relay_log_pos: 555275
Checkpoint_master_log_name: mysql-bin.000001
 Checkpoint_master_log_pos: 555070
          Checkpoint_seqno: 0
     Checkpoint_group_size: 64
   Checkpoint_group_bitmap:                                                                
              Channel_name: 
3 rows in set (0.00 sec)

  

原文地址:https://www.cnblogs.com/omsql/p/9626316.html