最近一直在瞎搬磚,最大的感觸是運維工作難做。不過廢話不多說,最近被分配了一項比較有意思的task,嘗試著非root用戶搭建MHA並測試下能否成功漂移,以下是兩天測試和文檔編寫的成果,分享給各位看客,歡迎交流學習。 測試的目的: 現行的主流搭建MHA使用的用戶是root來傳遞公鑰以及進行一些切換、摘除 ...
最近一直在瞎搬磚,最大的感觸是運維工作難做。不過廢話不多說,最近被分配了一項比較有意思的task,嘗試著非root用戶搭建MHA並測試下能否成功漂移,以下是兩天測試和文檔編寫的成果,分享給各位看客,歡迎交流學習。
測試的目的:
現行的主流搭建MHA使用的用戶是root來傳遞公鑰以及進行一些切換、摘除、添加VIP的工作,但root用戶的許可權過大,在生產上存在安全漏洞的風險,可以嘗試使用一個普通的用戶以較小的許可權角色實現MHA的各項功能。
測試的環境:
1、兩台CentOS伺服器,iptables關閉,配置為8核8G記憶體,系統CentOS release 6.8 (Final)。伺服器IP三個分別是172.16.3.190/22、172.16.3.189/22以及VIP:172.16.3.123/22
2、資料庫實例兩台,版本保持一致為5.7.18-log MySQL Community Server (GPL)。
測試的步驟:
1、配置MHA複製集(master-slave-manager),GTID+Semi-Sync+並行複製
2、安裝MHA及基本環境配置
3、MHA健康檢查
4、MHA切換測試(手動+自動)
測試摘要:
1、傳遞公鑰的用戶都需要設置密碼且與MySQL用戶要同一組
2、傳遞公鑰的用戶要有sudo許可權且能通過某一埠進行文件的傳遞
3、傳遞公鑰的用戶要有摘除、添加VIP的許可權,且線上切換的腳本要更改root為傳遞公鑰的用戶
4、MHA的配置文件、目錄的屬主屬組要更改為傳遞公鑰的用戶而不是root用戶
測試的具體搭建過程:
一、配置MHA複製集
1、MHA各角色和IP劃分
MHA-Master:172.16.3.190/22,VIP:172.16.3.123/22
MHA-Backup:172.16.3.189/22
MHA-Manager:172.16.3.189/22
2、MHA的GTID+Semi-Sync +Slave-parallel
搭建複製集的過程省略,需要註意的問題是master必須確保所有的slave都能連接,包括切換後新主與舊主之間的同步連接。
GRANT SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'172.16.%.%' identified by ‘repl’;
2.1、GTID參數配置
gtid_mode=on //開啟GTID,否則就是普通的複製類型
enforce_gtid_consistency=true //強制GTID的一致性
log_slave_updates=true //slave更新是否記錄日誌
master_info_repository=table //將日誌存儲為表形式,更加安全,防止日誌信息破損
relay_log_info_repository=table //將日誌存儲為表形式,更加安全,防止日誌信息破損
2.2、Semi-Sync配置
1、在MHA的master上安裝半同步插件並開啟半同步功能
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> set global rpl_semi_sync_master_enabled=on ;
.2、在MHA的slave或者manager節點上安裝插件並開啟slave的半同步
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled=on ;
3、Slave-paralle配置
在MySQL實例的配置文件中都添加slave_parallel_workers=N,此處根據機器的配置使用了4個應用線程
二、安裝MHA及基本環境配置
1、在所有的節點上安裝node數據包,在manager節點上安裝manager數據包
2、編輯/etc/hosts文件,添加如下幾行內容,指定各機器在MHA的角色。
#mha config
172.16.3.190 mha_master
172.16.3.189 mha_backup
172.16.3.189 mha_manager
3、給傳遞公鑰、配置SSH登錄使用的埠,編輯SSH服務的server端、client端的配置文件,分別是/etc/ssh/sshd_config、/etc/ssh/ssh_config,修改如下行的埠為22222。server端的配置文件不要修改行PermitRootLogin no為yes,區別於傳統的搭建方法,不是用root賬號登錄。
Port 22222 #此處埠配置為傳遞互信使用的埠,預傳遞公鑰的埠是多少這裡修改為多少。
4、給傳遞公鑰的用戶設置密碼,這裡我們使用的就是mysql用戶,如果使用其他用戶還需要將這個配置互信使用的用戶加入到mysql用戶組;這個用戶還需要有sudo許可權,因為MHA的切換過程中有VIP的摘除和添加過程,這個步驟要有類似root的許可權進行操作,且每台機器上都要執行。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
liyingxiao ALL=NOPASSWD: ALL
mysql ALL=NOPASSWD: ALL
5、切換用戶模式為mysql並配置機器之間的互信,可以通過id username判斷用戶行為是否是傳遞公鑰使用的用戶mysql
#mha_master上配置到mha_backup、mha_manager的無密碼登錄
[root@172-16-3-190 we_ops_admin]# su - mysql
[mysql@172-16-3-190 ~]$ ssh-keygen -t rsa
[mysql@172-16-3-190 home]$ cd /home/mysql/.ssh/[mysql@172-16-3-190 .ssh]$ cat id_rsa.pub >> authorized_keys #這裡角色復用,因此需要允許多角色自身登錄
[mysql@172-16-3-190 .ssh]$ chmod 700 /home/mysql/.ssh/
[mysql@172-16-3-190 .ssh]$ chmod 600 /home/mysql/.ssh/authorized_keys
[mysql@172-16-3-190 .ssh]$ ssh-copy-id -i id_rsa.pub '-p22222 [email protected]'
#mha_backup、mha_manager配置到mha_master的無密碼登錄
[mysql@172-16-3-189 .ssh]$ id
uid=502(mysql) gid=502(mysql) groups=502(mysql)
[mysql@172-16-3-189 .ssh]$ ssh-keygen -t rsa
[mysql@172-16-3-189 ~]$ cd /home/mysql/.ssh/
[mysql@172-16-3-189 .ssh]$ cat id_rsa.pub >> authorized_keys
[mysql@172-16-3-189 .ssh]$ chmod 700 /home/mysql/.ssh/
[mysql@172-16-3-189 .ssh]$ chmod 600 /home/mysql/.ssh/authorized_keys
[mysql@172-16-3-189 .ssh]$ ssh-copy-id -i id_rsa.pub '-p22222 [email protected]'
6、驗證互信,無密碼遠程登錄其他機器
#172.16.3.190驗證互信
[mysql@172-16-3-190 .ssh]$ ssh mha_backup
[mysql@172-16-3-190 .ssh]$ ssh mha_manager
#172.16.3.189驗證互信
[mysql@172-16-3-189 .ssh]$ ssh mha_master
[mysql@172-16-3-189 .ssh]$ ssh mha_backup
[mysql@172-16-3-189 .ssh]$ ssh mha_manager
7、配置manager節點的服務
7.1創建manager節點的監控用戶,確保從manager節點可以連接master、slave
mysql> grant all privileges on *.* to 'mha_monitor'@'172.16.%.%' identified by 'mha_monitor';
Query OK, 0 rows affected, 1 warning (10.12 sec)
7.2編輯MHA的配置文件,以及建立對應的工作目錄,並將這些目錄的屬主屬組更改為MySQL。如果不做更改SSH/同步檢查不會報錯,但使用其他命令和切換會報許可權錯誤,建議更改屬主屬組便於後續的維護配置。
[root@172-16-3-189 ~] mkdir ‐p /etc/masterha
[root@172-16-3-189 masterha]# mkdir -p /var/log/masterha/app_3306
[root@172-16-3-189 masterha]# mkdir /opt/shells/masterha
[root@172-16-3-189 we_ops_admin]# chown -R mysql:mysql /var/log/masterha/
[root@172-16-3-189 masterha]# chown -R mysql:mysql /etc/masterha/
[root@172-16-3-189 masterha]# chown -R mysql:mysql /opt/shells/masterha/
[root@172-16-3-189 masterha]# cat /etc/masterha/app_3306.cnf #編輯MHA的配置文件
[root@172-16-3-189 masterha]# cat app_3306.cnf
[server default]
# mysql user and password
user=mha_monitor
password=mha_monitor
repl_user=repl
repl_password=repl
ssh_user=mysql
ssh_port=22222
# working directory on the manager
manager_workdir=/var/log/masterha/app_3306
# working directory on MySQL servers
remote_workdir=/var/log/masterha/app_3306
ping_interval=1
master_ip_failover_script=/opt/shells/masterha/master_ip_failover_3306
master_ip_online_change_script=/opt/shells/masterha/master_ip_online_change_script_3306
[server1]
hostname=172.16.3.190
port=3306
master_binlog_dir=/opt/app/mysql_3306/data
[server2]
hostname=172.16.3.189
port=3306
master_binlog_dir=/opt/app/mysql_3306/data
7.3編輯自動漂移和手動漂移的腳本文件並授予可執行許可權,以及VIP漂移處給予sudo的許可權,這裡將用戶設置為可sudo,是給予摘除和添加VIP的許可權
[root@172-16-3-189 we_ops_admin]# chmod +x /opt/shells/masterha/master_ip_failover_3306
[root@172-16-3-189 we_ops_admin]# chmod +x /opt/shells/masterha/master_ip_online_change_script_3306
編輯腳本文件master_ip_failover_3306,修改如下行為:
my $ssh_start_vip = "sudo /sbin/ifconfig eth0:$key $vip;sudo /sbin/arping -I eth0:0 -c 5 -s 172.16.3.123 172.16.0.1 >/dev/null 2>&1"
編輯master_ip_online_change_script_3306修改如下行為:
my $ssh_start_vip = "sudo /sbin/ifconfig eth0:$key $vip;sudo /sbin/arping -I eth0:0 -c 5 -s 172.16.3.123 172.16.0.1 >/dev/null 2>&1"
`ssh mysql\@${new_master_host} \" $ssh_start_vip \"`; #將root用戶替換為MySQL用戶,這裡會進行SSH添加VIP
`ssh mysql\@${orig_master_host} \" $ssh_stop_vip \"`; #講root用戶替換為MySQL用戶,這裡會進行SSH摘除VIP
三、MHA健康檢查(傳遞公鑰的用戶模式下進行檢查)
1、檢查SSH免密碼登錄
[mysql@172-16-3-189 ~]$ masterha_check_ssh --conf=/etc/masterha/app_3306.cnf
2、檢查同步狀態
[mysql@172-16-3-189 ~]$ masterha_check_repl --conf=/etc/masterha/app_3306.cnf
3、檢查manager自動漂移服務是否開啟
[mysql@172-16-3-189 ~]$ masterha_check_status --conf=/etc/masterha/app_3306.cnf
四、切換測試(漂移過程及結果不做贅述,傳遞公鑰的用戶模式下進行漂移)
1、手動切換,並檢查同步狀態是否正常
[mysql@172-16-3-189 ~]$ masterha_master_switch --conf=/etc/masterha/app_3306.cnf --master_state=alive --orig_master_is_new_slave -interactive=0
2、自動切換,並查看VIP是否成功漂移
關閉master實例,發現VIP成功從master摘除並漂移到slave上
五、遇到的問題總結
1、MHA的工作目錄公鑰用戶對此沒有許可權
2、摘除、添加VIP需要有sudo許可權
3、線上切換的用戶要使用公鑰用戶而不是不用的root用戶
4、手動切換的過程中,使用公鑰用戶進行,不必進行sudo -s給予sudo許可權,否則會多餘輸入密碼