master1:192.168.175.210 主 master2:192.168.175.211 備
keepalived的vip: 192.168.175.11(注意這是虛擬IP,無需存在這臺主機,只要保證這個ip是沒有人用的便可)
本次筆者是在Centos7上安裝的是mysql的,若是有其餘需求能夠自行下載。mysql
一、下載安裝包,若是下載不了請本身到官網下載相匹配的rpm,我下載的不須要安裝其餘依賴,若是去官網下載可能要安裝一些依賴包,依次安裝便可。這種形式安裝後是經過生成yum源的形式,而後經過yum形式安裝。linux
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
二、安裝mysql源算法
yum -y localinstall mysql57-community-release-el7-11.noarch.rpm
三、mysql安裝sql
yum -y install mysql-community-server
在安裝mysql時有較多的東西須要安裝,稍等片刻便可。數據庫
四、啓動mysqlvim
啓動前請關閉selinux,有兩種方式關閉bash
方式一,臨時關閉,下次開機啓動後會重啓負載均衡
setenforce 0
方式2、永久關閉,經過設置配置文件的方式,將 SELINUX改成disabled的形式,以下:ide
vim /etc/selinux/config
開始啓動mysql服務:oop
systemctl start mysqld
能夠將其設置爲開機啓動:
[root@localhost ~]# systemctl enable mysqld
[root@localhost ~]# systemctl daemon-reload
登入mysql,注意第一次登入須要先找到mysql的root用戶的密碼,通常狀況下root用戶密碼存放在/var/log/mysqld.log下,若是不在該目錄下能夠經過 find / -name mysqld.log查找該文件
個人是在該目錄下,因此直接查看:
[root@localhost ~]# vi /var/log/mysqld.log
mysql -uroot -p
輸入密碼便可登入。
mysql的雙機高熱,須要對那些須要備份的數據庫的數據進行同步,因此須要咱們先將主庫的數據進行數據同步,若是是兩個新建的數據庫進行數據備份,無需作這一步 。不過筆者聽別人說
能夠不進行同步,能夠指定到具體位置就能夠實現自動同步,可是這種狀況筆者認爲,對應數據庫的高可用這方面是行不通的。假設其中一臺機器宕機,另外一臺機器進行服務的時候就會由於
數據的不一樣步而出現問題,因此筆者認爲仍是有必要進行數據同步的。
通常狀況下數據庫備份分爲多種,有壓縮文件的形式,有直接寫sql文件的形式,若想了解這方面的狀況,能夠自行在網上搜索,筆者在這裏就不進行整理。
第一步:鎖定數據庫,防止有新的數據進行寫入,形成數據不徹底同步。因此通常狀況下,若是是在公司搭建,會在下班時間進行搭建。(192.168.175.210操做)
mysql>flush tables with read lock;
第二步:將須要同步的數據庫進行sql文件輸出。
mysqldump -uroot -p --databases test1 test2 test3>master.sql
這時會在當前目錄下建立一個master.sql文件,固然也能夠指定路徑,不過若是僅僅是用一次,同步完畢刪除便可。
第三步:生成的sql文件遠程複製到備份機上,隨意指定
scp master.sql master2_mysql:/tmp/
第四步:在備份機上進行數據同步(192.168.175.211)操做
mysql -uroot -p <back.sql
第五步:檢查一下,看看在備份機上有沒有數據,若是有數據同步完成。
數據庫熱備的定義在這裏就不進行贅述,網上有不少這方面的原理解讀。這裏採用的是經過記錄數據庫操做,備份數據庫讀取這些操做,從而達到熱備的效果。
第一步:分別在兩個數據庫中建立用於備份是時的用戶並受權
在192.168.175.210上進行操做:
mysql>create user 'replicate'@'192.168.175.211' identified by 'qwe123'; # 192.168.175.211是備份機的ip
Query OK, 0 rows affected (0.09 sec)
mysql>grant replication slave on *.* to 'replicate'@'192.168.175.211';
Query OK, 0 rows affected (0.09 sec)
mysql>flush privileges;
Query OK, 0 rows affected (0.09 sec)
在192.168.175.211上進行操做:
mysql>create user 'replicate'@'192.168.175.210' identified by 'qwe123'; # 192.168.175.211是備份機的ip Query OK, 0 rows affected (0.09 sec) mysql>grant replication slave on *.* to 'replicate'@'192.168.175.210'; Query OK, 0 rows affected (0.09 sec) mysql>flush privileges; Query OK, 0 rows affected (0.09 sec)
分別在兩臺主機上用備份用戶進行訪問
# 在192.168.175.210 (操做) mysql -h192.168.175.211 -ureplicate -pqwe123 # 在192.168.175.211 (操做) mysql -h192.168.175.210 -ureplicate -pqwe123
若是都可以進入mysql 說明操做成功
第二步:配置數據庫的配置文件
通常狀況下,mysql的配置文件路徑是在 /etc/my.cnf 若是你的沒有能夠用 find / -name my.cnf 的方式查找, 若是查不到,能夠查看/usr/share/mysql目錄下的.cnf文件,應該是mysql開頭,對其負責一份到/etc/下,並更名爲my.cnf便可。
注意:在修改my.cnf以前,先對其進行備份,不要直接修改
cp my.cnf my.cnf.bak
第三步:修改數據庫配置(注意這了的配置是關於熱備的主要配置,其餘數據庫配置須要本身添加)
在192.168.175.210上配置
vim /etc/my.cnf
[mysqld] server-id=1 # 惟一id innodb_flush_log_at_trx_commit=2 # 默認爲1,防止數據丟失 log-bin=mysql-bin-1 #binlog日誌文件名(能夠任意命名) binlog-do-db=test # 記錄日誌的數據庫(若是沒有此項,表示同步全部的庫) binlog-ignore-db=mysql # 不須要同步的數據庫 binlog-ignore-db=information_schema binlog-ignore-db=performance_schema
binlog-ignore-db=sys log-slave-updates=ON relay_log=mysql-relay-bin slave_skip_errors=1062 # 跳過1062錯誤 auto_increment_increment=2 auto_increment_offset=1
# 注意
# bind_address = 127.0.0.1 若在配置文件中有這一項,須要將其註釋,否則在同步數據時,的鏈接數據庫狀況會出錯
在192.168.175.211上配置:
vim /etc/my.cnf
[mysqld] server-id=2 # 惟一id innodb_flush_log_at_trx_commit=2 # 默認爲1,防止數據丟失 log-bin=mysql-bin-2 #binlog日誌文件名(能夠任意命名) binlog-do-db=test # 記錄日誌的數據庫(若是沒有此項,表示同步全部的庫) binlog-ignore-db=mysql # 不須要同步的數據庫 binlog-ignore-db=information_schema binlog-ignore-db=performance_schema
binlog-ignore-db=sys
log-slave-updates=ON
relay_log=mysql-relay-bin
slave_skip_errors=1062 # 跳過1062錯誤 auto_increment_increment=1 auto_increment_offset=1
# 注意
# bind_address = 127.0.0.1 若在配置文件中有這一項,須要將其註釋,否則在同步數據時,的鏈接數據庫狀況會出錯
第四步:重啓數據庫,主備都須要重啓
systemctl restart mysqld 或 service mysqld restart
第五步:登入數據庫查看狀態
在192.168.175.210上登入數據庫,執行操做
mysql> show master status\G; *************************** 1. row *************************** File: mysql-bin-1.00001 # 記住這個值,後面有用 Position: 154 # 記住這個值,後面有用 Binlog_Do_DB: test Binlog_Ignore_DB:mysql,information_schema,performance_schema,sys Executed_Gtid_Set: 1 row in set (0.00 sec) ERROR: No query specified
在192.168.175.211上登入數據庫,執行操做
mysql> show master status\G; *************************** 1. row *************************** File: mysql-bin-2.00001 # 記住這個值,後面有用 Position: 154 # 記住這個值,後面有用 Binlog_Do_DB: test Binlog_Ignore_DB:mysql,information_schema,performance_schema,sys Executed_Gtid_Set: 1 row in set (0.00 sec) ERROR: No query specified
在192.168.175.210上登入數據庫,執行操做
mysql>unlock tables; # 必須執行,不然就會報錯
Query OK, 0 rows affected (0.09 sec)
mysql>stop slave; # 中止slave服務線程
mysql>change master to
mysql>master_host='192.168.175.211', # 備用ip
mysql>master_user='replicate', # 前面建立的user
mysql>master_password='qwe123', # 密碼
mysql>master_log_file='mysql-bin-2.000001', # show master 上得出
mysql>master_log_pos=154;
mysql>start slave; # 重啓線程
在192.168.175.211上登入數據庫,執行操做
mysql>unlock tables; # 必須執行,不然就會報錯 Query OK, 0 rows affected (0.09 sec) mysql>stop slave; # 中止slave服務線程 mysql>change master to mysql>master_host='192.168.175.210', # 備用ip mysql>master_user='replicate', # 前面建立的user mysql>master_password='qwe123', # 密碼 mysql>master_log_file='mysql-bin-1.000001', # show master 上得出 mysql>master_log_pos=154; mysql>start slave; # 重啓線程
第七步:show slave status\G查看狀態
兩臺機器上都執行:
show slave status\G;
若以下都爲兩個yes則標識熱備成功,有時可能出現一個是connecting狀態,能夠稍等片刻。如長時間不爲yes,則檢查防火牆,主要問題可能就是數據庫鏈接問題。若有其它狀況能夠查看日誌進行解決。
keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。
虛擬路由冗餘協議,能夠認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其餘機器的默認路由爲該vip),master會發組播,當backup收不到vrrp包時就認爲master宕掉了,這時就須要根據VRRP的優先級來選舉一個backup當master。這樣的話就能夠保證路由器的高可用了。
keepalived主要有三個模塊,分別是core、check和vrrp。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各類檢查方式。vrrp模塊是來實現VRRP協議的。
這裏僅僅是對keepalived進行了一個簡單的介紹,方便你們理解,若須要深刻了解,能夠參考官方文檔。
第一步:依賴安裝
yum install -y openssl-devel yum install -y libnfnetlink-devel yum install -y libnl libnl-devel yum install -y ipvsadm
第二步:keepalived安裝
cd /usr/local/src/ wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz tar -zvxf keepalived-1.3.5.tar.gz cd keepalived-1.3.5 ./configure --prefix=/usr/local/keepalived make && make install cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ mkdir /etc/keepalived/ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ echo "/etc/init.d/keepalived start" >> /etc/rc.local
複製配置文件:
[root@master1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@master1 ~]# vim /etc/keepalived/keepalived.conf
keepalived兩臺機器都得安裝:
第三步:修改配置文件
在192.168.175.210上編輯
! Configuration: command not found global_defs { # 全局配置,關於郵箱的問題 notification_email { wallace.wang@tbs.cn } notification_email_from wallace.wang@tbs.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } vrrp_instance HA_2 { state MASTER # 設置主節點的標識 interface em1 # 設置實例綁定的網卡 virtual_router_id 51 # 惟一標識id主從必須一致 priority 101 # 優先級 這個和下面的權重結合使用 advert_int 1 nopreempt # 非搶佔式,在主節點上不須要設置 authentication { # 主從必須一致 auth_type PASS # 認證方式 auth_pass 1111 # 認證密碼 } virtual_ipaddress { 192.168.175.11 # 虛擬的ip } } virtual_server 192.168.175.11 3306 { delay_loop 2 lb_algo wrr # lvs調度算法 有rr|wrr|lc|wlc|lblc|sh|dh等 lb_kind DR # 負載均衡轉發規則NAT|DR|RUN persistence_timeout 60 # 重新鏈接的時間 protocol TCP # 協議名稱 real_server 192.168.175.210 3306 { # 真實的ip地址 weight 3 # 權重 notify_down /opt/script/chk_mysql.sh # 檢測腳本 TCP_CHECK { connect_timeout 10 # 鏈接時長 nb_get_retry 3 # 重複次數 delay_before_retry 3 # connect_port 3306
在192.168.175.211上編輯
! Configuration: command not found global_defs { # 全局配置,關於郵箱的問題 notification_email { wallace.wang@tbs.cn } notification_email_from wallace.wang@tbs.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } vrrp_instance HA_2 { state BACKUP # 設置從節點的標識 interface em1 # 設置實例綁定的網卡 virtual_router_id 51 # 惟一標識id主從必須一致 priority 101 # 優先級 這個和下面的權重結合使用 advert_int 1 nopreempt # 非搶佔式,在主節點上不須要設置 authentication { # 主從必須一致 auth_type PASS # 認證方式 auth_pass 1111 # 認證密碼 } virtual_ipaddress { 192.168.175.11 # 虛擬的ip } } virtual_server 192.168.175.11 3306 { delay_loop 2 #lb_algo wrr # 這裏在從節點上不須要設置不然會出現從節點沒法鏈接上vip的狀況 #lb_kind DR # 這裏也無需設置 persistence_timeout 60 # 重新鏈接的時間 protocol TCP # 協議名稱 real_server 192.168.175.211 3306 { # 真實的ip地址 weight 3 # 權重 notify_down /opt/script/chk_mysql.sh # 檢測腳本 TCP_CHECK { connect_timeout 10 # 鏈接時長 nb_get_retry 3 # 重複次數 delay_before_retry 3 # connect_port 3306
第四步:編寫chk_mysql.sh腳本
vim /opt/script/chk_mysql.sh
#!/bin/bash killall keepalived
第五步:啓動keepalived
兩臺機器經過ip addr的形式查看一下:個人主節點在210上,因此這裏會多一個虛擬ip
到這裏爲止全部的配置就已經完成,老鐵們能夠進行測試了。在測試以前先建立一個帳號,這個帳號對外有權限:
分別在兩個數據庫上進行建立:
grant all on *.* to test@'%' identified by "qwe123";
flush privileges;
而後經過這個進行測試:
mysql -h 192.168.175.11 -utest -pqwe123
注意在高可用這一點上,若經過虛擬IP 進行鏈接時,主節點宕機,在鏈接從節點時可能會須要幾秒鐘的時間,能夠設置鏈接次數解決。其實keepalived和mysql熱備無關,因此不用擔憂數據缺失的問題。
關於priority 和weight的權重選擇問題能夠看一下下面的鏈接文章。
https://blog.csdn.net/hzsunshine/article/details/62041036
最後但願你們幫忙點個贊和添加關注,小編會繼續寫一下通俗易懂的文章來和你們一塊兒分享,最後送你們一句話:當你的能力撐不起你的野心時,就安靜下來學習吧!!!!!!!!!!