第五週作業mysql高可用+ansible

以夢為境發表於2020-10-19

一、如果主節點已經執行了一段時間,且有大量資料時,如何配置並啟動slave節點(寫出操作步驟)

1.節點配置

vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld]
log-bin
server-id=#     為當前節點設定一個全域性唯一的ID號
log-basename=master  可啥子datadir中日誌名稱,確保不依賴主機名稱 

2. 重啟服務

systemctl restart mariadb
重啟後生成二進位制索引檔案和二進位制檔案

在這裡插入圖片描述
檢視當前二進位制位置

show master logs;

3.需要把資料庫做完全備分

建立資料夾給許可權

chown -R mysql.mysql  檔案

全部備份

mysqldump -A -F --single-transaction --master-data=1  > /data/backup/base.sql

把主的完全備份檔案傳入,從

$scp /data/backup/base.sql 10.0.0.20:/data/

4.建立有複製許可權的使用者賬戶

grant replication slave on *.* to repluser@'10.0.0.%' identified by 'tang';

GRANT REPLICATION SLAVEON*.* To 'repluser'@ 'HOST’IDENTIFIED BY 'replpass';

5.檢視從二進位制日誌的檔案和位置開始進行復制

MariaDB [(none)]> show master logs;
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000004 |      389  |
+--------------------+-----------+

6.啟動中繼日誌

vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld]
server_id=20     為當前節點設定一個全域性唯一的id號
log-bin
read_only=on     設定資料庫只讀,針對supper user無效 
relay_log=relay-log       reay log的檔案路徑,預設值hostanem-relay-bin
relay_log_index=relay-log.index       預設值hostname-relay-bin.index

設定完後重啟
systemctl restart mariadb

6.使用有複製許可權的使用者賬號連線主伺服器,並啟動複製執行緒

幫助文件
help change master to

CHANGE MASTER TO
  MASTER_HOST='master2.mycompany.com', 指定主伺服器ip地址 ,
  MASTER_USER='replication',           複製時候賬號的名稱
  MASTER_PASSWORD='bigs3cret',         密碼
  MASTER_PORT=3306,                    埠號
  
下面三個已經在配置檔案裡自動生成了所以不用管
  MASTER_LOG_FILE='master2-bin.001',   二進位制位置
  MASTER_LOG_POS=4,                     節點
  MASTER_CONNECT_RETRY=10;

在這裡插入圖片描述
配置好後重啟服務

systemctl restart mariadb

8. 判斷主從同步狀態

show slave status\G

在這裡插入圖片描述
複製延遲,表示主節點和從節點之間差了多少時間,因為還沒有複製所以為 NULL 顯示0表示已經同步
在這裡插入圖片描述

在這裡插入圖片描述

9啟動執行緒

start slave;

start slave [IO_THREAD|SQL_THREAD];
  • 通過備份恢復資料至從伺服器,複製起始位置為備份時
  • 二進位制日誌檔案及其POS

二、當master伺服器當機,提升一個slave成為新的master(寫出操作步驟)

1. 找到哪個從節點的資料庫是最新,讓它成為新master

[root@centos8 ~]#cat /var/lib/mysql/relay-log.info
5
./mariadb-relay-bin.000001
1180
mysql-bin.000001
996
0

2. 新master修改配置檔案,關閉read-only配置

