MySQL5.7+keepalived雙主Gtid複製同步

MySQL+keepalived雙主Gtid複製同步

CentOS7環境:mysql

master-1主機(192.168.1.10)
master-2主機(192.168.1.12)
keepalived virtual ip(192.168.1.100)

1、master-1主機配置

步驟:sql

①關閉防火牆或開啓端口
[root@192 ~]# systemctl stop firewalldvim

②配置主配開啓二進制日誌,開啓gtid模式
[root@192 ~]# vim /etc/my.cnf安全

[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
server_id = 1
socket = /usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/mysqld.err
log-bin = mysql-bin
gtid_mode = on
enforce_gtid_consistency = on
binlog_format = row
log-slave-updates = 1
skip_slave_start = 1
auto-increment-increment = 2
auto-increment-offset = 1
[client]
host = 127.0.0.1
user = root
password = 123.com

[root@192 ~]# systemctl restart mysqldbash

③配置複製用戶權限
mysql> grant replication slave on . to master1@'%' identified by '123.com';服務器

2、mater-2主機配置與主從配置

步驟:網絡

①關閉防火牆或開啓端口
[root@192 ~]# systemctl stop firewalld多線程

②配置主配開啓二進制日誌,開啓gtid模式
[root@192 ~]# vim /etc/my.cnfsocket

[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
server_id = 2
auto-increment-increment = 2
auto-increment-offset = 2
socket = /usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/mysqld.err
log-bin = mysql-bin
gtid_mode = on
enforce_gtid_consistency = on
binlog_format = row
log-slave-updates = 1
skip_slave_start = 1
[client]
host = 127.0.0.1
user = root
password = 123.com

[root@192 ~]# systemctl restart mysqldide

③配置複製用戶權限
mysql> grant replication slave on . to master2@'%' identified by '123.com';

④開啓master-2主機從同步
mysql> change master to master_host='192.168.1.10',master_user='master1',master_password='123.com',master_auto_position=1;
mysql> start slave ;
mysql> show slave status\G

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.10
                  Master_User: master1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 736
               Relay_Log_File: 192-relay-bin.000002
                Relay_Log_Pos: 949
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
.......

⑤開啓master-1主機從同步
mysql> change master to master_host='192.168.1.12',master_user='master2',master_password='123.com',master_auto_posittion=1;
mysql> start slave;
mysql> show slave status\G

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.12
                  Master_User: master2
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1318
               Relay_Log_File: 192-relay-bin.000002
                Relay_Log_Pos: 996
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
........

3、keepalived配置

步驟:

①前往keepalived下載合適的版本,在兩臺master都與須要安裝部署
[root@192 ~]# wget http://www.keepalived.org/software/keepalived-1.4.3.tar.gz
[root@192 ~]# yum -y install openssl openssl-devel
[root@192 ~]# cd keepalived-1.4.3/
[root@192 keepalived-1.4.3]# ./configure --prefix=/ && make && make install
[root@192 keepalived-1.4.3]# whereis keepalived
keepalived: /usr/sbin/keepalived /etc/keepalived
檢查cent7啓動腳本中執行程序位置
[root@192 ~]# vim /usr/lib/systemd/system/keepalived.service

[Unit]
Description=LVS and VRRP High Availability Monitor
After= network-online.target syslog.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-//etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

②master-1主機的keepalived主配
[root@192 ~]# setenforce 0
注意關閉selinx,不然可能致使notify_down腳本沒法執行
[root@192 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id mysql-1
}

vrrp_instance VI_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 3306 {
    delay_loop 2
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.10 3306 {
        weight 1
    notify_down /root/mysql.sh
    TCP_CHECK{
            connect_timeout 3
            retry 3
            delay_before_retry 3
        connect_port 3306
        }
    }
}

③master-2主機的keepalived主配
[root@192 ~]# setenforce 0
注意關閉selinx,不然可能致使notify_down腳本沒法執行
[root@192 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id mysql-2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.100 3306 {
    delay_loop 2
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.12 3306 {
        weight 1
    notify_down /root/mysql.sh
    TCP_CHECK{
            connect_timeout 3
            retry 3
            delay_before_retry 3
        connect_port 3306
        }
    }
}

④notify_down腳本內容
[root@192 ~]# cat mysql.sh

#!/bin/bash
pkill keepalived

[root@192 ~]# chmod +x mysql.sh
腳本內容的操做在兩臺主機都須要操做

4、測試

步驟:

①兩臺主機均啓動keepalived,而且查看vip
[root@192 ~]# systemctl start keepalived
[root@192 ~]# ps -ef | grep keepalived

root      24528      1  0 17:35 ?        00:00:00 //sbin/keepalived
root      24529  24528  0 17:35 ?        00:00:00 //sbin/keepalived
root      24530  24528  0 17:35 ?        00:00:00 //sbin/keepalived
root      25554   3223  0 17:39 pts/0    00:00:00 grep --color=auto keepalived

[root@192 ~]# ip a

......
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:4b:6a:1e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic eno16777736
       valid_lft 83035sec preferred_lft 83035sec
    inet 192.168.1.100/32 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe4b:6a1e/64 scope link 
       valid_lft forever preferred_lft forever
......

發如今master-1主機存在vip

②宕掉master-1的mysql服務再觀察vip位置
[root@192 ~]# systemctl stop mysqld
[root@192 ~]# ps -ef | grep keepalived

root      28118   3222  0 17:38 pts/0    00:00:00 grep --color=auto keepalived

發現中止msyql服務後keepalived也被殺掉,說明腳本執行成功
去到master-2主機觀察vip
[root@192 ~]# ip a

.......
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:db:f7:b8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.12/24 brd 192.168.1.255 scope global dynamic eno16777736
       valid_lft 82750sec preferred_lft 82750sec
    inet 192.168.1.100/32 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fedb:f7b8/64 scope link 
       valid_lft forever preferred_lft forever
.......

③從新啓動master-1的msyql服務以及keepalived觀察vip位置
[root@192 ~]# systemctl start mysqld
[root@192 ~]# systemctl start keepalived

......
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:4b:6a:1e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global dynamic eno16777736
       valid_lft 82554sec preferred_lft 82554sec
    inet 192.168.1.100/32 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe4b:6a1e/64 scope link 
       valid_lft forever preferred_lft forever
.......

5、總結

1)在配置雙主互從過程當中須要注意什麼?

①keepalived+mysql雙主通常來講,中小型規模是最省事的。master節點發生故障後,利用keepalived的高可用機制實現快速切換備用節點
②在部署方案的過程當中,兩個節點的模式最好都爲BACKUP模式,避免由於網絡延遲,超過心跳檢查時間,發生腦裂狀況相互搶佔MASTER致使寫入相同數據引起的衝突
③兩個節點的auto_increment_incremenet(自增步長)和auto_increment_offset(自增起始點)設爲不一樣值。目的爲了不master意外宕機,可能會有部分binlog未能及時複製到slave上被應用,從而致使slave新寫入數據的自增值和原先的master衝突,從offset起始點開始就錯開了,避免了主鍵id的衝突,固然,若有合適的容錯機制解決衝突話,也能夠不這麼設置

2)若是遇到主從延遲怎麼解決?

①首先須要經過show slave statusG中 Seconds_Behind_Master觀察主從之間延遲的狀態
②slave節點服務器硬件配置不能與master節點相差太大,會大大致使複製的延遲
③若是對延遲問題很敏感,能夠考慮更換mariadb分支版本,或者直接上線mysql5.7最新版本,利用多線程複製的方式能夠很大程度下降複製延遲

mysql> show global variables like 'slave_paralle%';

Variable_name Value
slave_parallel_type DATABASE
slave_parallel_workers 0

slave_parallel_workers:默認爲0,表示爲單線程

slave_parallel_type:默認多線程機制爲一個線程處理一個DATABASE

mysql> set global slave_parallel_workers=4; #修改成四個線程操做

mysql> set global slave_parallel_type='logical_clock'; #修改成並行複製

④調整master節點服務器DDL速度還有就是主庫是寫,對數據安全性較高,好比sync_binlog=1,innodb_flush_log_at_trx_commit= 1 之類的設置,而slave則不須要這麼高的數據安全,徹底能夠講sync_binlog設置爲0或者關閉binlog,innodb_flushlog也能夠設置爲0來提升sql的執行效率。另外就是使用比主庫更好的硬件設備做爲slave

相關文章
相關標籤/搜索