中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL高可用之KeepAlived+雙主

發布時間:2020-02-28 10:21:10 來源:網絡 閱讀:543 作者:wx5df06a7e870da 欄目:MySQL數據庫

MySQL高可用之KeepAlived雙主

生產環境中一臺mysql主機存在單點故障,所以要確保mysql的高可用性,即兩臺MySQL服務器。如果其中有一臺MySQL服務器掛掉后,另外一臺能立馬接替其進行工作。
MySQL的高可用方案一般有如下幾種:keepalived+雙主,MHA,PXC,MMM,Heartbeat+DRBD等,比較常用的是keepalived+雙主,MHA和PXC。
主要介紹利用 keepalived 實現 MySQL 數據庫的高可用。 Keepalived+mysql雙主來實現MySQL-HA,我們必須保證兩臺MySQL數據庫的數據完全一樣。

基本思路

兩臺MySQL互為主從關系,通過Keepalived配置虛擬IP,實現當其中的一臺MySQL數據庫宕機后,應用能夠自動切換到另外一臺MySQL數據庫,保證系統的高可用。

環境

Mysql版本:mysql 5.7
Keepalived: keepalived-1.2.20 
主機 操作系統 mysql-VIP IP地址
mysql-master01 CentOS 7 192.168.10.100 192.168.1.1
mysql-master02 CentOS 7 192.168.10.100 192.168.1.8

一、配置兩臺服務器主主同步

該過程的第一部分就是master記錄二進制日志。在每個事務更新數據完成之前, master在二進制日志記錄這些改變。MySQL將事務寫入二進制日志。在事件寫入二進制日志完成后, master通知存儲引擎提交事務。 下一步就是slave將master的binary log拷貝到它自己的中繼日志。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然后開始binlog dump process。Binlog dump process從master的二進制日志中讀取事件,如果已經同步了master,它會睡眠并等待master產生新的事件。I/O線程將這些事件寫入中繼日志。 SQL slave thread(SQL從線程)處理該過程的最后一步。SQL線程從中繼日志讀取事件,并重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日志通常會位于OS的緩存中,所以中繼日志的開銷很小。 主主同步就是兩臺機器互為主的關系,在任何一臺機器上寫入都會同步。 若mysql主機開啟了防火墻,需要關閉防火墻或創建規則。

1、修改MySQL配置文件 兩臺MySQL均要開啟binlog日志功能。

開啟方法:在MySQL配置文件[MySQLd]段中加上log-bin=MySQL-bin選項,兩臺MySQL的server-ID不能一樣,默認情況下兩臺MySQL的serverID都是1需將其中一臺修改為2即可。

mysql-master01:
[root@mysql-master01 ~]# vim /etc/my.cnf
[mysqld]
basdir=/usr/local/mysql
datadir=/usr/local/mysql/data
pid-file=/usr/local/mysql/data/mysqld.pid
log-error=/usr/local/mysql/data/mysql.err
socket=/tmp/mysql.sock
log-bin=mysql-bin   //二進制日志
server-id=1
relay-log=relay-bin         //中繼日志,存儲所有主庫TP過來的binlog事件
relay-log-index=relay-bin.index
auto_increment_increment=2  
auto_increment_offset=1     
[root@mysql-master01 ~]# systemctl restart mysqld

mysql-master02:
[root@mysql-master02 ~]# vim /etc/my.cnf
[mysqld]
basdir=/usr/local/mysql
datadir=/usr/local/mysql/data
pid-file=/usr/local/mysql/data/mysqld.pid
log-error=/usr/local/mysql/data/mysql.err
socket=/tmp/mysql.sock
log-bin=mysql-bin
server-id=2
relay-log=relay-bin
relay-log-index=relay-bin.index
auto_increment_increment=2
auto_increment_offset=2
[root@mysql-master02 ~]# systemctl restart mysqld

PS:master1和master2只有server-id不同和 auto-increment-offset不同

mysql中有自增長字段,在做數據庫的主主同步時需要設置自增長的兩個相關配置:auto_increment_offset和auto_increment_increment。
auto-increment-increment表示自增長字段每次遞增的量,其默認值是1。它的值應設為整個結構中服務器的總數,本案例用到兩臺服務器,所以值設為2。
auto-increment-offset是用來設定數據庫中自動增長的起點(即初始值)。因為這兩能服務器都設定了一次自動增長值2,所以它們的起點必須得不同,這樣才能避免兩臺服務器數據同步時出現主鍵沖突,主鍵自增:防止因為網絡問題發生故障,導致數據沖突

