CentOS6.2 64位
Mysql版本mysql-5.5.35.tar.gz,編譯安裝
drbd yum安裝 drbd kmod-drbd84
heartbeat yum安裝 heartbeat-3.0.4-2.el6.x86_64
主:192.168.2.230
從:192.168.2.231
VIP:192.168.2.232
配置安裝編譯環境
yum groupinstall "Development Tools" -y
yum -y install vim wget gcc-c++ ncurses ncurses-devel cmake make bison openssl openssl-devel gcc* libxml2 libxml2-devel curl-devel libjpeg* libpng* freetype* libxslt
reboot
rpm -ivh http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
yum install drbd kmod-drbd84
chkconfig --add drbd
chkconfig drbd on
檢查安裝是否成功:
drbdadm
看是否以執行成功
cat /proc/drbd
是否可以看到版本信息
重啟后再次檢查cat /proc/drbd
查看drbd模塊信息
modinfo /lib/modules/2.6.32-358.el6.x86_64/updates/drbd.ko
在兩臺服務器中分出一個空分區或者添加一個空的硬盤,未格式化文件系統的
fdisk /dev/sda
配置服務器的hostname,在兩臺服務器中編輯hosts文件
vi /etc/hosts 添加:
192.168.2.230  www.a.com
192.168.2.231  www.b.com
在兩臺服務器上配置兩個drbd的源文件
vi /etc/drbd.d/mysqldata.res
resource mysqldata {protocol C;on www.a.com   {device    /dev/drbd0;disk      /dev/sda5;address   192.168.2.230:7789;meta-disk internal;}on www.b.com   {device    /dev/drbd0;disk      /dev/sda5;address   192.168.2.231:7789;meta-disk internal;}
}
往兩臺服務器的/dev/sda5設備寫入一些數據,否則drbd在create-md時會報錯
dd if=/dev/zero of=/dev/sda5 bs=1M count=128
drbdadm create-md all
service drbd restart
cat /proc/drbd
在主節點上執行
drbdadm -- --overwrite-data-of-peer primary all
=========================
上面執行的語句的所有橫線不能丟。如果第一次設置主節點時使用“/sbin/drbdadm primary mysqldata”命令,會提示如下錯誤:0: State change failed: (-2) Need access to UpToDate dataCommand '/sbin/drbdsetup 0 primary' terminated with exit code 17
只要第一次用上面命令成功后,以后就可以用“/sbin/drbdadm primary mysqldata”命令了。
========================
用下面命令查看同步的進度
cat /proc/drbd
同步成功后,主從節點都會出現UpToDate/UpToDate的關鍵字
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 599f286440bd633d15d5ff985204aff4bccffadd build by phil@Build64R6, 2013-10-14 15:33:060: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----ns:8393532 nr:0 dw:0 dr:8394196 al:0 bm:513 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
由于mount操作只能在主節點進行,所以只有設置了主節點后才能格式化磁盤分區,然后掛載,
備機的DRBD設備無法被掛載,因為它是用來接收主機數據的,由DRBD負責操作。
在主節點格式化/dev/drbd0
mkfs.ext4 /dev/drbd0
建立掛載點目錄,由于主從切換時都要有掛載點,所以都要建立該目錄
mkdir /mysqldata
掛載
mount /dev/drbd0 /mysqldata
測試drbd同步
先在主節點上寫入數據,隨便寫入什么:
touch /mysqldata/111
ll /mysqldata/然后,我們先卸載目錄/mysqldata,再把主節點的primary降級成secondary,然后把從節點的secondary提升成primary:
umount /mysqldata
drbdadm secondary mysqldata
把primary降級前,一定要先umount設備才行。
然后提升secondary
在從節點上執行:
drbdadm primary mysqldata
mount /dev/drbd0 /mysqldata
ll /mysqldata
可以看到,數據已經完全同步過去了。
還原
在從節點上
umount /mysqldata
drbdadm secondary mysqldata
在主節點上
drbdadm primary mysqldata
mount /dev/drbd0 /mysqldata
安裝mysql
建立mysql所需賬號、目錄及權限
useradd -d /usr/local/mysql/ mysql   #主從上創建一個Mysql用戶,指定家目錄到/use/local目錄下。
chown -R mysql:mysql /mysqldata/     #將主上面建立的mysqldata文件夾作為mysql的data存放位置,并賦予mysql權限
chmod 750 /mysqldata
3、解壓并安裝mysql
tar xf mysql-5.5.35.tar.gz  
cd mysql-5.5.35
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/mysqldata \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DSYSCONFDIR=/etc \
-DWITH_SSL=yes
make & make install
編譯注解:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \         #安裝目錄
-DDEFAULT_CHARSET=utf8 \                           #默認字符
-DDEFAULT_COLLATION=utf8_general_ci \              #校驗字符
-DEXTRA_CHARSETS=all \                            #安裝所有擴展字符集
-DWITH_MYISAM_STORAGE_ENGINE=1 \                  #安裝myisam存儲引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 \                #安裝innodb存儲引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \                 #安裝archive存儲引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \               #安裝blackhole存儲引擎
-DWITH_MEMORY_STORAGE_ENGINE=1 \                  #安裝memory存儲引擎
-DWITH_FEDERATED_STORAGE_ENGINE=1 \               #安裝frderated存儲引擎
-DWITH_READLINE=1 \                               #快捷鍵功能
-DENABLED_LOCAL_INFILE=1 \                        #允許從本地導入數據
-DMYSQL_DATADIR=/mysqldata \                      #數據庫存放目錄
-DMYSQL_USER=mysql \                              #數據庫屬主
-DMYSQL_TCP_PORT=3306 \                           #數據庫端口
-DSYSCONFDIR=/etc \                               #MySQL配輯文件
-DWITH_SSL=yes                                    #數據庫SSL
vim /etc/my.cnf
[mysqld]
datadir=/mysqldata
socket=/mysqldata/mysql.sock
port=3306
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default_storage_engine         = InnoDB
skip-external-locking
# CACHES AND LIMITS #
key_buffer_size                = 256M
max_allowed_packet             = 32M
sort_buffer_size               = 16M
read_buffer_size               = 4M
read_rnd_buffer_size           = 16M
thread_stack                   = 8M
tmp_table_size                 = 32M
max_heap_table_size            = 32M
query_cache_type               = 1
query_cache_size               = 128M
query_cache_limit              = 2M
max_connections                = 2048
thread_cache_size              = 512
open_files_limit               = 65535
table_definition_cache         = 1024
table_open_cache               = 2048
character_set_server = utf8
default-storage-engine = innodb
init_connect="SET NAMES 'utf8'"
skip-name-resolve
wait_timeout=3600
interactive-timeout=3600
# INNODB #
innodb_log_files_in_group      = 2
innodb_log_file_size           = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 0
innodb_support_xa=0
innodb_file_per_table          = 1
innodb_buffer_pool_size        = 128M
innodb_additional_mem_pool_size =64M
innodb_data_file_path =ibdata1:1024M:autoextend
innodb_autoextend_increment =50
# MyISAM #
key_buffer_size                = 32M
myisam_recover                 = FORCE,BACKUP
# LOGGING #
log-error=/mysqldata/error.log
general_log=1
general_log_file=/mysqldata/mysql.log
slow_query_log=1
slow_query_log_file=/mysqldata/slowquery.log
log-output=FILE
# BINARY LOGGING #
log-bin                        =/mysqldata/bin.log
expire_logs_days               = 30
sync_binlog =0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/mysqldata/mysql.sock
將mysql的庫文件路徑加入系統的庫文件搜索路徑中
利用ldconfig導入系統庫
echo "/usr/local/mysql/lib" >> /etc/ld.so.conf.d/mysql.conf
ldconfig
輸出mysql的頭文件到系統頭文件
ln -s /usr/local/mysql/include/mysql /usr/include/mysql
進入安裝路徑,初始化配置腳本,只在主節點上執行,從節點不執行
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql --datadir=/mysqldata
復制mysql啟動腳本到系統服務目錄
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
系統啟動項相關配置,主節點配置,從節點不配置
chkconfig --add mysqld  #添加開機啟動服務
chkconfig mysqld on  #設置mysql啟動
啟動mysql
service mysqld start
vim /etc/profile
配置mysql環境變量
export PATH=$PATH:/usr/local/mysql/bin
加載環境變量
. /etc/profile
設置初始賬戶,并登陸后臺:
/usr/local/mysql/bin/mysqladmin -u root password 111111
進入mysql
mysql -u root -p111111
安裝heartbeat
rpm -ivh http://mirrors.sohu.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install heartbeat
cd /etc/ha.d/
該目錄下需要三個配置文件
vim authkeys
#
#   Authentication file.  Must be mode 600
#
#
#   Must have exactly one auth directive at the front.
#   auth    send authentication using this method-id
#
#   Then, list the method and key that go with that method-id
#
#   Available methods: crc sha1, md5.  Crc doesn't need/want a key.
#
#   You normally only have one authentication method-id listed in this file
#
#   Put more than one to make a smooth transition when changing auth
#   methods and/or keys.
#
#
#   sha1 is believed to be the "best", md5 next best.
#
#   crc adds no security, except from packet corruption.
#       Use only on physically secure networks.
#
auth 1
1 crc
#2 sha1 HI!
#3 md5 Hello!
vim ha.cf
debugfile /var/log/ha-debug
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694       //upd監聽端口,iptables需要對各自開放
ucast eth0 192.168.2.230  //主從各自指向相對的ip,
auto_failback on
node www.a.com
node www.b.com
respawn root /usr/lib64/heartbeat/ipfail
apiauth ipfail gid=root uid=root
vim haresources 該文件主從需要保持一致,heartbeat根據該文件切換主從、啟動和掛載drbd以及mysqld程序,并使VIP地址生效。
www.a.com  IPaddr::192.168.2.232/22/eth0 drbddisk::mysqldata Filesystem::/dev/drbd0::/mysqldata::ext4 mysqld
將主從的該文件權限進行修改
chmod 600 authkeys
默認heartbeat安裝后沒有切換drbd的腳本,需要在主從的/etc/ha.d/resource.d下建立drbddisk腳本,并賦予755執行權限
vim /etc/ha.d/resource.d/drbddisk
#!/bin/bash
#
# This script is inteded to be used as resource script by heartbeat
#
# Copright 2003-2008 LINBIT Information Technologies
# Philipp Reisner, Lars Ellenberg
#
###
DEFAULTFILE="/etc/default/drbd"
DRBDADM="/sbin/drbdadm"
if [ -f $DEFAULTFILE ]; then. $DEFAULTFILE
fi
if [ "$#" -eq 2 ]; thenRES="$1"CMD="$2"
elseRES="all"CMD="$1"
fi
## EXIT CODES
# since this is a "legacy heartbeat R1 resource agent" script,
# exit codes actually do not matter that much as long as we conform to
#  http://wiki.linux-ha.org/HeartbeatResourceAgent
# but it does not hurt to conform to lsb init-script exit codes,
# where we can.
#  http://refspecs.linux-foundation.org/LSB_3.1.0/
#   LSB-Core-generic/LSB-Core-generic/iniscrptact.html
####
drbd_set_role_from_proc_drbd()
{local outif ! test -e /proc/drbd; thenROLE="Unconfigured"returnfidev=$( $DRBDADM sh-dev $RES )minor=${dev#/dev/drbd}if [[ $minor = *[!0-9]* ]] ; then# sh-minor is only supported since drbd 8.3.1minor=$( $DRBDADM sh-minor $RES )fiif [[ -z $minor ]] || [[ $minor = *[!0-9]* ]] ; thenROLE=Unknownreturnfiif out=$(sed -ne "/^ *$minor: cs:/ { s/:/ /g; p; q; }" /proc/drbd); thenset -- $outROLE=${5%/**}: ${ROLE:=Unconfigured} # if it does not show upelseROLE=Unknownfi
}
case "$CMD" instart)# try several times, in case heartbeat deadtime# was smaller than drbd ping timetry=6while true; do$DRBDADM primary $RES && breaklet "--try" || exit 1 # LSB generic errorsleep 1done;;stop)# heartbeat (haresources mode) will retry failed stop# for a number of times in addition to this internal retry.try=3while true; do$DRBDADM secondary $RES && break# We used to lie here, and pretend success for anything != 11,# to avoid the reboot on failed stop recovery for "simple# config errors" and such. But that is incorrect.# Don't lie to your cluster manager.# And don't do config errors...let --try || exit 1 # LSB generic errorsleep 1done;;status)if [ "$RES" = "all" ]; thenecho "A resource name is required for status inquiries."exit 10fiST=$( $DRBDADM role $RES )ROLE=${ST%/**}case $ROLE inPrimary|Secondary|Unconfigured)# expected;;*)# unexpected. whatever...# If we are unsure about the state of a resource, we need to# report it as possibly running, so heartbeat can, after failed# stop, do a recovery by reboot.# drbdsetup may fail for obscure reasons, e.g. if /var/lock/ is# suddenly readonly.  So we retry by parsing /proc/drbd.drbd_set_role_from_proc_drbdesaccase $ROLE inPrimary)echo "running (Primary)"exit 0 # LSB status "service is OK";;Secondary|Unconfigured)echo "stopped ($ROLE)"exit 3 # LSB status "service is not running";;*)# NOTE the "running" in below message.# this is a "heartbeat" resource script,# the exit code is _ignored_.echo "cannot determine status, may be running ($ROLE)"exit 4 #  LSB status "service status is unknown";;esac;;*)echo "Usage: drbddisk [resource] {start|stop|status}"exit 1;;
esac
exit 0
chmod 755 /etc/ha.d/resource.d/drbddisk
啟動heartbeat。先啟動主,再啟動從。heartbeat啟動時會自動啟動drbd和mysql,并且會根據/etc/ha.d/haresources中的配置加載和掛載drbd的源
service heartbeat start
在主上查看VIP
ip addr
查看主從的heartbeat日志
tail -f /var/log/ha-debug
測試
首先現在主上查看/mysqldata是否掛載成功
ll /mysqldata
查看drbd狀態
cat /proc/drbd
查看mysql啟動狀態和進程
service mysqld status
ps -ef|grep mysqld
本地登陸mysql查看數據庫和表是否正常
利用mysql客戶端工具連接VIP地址,看是否能通過VIP連接到mysql并且查看數據庫和表狀態
以上都成功后,測試切換
停止主上的heartbeat進程
在主上查看/mysqldata目錄內容,以及mysql進程是否關閉
在從上查看VIP地址是否切換成功
ip addr
在從上查看/mysqldata目錄內容,以及mysql進程是否啟動
本地登陸mysql查看數據庫和表是否正常
利用mysql客戶端工具連接VIP地址,看是否能通過VIP連接到mysql并且查看數據庫和表狀態