第一節(jié):部署數(shù)據(jù)庫(kù)主從的前提條件
1.兩臺(tái)或兩臺(tái)以上的數(shù)據(jù)庫(kù)實(shí)例
2.主庫(kù)要開(kāi)啟二進(jìn)制日志
3.主庫(kù)要有復(fù)制用戶(hù)
4.主庫(kù)的server_id和從庫(kù)不同
5.從庫(kù)需要在開(kāi)啟復(fù)制功能前,要獲取到主庫(kù)之前的數(shù)據(jù)(主庫(kù)備份,并且記錄binlog當(dāng)時(shí)位置)
6.從庫(kù)在第一次開(kāi)啟主從復(fù)制時(shí),時(shí)必須獲知主庫(kù):ip,port,user,password,logfile,pos
IP:10.0.0.51
Port:3306
User:rep
Password:123456
logFile:mysql-bin.000002 <--在主庫(kù)上獲取值
Pos:120 <--在主庫(kù)上獲取值
7.從庫(kù)要開(kāi)啟相關(guān)線(xiàn)程:IO、SQL
8.從庫(kù)需要記錄復(fù)制相關(guān)用戶(hù)信息,還應(yīng)該記錄到上次已經(jīng)從主庫(kù)請(qǐng)求到哪個(gè)二進(jìn)制日志
9.從庫(kù)請(qǐng)求過(guò)來(lái)的binlog,首先要存下來(lái),并且執(zhí)行binlog,執(zhí)行過(guò)的信息保存下來(lái)
第二節(jié): 使用Ansible自動(dòng)部署主從復(fù)制
Ansible部署主從復(fù)制出現(xiàn)的問(wèn)題:由于主庫(kù)的logfile,和pos不是固定的所以,我們所寫(xiě)的ansible前提是要在主庫(kù)上執(zhí)行命令,進(jìn)行查看logfile和pos
show master status;
主機(jī)文件:
[mysql]
172.16.1.51
172.16.1.52
第三節(jié):使用register來(lái)注冊(cè)變量
這里我使用了register注冊(cè)變量,但是注冊(cè)的變量只能針對(duì)當(dāng)前主機(jī)生效。通過(guò)設(shè)置全局的fact變量來(lái)實(shí)現(xiàn)跨主機(jī)變量的使用,從而自動(dòng)獲取到logfile和pot。
#將logfile注冊(cè)成變量。
- name: Get logfile
shell: mysql -uroot -p123456 -e "show master status;"|awk 'NR==2{print $1}'
register: file
when: ( ansible_hostname is match "mysql01" )
#將pot注冊(cè)成變量
- name: master-bin-pot
shell: mysql -uroot -p123456 -e "show master status;"|awk 'NR==2{print $2}'
register: pot
when: ( ansible_hostname is match "mysql01" )
第四節(jié):跨主機(jī)變量的使用
1.通過(guò)set_fact模塊來(lái)設(shè)置全局的fact變量
- name: set facts file
set_fact: masterbin={{ file.stdout_lines[0] }} <--將獲取到的logfile賦值給masterbin
when: ( ansible_hostname is match "mysql01")
- name: set facts position
set_fact: position={{ pot.stdout_lines[0] }} <--將獲取到的pot賦值給position
when: ( ansible_hostname is match "mysql01")
2.從庫(kù)上執(zhí)行change master to 命令
- name: Changemaster to
mysql_replication:
login_user: root
login_password: '123456'
mode: changemaster
master_user: web
master_password: '123456'
master_host: 172.16.1.51
master_log_file: "{{ hostvars['172.16.1.51']['masterbin'] }}" <--引用51的主機(jī)變量
master_log_pos: "{{ hostvars['172.16.1.51']['position'] }}" <--引用51的主機(jī)變量
when: ( ansible_hostname is match "mysql02" )