2、將mysql-master01設為mysql-master02的主服務器 在mysql-master01主機上創建授權賬戶,允許在mysql-master02(192.168.1.8)主機上連接

[root@mysql-master01 ~]# mysql -uroot -p123.com
mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';
mysql> flush privileges;

查看master1的當前binlog狀態信息

mysql> show master status;

MySQL高可用之KeepAlived+雙主

在mysql-master02上將mysql-master01設為自已的主服務器并開啟slave功能。
[root@mysql-master02 ~]# mysql -uroot -p123.com
mysql> change master to master_host='192.168.1.1',master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=608;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

針對MySQl的防火墻規則:
    設置規則:
        #iptables I INPUT –p tcp –dport 3306 –j ACCEPT
        #service iptables save
    或者關閉防火墻
        #systemctl stop firewalld

查看從的狀態,以下兩個值必須為yes,代表從服務器能正常連接主服務器

PS :如果是克隆,會報UUID相同的錯誤信息,導致Slave_IO_Running為NO,這種情況直接到任意一臺主機的/usr/local/mysql/data/auto.cnf文件,將里面的UUID刪除,重啟mysql服務就行。

mysql> show slave status\G

MySQL高可用之KeepAlived+雙主

3、將mysql-master02設為mysql-master01的主服務器 在mysql-master02主機上創建授權賬戶,允許在mysql-master01(192.168.1.1)主機上連接

mysql-master02:
mysql>  grant replication slave on *.* to rep@'192.168.1.%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

查看mysql-master02的當前binlog狀態信息

mysql> show master status;

MySQL高可用之KeepAlived+雙主

在mysql-master01上將mysql-master02設為自已的主服務器并開啟slave功能。

mysql> change master to master_host='192.168.1.8',master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=608;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

防火墻同上。
查看從的狀態,以下兩個值必須為yes,代表從服務器能正常連接主服務器

mysql> show slave status\G

MySQL高可用之KeepAlived+雙主

4、測試主主同步 在mysql-master01上創建要同步的數據庫如test_db,并在test_db中創建一張測試表如tab1

mysql> create database test_db;
mysql> use test_db;
mysql> create table tab1(id int);
查看mysql-master02主機是否同步了mysql-master01上的數據變化
mysql> show databases;

MySQL高可用之KeepAlived+雙主

mysql> use test_db;
mysql> show tables;

MySQL高可用之KeepAlived+雙主

在mysql-master02主機上向tab1表中插入數據,查看mysql-master01是否同步了數據

mysql> insert into tab1 values(1);
mysql> select * from tab1;

MySQL高可用之KeepAlived+雙主
使用mysql-master01查看:

mysql> select  * from tab1;

MySQL高可用之KeepAlived+雙主
雙主同步完成

PS:若主MYSQL服務器已經存在,只是后期才搭建從MYSQL服務器,在置配數據同步前應先將主MYSQL服務器的要同步的數據庫拷貝到從MYSQL服務器上(如先在主MYSQL上備份數據庫,再用備份在從MYSQL服務器上恢復).

二、keepalived的安裝配置實現高可用

下面就來完成keepalived的高可用性。 keepalived是集群管理中保證集群高可用的一個軟件解決方案,其功能類似于heartbeat,用來防止單點故障 keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual RouterRedundancy Protocol,即虛擬路由冗余協議。 虛擬路由冗余協議,可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組里面有一個master和多個backup,master上面有一個對外提供服務的vip,master會發組播(組播地址為224.0.0.18),當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。keepalived主要有三個模塊,分別是core 、check和vrrp。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。

1、在mysql-master01和mysql-master02上安裝軟件包keepalived 。安裝keepalived軟件包與服務控制在編譯安裝Keepalived之前,必須先安裝內核開發包kernel-devel以及openssl-devel、popt-devel等支持庫。

[root@mysql-master01 ~]# yum install kernel-devel openssl-devel popt-devel
[root@mysql-master02 ~]# yum install kernel-devel openssl-devel popt-devel
下載keepalived包:
https://www.keepalived.org/

