建立一個MySQL伺服器的備援(M/S Replication)

如果目前服務的MySQL只有一台,卻沒有備援機制,是一件非常危險的事。哪天主機壞了,硬碟壞了,所有資料都付之一炬。因此就必需要建立一個能備援資料的機制。
這次建立的環境為內網一台主要(Master)跟次要(Slave)的MySQL,次要機器為養機千日用在一時的備用。
要建立的步驟大約為以下幾點:
在Master要做的事

  • 建立同步資料用的帳號
  • 於my.cnf設定master該有的設定參數
  • 重啟MySQL以啟用設定

在Slave要做的事

  • 於my.cnf設定slave該有的設定參數
  • 將同步帳號輸入進slave中
  • 重啟MySQL以啟用設定

Master主機資訊: FreeBSD 9 , Mysql 50 server , if : 192.168.101.141
Slave 主機資訊: FreeBSD 9 , Mysql 50 server , if : 192.168.101.142

in Master
進入Master修改my.cnf,如果找不到my.cnf,就到/usr/local/share/mysql/my-large.cnf給它cp一份到/etc/my.cnf。
一般來說,你複製過來的設定檔已經是完整的了,只要查詢以下的設定是否有打開或是參數是否有正確。
[cc lang=”bash”]
[mysqld]
server-id=1
log-bin=mysql-bin
innodb_flush_log_at_trx_commit=1
[/cc]
重啟MySQL
[cc lang=”bash”]
$ /usr/local/etc/rc.d/mysql-server restart
[/cc]
然後進入msql的命令列新增同步用的使用者帳號
[cc lang=”bash”]
mysql>create user syncer@192.168.101.142;
mysql>grant replication slave on *.* to syncer@192.168.101.142 identified by ‘abc123’;
[/cc]
先鎖定主機,以查詢二進制的相關資料
[cc lang=”bash”]
mysql>flush tables with read lock;
mysal>show master status;
[/cc]
大概會出現像這樣的資訊

一定要記住File跟Position
然後釋放主機鎖定功能
[cc lang=”bash”]
mysql>unlock tables;
[/cc]

in Slave
修改Slave的my.cnf,其中的server-id不可以跟Master一樣,盡量小點的數字,不用太多。
[cc lang=”bash”]
server-id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
[/cc]
完成之後,重啟MySQL,並進入命令列。
[cc lang=”bash”]
mysql>slave stop;
mysql>change master to master_host=’192.168.1.141′,
->master_user=’syncer’,
->master_password=’abc123′,
->master_log_file=’mysql-bin.000006′,
->master_log_pos=1951;
[/cc]
記得master_log_file與master_log_pos都是剛才在Master的show master status所得的資訊。
然後,開啟slave機制。
[cc lang=”bash”]
mysql>start slave;
[/cc]
重看slave的狀態
[cc lang=”bash”]
mysql>show slave status\G
[/cc]
只要看到Slave_IO_Running: Yes 跟 Slave_SQL_Running: Yes 都表示皆在運作中。所以你就可以在Master試一下編修資料。照理來說,你的Slave就會即時吸取你所修改的資料進來了,因此你就得到一台一模一樣的第二台Mysql,並為你的資料做備援的準備以便未來保障你的資訊。
如果你在Slave做change master時輸入錯了相關的資訊,可以使用
[cc lang=”bash”]
STOP SLAVE;
RESET SLAVE;
[/cc]
將Slave的資訊重新設定。

如何改變帳號的群組為wheel

在FreeBSD裡,具有最高操作權限除了root之外,群組wheel也能做root身分的事。
如果帳號原身分不是wheel群組,那麼就不可以用su來改原身分為root,並且它會跟你say sorry。
一般說來在新增使用者時:adduser ,在選擇要加入哪些群組時,就可以在那邊做加入wheel的動作,若是已存在的帳號,改變群組時,可以下這個指令:

[cc lang=”bash”]
$ pw groupmod wheel -m username
[/cc]

然後讓該帳號重新登入,就可以用su來改變為root身份了。
當然也可以直接修改 /etc/group 檔案找到該後改成:
[cc lang=”bash”]
wheel:*:0:root,username
[/cc]

username就是要加入wheel群組的帳號名稱。

PF 的傳輸埠導向

如果你的NAT需要開放一些SSH或是一些服務的埠號導向後方的電腦們,這時你就需要設定一些導埠的的語法將所需的服務開通並導向正確的電腦們。
檔案設定在 /etc/pf.conf
[cc lang=”bash”]
if_ext=”vtnet0″
if_int=”vtnet1″

#用兩台mysql的原因是需要靠外部的SSH連進去管理。因此請照你目前NAT的後方的電腦的服務狀況來設定。
mysqla01=”192.168.101.141″
mysqla02=”192.168.101.142″

net_lan=”192.168.101.0/24″

set skip on lo0

nat on $if_ext from $net_lan -> ($if_ext:0)
no nat on $if_ext from !$net_lan to any

#導向ssh的通訊埠
rdr pass on $if_ext proto tcp from any to any port 22141 -> $mysqla01 port 22
rdr pass on $if_ext proto tcp from any to any port 22142 -> $mysqla02 port 22
rdr pass on $if_ext proto tcp from any to any port 22 -> 192.168.101.254 port 22

#原本要阻擋所有導進來的通訊,為了能測試通過導向,先開啟所有通訊埠。未來再找資料做個比較好的設定。
#block in on $if_ext
pass in on $if_ext

pass out
[/cc]

其設定的重點就是在rdr的部份,照以上的格式,可以將NAT對外的網卡以any to any的方式將來自於埠號22141連進第一台mysql的SSH之22埠。
然後用pfctl -nf /etc/pf.conf 來測試是否有正確,然後再下pfctl -f /etc/pf.conf 載入變更後的設定檔。
因此下了指令 pfctl -ns
[cc lang=”bash”]
$ pfctl -sn
No ALTQ support in kernel
ALTQ related functions disabled
nat on vtnet0 inet from 192.168.101.0/24 to any -> (vtnet0:0)
no nat on vtnet0 inet from ! 192.168.101.0/24 to any
rdr pass on vtnet0 inet proto tcp from any to any port = 22141 -> 192.168.101.141 port 22
rdr pass on vtnet0 inet proto tcp from any to any port = 22142 -> 192.168.101.142 port 22
rdr pass on vtnet0 inet proto tcp from any to any port = ssh -> 192.168.101.254 port 22
[/cc]
只要看到上述的內容有正確,就可以方便進入管理NAT後方的電腦了。