mysql 制作同步数据库的步骤,转载自网中人所写。mysql 制作同步数据库的步骤,转载自网中人所写。 我们需要的是"异地备援"的机制,我们花了一个多月的时间从构思到设定、实作、测试 .... 数换主机之后,终于完成了一个初步的架构。
为此特地将我们的心得提供给大家参考,并希望能得到更多的朋友帮忙改良。
------------------------------ 一﹐假设环境 ------------------------------
1) 一台主 phorum 主机(master):1.2.3.4 2) 一台能提供 ddns update 的 DNS 主机:1.2.3.5 3) 一台次 phorum 主机(slave): 4.3.2.1 4) phorum 使用的 FQDN 为:phorum.my.org
------------------------------ 二﹐构思 ------------------------------
1) 正常情况下,phorum 跑在 master。 然后启动 mysql 的双向 replication , 但两个 phpbb 都使用 master 的 mysql (在 config.php 设), phpbb 本身的 code 用 rsync+ssh 来同步。 2) 在 slave 这边,用 nmap 每 60 秒来扫 port 80 及 3306, 若两个 port 都扫到,不作任何变动。 3) 若其一扫不到,将作出如下动作: 1, 发 email 通知 mail list 2, 修改 phpbb 使用本机的 mysql 3, 用 ddns 将 phorum 的 IP 改到 slave 4, 每 20 秒再用 nmap 来扫 master 的 port 4) 若 master 回来后,将作出如下动作: 1, 发 email 通知 mail list 2, 修改 phpbb 使用 master 的 mysql 3, 用 ddns 将 phorum 改到 master 4, 每 60 秒再用 nmap 来扫 master port 80 (循环动作 2 )
------------------------------ 三﹐前提条件 ------------------------------
1) 您会设定及使用 ssh/scp ,还有 ssh 的 RSA 认证 2) 您会设定 bind v9 的 policy update (ddns) 3) 您会设定 mysql 的 replication 4) 您会修改 shell script (bash)
------------------------------ 四﹐开始实作 ------------------------------
4.1﹐设定 SSH
1) 在 slave 挑选一个账号(如 kenny),确定对整个 phpBB 目录有"写入"权限, 且能够从 master 端 ssh 进来(预设如此,除非您修改了)。并执行: $ mkdir ~/.ssh 2>/dev/null $ chmod 700 ~/.ssh $ touch ~/.ssh/authorized_keys $ chmod 644 ~/.ssh/authorized_keys
2) 在 master 上选一个能读取 phpBB 目录且能跑 crontab 的账号(如 netman), (注:若不用 root 的话,建议为 phpBB 目录的 owner。) 并用该身份鹖獢G $ ssh-keygen -t rsa (按三下 enter 完成﹔不需设密码,除非您会用 ssh-agent 。)
3) 将 master 的 RSA key 搬进 slave 那边去: $ scp /home/netman/.ssh/id_rsa.pub kenny@4.3.2.1:/home/kenny/id_rsa.pub.1.2.34 (输入密码﹔若是第一次联机,在输入密码之前还需输入 yes 三字。) $ ssh kenny@4.3.2.1 'cat /home/kenny/id_rsa.pub.1.2.3.4 >> /home/kenny/.ssh/authorized_keys' (再输入密码) $ ssh kenny@4.3.2.1 'rm /home/kenny/id_rsa.pub.1.2.3.4' (这次确定"不需"输入密码﹗若不成功,请参考 ssh 的文件完成。)
** 注:上述步骤也可参考如下网页的部份内容: http://www.study-area.org/tips/vpn.htm
4.2﹐同步 phpBB
* 此步骤不是必需的,若因其它目的不想想同步双方的 phpbb 设定,那可略过。
1) 请再次确定您在 slave 使用的账号(这里为 kenny)对 phpBB 目录有写入权限, (具体路径请自行修改): $ touch /home/phpbb/www/phpBB/new.text $ rm /home/phpbb/www/phpBB/new.text $ mv /home/phpbb/www/phpBB /home/phpbb/www/phpBB.bak 2) 用前述账号(这里为 netman)登入 master 主机上,执行 rsync 同步 phpBB: $ rsync -e ssh -zav /home/phpbb/www/phpBB kenny@4.3.2.1:/home/phpbb/www (注1:来源路径请打 "/home/phpbb/www/phpBB",也就是最后的路径不能带 "/" ﹗) (注2:目标路径请打 "/home/phpbb/www",也就是指到 phpBB 的上一级目录﹗)
3) 请到 slave 端验证同步是否成功﹔否则,请参考 rsync 文件来完成。
4) 在 master 上用前述账号写一个 crontab ,定期更新: $ crontab -e 1 */4 * * * /usr/bin/rsync -e ssh -zav /home/phpbb/www/phpBB kenny@4.3.2.1:/home/phpbb/www 这样,一天会同步 6 次﹔若需调整时间间隔,请参考 crontab 文件。
4.3﹐设定 DDNS
1) 以 root 身份登入 DNS 主机,并产生 key pair: # mkdir ~/tmp # cd ~/tmp # dnssec-keygen -a HMAC-MD5 -b 128 -n HOST phorum Kphorum.+157+01326
2) 获取 key 内容: # tail -1 Kphorum.+157+01326.key | awk '{print }' rTlaRxINDDD/#zUlnPadsfWA== 并请抄下来(小心别抄错﹗大小写是不同的哦~~~) (您也可自行打开 Kphorum.+157+01326.key 来复制)
3) 修改 /etc/named.conf ,并增加/修改如下句子: key "phorum" { algorithm hmac-md5; secret "rTlaRxINDDD/#zUlnPadsfWA=="; };
zone "my.org" { type master; file "named.my.org"; update-policy { grant phorum name phorum.my.org. A; }; };
并重新启动 named : # /etc/rc.d/init.d/named restart (一定要看 /var/log/messages 确定没有 error 出现﹗)
4) 将产生的 key-pair 抄至 slave : # scp Kphorum.+157+01326.* kenny@4.3.2.1:/home/kenny (输入密码﹔若是第一次联机,在输入密码之前还需输入 yes 三字。)
5) 转至 slave 主机,并以前面所用的账号(这里为 kenny)登入,测试 ddns : $ cd $ host phorum.my.org (以确定您看到的 ip 是 master 的) $ nsupdate -k Kphorum.+157+01326.key > server 1.2.3.5 > update delete phorum.my.org A > update add phorum.my.org 0 A 4.3.2.1 > send > ^d (按下 crtl 及 d 键) $ host phorum.my.org (确定您看到的 ip 是 slave 的﹔若不成功,请参考 ddns 文件来完成。) 成功后请再跑 nsupdate ,将 IP 改回 master 。
** 注:上述步骤也可参考如下网页的部份内容: http://www.study-area.org/tips/ddns.htm
4.4﹐设定 MSQL 之 Replication
1) 在 master 上 执行 mysql ,增加 replication 账号: # mysql -u root -p (输入您的 mysql 密码) mysql>GRANT FILE ON *.* TO rep_user2@4.3.2.1 IDENTIFIED BY ‘rep_password2’; mysql>\q
2) 在 master 上修改 /etc/my.cnf ,使之内容类似如下: [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock ##comment out the following line to be slave server-id=1 master-host=4.3.2.1 master-user=rep_user1 master-password=rep_password1 master-port=3306 log-slave-updates master-connect-retry=60 replicate-do-db=phpBB ##comment out the following line to be master log-bin sql-bin-update-same binlog-do-db=phpBB [mysql.server] user=mysql basedir=/var/lib [safe_mysqld] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
3) 在 slave 上 执行 mysql ,增加 replication 账号: # mysql -u root -p (输入您的 mysql 密码) mysql>GRANT FILE ON *.* TO rep_user1@1.2.3.4 IDENTIFIED BY ‘rep_password1’; mysql>\q
4) 在 slave 上修改 /etc/my.cnf ,使之内容类似如下: [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock ##comment out the following line to be slave server-id=2 master-host=1.2.3.4 master-user=rep_user2 master-password=rep_password2 master-port=3306 log-slave-updates master-connect-retry=60 replicate-do-db=phpBB ##comment out the following line to be master log-bin sql-bin-update-same binlog-do-db=phpBB [mysql.server] user=mysql basedir=/var/lib [safe_mysqld] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
5) 请分别关闭 master 及 slave 的 mysqld : # /etc/rc.d/init.d/mysqld stop
6) 登入 master 将 mysqld 打包,并传至 slave 那边去 : # cd /var/lib # tar zcvf mysql.tgz mysql # scp mysql.tgz kenny@4.3.2.1:/home/kenny 7) 登入 slave ,并将 mysql 存放好: # cd /var/lib # mv mysql mysql.bak # tar zxvf /home/kenny/mysql.tgz * 注: 建议只覆盖 /var/lib/mysql/ 目录底下的相关子目录, 或将 mysql.bak/mysql 再盖回。 否则 slave mysql 的设定还需从来,如: mysql>GRANT FILE ON *.* TO rep_user1@1.2.3.4 IDENTIFIED BY ‘rep_password1’;
8) 最后,将 master 及 slave 的 mysqld 打开: # /etc/rc.d/init.d/mysqld start
9) 请以 mysql 或 phorum 来测试 replication 是否成功。 若失败,不防将 mysql 目录下的如下档案砍掉: master.info *-bin.[0-9][0-9][0-9] *-bin.index 再重跑 mysqld 。 另外,/var/log/mysqld.log 的信息也很有用,请勿略过。
至于 phpBB 的设定,请修改 /home/phpbb/www/phpBB/config.php 即可。
** 注:上述步骤也可参考如下网页的部份内容: http://www.study-area.org/tips/mysql_replication.htm
4.5﹐撰写/下载 shell scripts
当前面各项测试"全部"都成功之后,接下来就是写 shell script 的时侯了。 聪明的您应该不难写出符合自己需求的 script , 但若您不想那么麻烦的话,那也可以下载我写好的 script 会去修改:
1) 请以 root 身份下载: # cd # wget http://www.study-area.org/linux/src/swap_phorum.tgz 2) 解压缩: # tar zxvf swap_phorum.tgz 3) 您所下载的 tarball ,主要是要跑两个 script : ddns.sh swap_phorum.sh 它们均共同使用 config 档来设定,您只需集中修改一个地方就够了。 # cd swap_phorum # vi config
在 config 里面,您可参考批注说明来修改设定参数,说明如下:
KEY_FILE=$w_dir/Kphpbb.+157+01326.key # ddns key 用来更新 ddns 的 key ,也就是前述步骤 4.3 所用的 key 。
UPDATE_SCR=$w_dir/nsupdate.scr # ddns template 更新 ddns 用的范本,供 ddnsh.sh 使用,不能删除。
UPDATE_DATA=$w_dir/nsupdate.data # ddns data 更新 ddns 用的数据,由 ddns.sh 产生,可删除。 DDNS_SCRIPT=$w_dir/ddns.sh # ddns script 更新 ddns 的 script 。
STATE_FILE=/var/run/swap_phorum # state file 供 swap_phorum.sh 参考的状态档,由 script 自动产生/移除。
PHPBB_DIR=/home/phpbb/www/phpBB # phpbb directory 存放 phpBB 的目录。 PHPBB_CONF=$PHPBB_DIR/config.php # phpbb config file phpBB 的设定档,决定用哪一个 mysql 就靠它了。 此档会被 swap_phorum.sh 修改,除非作测试,请勿修改。 在第一次执行 swap_phorum.sh 之前,请确定它是可用的。
CONF_BAK=$PHPBB_CONF.bak.swap_phorum # phpbb config 此档只有在第一次执行 swap_phorum.sh 时(或该档不存在时)产生, swap_phorum.sh 会参考此档来修改 config.conf , 因此若需修改 phpBB 的设定,请修改这此档,并同步至 config.php 。
MAIL_LIST=phpbb@my.org # notice recipient 邮件通知信箱。请确定可收到邮件,以便及时了解 phorum 状态。
HOST_NAME=phorum.my.org # ddns host 也就是别人连上 phorum 的 FQDN ,ddns 会修改这个 A record 。
NS_SERVER=1.2.3.4 # dns server ip DNS server 的 IP,请勿使用 FQDN 。
MASTER_HOST=1.2.3.5 # phorum master ip Master Phorum 主机的 IP ,请勿使用 FQDN。
SLAVE_HOST=4.3.2.1 # phorum slave ip Slave Phorum 主机的 IP ,请勿使用 FQDN。
NMAP=/usr/bin/nmap # nmap path nmap 程序的绝对路径。
WGET=/usr/bin/wget # wget path wget 程序的绝对路径。
INTERVAL=60 # seconds to waite 每次侦测 master 是否存活的时间间隔。
IF="eth0" # interface 在 swap_phorum.sh 的 code 中, 可以指定 ddns 更新 $HOST_NAME 为 master 或 slave 的 IP, 否则(若修改 code 的话),则以此界面的 IP 为准。
4) 当您完成 config 的修改之后,您可执行如下 script 来测试:
|