MySQL高可用之KeepAlived+雙主
MySQL高可用之KeepAlived+雙主
MySQL高可用之KeepAlived+雙主
MySQL高可用之KeepAlived+雙主

編譯安裝:

[root@mysql-master01 ~]#  tar zxf keepalived-2.0.20.tar.gz 
[root@mysql-master01 ~]#  cd keepalived-2.0.20/
[root@mysql-master01 keepalived-2.0.20]# ./configure --prefix=/ && make && make install
###第二臺省略…

PS:如不知道keepalived需要哪些依賴包,可到下載后的源碼解壓目錄下查看INSTALL 文件內容, 執行makeinstall操作之后,會自動生成/etc/init.d/keepalived腳本文件,但還需要手動添加為系統服務,這樣就可以使用service、chkconfig工具來對keepalived服務程序進行管理了。

針對keepalived的防火墻規則:
        添加規則:
            # firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --in-interfaceenp0s3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
            # firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interfaceenp0s3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
            # firewall-cmd --reload
        關閉防火墻:
            # systemctl stop firewalld

2、修改Keepalived的配置文件 keepalived只有一個配置文件keepalived.conf,里面主要包括以下幾個配置區域,分別是global_defs、vrrp_instance和virtual_server

? global_defs:主要是配置故障發生時的通知對象以及機器標識。
? vrrp_instance:用來定義對外提供服務的VIP區域及其相關屬性。
? virtual_server:虛擬服務器定義

mysql-master01主機上的keepalived.conf文件的修改:

