1. 程式人生 > >centos7中MySQL5.7+keepalived雙主熱備

centos7中MySQL5.7+keepalived雙主熱備

mysql主主備份原理:
複製過程中一個伺服器充當主伺服器,另一個或多個充當從伺服器,主伺服器將更新寫入二進位制日誌,並維護日誌檔案的一個索引以跟中日誌迴圈。當一個從伺服器連線到主伺服器時,它通知主伺服器上次更新的位置,從伺服器就接收主伺服器從那時起發生的變更,然後封鎖並等待主伺服器通知下一次更新。


雙主熱備原理:
  MySQL都對外提供服務。但是當一臺MySQL宕機後,另一臺會馬上接管宕機的MySQL的訪問。當宕機的MySQL修好了之後又對重新將業務還給他




一、編譯安裝mysql5.7.20


1、解除安裝系統自帶的Mariadb資料庫
rrpm -qa |grep mariadb (不解除安裝後面啟動mysql的時候會報錯)


2、建立mysql使用者組和mysql使用者


groupadd mysql
useradd -g mysql mysql


/3、解壓mysql-5.7.20


tar zxvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz   
/4、建立data目錄並將解壓後的安裝包移動到/data目錄下重新命名為mysql


 mv mysql-5.7.20-linux-glibc2.12-x86_64 /usr/local/mysql
/5、修改屬主,屬組
   cd /data
 chown -R mysql.mysql mysql
/6、建立data目錄,作為資料庫儲存位置


mkdir /usr/local/mysql/data


7、初始化mysql
  
 
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql--datadir=/usr/local/mysql/data 

如果報錯 可以先檢查/etc/my.cnf中的datadir的路徑是否是MySQL的安裝資料路徑


8、安裝的之後記得記下mysql的初始密碼:2018-06-07T06:40:13.310635Z 1 [Note] A temporary password is generated for [email protected]: gq+8i+jxQJ9>




9、啟動mysql
 /data/mysql/bin/mysqld_safe --user=mysql &




10、登入並修改密碼
/usr/local/mysql/bin/mysql -uroot -p  
/usr/local/mysql/bin/mysqladmin -uroot -p password
 11、設定開機自啟
cp /data/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql


chmod +x /etc/rc.d/init.d/mysql


 
chkconfig mysqld --add


啟動的時候會報239的錯,這是因為mysql預設安裝在在/usr/local目錄下,如果安裝在/usr/local目錄下則會正常啟動和關閉,不會報錯。但是本次安裝在自定義的/data目錄下,此時需要修改/etc/init.d/mysqld檔案,儲存後退出
vim /etc/init.d/mysqld
basedir=/data/mysql
datadir=/data/mysql/data  




二、編譯安裝keepalived-2.0.2


1、安裝依賴包


yum -y install openssl openssl-devel
2、編譯安裝
tar zxvf keepalived-2.0.2.tar.gz


cd keepalived-2.0.2


./configure --prefix=/usr/local/keepalived


make && make install
注意:*如果keepalived的配置檔案不在/etc/keepalived/下記得要複製一份過來,不然啟動的時候會報錯




三、配置mysql主主複製


1、mysql1裡面配置


server-id=1
#server唯一識別符號
auto_increment_offset=1
#自增ID起始值
auto_increment_increment=2
#每次自增數字
log-bin=mysql-bin
#開啟二進位制功能,主伺服器必須開啟
max_binlog_size=1024M
#binlog單檔案最大值
replicate-ignore-db=mysql
replicate-ignore-db=informaton_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=test
#忽略不同步主從資料庫


2、mysql2裡面配置


server-id=2
#server唯一識別符號
auto_increment_offset=2
#自增ID起始值
auto_increment_increment=2
#每次自增數字
log-bin=mysql-bin
#開啟二進位制功能,主伺服器必須開啟
max_binlog_size=1024M
#binlog單檔案最大值
replicate-ignore-db=mysql
replicate-ignore-db=informaton_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=test
#忽略不同步主從資料庫


3、mysql重啟


service mysql restart


4、配置同步資料
登入mysql並在master1上和master2上輸入此語句,記得具體情況根據自己的配置看
change master to master_host='111.1.19.122',master_user='repl',master_password='unioncast.cn',master_log_file='mysql-bin.000005',master_log_pos=154;






登入時報錯:mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)


此意思是說在命令列直接進行密碼登入不安全。這是mysql新版的一個安全改進,官方給出的解釋是在命令列下如果要使用密碼可以在執行命令後的提示輸入裡輸入密碼,或者在指定的安全檔案內指定密碼;如果還不行就該密碼


解決方法:輸入-p回車後在輸入密碼就可以啦


改密碼:
在配置檔案my.cnf中加入
skip-grant-tables
#跳過密碼登入
然後重啟資料庫後登入mysql
update mysql.user set authentication_string=password('unioncast.cn') where user='root';
 flush privileges;
exit
去掉重啟
skip-grant-tables
#跳過密碼登入


三、配置keepalived






 Configuration File for keepalived


global_defs {
   notification_email {
       
[email protected]

   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id mysql_ha
}






  vrrp_instance VI_1 {
    state BACKUP
    interface em1
#指定HA檢測網路的介面
    virtual_router_id 52
#路由識別符號,兩節點必須一致
    priority 100
    advert_int 1
#組播資訊傳送間隔時間。兩個節點必須一樣
   nopreempt
#不搶佔資源,只在master上設定
    authentication {
        #驗證資訊。兩節點必須一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        #設定VIP
        172.16.1.111
    }
}


  virtual_server 172.16.1.111 3306 {
    delay_loop 3
#設定健康檢查時間
    lb_algo rr
#設定負載排程演算法
    lb_kind DR
    persistence_timeout 80
#客戶連線保留時間
    protocol TCP
                                      1
#指定轉發協議
    real_server 172.16.1.20 3306 {
        weight 1
        notify_down /usr/local/keepalived/mysql.sh


        TCP_CHECK {
                connect_timeout 8
        #連線超時時間
                nb_get_retry 3
        #重試次數
                delay_before_retry 3
        #兩次重試間隔時間


                connect_port 3306
        #測試連線的埠
                #檢測MySQL埠
                }
        }
}
  






注意:如果是阿里雲的伺服器記得將keepalived的組播改成單播不然會出現鬧列現象 




nginx健康監測指令碼




#!/bin/bash
counter=$(netstat -na |grep "LISTEN" |grep "3306" |wc -l)
if [ "${counter}" -eq 0 ];then
        /etc/init.d/keepalived stop
fi