[root@slave1 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=18
read-only=OFF
log-bin=/data/mysql/logbin/mysql-bin  

3. 清除舊的master複製資訊3

MariaDB [hellodb]>set global read_only=off;
MariaDB [hellodb]>stop slave;//
MariaDB [hellodb]>reset slave all;

4. 在新master上完全備份

[root@slave1 ~]#mysqldump -A --single-transaction --master-data=1 -F >
backup.sql
[root@slave1 ~]#scp backup.sql 10.0.0.28:
#分析舊的master 的二進位制日誌,將未同步到至新master的二進位制日誌匯出來,恢復到新master,儘可能恢復資料
#其它所有 slave 重新還原資料庫,指向新的master
[root@slave2 ~]#vim backup.sql
CHANGE MASTER TO
MASTER_HOST='10.0.0.18',
MASTER_USER='test',
MASTER_PASSWORD='000000',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=371;

MariaDB [hellodb]>stop slave;
MariaDB [hellodb]>reset slave all;
MariaDB [hellodb]>set sql_log_bin=off;
MariaDB [hellodb]>source backup.sql;
MariaDB [hellodb]>set sql_log_bin=on;
MariaDB [hellodb]>start slave;

三、通過 MHA 0.58 搭建一個資料庫叢集結構

實驗裝置

10.0.0.71   管理節點
10.0.0.8110.0.0.8210.0.0.83

1.在管理節點安裝這個兩個包

yum -y install 通過yum安裝可以補全依賴包

mha4mysql-manager   不支援CentOS8,只支援Centos7以下版本
mha4mysql-node      

2.被管理節點安裝

mha4mysql-node      支援centOS 6.7.8

3.在管理節點建立配置檔案

mkdir /etc/mastermha/   建立配置檔案  檔案裡定義了你要監控的叢集服務地址,伺服器資訊
                    
vim /etc/mastermha/app1.cnf   app1名稱可以隨便起  代表著你監控的一組伺服器 如果要同時監控多組mysql伺服器要在建個app2

[server default]
user=mhauser         這個賬號用於遠端連線mysql所有節點的使用者,有一定的管理員許可權
password=magedus      密碼
manager_workdir=/data/mastermha/app1/           目錄自動生成,無需手動建立
manager_log=/data/mastermha/app1/manager.log    自動生成 日誌用來觀察他的執行情況
remote_workdir=/data/mastermha/app1/            自動生成指定正確的資料夾  遠端主機的工作目錄
ssh_user=root            用於實現遠端ssh基於KEY的連線,訪問二進位制日誌

repl_user=repluser       主從複製的賬號 用於修改主從關係  主服務掛了會提升一個從做為主,
那麼另外一個節點必然會把自己的主節點指向這個新主  用的複製賬號,所以要寫在配置檔案裡

repl_password=magedu     
ping_interval=1           健康性檢查時間間隔,怎麼知道這個伺服器是否掛了,一秒鐘查一次

master_ip_failover_script=/usr/local/bin/master_ip_failover   #切換VIP的perl指令碼
report_script=/usr/local/bin/sendmail.sh                     當執行報警指令碼
check_repl_delay=0    #預設如果slave中從庫落後主庫reaylog超過100M 主庫不會選擇這個從庫為新的master,因為這個從庫進行恢復需要很長的時間.通過這個引數,mha觸發主從切換的時候會忽略複製的延時,通過check_repl_delay=0這個引數,mha觸發主從切換時會忽略複製的延時,對於設定candidate_master=1的從庫非常有用,這樣確保這個從庫一定能成為最新的master

master_binlog_dir=/data/mysql/ 指定二進位制日誌存放的目錄,mha4mysq1-manager-0.58必須指定,之前版本不需要指定

[server1]                伺服器地址 
hostname=192.168.8.17      
candidate_master=1     
[server2]
hostname=192.168.8.27
candidate_master=1      設定誰優先成為主節點
設定為優先候選master,即使不時叢集中事件最新的slave,也會優先當master
[server3]
hostname=192.168.8.37

4.實現所有節點相互之間ssh key驗證

基於KEY 驗證

先生成公鑰私鑰對
ssh-keygen

把自己的鑰匙拷進去 拷到自己的電腦上登陸就不用驗證了
相當於自己連自己
ssh-copy-id 127.0.0.1

再把驗證拷貝到所有主機上
rsync -av .ssh 10.0.0.81:/root/

5.主

vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld]
server_id=81
log_bin
skip_name_resolve=1  防止反向解析

啟動資料庫
systemctl start mariadb

檢視二進位制日誌檔案位置
MariaDB [(none)]> show master logs
    -> ;
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |       330 |
+--------------------+-----------+
1 row in set (0.001 sec)

建立有複製許可權的賬號
                                   使用者名稱和密碼要一致 
grant replication slave on *.* to repluser@'10.0.0.%' identified by '123456';