[root@mysql-master01 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived     //注釋

global_defs {
   router_id mysql-master01     //keepalived服務器的一個標識
}

vrrp_instance VI_1 {
    state BACKUP        //指定keepalived的角色, 兩臺配置此處均是BACKUP,設為BACKUP將根據優先級決定主或從
    interface ens33     //指定HA監測網絡的接口
virtual_router_id 51    //虛擬路由標識,這個標識是一個數字(取值在0-255之間,用來區分多個instance的VRRP組播),同一個vrrp實例使用唯一的標識,確保和master2相同,同網內不同集群此項必須不同,否則發生沖突。
priority 100    //用來選舉master的,要成為master,該項取值范圍是1-255(在此范圍之外會被識別成默認值100),此處master2上設置為50
nopreempt   //不搶占,即允許一個priority比較低的節點作為master,即使有priority更高的節點啟動
advert_int 1    //發VRRP包的時間間隔,即多久進行一次master選舉(可以認為是健康查檢時間間隔)
    authentication {    //認證區域,認證類型有PASS和HA(IPSEC),推薦使用PASS(密碼只識別前8位)
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {     //VIP區域,指定vip地址
        192.168.1.100
    }   
}   

virtual_server 192.168.1.100 3306 { //設置虛擬服務器,需要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開
    delay_loop 6    //設置運行情況檢查時間,單位是秒
    lb_algo rr      //設置后端調度算法,這里設置為rr,即輪詢算法
    lb_kind DR      //設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選
    persistence_timeout 50  //會話保持時間,單位是秒。這個選項對動態網頁是非常有用的,為集群系統中的session共享提供了一個很好的解決方案。有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話的保持時間。
    protocol TCP    //指定轉發協議類型,有TCP和UDP兩種
    real_server 192.168.1.1 3306 {  //配置服務節點1,需要指定real server的真實IP地址和端口,IP與端口之間用空格隔開
    notify_down /etc/keepalived/bin/mysql.sh
        weight 1    //配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小為了區分不同性能的服務器
    notify_down /etc/keepalived/bin/mysql.sh    //檢測到realserver的mysql服務down后執行的腳本
        TCP_CHECK {
            connect_port 3306   //健康檢查端口
            connect_timeout 3   //連接超時時間
            retry 3 //重連次數
            delay_before_retry 3    //重連間隔時間
        } 
    } 
}

mysql-master01上有關keepalived.conf的具體配置如下:

! Configuration File for keepalived

global_defs {
   router_id mysql-master01
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    nopreempt
    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 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    real_server 192.168.1.1 3306 {
    notify_down /etc/keepalived/bin/mysql.sh
        weight 1
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

編寫腳本文件中對應的腳本,并啟動服務

[root@mysql-master01 ~]# mkdir /etc/keepalived/bin/
[root@mysql-master01 ~]# vim /etc/keepalived/bin/mysql.sh
#!/bin/bash
pkill keepalived
[root@mysql-master01 ~]# chmod +x /etc/keepalived/bin/mysql.sh  
//添加執行權限,不然沒有權限執行腳本,則關閉不了keepalived
[root@mysql-master01 ~]# systemctl start keepalived.service

mysql-master02主機上的keepalived.conf文件的修改:

[root@mysql-master01 ~]# scp /etc/keepalived/keepalived.conf 192.168.1.8:/etc/keepalived/
[root@mysql-master02 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id mysql-master02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 50
    nopreempt
    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 6
    lb_algo rr 
    lb_kind DR 
    persistence_timeout 50
    protocol TCP
    real_server 192.168.1.8 3306 {
    notify_down /etc/keepalived/bin/mysql.sh
        weight 1
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            retry 3
            delay_before_retry 3
        } 
    }
} 

編寫腳本,并啟動服務

[root@mysql-master02 ~]# mkdir /etc/keepalived/bin/
[root@mysql-master02 ~]# vim /etc/keepalived/bin/mysql.sh
#!/bin/bash
pkill keepalived
[root@mysql-master02 ~]# chmod +x /etc/keepalived/bin/mysql.sh
[root@mysql-master02 ~]# systemctl start keepalived.service

3、測試 在mysql-master01和mysql-master02分別執行命令查看mysql-master01和mysql-master02對VIP(群集虛擬IP)的控制權。

mysql-master01:

[root@mysql-master01 ~]# ip a

MySQL高可用之KeepAlived+雙主

mysql-master02:

[root@mysql-master02 ~]# ip a

MySQL高可用之KeepAlived+雙主

模擬mysql-master01宕機,查看是否會自動關閉keepalived服務,并且漂移地址轉換到了mysql-master02

[root@mysql-master01 ~]#  ps -ef |grep keep

MySQL高可用之KeepAlived+雙主
mysql-master02:

[root@mysql-master02 ~]# ip a

MySQL高可用之KeepAlived+雙主

因為兩臺keepalived的配置文件都關閉了占先權,所以即使mysql-master01的服務再次啟動,漂移地址也依然在mysql-master02上。
MySQL高可用之KeepAlived+雙主
MySQL高可用之KeepAlived+雙主

總結:

Keepalived+mysql雙主一般來說,中小型規模的時候,采用這種架構是最省事的。 在master節點發生故障后,利用keepalived的高可用機制實現快速切換到備用節點。

在這個方案里,需要注意的地方:

1、采用keepalived作為高可用方案時,兩個節點最好都設置成BACKUP模式,避免因為意外情況下(比如腦裂(通過心跳機制來監聽對方狀態,如果心跳失效,每臺電腦都認為對方失效了,從而把自己提升為主,導致數據不一致))相互搶占導致往兩個節點寫入相同數據而引發沖突;
2、把兩個節點的auto_increment_increment(自增步長)和auto_increment_offset(自增起始值)設成不同值。其目的是為了避免master節點意外宕機時,可能會有部分binlog未能及時復制到slave上被應用,從而會導致slave新寫入數據的自增值和原先master上沖突了,因此一開始就使其錯開;但是,如果有合適的容錯機制能解決主從自增ID沖突的話,也可以不這么做;
3、slave節點服務器配置不要太差,否則更容易導致復制延遲。作為熱備節點的slave服務器,硬件配置不能低于master節點;
4、如果對延遲問題很敏感的話,可考慮使用MariaDB分支版本,或者直接上線MySQL 5.7最新版本,利用多線程復制的方式可以很大程度降低復制延遲;

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

二手房| 房山区| 砚山县| 莫力| 三明市| 南阳市| 万州区| 芮城县| 同心县| 江安县| 冷水江市| 凤凰县| 绥江县| 荣昌县| 双流县| 阳西县| 左权县| 吉安市| 阳朔县| 镇巴县| 天津市| 天门市| 怀来县| 顺昌县| 双峰县| 黎平县| 蕉岭县| 建水县| 长顺县| 大竹县| 八宿县| 沙湾县| 临沧市| 九龙坡区| 罗平县| 特克斯县| 洮南市| 民县| 本溪市| 弥勒县| 东明县|