建立一個所有人的賬號,可以連線到所有的從節點
                    使用者和密碼要和管理點一致
grant all on *.* to mhauser@'10.0.0.%' identified by '123456';

在這裡插入圖片描述

6.從

vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld]
server_id=82    
log-bin         啟動二進位制日誌   如果主掛了,如果要提升他當主的話,必須開啟二進位制日誌
read_only     是個變數,支援set 命令動態修改
relay_log_purge=0
skip_name_resolve=1   禁止反向解析


sysetmctl start mariadb

7.從

vim /etc/my.cnf.d/mariadb-server.cnf

[mysqld]
server_id=82    
log-bin         啟動二進位制日誌   如果主掛了,如果要提升他當主的話,必須開啟二進位制日誌
read_only     是個變數,支援set 命令動態修改
relay_log_purge=0
skip_name_resolve=1   禁止反向解析

systemctl start maridb

8.使用有複製許可權的使用者賬號連線主伺服器,並啟動複製執行緒

幫助文件
help change master to

CHANGE MASTER TO
  MASTER_HOST='10.0.0.81', 指定主伺服器ip地址 ,
  MASTER_USER='repluser',           複製時候賬號的名稱
  MASTER_PASSWORD='123456',         密碼
  MASTER_PORT=3306,                    埠號
  MASTER_LOG_FILE='mariadb-bin.000001 ',   二進位制位置
  MASTER_LOG_POS=234,                  節點位置
  MASTER_CONNECT_RETRY=10;    可以不寫  重試時間10

9.啟動執行緒

start slave;

10. 檢查mha環境

masterha_check_ssh --conf=/etc/mastermha/one.cnf
masterha_check_repl --conf=/etc/mastermha/one.cnf

masterha_check_status--conf=/etc/mastermha/one.cnf

四、實戰案例:Percona XtraDB Cluster(PXC 5.7)

實驗環境

10.0.0.7
10.0.0.17
10.0.0.27
10.0.0.37

OS 版本目前不支援CentOS 8
[root@pxc1 ~]#cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)

關閉防火牆和SELinux,保證時間同步
注意:如果已經安裝MySQL,必須解除安裝

2 安裝 Percona XtraDB Cluster 5.7
#此處使用清華大學yum源,官方源太慢了
[root@pxc1 ~]#vim /etc/yum.repos.d/pxc.repo
[percona]
name=percona_repo
baseurl =
https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
enabled = 1
gpgcheck = 0
[root@pxc1 ~]#scp /etc/yum.repos.d/pxc.repo 10.0.0.17:/etc/yum.repos.d
[root@pxc1 ~]#scp /etc/yum.repos.d/pxc.repo 10.0.0.27:/etc/yum.repos.d
#在三個節點都安裝好PXC 5.7 
[root@pxc1 ~]#yum install Percona-XtraDB-Cluster-57 -y
[root@pxc2 ~]#yum install Percona-XtraDB-Cluster-57 -y
[root@pxc3 ~]#yum install Percona-XtraDB-Cluster-57 -y
3 在各個節點上分別配置mysql及叢集配置檔案
/etc/my.cnf為主配置檔案,當前版本中,其餘的配置檔案都放在/etc/percona-xtradb-cluster.conf.d目
錄裡,包括mysqld.cnf,mysqld_safe.cnf,wsrep.cnf 三個檔案
#主配置檔案不需要修改
[root@pxc1 ~]#cat /etc/my.cnf
# The Percona XtraDB Cluster 5.7 configuration file.
...省略...
!includedir /etc/my.cnf.d/
!includedir /etc/percona-xtradb-cluster.conf.d/
[root@pxc1 ~]#ls /etc/my.cnf.d/
[root@pxc1 ~]#ls /etc/percona-xtradb-cluster.conf.d/
mysqld.cnf mysqld_safe.cnf wsrep.cnf
#下面配置檔案不需要修改
[root@pxc1 ~]#cat /etc/percona-xtradb-cluster.conf.d/mysqld.cnf 
...省略...
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
server-id=1     #建議各個節點不同
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin     #建議啟用,非必須項
log_slave_updates
expire_logs_days=7
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0 #下面配置檔案不需要修改
[root@pxc1 ~]#cat /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf 
...省略...
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket   = /var/lib/mysql/mysql.sock
nice     = 0
#PXC的配置檔案必須修改
[root@pxc1 ~]#vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 
[root@pxc1 ~]#grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27  #三個節點的IP
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=10.0.0.7             #各個節點,指定自已的IP
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-1       #各個節點,指定自已節點名稱
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"       #取消本行註釋
[root@pxc2 ~]#grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2          #各個節點,指定自已的IP
wsrep_node_address=10.0.0.17
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-2    #各個節點,指定自已節點名稱
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"   #取消本行註釋
[root@pxc3 ~]#grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf

[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2   
wsrep_node_address=10.0.0.27 #各個節點,指定自已的IP
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-3    #各個節點,指定自已的IP
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"   #取消本行註釋

五、通過 ansible 部署二進位制 mysql

實驗裝置
10.0.0.81  ansible
10.0.0.82  mysql

#配置epel源

#安裝ansible
[root@ansible ~]# yum -y install ansible

[root@ansible ~]# vim /etc/ansible/hosts
[dbsrvs]
10.0.0.82

#準備二進位制檔案,配置檔案
[root@ansible ~]# ll /data/ansible/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz 
-rw-r--r-- 1 root root 485074552 Oct 17 12:06 /data/ansible/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz

[root@ansible ~]# cat /data/ansible/my.cnf
[mysqld]
datadir=/data/mysql
skip_name_resolve=1
socket=/data/mysql/mysql.sock       
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
log_bin=/data/mysqlbinlog/mysql-bin
[client]
socket=/data/mysql/mysql.sock


#基於key驗證
[root@ansible ~]# ssh-keygen
[root@ansible ~]# scp -r .ssh 10.0.0.82:/root/

#安裝mysql相關模組檔案
[root@ansible ~]# ansible dbsrvs -m yum -a 'name=libaio,numactl-libs state=present'
#建立組和使用者
[root@ansible ~]# ansible dbsrvs -m group -a 'name=mysql gid=66 system=yes'
10.0.0.82 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "gid": 66, 
    "name": "mysql", 
    "state": "present", 
    "system": true
}
[root@ansible ~]# ansible dbsrvs -m user -a 'name=mysql uid=66 group=mysql shell=/sbin/nologin system=yes create_home=no home=/data/mysql'
10.0.0.82 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "comment": "", 
    "create_home": false, 
    "group": 66, 
    "home": "/data/mysql", 
    "name": "mysql", 
    "shell": "/sbin/nologin", 
    "state": "present", 
    "system": true, 
    "uid": 66
}

#二進位制包解壓到mysql主機上
[root@ansible ~]# ansible dbsrvs -m unarchive -a 'src=/data/ansible/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz dest=/usr/local owner=root group=root'
#建立軟連線
[root@ansible ~]# ansible dbsrvs -m shell -a 'echo "PATH=/usr/local/mysql/bin:\$PATH" > /etc/profile.d/mysql.sh'
[root@ansible ~]# ansible dbsrvs -m shell -a '. /etc/profile.d/mysql.sh'
#拷貝配置檔案到mysql機器上
[root@ansible ~]# ansible dbsrvs -m copy -a 'src=/data/ansible/my.cnf dest=/etc/my.cnf'
#生成資料庫檔案
[root@ansible ~]# ansible dbsrvs -m shell -a 'mysqld --initialize --user=mysql --datadir=/data/mysql'
#啟動指令碼複製到系統檔案裡
[root@ansible ~]# ansible dbsrvs -m shell -a 'cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld'
#使用shell指令碼更改密碼
[root@ansible ~]# ansible dbsrvs -m script -a dbsrvs.sh
[root@ansible ~]# cat dbsrvs.sh 
passwd=`awk '/temporary password/{print $NF}' /data/mysql/mysql.log`
mysqladmin -uroot -p"${passwd}" password "123456"

相關文章